Skip to content

Hyperliquid

Connector for Hyperliquid perpetuals exchange.

almanak.framework.connectors.hyperliquid

Hyperliquid Connector.

This module provides an adapter for interacting with Hyperliquid perpetual futures exchange, supporting order management, position queries, and L1/L2 message signing.

Hyperliquid is a decentralized perpetual futures exchange supporting: - Long and short positions with up to 50x leverage - Limit and market orders with various time-in-force options - Cross and isolated margin modes - REST API and WebSocket for real-time data

Supported networks: - Mainnet (api.hyperliquid.xyz) - Testnet (api.hyperliquid-testnet.xyz)

Example

from almanak.framework.connectors.hyperliquid import HyperliquidAdapter, HyperliquidConfig

config = HyperliquidConfig( network="mainnet", wallet_address="0x...", private_key="0x...", ) adapter = HyperliquidAdapter(config)

Place a limit order

result = adapter.place_order( asset="ETH", is_buy=True, size=Decimal("0.1"), price=Decimal("2000"), )

Check open orders

orders = adapter.get_open_orders()

Get position

position = adapter.get_position("ETH")

CancelResult dataclass

CancelResult(
    success: bool,
    cancelled_orders: list[str] = list(),
    failed_orders: list[str] = list(),
    error: str | None = None,
    response: dict[str, Any] | None = None,
)

Result of canceling one or more orders.

Attributes:

Name Type Description
success bool

Whether operation succeeded

cancelled_orders list[str]

List of cancelled order IDs

failed_orders list[str]

List of order IDs that failed to cancel

error str | None

Error message if failed

response dict[str, Any] | None

Raw API response

to_dict

to_dict() -> dict[str, Any]

Convert to dictionary.

EIP712Signer

EIP712Signer(
    private_key: str, chain_id: int, is_mainnet: bool = True
)

EIP-712 typed message signer for Hyperliquid.

This class handles the cryptographic signing of messages for both L1 and L2 operations on Hyperliquid. It uses EIP-712 structured data hashing.

The signing process: 1. Construct the EIP-712 typed data structure 2. Hash the domain separator 3. Hash the message struct 4. Sign the combined hash with the private key

Initialize the signer.

Parameters:

Name Type Description Default
private_key str

Hex-encoded private key (with or without 0x prefix)

required
chain_id int

Chain ID for EIP-712 domain

required
is_mainnet bool

Whether this is mainnet (L1) or testnet (L2)

True

sign_l1_action

sign_l1_action(
    action: dict[str, Any],
    nonce: int,
    vault_address: str | None = None,
) -> str

Sign an L1 action for mainnet.

L1 signing uses a specific EIP-712 structure with: - source: The signing wallet address - connectionId: Always the zero address for direct signing - nonce: Unique identifier to prevent replay

Parameters:

Name Type Description Default
action dict[str, Any]

Action payload

required
nonce int

Unique nonce

required
vault_address str | None

Optional vault address

None

Returns:

Type Description
str

Hex-encoded signature

sign_l2_action

sign_l2_action(action: dict[str, Any], nonce: int) -> str

Sign an L2 action for testnet.

L2 signing uses a simpler structure that's more gas-efficient for the testnet environment.

Parameters:

Name Type Description Default
action dict[str, Any]

Action payload

required
nonce int

Unique nonce

required

Returns:

Type Description
str

Hex-encoded signature

ExternalSigner

ExternalSigner(sign_callback: SignCallback)

External signer that delegates to a callback.

This allows using hardware wallets, custodians, or other external signing solutions.

Initialize with signing callback.

Parameters:

Name Type Description Default
sign_callback SignCallback

Function that signs (action, nonce, is_l1) -> signature

required

sign_l1_action

sign_l1_action(
    action: dict[str, Any],
    nonce: int,
    vault_address: str | None = None,
) -> str

Sign an L1 action using external signer.

sign_l2_action

sign_l2_action(action: dict[str, Any], nonce: int) -> str

Sign an L2 action using external signer.

