Skip to content

Exchange

Signed exchange-action client.

agent_enable_dex_abstraction

Enable HIP-3 DEX abstraction (agent, deprecated).

References
Source code in pkg/src/hyperliquid/exchange/agent_enable_dex_abstraction.py
async def agent_enable_dex_abstraction(self) -> ExchangeResponse[DefaultResponse]:
  """Enable HIP-3 DEX abstraction (agent, deprecated).

  References:
    - [Hyperliquid API docs](https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/exchange-endpoint#enable-hip-3-dex-abstraction-agent)
  """
  action: AgentEnableDexAbstractionAction = {'type': 'agentEnableDexAbstraction'}
  ts = timestamp.now()
  sig = sign_l1_action(
    action,
    wallet=self.wallet,
    nonce=ts,
    mainnet=self.mainnet,
  )
  result = await self.client.request({
    'action': action,
    'nonce': ts,
    'signature': sig,
    'vaultAddress': None,
    'expiresAfter': None,
  })
  return adapter.validate_python(result) if self.validate else result

agent_set_abstraction

Set user abstraction (agent).

Parameters:

Name Type Description Default
abstraction AgentAbstraction

Agent abstraction mode to set.

required
References
Source code in pkg/src/hyperliquid/exchange/agent_set_abstraction.py
async def agent_set_abstraction(self, abstraction: AgentAbstraction) -> ExchangeResponse[DefaultResponse]:
  """Set user abstraction (agent).

  Args:
    abstraction: Agent abstraction mode to set.

  References:
    - [Hyperliquid API docs](https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/exchange-endpoint#set-user-abstraction-agent)
  """
  action: AgentSetAbstractionAction = {
    'type': 'agentSetAbstraction',
    'abstraction': abstraction,
  }
  ts = timestamp.now()
  sig = sign_l1_action(
    action,
    wallet=self.wallet,
    nonce=ts,
    mainnet=self.mainnet,
  )
  result = await self.client.request({
    'action': action,
    'nonce': ts,
    'signature': sig,
    'vaultAddress': None,
    'expiresAfter': None,
  })
  return adapter.validate_python(result) if self.validate else result

approve_agent

Approve an API wallet (agent).

Parameters:

Name Type Description Default
agent_address str

API wallet address to approve.

required
signature_chain_id str

Chain id used for the user-signed action.

required
agent_name str | None

Optional display name for the API wallet.

None
nonce int | None

Optional action nonce. Defaults to the current timestamp.

None
References
Source code in pkg/src/hyperliquid/exchange/approve_agent.py
async def approve_agent(
  self, *, agent_address: str,
  signature_chain_id: str,
  agent_name: str | None = None,
  nonce: int | None = None,
) -> ExchangeResponse[DefaultResponse]:
  """Approve an API wallet (agent).

  Args:
    agent_address: API wallet address to approve.
    signature_chain_id: Chain id used for the user-signed action.
    agent_name: Optional display name for the API wallet.
    nonce: Optional action nonce. Defaults to the current timestamp.

  References:
    - [Hyperliquid API docs](https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/exchange-endpoint#approve-an-api-wallet)
  """
  ts = timestamp.now() if nonce is None else nonce
  action: ApproveAgentAction = {
    'type': 'approveAgent',
    'signatureChainId': signature_chain_id,
    'agentAddress': agent_address,
    'nonce': ts,
  }
  if agent_name is not None:
    action['agentName'] = agent_name
  sig = sign_user_signed_action(
    action,
    wallet=self.wallet,
    payload_types=[
      {'name': 'hyperliquidChain', 'type': 'string'},
      {'name': 'agentAddress', 'type': 'address'},
      {'name': 'agentName', 'type': 'string'},
      {'name': 'nonce', 'type': 'uint64'},
    ],
    primary_type='HyperliquidTransaction:ApproveAgent',
    mainnet=self.mainnet,
  )
  result = await self.client.request({
    'action': action,
    'nonce': ts,
    'signature': sig,
    'vaultAddress': None,
    'expiresAfter': None,
  })
  return adapter.validate_python(result) if self.validate else result

approve_builder_fee

Approve a maximum builder fee rate.

Parameters:

Name Type Description Default
max_fee_rate str

Maximum fee rate to approve.

required
builder str

Builder address.

required
signature_chain_id str

Chain id used for the user-signed action.

required
nonce int | None

Optional action nonce. Defaults to the current timestamp.

None
References
Source code in pkg/src/hyperliquid/exchange/approve_builder_fee.py
async def approve_builder_fee(
  self, *, max_fee_rate: str, builder: str,
  signature_chain_id: str,
  nonce: int | None = None,
) -> ExchangeResponse[DefaultResponse]:
  """Approve a maximum builder fee rate.

  Args:
    max_fee_rate: Maximum fee rate to approve.
    builder: Builder address.
    signature_chain_id: Chain id used for the user-signed action.
    nonce: Optional action nonce. Defaults to the current timestamp.

  References:
    - [Hyperliquid API docs](https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/exchange-endpoint#approve-a-builder-fee)
  """
  ts = timestamp.now() if nonce is None else nonce
  action: ApproveBuilderFeeAction = {
    'type': 'approveBuilderFee',
    'signatureChainId': signature_chain_id,
    'maxFeeRate': max_fee_rate,
    'builder': builder,
    'nonce': ts,
  }
  sig = sign_user_signed_action(
    action,
    wallet=self.wallet,
    payload_types=[
      {'name': 'hyperliquidChain', 'type': 'string'},
      {'name': 'maxFeeRate', 'type': 'string'},
      {'name': 'builder', 'type': 'address'},
      {'name': 'nonce', 'type': 'uint64'},
    ],
    primary_type='HyperliquidTransaction:ApproveBuilderFee',
    mainnet=self.mainnet,
  )
  result = await self.client.request({
    'action': action,
    'nonce': ts,
    'signature': sig,
    'vaultAddress': None,
    'expiresAfter': None,
  })
  return adapter.validate_python(result) if self.validate else result

cancel

Cancel one or more orders.

Parameters:

Name Type Description Default
cancels Cancel

Cancel wire objects with asset + order id.

()
vault_address str | None

Optional vault address for the signed action.

None
expires_after int | None

Optional expiration timestamp for the signed action.

