Class: Hyperliquid::Exchange
- Inherits:
-
Object
- Object
- Hyperliquid::Exchange
- Defined in:
- lib/hyperliquid/exchange.rb
Overview
Exchange API client for write operations (orders, cancels, etc.) Requires a private key for signing transactions
Constant Summary collapse
- DEFAULT_SLIPPAGE =
Default slippage for market orders (5%)
0.05- SPOT_ASSET_THRESHOLD =
Spot assets have indices >= 10000
10_000
Instance Attribute Summary collapse
-
#expires_after ⇒ Object
writeonly
Update the global expiration timestamp applied to subsequent L1 actions.
Instance Method Summary collapse
-
#activate_outcome_deployer(is_deactivate:) ⇒ Hash
Activate or deactivate the signer as an outcome deployer (
activateOutcomeDeployerL1 action, HIP-4). -
#address ⇒ String
Get the wallet address.
-
#agent_enable_dex_abstraction(vault_address: nil) ⇒ Hash
Enable HIP-3 DEX abstraction via agent (L1 action, enable only) This allows agents to enable DEX abstraction for the account they're trading on behalf of.
-
#agent_send_asset(destination:, source_dex:, destination_dex:, token:, amount:, from_sub_account: '') ⇒ Hash
Move assets between DEX instances on behalf of an agent's principal (
agentSendAssetL1 action). -
#agent_set_abstraction(abstraction:, vault_address: nil) ⇒ Hash
Set the agent abstraction mode (L1 action
agentSetAbstraction). -
#approve_agent(agent_address:, agent_name: nil) ⇒ Hash
Authorize an agent wallet to trade on behalf of this account.
-
#approve_builder_fee(builder:, max_fee_rate:) ⇒ Hash
Approve a builder fee rate for a builder address Users must approve a builder before orders with that builder can be placed.
-
#authorize_aqav2_role(token:, role:) ⇒ Hash
Authorize an AQAv2 role (
authorizeAqav2RoleL1 action). -
#batch_modify(modifies:, vault_address: nil) ⇒ Hash
Modify multiple orders at once.
-
#borrow_lend(operation:, token:, amount: nil, vault_address: nil) ⇒ Hash
Borrow, lend, supply, or withdraw HIP-2 borrow/lend assets (
borrowLendL1 action). -
#bulk_cancel(cancels:, vault_address: nil) ⇒ Hash
Cancel multiple orders by order ID.
-
#bulk_cancel_by_cloid(cancels:, vault_address: nil) ⇒ Hash
Cancel multiple orders by client order ID.
-
#bulk_orders(orders:, grouping: 'na', vault_address: nil, builder: nil) ⇒ Hash
Place multiple orders in a batch.
-
#c_deposit(wei:) ⇒ Hash
Deposit native HYPE from the user's spot account into staking (
cDeposituser-signed action). -
#c_withdraw(wei:) ⇒ Hash
Withdraw native HYPE from staking back into the user's spot account (
cWithdrawuser-signed action). -
#cancel(coin:, oid:, vault_address: nil, fast: nil) ⇒ Hash
Cancel a single order by order ID.
-
#cancel_by_cloid(coin:, cloid:, vault_address: nil, fast: nil) ⇒ Hash
Cancel a single order by client order ID.
-
#claim_rewards ⇒ Hash
Claim accrued referral-program rewards (
claimRewardsL1 action). -
#convert_to_multi_sig_user(authorized_users:, threshold:) ⇒ Hash
Convert this account into a multi-sig user (
convertToMultiSigUseruser-signed action). -
#create_sub_account(name:) ⇒ Hash
Create a sub-account.
-
#create_vault(name:, description:, initial_usd:) ⇒ Hash
Exchange response — on success
response.datais the new vault address. -
#finalize_evm_contract(token:, input:) ⇒ Hash
Finalize the link between a HyperCore spot token and an ERC-20 contract on HyperEVM (
finalizeEvmContractL1 action). -
#gossip_priority_bid(slot_id:, ip:, max_gas:, vault_address: nil) ⇒ Hash
Submit a priority-bid gossip message (L1 action
gossipPriorityBid). -
#hip3_liquidator_transfer(dex:, ntl:, is_deposit:) ⇒ Hash
Deposit to or withdraw from an HIP-3 DEX's backstop liquidator (
hip3LiquidatorTransferL1 action). -
#initialize(client:, signer:, info:, testnet: false, expires_after: nil) ⇒ Exchange
constructor
Initialize the exchange client.
-
#link_staking_user(user:, is_finalize:) ⇒ Hash
Link a staking account to a trading account for fee-discount attribution (
linkStakingUseruser-signed action). -
#market_close(coin:, size: nil, slippage: DEFAULT_SLIPPAGE, cloid: nil, vault_address: nil, builder: nil) ⇒ Hash
Close a position at market price.
-
#market_order(coin:, is_buy:, size:, slippage: DEFAULT_SLIPPAGE, vault_address: nil, builder: nil) ⇒ Hash
Place a market order (aggressive limit IoC with slippage).
-
#merge_outcome(outcome:, amount: nil) ⇒ Hash
HIP-4: merge
amountYes andamountNo shares of an outcome back intoamountquote tokens (userOutcomeL1 action, mergeOutcome variant). -
#merge_question(question:, amount: nil) ⇒ Hash
HIP-4: merge
amountYes shares from every outcome of a question intoamountquote tokens (userOutcomeL1 action, mergeQuestion variant). -
#modify_order(oid:, coin:, is_buy:, size:, limit_px:, order_type: { limit: { tif: 'Gtc' } }, reduce_only: false, cloid: nil, vault_address: nil, always_place: nil) ⇒ Hash
Modify a single existing order.
-
#multi_sig(multi_sig_user:, inner_action:, signatures:, nonce: nil, vault_address: nil) ⇒ Hash
Submit a multi-signature action wrapping any inner exchange action with N pre-collected co-signer signatures (
multiSiguser-signed envelope). -
#negate_outcome(question:, outcome:, amount:) ⇒ Hash
HIP-4: convert
amountNo shares from one outcome of a question intoamountYes shares of every other outcome associated with that question (userOutcomeL1 action, negateOutcome variant). -
#noop(nonce: nil, vault_address: nil) ⇒ Hash
No-op L1 action — useful for burning a specific nonce slot without side effects.
-
#order(coin:, is_buy:, size:, limit_px:, order_type: { limit: { tif: 'Gtc' } }, reduce_only: false, cloid: nil, vault_address: nil, builder: nil) ⇒ Hash
Place a single order.
-
#register_referrer(code:) ⇒ Hash
Register a new referral code for this account (
registerReferrerL1 action). -
#reload_metadata! ⇒ Object
Clear the asset metadata cache Call this if metadata has been updated.
-
#reserve_request_weight(weight:, destination: nil) ⇒ Hash
Reserve additional rate-limited actions for a fee (
reserveRequestWeightL1 action). -
#schedule_cancel(time: nil, vault_address: nil) ⇒ Hash
Schedule automatic cancellation of all orders.
-
#send_asset(destination:, source_dex:, destination_dex:, token:, amount:) ⇒ Hash
Move assets between DEX instances.
-
#send_to_evm_with_data(token:, amount:, source_dex:, destination_recipient:, address_encoding:, destination_chain_id:, gas_limit:, data: '0x') ⇒ Hash
Transfer an asset from Core to HyperEVM with an arbitrary calldata payload (
sendToEvmWithDatauser-signed action). -
#set_display_name(display_name:) ⇒ Hash
Set the leaderboard display name (
setDisplayNameL1 action). -
#set_referrer(code:) ⇒ Hash
Set referral code.
-
#split_outcome(outcome:, amount:) ⇒ Hash
HIP-4: split
amountquote tokens intoamountYes andamountNo shares of an outcome (userOutcomeL1 action, splitOutcome variant). -
#spot_send(amount:, destination:, token:) ⇒ Hash
Transfer a spot token to another address.
-
#spot_user(opt_out:) ⇒ Hash
Opt in or out of spot dusting (
spotUserL1 action). -
#staking_link_disable_trading_user(trading_user:) ⇒ Hash
Permanently disable a linked trading user, locking its funds (
stakingLinkDisableTradingUseruser-signed action). -
#sub_account_modify(sub_account_user:, name:) ⇒ Hash
Rename a sub-account (
subAccountModifyL1 action). -
#sub_account_spot_transfer(sub_account_user:, is_deposit:, token:, amount:) ⇒ Hash
Transfer spot tokens to/from a sub-account.
-
#sub_account_transfer(sub_account_user:, is_deposit:, usd:) ⇒ Hash
Transfer USDC to/from a sub-account.
-
#token_delegate(validator:, wei:, is_undelegate:) ⇒ Hash
Delegate or undelegate HYPE tokens to a validator.
-
#top_up_isolated_only_margin(coin:, leverage:, vault_address: nil) ⇒ Hash
Top up isolated margin to target a specific leverage (
topUpIsolatedOnlyMarginL1 action). -
#twap_cancel(coin:, twap_id:, vault_address: nil) ⇒ Hash
Cancel a TWAP order by id (
twapCancelL1 action). -
#twap_order(coin:, is_buy:, size:, reduce_only:, minutes:, randomize:, vault_address: nil, details: nil) ⇒ Hash
Place a TWAP order (
twapOrderL1 action). -
#update_isolated_margin(coin:, amount:, vault_address: nil) ⇒ Hash
Add or remove isolated margin for a position.
-
#update_leverage(coin:, leverage:, is_cross: true, vault_address: nil) ⇒ Hash
Set cross or isolated leverage for a coin.
-
#usd_class_transfer(amount:, to_perp:, sub_account: nil) ⇒ Hash
Move USDC between perp and spot accounts.
-
#usd_send(amount:, destination:) ⇒ Hash
Transfer USDC to another address.
-
#use_big_blocks(enable:) ⇒ Hash
Toggle EVM big-blocks mode for this account (
evmUserModifyL1 action). -
#user_dex_abstraction(enabled:, user: nil) ⇒ Hash
Enable or disable HIP-3 DEX abstraction for automatic collateral transfers When enabled, collateral is automatically transferred to HIP-3 dexes when trading.
-
#user_portfolio_margin(user:, enabled:) ⇒ Hash
Toggle cross-portfolio-margin mode for a user (
userPortfolioMarginuser-signed action). -
#user_set_abstraction(user:, abstraction:) ⇒ Hash
Set the abstraction mode for a user (
userSetAbstractionuser-signed action). -
#vault_distribute(vault_address:, usd:) ⇒ Hash
Distribute funds from a vault to followers (
vaultDistributeL1 action). -
#vault_modify(vault_address:, allow_deposits: nil, always_close_on_withdraw: nil) ⇒ Hash
Modify a vault's configuration (
vaultModifyL1 action). -
#vault_transfer(vault_address:, is_deposit:, usd:) ⇒ Hash
Deposit or withdraw USDC to/from a vault.
-
#withdraw_from_bridge(amount:, destination:) ⇒ Hash
Withdraw USDC via the bridge.
Constructor Details
#initialize(client:, signer:, info:, testnet: false, expires_after: nil) ⇒ Exchange
Initialize the exchange client
22 23 24 25 26 27 28 29 |
# File 'lib/hyperliquid/exchange.rb', line 22 def initialize(client:, signer:, info:, testnet: false, expires_after: nil) @client = client @signer = signer @info = info @testnet = testnet @expires_after = expires_after @asset_cache = nil end |
Instance Attribute Details
#expires_after=(value) ⇒ Object (writeonly)
Update the global expiration timestamp applied to subsequent L1 actions.
expires_after is not supported on user-signed actions (e.g. usd_send,
withdraw_from_bridge) and must be nil for those calls to succeed.
740 741 742 |
# File 'lib/hyperliquid/exchange.rb', line 740 def expires_after=(value) @expires_after = value end |
Instance Method Details
#activate_outcome_deployer(is_deactivate:) ⇒ Hash
Activate or deactivate the signer as an outcome deployer
(activateOutcomeDeployer L1 action, HIP-4).
1367 1368 1369 1370 1371 1372 1373 1374 1375 |
# File 'lib/hyperliquid/exchange.rb', line 1367 def activate_outcome_deployer(is_deactivate:) nonce = action = { type: 'activateOutcomeDeployer', isDeactivate: is_deactivate } signature = @signer.sign_l1_action( action, nonce, expires_after: @expires_after ) post_action(action, signature, nonce, nil) end |
#address ⇒ String
Get the wallet address
33 34 35 |
# File 'lib/hyperliquid/exchange.rb', line 33 def address @signer.address end |
#agent_enable_dex_abstraction(vault_address: nil) ⇒ Hash
Enable HIP-3 DEX abstraction via agent (L1 action, enable only) This allows agents to enable DEX abstraction for the account they're trading on behalf of
686 687 688 689 690 691 692 693 694 695 |
# File 'lib/hyperliquid/exchange.rb', line 686 def agent_enable_dex_abstraction(vault_address: nil) nonce = action = { type: 'agentEnableDexAbstraction' } signature = @signer.sign_l1_action( action, nonce, vault_address: vault_address, expires_after: @expires_after ) post_action(action, signature, nonce, vault_address) end |
#agent_send_asset(destination:, source_dex:, destination_dex:, token:, amount:, from_sub_account: '') ⇒ Hash
Move assets between DEX instances on behalf of an agent's principal
(agentSendAsset L1 action). Unlike send_asset (which is user-signed),
this is signed by an agent and the destination must equal the agent's
principal address. source_dex/destination_dex accept "" (default USDC
perp DEX) and "spot" (spot trading) per protocol convention.
1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 |
# File 'lib/hyperliquid/exchange.rb', line 1075 def agent_send_asset(destination:, source_dex:, destination_dex:, token:, amount:, from_sub_account: '') nonce = action = { type: 'agentSendAsset', destination: destination, sourceDex: source_dex, destinationDex: destination_dex, token: token, amount: amount.to_s, fromSubAccount: from_sub_account, nonce: nonce } signature = @signer.sign_l1_action( action, nonce, expires_after: @expires_after ) post_action(action, signature, nonce, nil) end |
#agent_set_abstraction(abstraction:, vault_address: nil) ⇒ Hash
Set the agent abstraction mode (L1 action agentSetAbstraction).
701 702 703 704 705 706 707 708 709 710 |
# File 'lib/hyperliquid/exchange.rb', line 701 def agent_set_abstraction(abstraction:, vault_address: nil) nonce = action = { type: 'agentSetAbstraction', abstraction: abstraction } signature = @signer.sign_l1_action( action, nonce, vault_address: vault_address, expires_after: @expires_after ) post_action(action, signature, nonce, vault_address) end |
#approve_agent(agent_address:, agent_name: nil) ⇒ Hash
Authorize an agent wallet to trade on behalf of this account
591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 |
# File 'lib/hyperliquid/exchange.rb', line 591 def approve_agent(agent_address:, agent_name: nil) nonce = action = { type: 'approveAgent', signatureChainId: '0x66eee', hyperliquidChain: Signing::EIP712.hyperliquid_chain(testnet: @testnet), agentAddress: agent_address, nonce: nonce } # agentName is always included in the signed message (empty string if nil), # but only included in the posted action if a name was provided (matches Python SDK) action[:agentName] = agent_name if agent_name signature = @signer.sign_user_signed_action( { agentAddress: agent_address, agentName: agent_name || '', nonce: nonce }, 'HyperliquidTransaction:ApproveAgent', Signing::EIP712::APPROVE_AGENT_TYPES ) post_action(action, signature, nonce, nil) end |
#approve_builder_fee(builder:, max_fee_rate:) ⇒ Hash
Approve a builder fee rate for a builder address Users must approve a builder before orders with that builder can be placed.
616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 |
# File 'lib/hyperliquid/exchange.rb', line 616 def approve_builder_fee(builder:, max_fee_rate:) nonce = action = { type: 'approveBuilderFee', signatureChainId: '0x66eee', hyperliquidChain: Signing::EIP712.hyperliquid_chain(testnet: @testnet), maxFeeRate: max_fee_rate, builder: builder, nonce: nonce } signature = @signer.sign_user_signed_action( { maxFeeRate: max_fee_rate, builder: builder, nonce: nonce }, 'HyperliquidTransaction:ApproveBuilderFee', Signing::EIP712::APPROVE_BUILDER_FEE_TYPES ) post_action(action, signature, nonce, nil) end |
#authorize_aqav2_role(token:, role:) ⇒ Hash
Authorize an AQAv2 role (authorizeAqav2Role L1 action).
1418 1419 1420 1421 1422 1423 1424 1425 1426 |
# File 'lib/hyperliquid/exchange.rb', line 1418 def (token:, role:) nonce = action = { type: 'authorizeAqav2Role', token: token.to_i, role: role } signature = @signer.sign_l1_action( action, nonce, expires_after: @expires_after ) post_action(action, signature, nonce, nil) end |
#batch_modify(modifies:, vault_address: nil) ⇒ Hash
Modify multiple orders at once
265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 |
# File 'lib/hyperliquid/exchange.rb', line 265 def batch_modify(modifies:, vault_address: nil) nonce = modify_wires = modifies.map do |m| order_wire = build_order_wire( coin: m[:coin], is_buy: m[:is_buy], size: m[:size], limit_px: m[:limit_px], order_type: m[:order_type] || { limit: { tif: 'Gtc' } }, reduce_only: m[:reduce_only] || false, cloid: m[:cloid] ) entry = { oid: normalize_oid(m[:oid]), order: order_wire } entry[:a] = true if m[:always_place] entry end action = { type: 'batchModify', modifies: modify_wires } signature = @signer.sign_l1_action( action, nonce, vault_address: vault_address, expires_after: @expires_after ) post_action(action, signature, nonce, vault_address) end |
#borrow_lend(operation:, token:, amount: nil, vault_address: nil) ⇒ Hash
Borrow, lend, supply, or withdraw HIP-2 borrow/lend assets (borrowLend L1 action).
Companion to the four HIP-2 info methods (borrow_lend_user_state etc.).
978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 |
# File 'lib/hyperliquid/exchange.rb', line 978 def borrow_lend(operation:, token:, amount: nil, vault_address: nil) nonce = action = { type: 'borrowLend', operation: operation, token: token, amount: amount&.to_s } signature = @signer.sign_l1_action( action, nonce, vault_address: vault_address, expires_after: @expires_after ) post_action(action, signature, nonce, vault_address) end |
#bulk_cancel(cancels:, vault_address: nil) ⇒ Hash
Cancel multiple orders by order ID
198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 |
# File 'lib/hyperliquid/exchange.rb', line 198 def bulk_cancel(cancels:, vault_address: nil) nonce = cancel_wires = cancels.map do |c| { a: asset_index(c[:coin]), o: c[:oid] } end action = { type: 'cancel', cancels: cancel_wires } signature = @signer.sign_l1_action( action, nonce, vault_address: vault_address, expires_after: @expires_after ) post_action(action, signature, nonce, vault_address) end |
#bulk_cancel_by_cloid(cancels:, vault_address: nil) ⇒ Hash
Cancel multiple orders by client order ID
218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 |
# File 'lib/hyperliquid/exchange.rb', line 218 def bulk_cancel_by_cloid(cancels:, vault_address: nil) nonce = cancel_wires = cancels.map do |c| { asset: asset_index(c[:coin]), cloid: normalize_cloid(c[:cloid]) } end action = { type: 'cancelByCloid', cancels: cancel_wires } signature = @signer.sign_l1_action( action, nonce, vault_address: vault_address, expires_after: @expires_after ) post_action(action, signature, nonce, vault_address) end |
#bulk_orders(orders:, grouping: 'na', vault_address: nil, builder: nil) ⇒ Hash
Place multiple orders in a batch
84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 |
# File 'lib/hyperliquid/exchange.rb', line 84 def bulk_orders(orders:, grouping: 'na', vault_address: nil, builder: nil) nonce = order_wires = orders.map do |o| build_order_wire( coin: o[:coin], is_buy: o[:is_buy], size: o[:size], limit_px: o[:limit_px], order_type: o[:order_type] || { limit: { tif: 'Gtc' } }, reduce_only: o[:reduce_only] || false, cloid: o[:cloid] ) end action = { type: 'order', orders: order_wires, grouping: grouping } action[:builder] = normalize_builder(builder) if builder signature = @signer.sign_l1_action( action, nonce, vault_address: vault_address, expires_after: @expires_after ) post_action(action, signature, nonce, vault_address) end |
#c_deposit(wei:) ⇒ Hash
Deposit native HYPE from the user's spot account into staking (cDeposit user-signed action).
1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 |
# File 'lib/hyperliquid/exchange.rb', line 1183 def c_deposit(wei:) nonce = wei_int = wei.to_i action = { type: 'cDeposit', signatureChainId: '0x66eee', hyperliquidChain: Signing::EIP712.hyperliquid_chain(testnet: @testnet), wei: wei_int, nonce: nonce } signature = @signer.sign_user_signed_action( { wei: wei_int, nonce: nonce }, 'HyperliquidTransaction:CDeposit', Signing::EIP712::C_DEPOSIT_TYPES ) post_action(action, signature, nonce, nil) end |
#c_withdraw(wei:) ⇒ Hash
Withdraw native HYPE from staking back into the user's spot account (cWithdraw user-signed action).
1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 |
# File 'lib/hyperliquid/exchange.rb', line 1204 def c_withdraw(wei:) nonce = wei_int = wei.to_i action = { type: 'cWithdraw', signatureChainId: '0x66eee', hyperliquidChain: Signing::EIP712.hyperliquid_chain(testnet: @testnet), wei: wei_int, nonce: nonce } signature = @signer.sign_user_signed_action( { wei: wei_int, nonce: nonce }, 'HyperliquidTransaction:CWithdraw', Signing::EIP712::C_WITHDRAW_TYPES ) post_action(action, signature, nonce, nil) end |
#cancel(coin:, oid:, vault_address: nil, fast: nil) ⇒ Hash
Cancel a single order by order ID
149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 |
# File 'lib/hyperliquid/exchange.rb', line 149 def cancel(coin:, oid:, vault_address: nil, fast: nil) nonce = cancel_entry = { a: asset_index(coin), o: oid } cancel_entry[:f] = true if fast action = { type: 'cancel', cancels: [cancel_entry] } signature = @signer.sign_l1_action( action, nonce, vault_address: vault_address, expires_after: @expires_after ) post_action(action, signature, nonce, vault_address) end |
#cancel_by_cloid(coin:, cloid:, vault_address: nil, fast: nil) ⇒ Hash
Cancel a single order by client order ID
174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 |
# File 'lib/hyperliquid/exchange.rb', line 174 def cancel_by_cloid(coin:, cloid:, vault_address: nil, fast: nil) nonce = cloid_raw = normalize_cloid(cloid) cancel_entry = { asset: asset_index(coin), cloid: cloid_raw } cancel_entry[:f] = true if fast action = { type: 'cancelByCloid', cancels: [cancel_entry] } signature = @signer.sign_l1_action( action, nonce, vault_address: vault_address, expires_after: @expires_after ) post_action(action, signature, nonce, vault_address) end |
#claim_rewards ⇒ Hash
Claim accrued referral-program rewards (claimRewards L1 action).
850 851 852 853 854 855 856 857 858 |
# File 'lib/hyperliquid/exchange.rb', line 850 def claim_rewards nonce = action = { type: 'claimRewards' } signature = @signer.sign_l1_action( action, nonce, expires_after: @expires_after ) post_action(action, signature, nonce, nil) end |
#convert_to_multi_sig_user(authorized_users:, threshold:) ⇒ Hash
Convert this account into a multi-sig user (convertToMultiSigUser user-signed action).
The set of authorized signers and the threshold are JSON-encoded into the action's
signers field as required by the Hyperliquid protocol.
795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 |
# File 'lib/hyperliquid/exchange.rb', line 795 def convert_to_multi_sig_user(authorized_users:, threshold:) nonce = sorted_users = .sort signers_json = JSON.generate({ authorizedUsers: sorted_users, threshold: threshold }) action = { type: 'convertToMultiSigUser', signatureChainId: '0x66eee', hyperliquidChain: Signing::EIP712.hyperliquid_chain(testnet: @testnet), signers: signers_json, nonce: nonce } signature = @signer.sign_user_signed_action( { signers: signers_json, nonce: nonce }, 'HyperliquidTransaction:ConvertToMultiSigUser', Signing::EIP712::CONVERT_TO_MULTI_SIG_USER_TYPES ) post_action(action, signature, nonce, nil) end |
#create_sub_account(name:) ⇒ Hash
Create a sub-account
517 518 519 520 521 522 |
# File 'lib/hyperliquid/exchange.rb', line 517 def create_sub_account(name:) nonce = action = { type: 'createSubAccount', name: name } signature = @signer.sign_l1_action(action, nonce) post_action(action, signature, nonce, nil) end |
#create_vault(name:, description:, initial_usd:) ⇒ Hash
Returns Exchange response — on success response.data is the new vault address.
955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 |
# File 'lib/hyperliquid/exchange.rb', line 955 def create_vault(name:, description:, initial_usd:) nonce = action = { type: 'createVault', name: name, description: description, initialUsd: float_to_usd_int(initial_usd), nonce: nonce } signature = @signer.sign_l1_action( action, nonce, expires_after: @expires_after ) post_action(action, signature, nonce, nil) end |
#finalize_evm_contract(token:, input:) ⇒ Hash
Finalize the link between a HyperCore spot token and an ERC-20 contract on
HyperEVM (finalizeEvmContract L1 action). input selects the verification method
and is passed through verbatim — accepts a Hash { create: { nonce: <int> } } for an
EOA-deployed contract, or one of the strings "firstStorageSlot" / "customStorageSlot"
for contracts that store the finalizer address in a known storage slot.
1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 |
# File 'lib/hyperliquid/exchange.rb', line 1385 def finalize_evm_contract(token:, input:) nonce = action = { type: 'finalizeEvmContract', token: token, input: input } signature = @signer.sign_l1_action( action, nonce, expires_after: @expires_after ) post_action(action, signature, nonce, nil) end |
#gossip_priority_bid(slot_id:, ip:, max_gas:, vault_address: nil) ⇒ Hash
Submit a priority-bid gossip message (L1 action gossipPriorityBid).
Used by validators / priority bidders to gossip a bid for a given slot.
778 779 780 781 782 783 784 785 786 787 |
# File 'lib/hyperliquid/exchange.rb', line 778 def gossip_priority_bid(slot_id:, ip:, max_gas:, vault_address: nil) nonce = action = { type: 'gossipPriorityBid', slotId: slot_id, ip: ip, maxGas: max_gas } signature = @signer.sign_l1_action( action, nonce, vault_address: vault_address, expires_after: @expires_after ) post_action(action, signature, nonce, vault_address) end |
#hip3_liquidator_transfer(dex:, ntl:, is_deposit:) ⇒ Hash
Deposit to or withdraw from an HIP-3 DEX's backstop liquidator
(hip3LiquidatorTransfer L1 action). ntl is denominated in 1e-6 quote
tokens and the protocol requires it to be a multiple of 1_000_000_000
(i.e. $1,000 increments).
1103 1104 1105 1106 1107 1108 1109 1110 1111 |
# File 'lib/hyperliquid/exchange.rb', line 1103 def hip3_liquidator_transfer(dex:, ntl:, is_deposit:) nonce = action = { type: 'hip3LiquidatorTransfer', dex: dex, ntl: ntl, isDeposit: is_deposit } signature = @signer.sign_l1_action( action, nonce, expires_after: @expires_after ) post_action(action, signature, nonce, nil) end |
#link_staking_user(user:, is_finalize:) ⇒ Hash
Link a staking account to a trading account for fee-discount attribution
(linkStakingUser user-signed action).
The trading user initiates with is_finalize: false; the staking user finalizes
the permanent link with is_finalize: true. The user field is the other
account address in each direction.
1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 |
# File 'lib/hyperliquid/exchange.rb', line 1020 def link_staking_user(user:, is_finalize:) nonce = action = { type: 'linkStakingUser', signatureChainId: '0x66eee', hyperliquidChain: Signing::EIP712.hyperliquid_chain(testnet: @testnet), user: user, isFinalize: is_finalize, nonce: nonce } signature = @signer.sign_user_signed_action( { user: user, isFinalize: is_finalize, nonce: nonce }, 'HyperliquidTransaction:LinkStakingUser', Signing::EIP712::LINK_STAKING_USER_TYPES ) post_action(action, signature, nonce, nil) end |
#market_close(coin:, size: nil, slippage: DEFAULT_SLIPPAGE, cloid: nil, vault_address: nil, builder: nil) ⇒ Hash
Close a position at market price
369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 |
# File 'lib/hyperliquid/exchange.rb', line 369 def market_close(coin:, size: nil, slippage: DEFAULT_SLIPPAGE, cloid: nil, vault_address: nil, builder: nil) address = vault_address || @signer.address position = find_position(coin, address) raise ArgumentError, "No open position found for #{coin}" unless position szi = position.dig('position', 'szi').to_f is_buy = szi.negative? close_size = size || szi.abs slippage_price = calculate_slippage_price(coin, get_mid_price(coin), is_buy, slippage) order( coin: coin, is_buy: is_buy, size: close_size, limit_px: slippage_price, order_type: { limit: { tif: 'Ioc' } }, reduce_only: true, cloid: cloid, vault_address: vault_address, builder: builder ) end |
#market_order(coin:, is_buy:, size:, slippage: DEFAULT_SLIPPAGE, vault_address: nil, builder: nil) ⇒ Hash
Place a market order (aggressive limit IoC with slippage)
122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 |
# File 'lib/hyperliquid/exchange.rb', line 122 def market_order(coin:, is_buy:, size:, slippage: DEFAULT_SLIPPAGE, vault_address: nil, builder: nil) # Get current mid price (use dex-specific endpoint for HIP-3 assets) dex_prefix = extract_dex_prefix(coin) mids = dex_prefix ? @info.all_mids(dex: dex_prefix) : @info.all_mids mid = mids[coin]&.to_f raise ArgumentError, "Unknown asset or no price available: #{coin}" unless mid&.positive? # Apply slippage and round to appropriate precision slippage_price = calculate_slippage_price(coin, mid, is_buy, slippage) order( coin: coin, is_buy: is_buy, size: size, limit_px: slippage_price, order_type: { limit: { tif: 'Ioc' } }, vault_address: vault_address, builder: builder ) end |
#merge_outcome(outcome:, amount: nil) ⇒ Hash
HIP-4: merge amount Yes and amount No shares of an outcome back into
amount quote tokens (userOutcome L1 action, mergeOutcome variant).
Pass amount: nil to merge the maximum available.
1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 |
# File 'lib/hyperliquid/exchange.rb', line 1311 def merge_outcome(outcome:, amount: nil) nonce = action = { type: 'userOutcome', mergeOutcome: { outcome: outcome, amount: amount&.to_s } } signature = @signer.sign_l1_action( action, nonce, expires_after: @expires_after ) post_action(action, signature, nonce, nil) end |
#merge_question(question:, amount: nil) ⇒ Hash
HIP-4: merge amount Yes shares from every outcome of a question into
amount quote tokens (userOutcome L1 action, mergeQuestion variant).
Pass amount: nil to merge the maximum available.
1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 |
# File 'lib/hyperliquid/exchange.rb', line 1330 def merge_question(question:, amount: nil) nonce = action = { type: 'userOutcome', mergeQuestion: { question: question, amount: amount&.to_s } } signature = @signer.sign_l1_action( action, nonce, expires_after: @expires_after ) post_action(action, signature, nonce, nil) end |
#modify_order(oid:, coin:, is_buy:, size:, limit_px:, order_type: { limit: { tif: 'Gtc' } }, reduce_only: false, cloid: nil, vault_address: nil, always_place: nil) ⇒ Hash
Modify a single existing order
246 247 248 249 250 251 252 253 254 255 256 257 258 |
# File 'lib/hyperliquid/exchange.rb', line 246 def modify_order(oid:, coin:, is_buy:, size:, limit_px:, order_type: { limit: { tif: 'Gtc' } }, reduce_only: false, cloid: nil, vault_address: nil, always_place: nil) batch_modify( modifies: [{ oid: oid, coin: coin, is_buy: is_buy, size: size, limit_px: limit_px, order_type: order_type, reduce_only: reduce_only, cloid: cloid, always_place: always_place }], vault_address: vault_address ) end |
#multi_sig(multi_sig_user:, inner_action:, signatures:, nonce: nil, vault_address: nil) ⇒ Hash
Submit a multi-signature action wrapping any inner exchange action with N pre-collected
co-signer signatures (multiSig user-signed envelope). The submitter's outer signature
authorises execution; co-signer signatures must be collected externally via
Signing::MultiSig.sign_as_co_signer_l1 (for L1 inner actions) or
Signing::MultiSig.sign_as_co_signer_user_signed (for user-signed inner actions).
826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 |
# File 'lib/hyperliquid/exchange.rb', line 826 def multi_sig(multi_sig_user:, inner_action:, signatures:, nonce: nil, vault_address: nil) nonce ||= envelope = Signing::MultiSig.build_envelope( inner_action: inner_action, multi_sig_user: multi_sig_user, outer_signer: @signer.address, signatures: signatures ) multi_sig_action_hash = Signing::MultiSig.envelope_action_hash( envelope: envelope, nonce: nonce, vault_address: vault_address, expires_after: @expires_after ) signature = @signer.sign_user_signed_action( { multiSigActionHash: multi_sig_action_hash, nonce: nonce }, Signing::MultiSig::OUTER_PRIMARY_TYPE, Signing::EIP712::MULTI_SIG_TYPES ) post_action(envelope, signature, nonce, vault_address) end |
#negate_outcome(question:, outcome:, amount:) ⇒ Hash
HIP-4: convert amount No shares from one outcome of a question into
amount Yes shares of every other outcome associated with that question
(userOutcome L1 action, negateOutcome variant).
1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 1361 |
# File 'lib/hyperliquid/exchange.rb', line 1350 def negate_outcome(question:, outcome:, amount:) nonce = action = { type: 'userOutcome', negateOutcome: { question: question, outcome: outcome, amount: amount.to_s } } signature = @signer.sign_l1_action( action, nonce, expires_after: @expires_after ) post_action(action, signature, nonce, nil) end |
#noop(nonce: nil, vault_address: nil) ⇒ Hash
No-op L1 action — useful for burning a specific nonce slot without side effects.
760 761 762 763 764 765 766 767 768 769 |
# File 'lib/hyperliquid/exchange.rb', line 760 def noop(nonce: nil, vault_address: nil) nonce ||= action = { type: 'noop' } signature = @signer.sign_l1_action( action, nonce, vault_address: vault_address, expires_after: @expires_after ) post_action(action, signature, nonce, vault_address) end |
#order(coin:, is_buy:, size:, limit_px:, order_type: { limit: { tif: 'Gtc' } }, reduce_only: false, cloid: nil, vault_address: nil, builder: nil) ⇒ Hash
Place a single order
48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 |
# File 'lib/hyperliquid/exchange.rb', line 48 def order(coin:, is_buy:, size:, limit_px:, order_type: { limit: { tif: 'Gtc' } }, reduce_only: false, cloid: nil, vault_address: nil, builder: nil) nonce = order_wire = build_order_wire( coin: coin, is_buy: is_buy, size: size, limit_px: limit_px, order_type: order_type, reduce_only: reduce_only, cloid: cloid ) action = { type: 'order', orders: [order_wire], grouping: 'na' } action[:builder] = normalize_builder(builder) if builder signature = @signer.sign_l1_action( action, nonce, vault_address: vault_address, expires_after: @expires_after ) post_action(action, signature, nonce, vault_address) end |
#register_referrer(code:) ⇒ Hash
Register a new referral code for this account (registerReferrer L1 action).
Distinct from set_referrer, which records a referrer the account was referred by.
878 879 880 881 882 883 884 885 886 |
# File 'lib/hyperliquid/exchange.rb', line 878 def register_referrer(code:) nonce = action = { type: 'registerReferrer', code: code } signature = @signer.sign_l1_action( action, nonce, expires_after: @expires_after ) post_action(action, signature, nonce, nil) end |
#reload_metadata! ⇒ Object
Clear the asset metadata cache Call this if metadata has been updated
1430 1431 1432 |
# File 'lib/hyperliquid/exchange.rb', line 1430 def @asset_cache = nil end |
#reserve_request_weight(weight:, destination: nil) ⇒ Hash
Reserve additional rate-limited actions for a fee (reserveRequestWeight L1 action).
1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 |
# File 'lib/hyperliquid/exchange.rb', line 1276 def reserve_request_weight(weight:, destination: nil) nonce = action = { type: 'reserveRequestWeight', weight: weight } action[:destination] = destination unless destination.nil? signature = @signer.sign_l1_action( action, nonce, expires_after: @expires_after ) post_action(action, signature, nonce, nil) end |
#schedule_cancel(time: nil, vault_address: nil) ⇒ Hash
Schedule automatic cancellation of all orders
347 348 349 350 351 352 353 354 355 356 357 358 359 |
# File 'lib/hyperliquid/exchange.rb', line 347 def schedule_cancel(time: nil, vault_address: nil) nonce = action = { type: 'scheduleCancel' } action[:time] = time if time signature = @signer.sign_l1_action( action, nonce, vault_address: vault_address, expires_after: @expires_after ) post_action(action, signature, nonce, vault_address) end |
#send_asset(destination:, source_dex:, destination_dex:, token:, amount:) ⇒ Hash
Move assets between DEX instances
489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 |
# File 'lib/hyperliquid/exchange.rb', line 489 def send_asset(destination:, source_dex:, destination_dex:, token:, amount:) nonce = action = { type: 'sendAsset', signatureChainId: '0x66eee', hyperliquidChain: Signing::EIP712.hyperliquid_chain(testnet: @testnet), destination: destination, sourceDex: source_dex, destinationDex: destination_dex, token: token, amount: amount.to_s, fromSubAccount: '', nonce: nonce } signature = @signer.sign_user_signed_action( { destination: destination, sourceDex: source_dex, destinationDex: destination_dex, token: token, amount: amount.to_s, fromSubAccount: '', nonce: nonce }, 'HyperliquidTransaction:SendAsset', Signing::EIP712::SEND_ASSET_TYPES ) post_action(action, signature, nonce, nil) end |
#send_to_evm_with_data(token:, amount:, source_dex:, destination_recipient:, address_encoding:, destination_chain_id:, gas_limit:, data: '0x') ⇒ Hash
Transfer an asset from Core to HyperEVM with an arbitrary calldata payload
(sendToEvmWithData user-signed action). Intended for ICoreReceiveWithData
contracts that react atomically to the deposit. data accepts a hex string
('0x' or '0x...'); the EIP-712 signer hashes it as bytes.
destination_recipient is NOT lowercased — address_encoding may be
'base58' for non-EVM target chains, where lowercasing would corrupt the value.
1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 |
# File 'lib/hyperliquid/exchange.rb', line 1128 def send_to_evm_with_data(token:, amount:, source_dex:, destination_recipient:, address_encoding:, destination_chain_id:, gas_limit:, data: '0x') nonce = action = { type: 'sendToEvmWithData', signatureChainId: '0x66eee', hyperliquidChain: Signing::EIP712.hyperliquid_chain(testnet: @testnet), token: token, amount: amount.to_s, sourceDex: source_dex, destinationRecipient: destination_recipient, addressEncoding: address_encoding, destinationChainId: destination_chain_id.to_i, gasLimit: gas_limit.to_i, data: data, nonce: nonce } signature = @signer.sign_user_signed_action( { token: token, amount: amount.to_s, sourceDex: source_dex, destinationRecipient: destination_recipient, addressEncoding: address_encoding, destinationChainId: destination_chain_id.to_i, gasLimit: gas_limit.to_i, data: data, nonce: nonce }, 'HyperliquidTransaction:SendToEvmWithData', Signing::EIP712::SEND_TO_EVM_WITH_DATA_TYPES ) post_action(action, signature, nonce, nil) end |
#set_display_name(display_name:) ⇒ Hash
Set the leaderboard display name (setDisplayName L1 action).
Pass an empty string to remove the existing display name.
864 865 866 867 868 869 870 871 872 |
# File 'lib/hyperliquid/exchange.rb', line 864 def set_display_name(display_name:) nonce = action = { type: 'setDisplayName', displayName: display_name } signature = @signer.sign_l1_action( action, nonce, expires_after: @expires_after ) post_action(action, signature, nonce, nil) end |
#set_referrer(code:) ⇒ Hash
Set referral code
580 581 582 583 584 585 |
# File 'lib/hyperliquid/exchange.rb', line 580 def set_referrer(code:) nonce = action = { type: 'setReferrer', code: code } signature = @signer.sign_l1_action(action, nonce) post_action(action, signature, nonce, nil) end |
#split_outcome(outcome:, amount:) ⇒ Hash
HIP-4: split amount quote tokens into amount Yes and amount No shares
of an outcome (userOutcome L1 action, splitOutcome variant).
1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 |
# File 'lib/hyperliquid/exchange.rb', line 1292 def split_outcome(outcome:, amount:) nonce = action = { type: 'userOutcome', splitOutcome: { outcome: outcome, amount: amount.to_s } } signature = @signer.sign_l1_action( action, nonce, expires_after: @expires_after ) post_action(action, signature, nonce, nil) end |
#spot_send(amount:, destination:, token:) ⇒ Hash
Transfer a spot token to another address
413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 |
# File 'lib/hyperliquid/exchange.rb', line 413 def spot_send(amount:, destination:, token:) nonce = action = { type: 'spotSend', signatureChainId: '0x66eee', hyperliquidChain: Signing::EIP712.hyperliquid_chain(testnet: @testnet), destination: destination, token: token, amount: amount.to_s, time: nonce } signature = @signer.sign_user_signed_action( { destination: destination, token: token, amount: amount.to_s, time: nonce }, 'HyperliquidTransaction:SpotSend', Signing::EIP712::SPOT_SEND_TYPES ) post_action(action, signature, nonce, nil) end |
#spot_user(opt_out:) ⇒ Hash
Opt in or out of spot dusting (spotUser L1 action).
Spot dusting is the protocol's automatic conversion of small spot balances.
Despite the generic action name, this method exclusively toggles that opt-out flag.
1404 1405 1406 1407 1408 1409 1410 1411 1412 |
# File 'lib/hyperliquid/exchange.rb', line 1404 def spot_user(opt_out:) nonce = action = { type: 'spotUser', toggleSpotDusting: { optOut: opt_out } } signature = @signer.sign_l1_action( action, nonce, expires_after: @expires_after ) post_action(action, signature, nonce, nil) end |
#staking_link_disable_trading_user(trading_user:) ⇒ Hash
Permanently disable a linked trading user, locking its funds
(stakingLinkDisableTradingUser user-signed action). Sent by the staking user.
After 1 year of locking, funds from the trading user are automatically transferred
to the staking user. This action is irreversible. The trading_user address is
lowercased to match the address-field convention used by other user-signed actions.
1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 |
# File 'lib/hyperliquid/exchange.rb', line 1045 def staking_link_disable_trading_user(trading_user:) nonce = trading_user_lower = trading_user.downcase action = { type: 'stakingLinkDisableTradingUser', signatureChainId: '0x66eee', hyperliquidChain: Signing::EIP712.hyperliquid_chain(testnet: @testnet), tradingUser: trading_user_lower, nonce: nonce } signature = @signer.sign_user_signed_action( { tradingUser: trading_user_lower, nonce: nonce }, 'HyperliquidTransaction:StakingLinkDisableTradingUser', Signing::EIP712::STAKING_LINK_DISABLE_TRADING_USER_TYPES ) post_action(action, signature, nonce, nil) end |
#sub_account_modify(sub_account_user:, name:) ⇒ Hash
Rename a sub-account (subAccountModify L1 action).
998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 |
# File 'lib/hyperliquid/exchange.rb', line 998 def sub_account_modify(sub_account_user:, name:) nonce = action = { type: 'subAccountModify', subAccountUser: sub_account_user, name: name } signature = @signer.sign_l1_action( action, nonce, expires_after: @expires_after ) post_action(action, signature, nonce, nil) end |
#sub_account_spot_transfer(sub_account_user:, is_deposit:, token:, amount:) ⇒ Hash
Transfer spot tokens to/from a sub-account
547 548 549 550 551 552 553 554 555 556 557 558 |
# File 'lib/hyperliquid/exchange.rb', line 547 def sub_account_spot_transfer(sub_account_user:, is_deposit:, token:, amount:) nonce = action = { type: 'subAccountSpotTransfer', subAccountUser: sub_account_user, isDeposit: is_deposit, token: token, amount: amount.to_s } signature = @signer.sign_l1_action(action, nonce) post_action(action, signature, nonce, nil) end |
#sub_account_transfer(sub_account_user:, is_deposit:, usd:) ⇒ Hash
Transfer USDC to/from a sub-account
529 530 531 532 533 534 535 536 537 538 539 |
# File 'lib/hyperliquid/exchange.rb', line 529 def sub_account_transfer(sub_account_user:, is_deposit:, usd:) nonce = action = { type: 'subAccountTransfer', subAccountUser: sub_account_user, isDeposit: is_deposit, usd: float_to_usd_int(usd) } signature = @signer.sign_l1_action(action, nonce) post_action(action, signature, nonce, nil) end |
#token_delegate(validator:, wei:, is_undelegate:) ⇒ Hash
Delegate or undelegate HYPE tokens to a validator
639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 |
# File 'lib/hyperliquid/exchange.rb', line 639 def token_delegate(validator:, wei:, is_undelegate:) nonce = action = { type: 'tokenDelegate', signatureChainId: '0x66eee', hyperliquidChain: Signing::EIP712.hyperliquid_chain(testnet: @testnet), validator: validator, wei: wei, isUndelegate: is_undelegate, nonce: nonce } signature = @signer.sign_user_signed_action( { validator: validator, wei: wei, isUndelegate: is_undelegate, nonce: nonce }, 'HyperliquidTransaction:TokenDelegate', Signing::EIP712::TOKEN_DELEGATE_TYPES ) post_action(action, signature, nonce, nil) end |
#top_up_isolated_only_margin(coin:, leverage:, vault_address: nil) ⇒ Hash
Top up isolated margin to target a specific leverage (topUpIsolatedOnlyMargin L1 action).
893 894 895 896 897 898 899 900 901 902 903 904 905 906 |
# File 'lib/hyperliquid/exchange.rb', line 893 def top_up_isolated_only_margin(coin:, leverage:, vault_address: nil) nonce = action = { type: 'topUpIsolatedOnlyMargin', asset: asset_index(coin), leverage: leverage.to_s } signature = @signer.sign_l1_action( action, nonce, vault_address: vault_address, expires_after: @expires_after ) post_action(action, signature, nonce, vault_address) end |
#twap_cancel(coin:, twap_id:, vault_address: nil) ⇒ Hash
Cancel a TWAP order by id (twapCancel L1 action).
1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 |
# File 'lib/hyperliquid/exchange.rb', line 1261 def twap_cancel(coin:, twap_id:, vault_address: nil) nonce = action = { type: 'twapCancel', a: asset_index(coin), t: twap_id } signature = @signer.sign_l1_action( action, nonce, vault_address: vault_address, expires_after: @expires_after ) post_action(action, signature, nonce, vault_address) end |
#twap_order(coin:, is_buy:, size:, reduce_only:, minutes:, randomize:, vault_address: nil, details: nil) ⇒ Hash
Place a TWAP order (twapOrder L1 action). The order is sliced over minutes
minutes (5..1440). When randomize is true the protocol randomizes the timing
of individual child orders. size is denominated in base currency units.
1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 |
# File 'lib/hyperliquid/exchange.rb', line 1234 def twap_order(coin:, is_buy:, size:, reduce_only:, minutes:, randomize:, vault_address: nil, details: nil) nonce = action = { type: 'twapOrder', twap: { a: asset_index(coin), b: is_buy, s: float_to_wire(size), r: reduce_only, m: minutes, t: randomize } } action[:details] = details unless details.nil? signature = @signer.sign_l1_action( action, nonce, vault_address: vault_address, expires_after: @expires_after ) post_action(action, signature, nonce, vault_address) end |
#update_isolated_margin(coin:, amount:, vault_address: nil) ⇒ Hash
Add or remove isolated margin for a position
325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 |
# File 'lib/hyperliquid/exchange.rb', line 325 def update_isolated_margin(coin:, amount:, vault_address: nil) nonce = action = { type: 'updateIsolatedMargin', asset: asset_index(coin), isBuy: true, ntli: float_to_usd_int(amount) } signature = @signer.sign_l1_action( action, nonce, vault_address: vault_address, expires_after: @expires_after ) post_action(action, signature, nonce, vault_address) end |
#update_leverage(coin:, leverage:, is_cross: true, vault_address: nil) ⇒ Hash
Set cross or isolated leverage for a coin
302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 |
# File 'lib/hyperliquid/exchange.rb', line 302 def update_leverage(coin:, leverage:, is_cross: true, vault_address: nil) nonce = action = { type: 'updateLeverage', asset: asset_index(coin), isCross: is_cross, leverage: leverage } signature = @signer.sign_l1_action( action, nonce, vault_address: vault_address, expires_after: @expires_after ) post_action(action, signature, nonce, vault_address) end |
#usd_class_transfer(amount:, to_perp:, sub_account: nil) ⇒ Hash
Move USDC between perp and spot accounts
440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 |
# File 'lib/hyperliquid/exchange.rb', line 440 def usd_class_transfer(amount:, to_perp:, sub_account: nil) nonce = amount_str = amount.to_s amount_str = "#{amount_str} subaccount:#{sub_account}" if sub_account action = { type: 'usdClassTransfer', signatureChainId: '0x66eee', hyperliquidChain: Signing::EIP712.hyperliquid_chain(testnet: @testnet), amount: amount_str, toPerp: to_perp, nonce: nonce } signature = @signer.sign_user_signed_action( { amount: amount_str, toPerp: to_perp, nonce: nonce }, 'HyperliquidTransaction:UsdClassTransfer', Signing::EIP712::USD_CLASS_TRANSFER_TYPES ) post_action(action, signature, nonce, nil) end |
#usd_send(amount:, destination:) ⇒ Hash
Transfer USDC to another address
390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 |
# File 'lib/hyperliquid/exchange.rb', line 390 def usd_send(amount:, destination:) nonce = action = { type: 'usdSend', signatureChainId: '0x66eee', hyperliquidChain: Signing::EIP712.hyperliquid_chain(testnet: @testnet), destination: destination, amount: amount.to_s, time: nonce } signature = @signer.sign_user_signed_action( { destination: destination, amount: amount.to_s, time: nonce }, 'HyperliquidTransaction:UsdSend', Signing::EIP712::USD_SEND_TYPES ) post_action(action, signature, nonce, nil) end |
#use_big_blocks(enable:) ⇒ Hash
Toggle EVM big-blocks mode for this account (evmUserModify L1 action).
When enabled, EVM transactions from this account are routed to big blocks.
746 747 748 749 750 751 752 753 754 |
# File 'lib/hyperliquid/exchange.rb', line 746 def use_big_blocks(enable:) nonce = action = { type: 'evmUserModify', usingBigBlocks: enable } signature = @signer.sign_l1_action( action, nonce, expires_after: @expires_after ) post_action(action, signature, nonce, nil) end |
#user_dex_abstraction(enabled:, user: nil) ⇒ Hash
Enable or disable HIP-3 DEX abstraction for automatic collateral transfers When enabled, collateral is automatically transferred to HIP-3 dexes when trading
663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 |
# File 'lib/hyperliquid/exchange.rb', line 663 def user_dex_abstraction(enabled:, user: nil) nonce = user_address = user || @signer.address action = { type: 'userDexAbstraction', signatureChainId: '0x66eee', hyperliquidChain: Signing::EIP712.hyperliquid_chain(testnet: @testnet), user: user_address, enabled: enabled, nonce: nonce } signature = @signer.sign_user_signed_action( { user: user_address, enabled: enabled, nonce: nonce }, 'HyperliquidTransaction:UserDexAbstraction', Signing::EIP712::USER_DEX_ABSTRACTION_TYPES ) post_action(action, signature, nonce, nil) end |
#user_portfolio_margin(user:, enabled:) ⇒ Hash
Toggle cross-portfolio-margin mode for a user (userPortfolioMargin user-signed action).
The user address is lowercased to match the Python SDK and protocol expectations.
1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 |
# File 'lib/hyperliquid/exchange.rb', line 1161 def user_portfolio_margin(user:, enabled:) nonce = user_lower = user.downcase action = { type: 'userPortfolioMargin', signatureChainId: '0x66eee', hyperliquidChain: Signing::EIP712.hyperliquid_chain(testnet: @testnet), user: user_lower, enabled: enabled, nonce: nonce } signature = @signer.sign_user_signed_action( { user: user_lower, enabled: enabled, nonce: nonce }, 'HyperliquidTransaction:UserPortfolioMargin', Signing::EIP712::USER_PORTFOLIO_MARGIN_TYPES ) post_action(action, signature, nonce, nil) end |
#user_set_abstraction(user:, abstraction:) ⇒ Hash
Set the abstraction mode for a user (userSetAbstraction user-signed action).
The user address is lowercased to match the Python SDK and protocol expectations.
717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 |
# File 'lib/hyperliquid/exchange.rb', line 717 def user_set_abstraction(user:, abstraction:) nonce = user_lower = user.downcase action = { type: 'userSetAbstraction', signatureChainId: '0x66eee', hyperliquidChain: Signing::EIP712.hyperliquid_chain(testnet: @testnet), user: user_lower, abstraction: abstraction, nonce: nonce } signature = @signer.sign_user_signed_action( { user: user_lower, abstraction: abstraction, nonce: nonce }, 'HyperliquidTransaction:UserSetAbstraction', Signing::EIP712::USER_SET_ABSTRACTION_TYPES ) post_action(action, signature, nonce, nil) end |
#vault_distribute(vault_address:, usd:) ⇒ Hash
Distribute funds from a vault to followers (vaultDistribute L1 action).
Only the vault leader may submit this. Pass usd: 0 to close the vault.
934 935 936 937 938 939 940 941 942 943 944 945 946 |
# File 'lib/hyperliquid/exchange.rb', line 934 def vault_distribute(vault_address:, usd:) nonce = action = { type: 'vaultDistribute', vaultAddress: vault_address, usd: float_to_usd_int(usd) } signature = @signer.sign_l1_action( action, nonce, expires_after: @expires_after ) post_action(action, signature, nonce, nil) end |
#vault_modify(vault_address:, allow_deposits: nil, always_close_on_withdraw: nil) ⇒ Hash
Modify a vault's configuration (vaultModify L1 action).
Only the vault leader may submit this. Either flag may be omitted (sent as null).
914 915 916 917 918 919 920 921 922 923 924 925 926 927 |
# File 'lib/hyperliquid/exchange.rb', line 914 def vault_modify(vault_address:, allow_deposits: nil, always_close_on_withdraw: nil) nonce = action = { type: 'vaultModify', vaultAddress: vault_address, allowDeposits: allow_deposits, alwaysCloseOnWithdraw: always_close_on_withdraw } signature = @signer.sign_l1_action( action, nonce, expires_after: @expires_after ) post_action(action, signature, nonce, nil) end |
#vault_transfer(vault_address:, is_deposit:, usd:) ⇒ Hash
Deposit or withdraw USDC to/from a vault
565 566 567 568 569 570 571 572 573 574 575 |
# File 'lib/hyperliquid/exchange.rb', line 565 def vault_transfer(vault_address:, is_deposit:, usd:) nonce = action = { type: 'vaultTransfer', vaultAddress: vault_address, isDeposit: is_deposit, usd: float_to_usd_int(usd) } signature = @signer.sign_l1_action(action, nonce) post_action(action, signature, nonce, nil) end |
#withdraw_from_bridge(amount:, destination:) ⇒ Hash
Withdraw USDC via the bridge
464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 |
# File 'lib/hyperliquid/exchange.rb', line 464 def withdraw_from_bridge(amount:, destination:) nonce = action = { type: 'withdraw3', signatureChainId: '0x66eee', hyperliquidChain: Signing::EIP712.hyperliquid_chain(testnet: @testnet), destination: destination, amount: amount.to_s, time: nonce } signature = @signer.sign_user_signed_action( { destination: destination, amount: amount.to_s, time: nonce }, 'HyperliquidTransaction:Withdraw', Signing::EIP712::WITHDRAW_TYPES ) post_action(action, signature, nonce, nil) end |