HyperliquidAdapter

HyperliquidAdapter(
    config: HyperliquidConfig,
    signer: MessageSigner | None = None,
)

Adapter for Hyperliquid perpetual futures exchange.

This adapter provides methods for: - Placing limit and market orders - Canceling orders by ID or client ID - Querying positions and open orders - Managing leverage and margin settings

Example

config = HyperliquidConfig( network="mainnet", wallet_address="0x...", private_key="0x...", ) adapter = HyperliquidAdapter(config)

Place a limit buy order

result = adapter.place_order( asset="ETH", is_buy=True, size=Decimal("0.1"), price=Decimal("2000"), )

Check open orders

orders = adapter.get_open_orders()

Cancel order

cancel_result = adapter.cancel_order(order_id=result.order_id)

Initialize the adapter.

Parameters:

Name Type Description Default
config HyperliquidConfig

Hyperliquid adapter configuration

required
signer MessageSigner | None

Optional custom message signer (uses EIP712Signer if not provided)

None

place_order

place_order(
    asset: str,
    is_buy: bool,
    size: Decimal,
    price: Decimal,
    order_type: HyperliquidOrderType = HyperliquidOrderType.LIMIT,
    time_in_force: HyperliquidTimeInForce = HyperliquidTimeInForce.GTC,
    reduce_only: bool = False,
    client_id: str | None = None,
    slippage_bps: int | None = None,
) -> OrderResult

Place a new order.

Parameters:

Name Type Description Default
asset str

Asset symbol (e.g., "ETH", "BTC")

required
is_buy bool

True for buy, False for sell

required
size Decimal

Order size in asset units

required
price Decimal

Limit price (for market orders, used as slippage reference)

required
order_type HyperliquidOrderType

Order type (limit or market)

LIMIT
time_in_force HyperliquidTimeInForce

Time in force option

GTC
reduce_only bool

Whether order can only reduce position

False
client_id str | None

Optional client-assigned order ID

None
slippage_bps int | None

Slippage tolerance for market orders

None

Returns:

Type Description
OrderResult

OrderResult with order details

cancel_order

cancel_order(
    order_id: str | None = None,
    client_id: str | None = None,
    asset: str | None = None,
) -> CancelResult

Cancel an existing order.

Parameters:

Name Type Description Default
order_id str | None

Exchange-assigned order ID

None
client_id str | None

Client-assigned order ID

None
asset str | None

Asset symbol (required with client_id)

None

Returns:

Type Description
CancelResult

CancelResult indicating success/failure

cancel_all_orders

cancel_all_orders(asset: str | None = None) -> CancelResult

Cancel all open orders.

Parameters:

Name Type Description Default
asset str | None

Optional asset to filter by

None

Returns:

Type Description
CancelResult

CancelResult with list of cancelled orders

get_order

get_order(order_id: str) -> HyperliquidOrder | None

Get order by ID.

Parameters:

Name Type Description Default
order_id str

Order ID to look up

required

Returns:

Type Description
HyperliquidOrder | None

Order details or None if not found

get_open_orders

get_open_orders(
    asset: str | None = None,
) -> list[HyperliquidOrder]

Get all open orders.

Parameters:

Name Type Description Default
asset str | None

Optional asset to filter by

None

Returns:

Type Description
list[HyperliquidOrder]

List of open orders

get_position

get_position(asset: str) -> HyperliquidPosition | None

Get position for an asset.

Parameters:

Name Type Description Default
asset str

Asset symbol

required

Returns:

Type Description
HyperliquidPosition | None

Position details or None if no position

get_all_positions

get_all_positions() -> list[HyperliquidPosition]

Get all open positions.

Returns:

Type Description
list[HyperliquidPosition]

List of all positions with non-zero size

set_leverage

set_leverage(asset: str, leverage: int) -> bool

Set leverage for an asset.

Parameters:

Name Type Description Default
asset str

Asset symbol

required
leverage int

Target leverage (1-50)

required

Returns:

Type Description
bool

True if successful

get_leverage