None
References
Source code in pkg/src/hyperliquid/exchange/cancel.py
async def cancel(
  self, *cancels: Cancel,
  vault_address: str | None = None,
  expires_after: int | None = None,
) -> ExchangeResponse[CancelResponse]:
  """Cancel one or more orders.

  Args:
    cancels: Cancel wire objects with asset + order id.
    vault_address: Optional vault address for the signed action.
    expires_after: Optional expiration timestamp for the signed action.

  References:
    - [Hyperliquid API docs](https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/exchange-endpoint#cancel-order-s)
  """
  action = {
    'type': 'cancel',
    'cancels': cancels,
  }
  ts = timestamp.now()
  sig = sign_l1_action(
    action,
    wallet=self.wallet,
    nonce=ts,
    mainnet=self.mainnet,
    vault_address=vault_address,
    expires_after=expires_after,
  )
  result = await self.client.request({
    'action': action,
    'nonce': ts,
    'signature': sig,
    'vaultAddress': vault_address,
    'expiresAfter': expires_after,
  })
  return adapter.validate_python(result) if self.validate else result

cancel_by_cloid

Cancel one or more orders by cloid.

Parameters:

Name Type Description Default
cancels CancelByCloid

Cancel wire objects with asset + cloid.

()
vault_address str | None

Optional vault address for the signed action.

None
expires_after int | None

Optional expiration timestamp for the signed action.

None
References
Source code in pkg/src/hyperliquid/exchange/cancel_by_cloid.py
async def cancel_by_cloid(
  self, *cancels: CancelByCloid,
  vault_address: str | None = None,
  expires_after: int | None = None,
) -> ExchangeResponse[CancelByCloidResponse]:
  """Cancel one or more orders by cloid.

  Args:
    cancels: Cancel wire objects with asset + cloid.
    vault_address: Optional vault address for the signed action.
    expires_after: Optional expiration timestamp for the signed action.

  References:
    - [Hyperliquid API docs](https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/exchange-endpoint#cancel-order-s-by-cloid)
  """
  action = {
    'type': 'cancelByCloid',
    'cancels': cancels,
  }
  ts = timestamp.now()
  sig = sign_l1_action(
    action,
    wallet=self.wallet,
    nonce=ts,
    mainnet=self.mainnet,
    vault_address=vault_address,
    expires_after=expires_after,
  )
  result = await self.client.request({
    'action': action,
    'nonce': ts,
    'signature': sig,
    'vaultAddress': vault_address,
    'expiresAfter': expires_after,
  })
  return adapter.validate_python(result) if self.validate else result

modify_order

Modify a single order.

Parameters:

Name Type Description Default
oid int | str

Order id or cloid.

required
order Order

Order wire object.

required
vault_address str | None

Optional vault address for the signed action.

None
expires_after int | None

Optional expiration timestamp for the signed action.

None
References
Source code in pkg/src/hyperliquid/exchange/modify_order.py
async def modify_order(
  self, oid: int | str, order: Order,
  vault_address: str | None = None,
  expires_after: int | None = None,
) -> ExchangeResponse[DefaultResponse]:
  """Modify a single order.

  Args:
    oid: Order id or cloid.
    order: Order wire object.
    vault_address: Optional vault address for the signed action.
    expires_after: Optional expiration timestamp for the signed action.

  References:
    - [Hyperliquid API docs](https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/exchange-endpoint#modify-an-order)
  """
  action: ModifyOrderAction = {
    'type': 'modify',
    'oid': oid,
    'order': order,
  }
  ts = timestamp.now()
  sig = sign_l1_action(
    action,
    wallet=self.wallet,
    nonce=ts,
    mainnet=self.mainnet,
    vault_address=vault_address,
    expires_after=expires_after,
  )
  result = await self.client.request({
    'action': action,
    'nonce': ts,
    'signature': sig,
    'vaultAddress': vault_address,
    'expiresAfter': expires_after,
  })
  return adapter.validate_python(result) if self.validate else result

modify_orders

Modify multiple orders.

Parameters:

Name Type Description Default
modifies Modify

Modify wire objects.

()
vault_address str | None

Optional vault address for the signed action.

None
expires_after int | None

Optional expiration timestamp for the signed action.

None
References
Source code in pkg/src/hyperliquid/exchange/modify_orders.py
async def modify_orders(
  self, *modifies: Modify,
  vault_address: str | None = None,
  expires_after: int | None = None,
) -> ExchangeResponse[DefaultResponse]:
  """Modify multiple orders.

  Args:
    modifies: Modify wire objects.
    vault_address: Optional vault address for the signed action.
    expires_after: Optional expiration timestamp for the signed action.

  References:
    - [Hyperliquid API docs](https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/exchange-endpoint#modify-multiple-orders)
  """
  action: BatchModifyAction = {
    'type': 'batchModify',
    'modifies': list(modifies),
  }
  ts = timestamp.now()
  sig = sign_l1_action(
    action,
    wallet=self.wallet,
    nonce=ts,
    mainnet=self.mainnet,
    vault_address=vault_address,
    expires_after=expires_after,
  )
  result = await self.client.request({
    'action': action,
    'nonce': ts,
    'signature': sig,
    'vaultAddress': vault_address,
    'expiresAfter': expires_after,
  })
  return adapter.validate_python(result) if self.validate else result

noop

Invalidate a pending nonce (noop).

Parameters:

Name Type Description Default
expires_after int | None

Optional expiration timestamp for the signed action.

None
References
Source code in pkg/src/hyperliquid/exchange/noop.py
async def noop(self, *, expires_after: int | None = None) -> ExchangeResponse[DefaultResponse]:
  """Invalidate a pending nonce (noop).

  Args:
    expires_after: Optional expiration timestamp for the signed action.

  References:
    - [Hyperliquid API docs](https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/exchange-endpoint#invalidate-pending-nonce-noop)
  """
  action: NoopAction = {'type': 'noop'}
  ts = timestamp.now()
  sig = sign_l1_action(
    action,
    wallet=self.wallet,
    nonce=ts,
    mainnet=self.mainnet,
    vault_address=None,
    expires_after=expires_after,
  )
  result = await self.client.request({
    'action': action,
    'nonce': ts,
    'signature': sig,
    'vaultAddress': None,
    'expiresAfter': expires_after,
  })
  return adapter.validate_python(result) if self.validate else result

order

Place one or more orders.

Parameters:

Name Type Description Default
orders Order

Order wire objects.

()
grouping Grouping

Grouping mode for normal or TPSL orders.

'na'
builder BuilderInfo | None

Optional builder fee information.

None
vault_address str | None

Optional vault address for the signed action.

None
expires_after int | None

Optional expiration timestamp for the signed action.

None
References
Source code in pkg/src/hyperliquid/exchange/order.py
async def order(
  self, *orders: Order, grouping: Grouping = 'na',
  builder: BuilderInfo | None = None,
  vault_address: str | None = None,
  expires_after: int | None = None,
) -> ExchangeResponse[OrderResponse]:
  """Place one or more orders.

  Args:
    orders: Order wire objects.
    grouping: Grouping mode for normal or TPSL orders.
    builder: Optional builder fee information.
    vault_address: Optional vault address for the signed action.
    expires_after: Optional expiration timestamp for the signed action.

  References:
    - [Hyperliquid API docs](https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/exchange-endpoint#place-an-order)
  """
  action = {
    'type': 'order',
    'orders': [reorder(order) for order in orders],
    'grouping': grouping,
  }
  if builder:
    action['builder'] = builder
  ts = timestamp.now()
  sig = sign_l1_action(
    action,
    wallet=self.wallet,
    nonce=ts,
    mainnet=self.mainnet,
    vault_address=vault_address,
    expires_after=expires_after,
  )
  result = await self.client.request({
    'action': action,
    'nonce': ts,
    'signature': sig,
    'vaultAddress': vault_address,
    'expiresAfter': expires_after,
  })
  return adapter.validate_python(result) if self.validate else result

reserve_request_weight

Reserve additional actions.

Parameters:

Name Type Description Default
weight int

Additional request weight to reserve.

required
expires_after int | None

Optional expiration timestamp for the signed action.

None
References
Source code in pkg/src/hyperliquid/exchange/reserve_request_weight.py
async def reserve_request_weight(
  self, *, weight: int,
  expires_after: int | None = None,
) -> ExchangeResponse[DefaultResponse]:
  """Reserve additional actions.

  Args:
    weight: Additional request weight to reserve.
    expires_after: Optional expiration timestamp for the signed action.

  References:
    - [Hyperliquid API docs](https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/exchange-endpoint#reserve-additional-actions)
  """
  action: ReserveRequestWeightAction = {
    'type': 'reserveRequestWeight',
    'weight': weight,
  }
  ts = timestamp.now()
  sig = sign_l1_action(
    action,
    wallet=self.wallet,
    nonce=ts,
    mainnet=self.mainnet,
    vault_address=None,
    expires_after=expires_after,
  )
  result = await self.client.request({
    'action': action,
    'nonce': ts,
    'signature': sig,
    'vaultAddress': None,
    'expiresAfter': expires_after,
  })
  return adapter.validate_python(result) if self.validate else result

schedule_cancel

Schedule a cancel-all operation.

Parameters:

Name Type Description Default
time int | None

UTC millis when all open orders should be canceled. If None, removes the scheduled cancel operation.

None
vault_address str | None

Optional vault address for the signed action.

None
expires_after int | None

Optional expiration timestamp for the signed action.

None
References
Source code in pkg/src/hyperliquid/exchange/schedule_cancel.py
async def schedule_cancel(
  self, time: int | None = None,
  vault_address: str | None = None,
  expires_after: int | None = None,
) -> ExchangeResponse[DefaultResponse]:
  """Schedule a cancel-all operation.

  Args:
    time: UTC millis when all open orders should be canceled. If `None`,
      removes the scheduled cancel operation.
    vault_address: Optional vault address for the signed action.
    expires_after: Optional expiration timestamp for the signed action.

  References:
    - [Hyperliquid API docs](https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/exchange-endpoint#schedule-cancel-dead-man-s-switch)
  """
  action: ScheduleCancelAction = {'type': 'scheduleCancel'}
  if time is not None:
    action['time'] = time
  ts = timestamp.now()
  sig = sign_l1_action(
    action,
    wallet=self.wallet,
    nonce=ts,
    mainnet=self.mainnet,
    vault_address=vault_address,
    expires_after=expires_after,
  )
  result = await self.client.request({
    'action': action,
    'nonce': ts,
    'signature': sig,
    'vaultAddress': vault_address,
    'expiresAfter': expires_after,
  })
  return adapter.validate_python(result) if self.validate else result

send_asset

Send assets between DEXs, spot, users, or subaccounts.

Parameters:

Name Type Description Default
destination str

Destination user, subaccount, spot account, or DEX address.

required
source_dex str

Source DEX name. Use an empty string for the main DEX.

required
destination_dex str

Destination DEX name. Use an empty string for the main DEX.

required
token str

Token symbol or token id to send.

required
amount str

Decimal amount string.

required
from_subaccount str

Source subaccount name, or empty string for the main account.

required
signature_chain_id str

Chain id used for the user-signed action.

required
nonce int | None

Optional action nonce. Defaults to the current timestamp.

None
References
Source code in pkg/src/hyperliquid/exchange/send_asset.py
async def send_asset(
  self, *, destination: str, source_dex: str, destination_dex: str,
  token: str, amount: str, from_subaccount: str,
  signature_chain_id: str,
  nonce: int | None = None,
) -> ExchangeResponse[DefaultResponse]:
  """Send assets between DEXs, spot, users, or subaccounts.

  Args:
    destination: Destination user, subaccount, spot account, or DEX address.
    source_dex: Source DEX name. Use an empty string for the main DEX.
    destination_dex: Destination DEX name. Use an empty string for the main DEX.
    token: Token symbol or token id to send.
    amount: Decimal amount string.
    from_subaccount: Source subaccount name, or empty string for the main account.
    signature_chain_id: Chain id used for the user-signed action.
    nonce: Optional action nonce. Defaults to the current timestamp.

  References:
    - [Hyperliquid API docs](https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/exchange-endpoint#send-asset)
  """
  ts = timestamp.now() if nonce is None else nonce
  action: SendAssetAction = {
    'type': 'sendAsset',
    'signatureChainId': signature_chain_id,
    'destination': destination,
    'sourceDex': source_dex,
    'destinationDex': destination_dex,
    'token': token,
    'amount': amount,
    'fromSubAccount': from_subaccount,
    'nonce': ts,
  }
  sig = sign_user_signed_action(
    action,
    wallet=self.wallet,
    payload_types=[
      {'name': 'hyperliquidChain', 'type': 'string'},
      {'name': 'destination', 'type': 'string'},
      {'name': 'sourceDex', 'type': 'string'},
      {'name': 'destinationDex', 'type': 'string'},
      {'name': 'token', 'type': 'string'},
      {'name': 'amount', 'type': 'string'},
      {'name': 'fromSubAccount', 'type': 'string'},
      {'name': 'nonce', 'type': 'uint64'},
    ],
    primary_type='HyperliquidTransaction:SendAsset',
    mainnet=self.mainnet,
  )
  result = await self.client.request({
    'action': action,
    'nonce': ts,
    'signature': sig,
    'vaultAddress': None,
    'expiresAfter': None,
  })
  return adapter.validate_python(result) if self.validate else result