get_leverage(asset: str) -> int

Get current leverage for an asset.

Parameters:

Name Type Description Default
asset str

Asset symbol

required

Returns:

Type Description
int

Current leverage setting (default 1)

set_position

set_position(position: HyperliquidPosition) -> None

Set a position for testing.

Parameters:

Name Type Description Default
position HyperliquidPosition

Position to set

required

clear_positions

clear_positions() -> None

Clear all positions.

clear_orders

clear_orders() -> None

Clear all orders.

clear_all

clear_all() -> None

Clear all state.

HyperliquidConfig dataclass

HyperliquidConfig(
    network: str,
    wallet_address: str,
    private_key: str | None = None,
    default_slippage_bps: int = 50,
    vault_address: str | None = None,
    agent_address: str | None = None,
)

Configuration for HyperliquidAdapter.

Attributes:

Name Type Description
network str

Target network (mainnet or testnet)

wallet_address str

Ethereum address for the account

private_key str | None

Private key for signing (optional, can use external signer)

default_slippage_bps int

Default slippage tolerance in basis points (default 50 = 0.5%)

vault_address str | None

Optional vault address for vault trading

agent_address str | None

Optional agent address for delegated trading

api_url property

api_url: str

Get API URL for configured network.

ws_url property

ws_url: str

Get WebSocket URL for configured network.

chain_id property

chain_id: int

Get chain ID for configured network.

eip712_domain property

eip712_domain: dict[str, Any]

Get EIP-712 domain for configured network.

__post_init__

__post_init__() -> None

Validate configuration.

to_dict

to_dict() -> dict[str, Any]

Convert to dictionary.

HyperliquidMarginMode

Bases: Enum

Margin mode options.

HyperliquidNetwork

Bases: Enum

Hyperliquid network environments.

HyperliquidOrder dataclass

HyperliquidOrder(
    order_id: str,
    client_id: str | None,
    asset: str,
    side: HyperliquidOrderSide,
    size: Decimal,
    price: Decimal,
    order_type: HyperliquidOrderType = HyperliquidOrderType.LIMIT,
    time_in_force: HyperliquidTimeInForce = HyperliquidTimeInForce.GTC,
    reduce_only: bool = False,
    status: HyperliquidOrderStatus = HyperliquidOrderStatus.OPEN,
    filled_size: Decimal = Decimal("0"),
    avg_fill_price: Decimal | None = None,
    created_at: datetime = (lambda: datetime.now(UTC))(),
    updated_at: datetime = (lambda: datetime.now(UTC))(),
)

Represents a Hyperliquid order.

Attributes:

Name Type Description
order_id str

Exchange-assigned order ID

client_id str | None

Client-assigned order ID (cloid)

asset str

Asset symbol

side HyperliquidOrderSide

Order side (buy/sell)

size Decimal

Order size

price Decimal

Limit price

order_type HyperliquidOrderType

Order type (limit/market)

time_in_force HyperliquidTimeInForce

Time in force option

reduce_only bool

Whether order can only reduce position

status HyperliquidOrderStatus

Current order status

filled_size Decimal

Amount already filled

avg_fill_price Decimal | None

Average fill price

created_at datetime

Order creation timestamp

updated_at datetime

Last update timestamp

remaining_size property

remaining_size: Decimal

Get remaining unfilled size.

is_buy property

is_buy: bool

Check if order is a buy.

is_sell property

is_sell: bool

Check if order is a sell.

is_open property

is_open: bool

Check if order is still open.

is_filled property

is_filled: bool

Check if order is fully filled.

fill_percentage property

fill_percentage: Decimal

Get fill percentage.

to_dict

to_dict() -> dict[str, Any]

Convert to dictionary.

from_dict classmethod

from_dict(data: dict[str, Any]) -> HyperliquidOrder

Create from dictionary.

HyperliquidOrderSide

Bases: Enum

Order side (buy/sell).

HyperliquidOrderStatus

Bases: Enum

Order status values.

HyperliquidOrderType

Bases: Enum