send_to_evm_with_data

Send to EVM with data payload.

Parameters:

Name Type Description Default
token str

Token symbol or token id to send.

required
amount str

Decimal amount string.

required
source_dex str

Source DEX name. Use an empty string for the main DEX.

required
destination_recipient str

Recipient on the destination EVM chain.

required
address_encoding Literal['hex', 'base58']

Encoding used for the destination recipient.

required
destination_chain_id int

Destination EVM chain id.

required
gas_limit int

Gas limit for the destination call.

required
data str

Hex-encoded calldata.

required
signature_chain_id str

Chain id used for the user-signed action.

required
nonce int | None

Optional action nonce. Defaults to the current timestamp.

None
References
Source code in pkg/src/hyperliquid/exchange/send_to_evm_with_data.py
async def send_to_evm_with_data(
  self, *, token: str, amount: str, source_dex: str,
  destination_recipient: str, address_encoding: Literal['hex', 'base58'],
  destination_chain_id: int, gas_limit: int, data: str,
  signature_chain_id: str,
  nonce: int | None = None,
) -> ExchangeResponse[DefaultResponse]:
  """Send to EVM with data payload.

  Args:
    token: Token symbol or token id to send.
    amount: Decimal amount string.
    source_dex: Source DEX name. Use an empty string for the main DEX.
    destination_recipient: Recipient on the destination EVM chain.
    address_encoding: Encoding used for the destination recipient.
    destination_chain_id: Destination EVM chain id.
    gas_limit: Gas limit for the destination call.
    data: Hex-encoded calldata.
    signature_chain_id: Chain id used for the user-signed action.
    nonce: Optional action nonce. Defaults to the current timestamp.

  References:
    - [Hyperliquid API docs](https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/exchange-endpoint#send-to-evm-with-data)
  """
  ts = timestamp.now() if nonce is None else nonce
  action: SendToEvmWithDataAction = {
    'type': 'sendToEvmWithData',
    'signatureChainId': signature_chain_id,
    'token': token,
    'amount': amount,
    'sourceDex': source_dex,
    'destinationRecipient': destination_recipient,
    'addressEncoding': address_encoding,
    'destinationChainId': destination_chain_id,
    'gasLimit': gas_limit,
    'data': data,
    'nonce': ts,
  }
  sig = sign_user_signed_action(
    action,
    wallet=self.wallet,
    payload_types=[
      {'name': 'hyperliquidChain', 'type': 'string'},
      {'name': 'token', 'type': 'string'},
      {'name': 'amount', 'type': 'string'},
      {'name': 'sourceDex', 'type': 'string'},
      {'name': 'destinationRecipient', 'type': 'string'},
      {'name': 'addressEncoding', 'type': 'string'},
      {'name': 'destinationChainId', 'type': 'uint64'},
      {'name': 'gasLimit', 'type': 'uint64'},
      {'name': 'data', 'type': 'bytes'},
      {'name': 'nonce', 'type': 'uint64'},
    ],
    primary_type='HyperliquidTransaction:SendToEvmWithData',
    mainnet=self.mainnet,
  )
  result = await self.client.request({
    'action': action,
    'nonce': ts,
    'signature': sig,
    'vaultAddress': None,
    'expiresAfter': None,
  })
  return adapter.validate_python(result) if self.validate else result

spot_transfer

Core spot transfer.

Parameters:

Name Type Description Default
destination str

Destination address.

required
token str

Spot token to transfer.

required
amount str

Decimal amount string.

required
signature_chain_id str

Chain id used for the user-signed action.

required
time int | None

Optional action timestamp. Defaults to the current timestamp.

None
References
Source code in pkg/src/hyperliquid/exchange/spot_transfer.py
async def spot_transfer(
  self, *, destination: str, token: str, amount: str,
  signature_chain_id: str,
  time: int | None = None,
) -> ExchangeResponse[DefaultResponse]:
  """Core spot transfer.

  Args:
    destination: Destination address.
    token: Spot token to transfer.
    amount: Decimal amount string.
    signature_chain_id: Chain id used for the user-signed action.
    time: Optional action timestamp. Defaults to the current timestamp.

  References:
    - [Hyperliquid API docs](https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/exchange-endpoint#core-spot-transfer)
  """
  ts = timestamp.now()
  action: SpotSendAction = {
    'type': 'spotSend',
    'signatureChainId': signature_chain_id,
    'destination': destination,
    'token': token,
    'amount': amount,
    'time': ts if time is None else time,
  }
  sig = sign_user_signed_action(
    action,
    wallet=self.wallet,
    payload_types=[
      {'name': 'hyperliquidChain', 'type': 'string'},
      {'name': 'destination', 'type': 'string'},
      {'name': 'token', 'type': 'string'},
      {'name': 'amount', 'type': 'string'},
      {'name': 'time', 'type': 'uint64'},
    ],
    primary_type='HyperliquidTransaction:SpotSend',
    mainnet=self.mainnet,
  )
  result = await self.client.request({
    'action': action,
    'nonce': ts,
    'signature': sig,
    'vaultAddress': None,
    'expiresAfter': None,
  })
  return adapter.validate_python(result) if self.validate else result

staking_deposit

Deposit native token into staking.

Parameters:

Name Type Description Default
wei int

Amount to deposit in wei.

required
signature_chain_id str

Chain id used for the user-signed action.

required
nonce int | None

Optional action nonce. Defaults to the current timestamp.

None
References
Source code in pkg/src/hyperliquid/exchange/staking_deposit.py
async def staking_deposit(
  self, *, wei: int,
  signature_chain_id: str,
  nonce: int | None = None,
) -> ExchangeResponse[DefaultResponse]:
  """Deposit native token into staking.

  Args:
    wei: Amount to deposit in wei.
    signature_chain_id: Chain id used for the user-signed action.
    nonce: Optional action nonce. Defaults to the current timestamp.

  References:
    - [Hyperliquid API docs](https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/exchange-endpoint#deposit-into-staking)
  """
  ts = timestamp.now() if nonce is None else nonce
  action: CDepositAction = {
    'type': 'cDeposit',
    'signatureChainId': signature_chain_id,
    'wei': wei,
    'nonce': ts,
  }
  sig = sign_user_signed_action(
    action,
    wallet=self.wallet,
    payload_types=[
      {'name': 'hyperliquidChain', 'type': 'string'},
      {'name': 'wei', 'type': 'uint64'},
      {'name': 'nonce', 'type': 'uint64'},
    ],
    primary_type='HyperliquidTransaction:Deposit',
    mainnet=self.mainnet,
  )
  result = await self.client.request({
    'action': action,
    'nonce': ts,
    'signature': sig,
    'vaultAddress': None,
    'expiresAfter': None,
  })
  return adapter.validate_python(result) if self.validate else result

staking_withdraw

Withdraw native token from staking.

Parameters:

Name Type Description Default
wei int

Amount to withdraw in wei.

required
signature_chain_id str

Chain id used for the user-signed action.

required
nonce int | None

Optional action nonce. Defaults to the current timestamp.

None
References
Source code in pkg/src/hyperliquid/exchange/staking_withdraw.py
async def staking_withdraw(
  self, *, wei: int,
  signature_chain_id: str,
  nonce: int | None = None,
) -> ExchangeResponse[DefaultResponse]:
  """Withdraw native token from staking.

  Args:
    wei: Amount to withdraw in wei.
    signature_chain_id: Chain id used for the user-signed action.
    nonce: Optional action nonce. Defaults to the current timestamp.

  References:
    - [Hyperliquid API docs](https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/exchange-endpoint#withdraw-from-staking)
  """
  ts = timestamp.now() if nonce is None else nonce
  action: CWithdrawAction = {
    'type': 'cWithdraw',
    'signatureChainId': signature_chain_id,
    'wei': wei,
    'nonce': ts,
  }
  sig = sign_user_signed_action(
    action,
    wallet=self.wallet,
    payload_types=[
      {'name': 'hyperliquidChain', 'type': 'string'},
      {'name': 'wei', 'type': 'uint64'},
      {'name': 'nonce', 'type': 'uint64'},
    ],
    primary_type='HyperliquidTransaction:WithdrawFromStaking',
    mainnet=self.mainnet,
  )
  result = await self.client.request({
    'action': action,
    'nonce': ts,
    'signature': sig,
    'vaultAddress': None,
    'expiresAfter': None,
  })
  return adapter.validate_python(result) if self.validate else result

token_delegate

Delegate or undelegate stake to a validator.

Parameters:

Name Type Description Default
validator str

Validator address.

required
is_undelegate bool

Whether to undelegate instead of delegate.

required
wei int

Stake amount in wei.

required
signature_chain_id str

Chain id used for the user-signed action.

required
nonce int | None

Optional action nonce. Defaults to the current timestamp.

None
References
Source code in pkg/src/hyperliquid/exchange/token_delegate.py
async def token_delegate(
  self, *, validator: str, is_undelegate: bool, wei: int,
  signature_chain_id: str,
  nonce: int | None = None,
) -> ExchangeResponse[DefaultResponse]:
  """Delegate or undelegate stake to a validator.

  Args:
    validator: Validator address.
    is_undelegate: Whether to undelegate instead of delegate.
    wei: Stake amount in wei.
    signature_chain_id: Chain id used for the user-signed action.
    nonce: Optional action nonce. Defaults to the current timestamp.

  References:
    - [Hyperliquid API docs](https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/exchange-endpoint#delegate-or-undelegate-stake-from-validator)
  """
  ts = timestamp.now() if nonce is None else nonce
  action: TokenDelegateAction = {
    'type': 'tokenDelegate',
    'signatureChainId': signature_chain_id,
    'validator': validator,
    'isUndelegate': is_undelegate,
    'wei': wei,
    'nonce': ts,
  }
  sig = sign_user_signed_action(
    action,
    wallet=self.wallet,
    payload_types=[
      {'name': 'hyperliquidChain', 'type': 'string'},
      {'name': 'validator', 'type': 'address'},
      {'name': 'wei', 'type': 'uint64'},
      {'name': 'isUndelegate', 'type': 'bool'},
      {'name': 'nonce', 'type': 'uint64'},
    ],
    primary_type='HyperliquidTransaction:TokenDelegate',
    mainnet=self.mainnet,
  )
  result = await self.client.request({
    'action': action,
    'nonce': ts,
    'signature': sig,
    'vaultAddress': None,
    'expiresAfter': None,
  })
  return adapter.validate_python(result) if self.validate else result

twap_cancel

Cancel a TWAP order.

Parameters:

Name Type Description Default
asset int

Asset index.

required
twap_id int

TWAP order id.

required
vault_address str | None

Optional vault address for the signed action.

None
expires_after int | None

Optional expiration timestamp for the signed action.

None
References
Source code in pkg/src/hyperliquid/exchange/twap_cancel.py
async def twap_cancel(
  self, *, asset: int, twap_id: int,
  vault_address: str | None = None,
  expires_after: int | None = None,
) -> ExchangeResponse[TwapCancelResponse]:
  """Cancel a TWAP order.

  Args:
    asset: Asset index.
    twap_id: TWAP order id.
    vault_address: Optional vault address for the signed action.
    expires_after: Optional expiration timestamp for the signed action.

  References:
    - [Hyperliquid API docs](https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/exchange-endpoint#cancel-a-twap-order)
  """
  action: TwapCancelAction = {
    'type': 'twapCancel',
    'a': asset,
    't': twap_id,
  }
  ts = timestamp.now()
  sig = sign_l1_action(
    action,
    wallet=self.wallet,
    nonce=ts,
    mainnet=self.mainnet,
    vault_address=vault_address,
    expires_after=expires_after,
  )
  result = await self.client.request({
    'action': action,
    'nonce': ts,
    'signature': sig,
    'vaultAddress': vault_address,
    'expiresAfter': expires_after,
  })
  return adapter.validate_python(result) if self.validate else result