Hyperliquid order types.

HyperliquidPosition dataclass

HyperliquidPosition(
    asset: str,
    size: Decimal,
    entry_price: Decimal,
    mark_price: Decimal = Decimal("0"),
    liquidation_price: Decimal | None = None,
    unrealized_pnl: Decimal = Decimal("0"),
    realized_pnl: Decimal = Decimal("0"),
    margin_used: Decimal = Decimal("0"),
    leverage: Decimal = Decimal("1"),
    margin_mode: HyperliquidMarginMode = HyperliquidMarginMode.CROSS,
    max_leverage: int = 50,
    last_updated: datetime = (lambda: datetime.now(UTC))(),
)

Represents an open Hyperliquid position.

Attributes:

Name Type Description
asset str

Asset symbol (e.g., "ETH")

size Decimal

Position size (positive for long, negative for short)

entry_price Decimal

Average entry price

mark_price Decimal

Current mark price

liquidation_price Decimal | None

Estimated liquidation price

unrealized_pnl Decimal

Unrealized profit/loss

realized_pnl Decimal

Realized profit/loss

margin_used Decimal

Margin allocated to position

leverage Decimal

Current leverage

margin_mode HyperliquidMarginMode

Cross or isolated margin

max_leverage int

Maximum allowed leverage for asset

last_updated datetime

Timestamp of last update

side property

side: HyperliquidPositionSide

Get position side.

is_long property

is_long: bool

Check if position is long.

is_short property

is_short: bool

Check if position is short.

notional_value property

notional_value: Decimal

Get notional value of position.

net_pnl property

net_pnl: Decimal

Get net PnL (realized + unrealized).

to_dict

to_dict() -> dict[str, Any]

Convert to dictionary.

from_dict classmethod

from_dict(data: dict[str, Any]) -> HyperliquidPosition

Create from dictionary.

HyperliquidPositionSide

Bases: Enum

Position side (long/short).

HyperliquidTimeInForce

Bases: Enum

Time in force options for orders.

MessageSigner

Bases: Protocol

Protocol for message signing implementations.

sign_l1_action

sign_l1_action(
    action: dict[str, Any],
    nonce: int,
    vault_address: str | None = None,
) -> str

Sign an L1 action.

L1 actions are used for mainnet and include: - Order placement - Order cancellation - Withdrawal requests

Parameters:

Name Type Description Default
action dict[str, Any]

Action payload to sign

required
nonce int

Unique nonce for the action

required
vault_address str | None

Optional vault address

None

Returns:

Type Description
str

Hex-encoded signature

sign_l2_action

sign_l2_action(action: dict[str, Any], nonce: int) -> str

Sign an L2 action.

L2 actions are used for testnet and some mainnet operations. The signing scheme is slightly different from L1.

Parameters:

Name Type Description Default
action dict[str, Any]

Action payload to sign

required
nonce int

Unique nonce for the action

required

Returns:

Type Description
str

Hex-encoded signature

OrderResult dataclass

OrderResult(
    success: bool,
    order_id: str | None = None,
    client_id: str | None = None,
    order: HyperliquidOrder | None = None,
    error: str | None = None,
    response: dict[str, Any] | None = None,
)

Result of placing or canceling an order.

Attributes:

Name Type Description
success bool

Whether operation succeeded

order_id str | None

Order ID if successful

client_id str | None

Client-assigned order ID

order HyperliquidOrder | None

Created/affected order object

error str | None

Error message if failed

response dict[str, Any] | None

Raw API response

to_dict

to_dict() -> dict[str, Any]

Convert to dictionary.

SignedAction dataclass

SignedAction(
    action: dict[str, Any],
    signature: str,
    nonce: int,
    vault_address: str | None = None,
)

A signed action ready for submission to Hyperliquid.

Attributes:

Name Type Description
action dict[str, Any]

The action payload

signature str

EIP-712 signature

nonce int

Nonce used for signing

vault_address str | None

Optional vault address

to_dict

to_dict() -> dict[str, Any]

Convert to dictionary.