twap_order

Place a TWAP order.

Parameters:

Name Type Description Default
twap TwapWire

TWAP order wire object.

required
vault_address str | None

Optional vault address for the signed action.

None
expires_after int | None

Optional expiration timestamp for the signed action.

None
References
Source code in pkg/src/hyperliquid/exchange/twap_order.py
async def twap_order(
  self, twap: TwapWire,
  vault_address: str | None = None,
  expires_after: int | None = None,
) -> ExchangeResponse[TwapOrderResponse]:
  """Place a TWAP order.

  Args:
    twap: TWAP order wire object.
    vault_address: Optional vault address for the signed action.
    expires_after: Optional expiration timestamp for the signed action.

  References:
    - [Hyperliquid API docs](https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/exchange-endpoint#place-a-twap-order)
  """
  action: TwapOrderAction = {
    'type': 'twapOrder',
    'twap': twap,
  }
  ts = timestamp.now()
  sig = sign_l1_action(
    action,
    wallet=self.wallet,
    nonce=ts,
    mainnet=self.mainnet,
    vault_address=vault_address,
    expires_after=expires_after,
  )
  result = await self.client.request({
    'action': action,
    'nonce': ts,
    'signature': sig,
    'vaultAddress': vault_address,
    'expiresAfter': expires_after,
  })
  return adapter.validate_python(result) if self.validate else result

update_isolated_margin

Add or remove margin from an isolated position.

Parameters:

Name Type Description Default
asset int

Asset index.

required
is_buy bool

Position side; true for long, false for short.

required
ntli int

Margin delta in native token lots.

required
vault_address str | None

Optional vault address for the signed action.

None
expires_after int | None

Optional expiration timestamp for the signed action.

None
References
Source code in pkg/src/hyperliquid/exchange/update_isolated_margin.py
async def update_isolated_margin(
  self, *, asset: int, is_buy: bool, ntli: int,
  vault_address: str | None = None,
  expires_after: int | None = None,
) -> ExchangeResponse[DefaultResponse]:
  """Add or remove margin from an isolated position.

  Args:
    asset: Asset index.
    is_buy: Position side; true for long, false for short.
    ntli: Margin delta in native token lots.
    vault_address: Optional vault address for the signed action.
    expires_after: Optional expiration timestamp for the signed action.

  References:
    - [Hyperliquid API docs](https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/exchange-endpoint#update-isolated-margin)
  """
  action: UpdateIsolatedMarginAction = {
    'type': 'updateIsolatedMargin',
    'asset': asset,
    'isBuy': is_buy,
    'ntli': ntli,
  }
  ts = timestamp.now()
  sig = sign_l1_action(
    action,
    wallet=self.wallet,
    nonce=ts,
    mainnet=self.mainnet,
    vault_address=vault_address,
    expires_after=expires_after,
  )
  result = await self.client.request({
    'action': action,
    'nonce': ts,
    'signature': sig,
    'vaultAddress': vault_address,
    'expiresAfter': expires_after,
  })
  return adapter.validate_python(result) if self.validate else result

top_up_isolated_only_margin

Target leverage for isolated margin with an alternate action.

Parameters:

Name Type Description Default
asset int

Asset index.

required
leverage str

Target leverage as a decimal string.

required
vault_address str | None

Optional vault address for the signed action.

None
expires_after int | None

Optional expiration timestamp for the signed action.

None
References
Source code in pkg/src/hyperliquid/exchange/update_isolated_margin.py
async def top_up_isolated_only_margin(
  self, *, asset: int, leverage: str,
  vault_address: str | None = None,
  expires_after: int | None = None,
) -> ExchangeResponse[DefaultResponse]:
  """Target leverage for isolated margin with an alternate action.

  Args:
    asset: Asset index.
    leverage: Target leverage as a decimal string.
    vault_address: Optional vault address for the signed action.
    expires_after: Optional expiration timestamp for the signed action.

  References:
    - [Hyperliquid API docs](https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/exchange-endpoint#update-isolated-margin)
  """
  action: TopUpIsolatedOnlyMarginAction = {
    'type': 'topUpIsolatedOnlyMargin',
    'asset': asset,
    'leverage': leverage,
  }
  ts = timestamp.now()
  sig = sign_l1_action(
    action,
    wallet=self.wallet,
    nonce=ts,
    mainnet=self.mainnet,
    vault_address=vault_address,
    expires_after=expires_after,
  )
  result = await self.client.request({
    'action': action,
    'nonce': ts,
    'signature': sig,
    'vaultAddress': vault_address,
    'expiresAfter': expires_after,
  })
  return adapter.validate_python(result) if self.validate else result

update_leverage

Update cross or isolated leverage.

Parameters:

Name Type Description Default
asset int

Asset index.

required
is_cross bool

Whether to use cross margin.

required
leverage int

Target leverage.

required
vault_address str | None

Optional vault address for the signed action.

None
expires_after int | None

Optional expiration timestamp for the signed action.

None
References
Source code in pkg/src/hyperliquid/exchange/update_leverage.py
async def update_leverage(
  self, *, asset: int, is_cross: bool, leverage: int,
  vault_address: str | None = None,
  expires_after: int | None = None,
) -> ExchangeResponse[DefaultResponse]:
  """Update cross or isolated leverage.

  Args:
    asset: Asset index.
    is_cross: Whether to use cross margin.
    leverage: Target leverage.
    vault_address: Optional vault address for the signed action.
    expires_after: Optional expiration timestamp for the signed action.

  References:
    - [Hyperliquid API docs](https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/exchange-endpoint#update-leverage)
  """
  action: UpdateLeverageAction = {
    'type': 'updateLeverage',
    'asset': asset,
    'isCross': is_cross,
    'leverage': leverage,
  }
  ts = timestamp.now()
  sig = sign_l1_action(
    action,
    wallet=self.wallet,
    nonce=ts,
    mainnet=self.mainnet,
    vault_address=vault_address,
    expires_after=expires_after,
  )
  result = await self.client.request({
    'action': action,
    'nonce': ts,
    'signature': sig,
    'vaultAddress': vault_address,
    'expiresAfter': expires_after,
  })
  return adapter.validate_python(result) if self.validate else result

usd_class_transfer

Transfer USDC between spot and perp accounts.

Parameters:

Name Type Description Default
amount str

Decimal amount string.

required
to_perp bool

Whether to transfer from spot to perp.

required
signature_chain_id str

Chain id used for the user-signed action.

required
subaccount str | None

Optional subaccount address.

None
nonce int | None

Optional action nonce. Defaults to the current timestamp.

None
References
Source code in pkg/src/hyperliquid/exchange/usd_class_transfer.py
async def usd_class_transfer(
  self, *, amount: str, to_perp: bool,
  signature_chain_id: str,
  subaccount: str | None = None,
  nonce: int | None = None,
) -> ExchangeResponse[DefaultResponse]:
  """Transfer USDC between spot and perp accounts.

  Args:
    amount: Decimal amount string.
    to_perp: Whether to transfer from spot to perp.
    signature_chain_id: Chain id used for the user-signed action.
    subaccount: Optional subaccount address.
    nonce: Optional action nonce. Defaults to the current timestamp.

  References:
    - [Hyperliquid API docs](https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/exchange-endpoint#transfer-from-spot-account-to-perp-account-and-vice-versa)
  """
  ts = timestamp.now() if nonce is None else nonce
  action: UsdClassTransferAction = {
    'type': 'usdClassTransfer',
    'signatureChainId': signature_chain_id,
    'amount': amount,
    'toPerp': to_perp,
    'nonce': ts,
  }
  if subaccount is not None:
    action['subaccount'] = subaccount
  sig = sign_user_signed_action(
    action,
    wallet=self.wallet,
    payload_types=[
      {'name': 'hyperliquidChain', 'type': 'string'},
      {'name': 'amount', 'type': 'string'},
      {'name': 'toPerp', 'type': 'bool'},
      {'name': 'nonce', 'type': 'uint64'},
    ],
    primary_type='HyperliquidTransaction:UsdClassTransfer',
    mainnet=self.mainnet,
  )
  result = await self.client.request({
    'action': action,
    'nonce': ts,
    'signature': sig,
    'vaultAddress': None,
    'expiresAfter': None,
  })
  return adapter.validate_python(result) if self.validate else result

usdc_transfer

Core USDC transfer.

Parameters:

Name Type Description Default
destination str

Destination address.

required
amount str

Decimal amount string.

required
signature_chain_id str

Chain id used for the user-signed action.

required
time int | None

Optional action timestamp. Defaults to the current timestamp.

None
References
Source code in pkg/src/hyperliquid/exchange/usdc_transfer.py
async def usdc_transfer(
  self, *, destination: str, amount: str,
  signature_chain_id: str,
  time: int | None = None,
) -> ExchangeResponse[DefaultResponse]:
  """Core USDC transfer.

  Args:
    destination: Destination address.
    amount: Decimal amount string.
    signature_chain_id: Chain id used for the user-signed action.
    time: Optional action timestamp. Defaults to the current timestamp.

  References:
    - [Hyperliquid API docs](https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/exchange-endpoint#core-usdc-transfer)
  """
  ts = timestamp.now()
  action: UsdSendAction = {
    'type': 'usdSend',
    'signatureChainId': signature_chain_id,
    'destination': destination,
    'amount': amount,
    'time': ts if time is None else time,
  }
  sig = sign_user_signed_action(
    action,
    wallet=self.wallet,
    payload_types=[
      {'name': 'hyperliquidChain', 'type': 'string'},
      {'name': 'destination', 'type': 'string'},
      {'name': 'amount', 'type': 'string'},
      {'name': 'time', 'type': 'uint64'},
    ],
    primary_type='HyperliquidTransaction:UsdSend',
    mainnet=self.mainnet,
  )
  result = await self.client.request({
    'action': action,
    'nonce': ts,
    'signature': sig,
    'vaultAddress': None,
    'expiresAfter': None,
  })
  return adapter.validate_python(result) if self.validate else result

user_dex_abstraction

Enable HIP-3 DEX abstraction (deprecated).

Parameters:

Name Type Description Default
user str

User address.

required
enabled bool

Whether DEX abstraction is enabled.

required
signature_chain_id str

Chain id used for the user-signed action.

required
nonce int | None

Optional action nonce. Defaults to the current timestamp.

None
References
Source code in pkg/src/hyperliquid/exchange/user_dex_abstraction.py
async def user_dex_abstraction(
  self, *, user: str, enabled: bool,
  signature_chain_id: str,
  nonce: int | None = None,
) -> ExchangeResponse[DefaultResponse]:
  """Enable HIP-3 DEX abstraction (deprecated).

  Args:
    user: User address.
    enabled: Whether DEX abstraction is enabled.
    signature_chain_id: Chain id used for the user-signed action.
    nonce: Optional action nonce. Defaults to the current timestamp.

  References:
    - [Hyperliquid API docs](https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/exchange-endpoint#enable-hip-3-dex-abstraction)
  """
  ts = timestamp.now() if nonce is None else nonce
  action: UserDexAbstractionAction = {
    'type': 'userDexAbstraction',
    'signatureChainId': signature_chain_id,
    'user': user,
    'enabled': enabled,
    'nonce': ts,
  }
  sig = sign_user_signed_action(
    action,
    wallet=self.wallet,
    payload_types=[
      {'name': 'hyperliquidChain', 'type': 'string'},
      {'name': 'user', 'type': 'address'},
      {'name': 'enabled', 'type': 'bool'},
      {'name': 'nonce', 'type': 'uint64'},
    ],
    primary_type='HyperliquidTransaction:UserDexAbstraction',
    mainnet=self.mainnet,
  )
  result = await self.client.request({
    'action': action,
    'nonce': ts,
    'signature': sig,
    'vaultAddress': None,
    'expiresAfter': None,
  })
  return adapter.validate_python(result) if self.validate else result

user_set_abstraction

Set user abstraction.

Parameters:

Name Type Description Default
user str

User address.

required
abstraction Abstraction

Abstraction mode to set.

required
signature_chain_id str

Chain id used for the user-signed action.

required
nonce int | None

Optional action nonce. Defaults to the current timestamp.

None
References
Source code in pkg/src/hyperliquid/exchange/user_set_abstraction.py
async def user_set_abstraction(
  self, *, user: str, abstraction: Abstraction,
  signature_chain_id: str,
  nonce: int | None = None,
) -> ExchangeResponse[DefaultResponse]:
  """Set user abstraction.

  Args:
    user: User address.
    abstraction: Abstraction mode to set.
    signature_chain_id: Chain id used for the user-signed action.
    nonce: Optional action nonce. Defaults to the current timestamp.

  References:
    - [Hyperliquid API docs](https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/exchange-endpoint#set-user-abstraction)
  """
  ts = timestamp.now() if nonce is None else nonce
  action: UserSetAbstractionAction = {
    'type': 'userSetAbstraction',
    'signatureChainId': signature_chain_id,
    'user': user,
    'abstraction': abstraction,
    'nonce': ts,
  }
  sig = sign_user_signed_action(
    action,
    wallet=self.wallet,
    payload_types=[
      {'name': 'hyperliquidChain', 'type': 'string'},
      {'name': 'user', 'type': 'address'},
      {'name': 'abstraction', 'type': 'string'},
      {'name': 'nonce', 'type': 'uint64'},
    ],
    primary_type='HyperliquidTransaction:UserSetAbstraction',
    mainnet=self.mainnet,
  )
  result = await self.client.request({
    'action': action,
    'nonce': ts,
    'signature': sig,
    'vaultAddress': None,
    'expiresAfter': None,
  })
  return adapter.validate_python(result) if self.validate else result

validator_l1_stream

Vote on risk-free rate for aligned quote asset.

Parameters:

Name Type Description Default
risk_free_rate str

Risk-free rate vote as a decimal string.

required
References
Source code in pkg/src/hyperliquid/exchange/validator_l1_stream.py
async def validator_l1_stream(self, risk_free_rate: str) -> ExchangeResponse[DefaultResponse]:
  """Vote on risk-free rate for aligned quote asset.

  Args:
    risk_free_rate: Risk-free rate vote as a decimal string.

  References:
    - [Hyperliquid API docs](https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/exchange-endpoint#validator-vote-on-risk-free-rate-for-aligned-quote-asset)
  """
  action: ValidatorL1StreamAction = {
    'type': 'validatorL1Stream',
    'riskFreeRate': risk_free_rate,
  }
  ts = timestamp.now()
  sig = sign_l1_action(
    action,
    wallet=self.wallet,
    nonce=ts,
    mainnet=self.mainnet,
  )
  result = await self.client.request({
    'action': action,
    'nonce': ts,
    'signature': sig,
    'vaultAddress': None,
    'expiresAfter': None,
  })
  return adapter.validate_python(result) if self.validate else result

vault_transfer

Deposit or withdraw from a vault.

Parameters:

Name Type Description Default
vault_address str

Vault address.

required
is_deposit bool

Whether to deposit into the vault.

required
usd float

USD amount.

required
expires_after int | None

Optional expiration timestamp for the signed action.

None
References
Source code in pkg/src/hyperliquid/exchange/vault_transfer.py
async def vault_transfer(
  self, *, vault_address: str, is_deposit: bool, usd: float,
  expires_after: int | None = None,
) -> ExchangeResponse[DefaultResponse]:
  """Deposit or withdraw from a vault.

  Args:
    vault_address: Vault address.
    is_deposit: Whether to deposit into the vault.
    usd: USD amount.
    expires_after: Optional expiration timestamp for the signed action.

  References:
    - [Hyperliquid API docs](https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/exchange-endpoint#deposit-or-withdraw-from-a-vault)
  """
  action: VaultTransferAction = {
    'type': 'vaultTransfer',
    'vaultAddress': vault_address,
    'isDeposit': is_deposit,
    'usd': usd,
  }
  ts = timestamp.now()
  sig = sign_l1_action(
    action,
    wallet=self.wallet,
    nonce=ts,
    mainnet=self.mainnet,
    vault_address=None,
    expires_after=expires_after,
  )
  result = await self.client.request({
    'action': action,
    'nonce': ts,
    'signature': sig,
    'vaultAddress': None,
    'expiresAfter': expires_after,
  })
  return adapter.validate_python(result) if self.validate else result

withdraw3

Initiate a withdrawal request.

Parameters:

Name Type Description Default
amount str

Decimal USDC amount string.

required
destination str

Destination address.

required
signature_chain_id str

Chain id used for the user-signed action.

required
time int | None

Optional action timestamp. Defaults to the current timestamp.

None
References
Source code in pkg/src/hyperliquid/exchange/withdraw3.py
async def withdraw3(
  self, *, amount: str, destination: str,
  signature_chain_id: str,
  time: int | None = None,
) -> ExchangeResponse[DefaultResponse]:
  """Initiate a withdrawal request.

  Args:
    amount: Decimal USDC amount string.
    destination: Destination address.
    signature_chain_id: Chain id used for the user-signed action.
    time: Optional action timestamp. Defaults to the current timestamp.

  References:
    - [Hyperliquid API docs](https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/exchange-endpoint#initiate-a-withdrawal-request)
  """
  ts = timestamp.now()
  action: Withdraw3Action = {
    'type': 'withdraw3',
    'signatureChainId': signature_chain_id,
    'amount': amount,
    'time': ts if time is None else time,
    'destination': destination,
  }
  sig = sign_user_signed_action(
    action,
    wallet=self.wallet,
    payload_types=[
      {'name': 'hyperliquidChain', 'type': 'string'},
      {'name': 'destination', 'type': 'string'},
      {'name': 'amount', 'type': 'string'},
      {'name': 'time', 'type': 'uint64'},
    ],
    primary_type='HyperliquidTransaction:Withdraw',
    mainnet=self.mainnet,
  )
  result = await self.client.request({
    'action': action,
    'nonce': ts,
    'signature': sig,
    'vaultAddress': None,
    'expiresAfter': None,
  })
  return adapter.validate_python(result) if self.validate else result