npx skills add ...
npx skills add starchild-ai-agent/official-skills --skill hyperliquid
Trade perp futures, spot, and RWA on Hyperliquid DEX with up to asset max leverage.
npx skills add starchild-ai-agent/official-skills --skill hyperliquid
Trade perpetual futures and spot tokens on Hyperliquid, a fully on-chain decentralized exchange. Orders are signed using this agent's EVM wallet and submitted directly to the Hyperliquid L1.
Before trading, the wallet policy must be active. Load the wallet-policy skill and propose the standard wildcard policy (deny key export + allow *). This covers all Hyperliquid operations — USDC deposits, EIP-712 order signing, and withdrawals.
This skill is script-delivery. It registers no hl_* agent tools — calling
hl_deposit, hl_order, or any other hl_* name as a tool will always fail with
"not found in registry". That is by design, not a bug or a missing install.
There are exactly two working lanes:
exports.py)Any wallet, not just your own. Every user-scoped function takes an optional
address. Omit it for the agent's own wallet; pass a 0x address to inspect a
third party. This is what makes "analyse this wallet's Hyperliquid PnL"
answerable — Hyperliquid is an off-chain order book, so a DeBank-style
chain scan cannot see any of it.
32 functions, grouped:
| Group | Functions |
|---|---|
| Account | hl_account hl_balances hl_total_balance hl_user_role hl_user_fees hl_rate_limit hl_sub_accounts hl_referral hl_extra_agents |
| PnL & history | hl_portfolio hl_fills hl_fills_by_time hl_historical_orders hl_ledger hl_funding_payments hl_twap_fills hl_vault_equities |
| Orders | hl_open_orders hl_open_orders_full hl_order_status |
| Market | hl_market hl_orderbook hl_candles hl_funding hl_predicted_funding hl_meta hl_meta_ctxs hl_spot_meta hl_spot_meta_ctxs hl_perp_dexs |
| Staking | hl_staking hl_staking_delegations hl_staking_rewards |
Read-only only — no writes on this lane.
hl_portfolio returns 8 windows — day, week, month, allTime and the
perp* equivalents — each with accountValueHistory and pnlHistory as
[epoch_ms, value] pairs. pnlHistory restarts at 0 at the start of each
window, so read allTime for lifetime PnL.
For a cost-basis reconstruction, combine three sources: hl_ledger (capital
in/out — deposits, withdrawals, vault moves), hl_fills_by_time (realized
closedPnl per fill, 2000 max per call — page by passing the last fill's
time as the next start), and hl_funding_payments (funding paid/received).
Check hl_user_role first: role "missing" means the address never traded
here, which is not the same as "no positions".
client.py)Every write goes through HyperliquidClient, which owns the EIP-712 signing
pipeline. It is an async class — await every call.
Prerequisite for Lane 2: the wallet policy must be active — load the
wallet-policy skill and propose the standard wildcard policy (deny key
export + allow *). That covers deposits, EIP-712 order signing, and withdrawals.
Naming note: the rest of this document refers to operations by their
historical hl_* names (e.g. "hl_deposit"). Those are labels for the
operation, not callable tools — always reach them via Lane 1 or Lane 2 above.
| Tool | What it does |
|---|---|
hl_total_balance | Check how much you can trade with (use this for balance checks!) |
hl_account | Open positions and unrealized PnL |
hl_balances | Token holdings (USDC, HYPE, etc.) |
hl_portfolio | PnL and account value over time — day/week/month/allTime |
hl_ledger | Deposits, withdrawals, transfers — the capital in/out record |
hl_fills_by_time | Fills within a date range, for cost-basis work |
hl_market | Get current prices for crypto or stocks |
hl_meta_ctxs | Market-wide scan: markPx, funding, OI, volume per asset |
hl_orderbook | Check order book depth and liquidity |
hl_fills | See recent trade fills and execution prices |
hl_candles | Get price charts (1m, 5m, 1h, 4h, 1d) |
hl_funding | Check funding rates for perps |
hl_open_orders | See pending orders |
hl_open_orders_full | Pending orders with stop-loss / take-profit detail |
All of the above accept address="0x..." to inspect any wallet, not just
the agent's own.
| Tool | What it does |
|---|---|
hl_order | Buy or sell perps (crypto/stocks) |
hl_spot_order | Buy or sell spot tokens |
hl_tpsl_order | Place stop loss or take profit orders |
hl_leverage | Set leverage (1x to asset max) |
hl_cancel | Cancel a specific order |
hl_cancel_all | Cancel all open orders |
hl_modify | Change order price or size |
| Tool | What it does |
|---|---|
hl_deposit | Add USDC from Arbitrum (min $5) |
hl_withdraw | Send USDC to Arbitrum (1 USDC fee, ~5 min) |
hl_transfer_usd | Move USDC between spot/perp (rarely needed) |
| Tool | What it does |
|---|---|
hl_approve_builder | Approve Starchild builder fee collection (auto-done on first order) |
hl_builder_status | Check builder approval status and collected rewards |
Just tell the agent what you want to trade - it handles everything automatically.
Examples:
You don't need to:
Just say what you want, the agent handles the rest.
🤖 As the agent, you should ALWAYS do these automatically (never ask the user):
hl_total_balance before EVERY trade to see total available marginhl_leverage before placing orders (unless user specifies not to)hl_fills to check if it filled🎯 User just says: "buy X" or "sell Y" or "long Z with $N"
🔧 You figure out:
📊 Balance checking hierarchy:
hl_total_balance - shows ACTUAL available margin regardless of account modehl_account for balance - may show $0 even if funds availablehl_balances for margin - only shows spot tokens🚀 Be proactive, not reactive:
Returns marginSummary (accountValue, totalMarginUsed, withdrawable) and assetPositions array with each position's coin, szi (signed size), entryPx, unrealizedPnl, leverage.
Important: Builder perps (xyz:NVDA, xyz:TSLA, etc.) have separate clearinghouses. Always check the correct dex when trading RWA/stock perps.
Returns balances array with coin, hold, total for USDC and all spot tokens.
All order tools (hl_order, hl_spot_order, hl_tpsl_order, hl_modify)
use the same side parameter. Use "buy" or "sell" — these are the
documented values and should be your default.
For safety, the tools also accept these aliases so a model guess doesn't reverse direction on a leveraged order:
"buy", "B", "bid", "long", "L", 1, true"sell", "S", "A", "ask", "short", 0, falseAn unrecognized value will fail the call with a clear error — the tool
never defaults to sell (or buy) when side is ambiguous. This is intentional:
silently reversing direction on a leveraged position is the worst failure mode.
Note: Hyperliquid's L1 wire protocol uses "B" and "A" internally, but the
tool interface here is buy/sell. Stick to buy/sell in your calls and
you will never be surprised.
Places a GTC limit buy for 0.01 BTC at $95,000.
Omitting price submits an IoC order at mid price +/- 3% slippage.
Parameter format behavior:
size as number, reduce_only as boolean)"0.01" → 0.01"true"/"false" → true/false"5"/"5.0" → 5ALO (Add Liquidity Only) = post-only. Rejected if it would immediately fill.
Practical guardrail for bots: If your ALO price is too close to mid (often within ~0.1% on liquid pairs), Hyperliquid may reject it. For market-making/grid bots, compute current mid first and skip or shift levels that sit inside your no-cross buffer zone.
Automatically sells 0.01 BTC if the price drops to $90,000. Executes as market order when triggered.
For a limit order when triggered (instead of market):
Automatically sells 0.5 ETH if the price rises to $3,500. Executes as market order when triggered.
Use reduce_only=true to ensure it only closes, never opens a new position.
Spot orders use the same interface — just specify the token name.
Get order_id from hl_open_orders.
Note: Usually not needed - funds are automatically shared. Only use if you get an error saying you need to transfer.
Fee: 1 USDC deducted by Hyperliquid. Processing takes ~5 minutes.
Sends USDC from the agent's Arbitrum wallet to the Hyperliquid bridge contract. Minimum deposit: 5 USDC. Requires USDC balance on Arbitrum.
Intervals: 1m, 5m, 15m, 1h, 4h, 1d. Lookback in hours.
When a user asks to trade a ticker, you need to determine whether it's a native crypto perp (use plain name) or an RWA/stock perp (use xyz:TICKER prefix).
"BTC", "ETH", "SOL", "DOGE", "HYPE", etc.xyz: prefix: "xyz:NVDA", "xyz:TSLA", "xyz:GOLD", etc.hl_market(coin="X") — if it returns a price, it's a crypto perphl_market(dex="xyz") to list all RWA markets and search the resultsxyz: prefix)| Category | Examples |
|---|---|
| US Stocks | xyz:NVDA, xyz:TSLA, xyz:AAPL, xyz:MSFT, xyz:AMZN, xyz:GOOG, xyz:META, xyz:TSM |
| Commodities — Metals | xyz:GOLD, xyz:SILVER, xyz:COPPER, xyz:PLATINUM, xyz:PALLADIUM, xyz:ALUMINIUM |
| Commodities — Energy | xyz:CL (WTI), xyz:BRENTOIL, xyz:NATGAS, xyz:TTF (EU Gas) |
| Commodities — Agriculture | xyz:CORN, xyz:WHEAT |
| Commodities — Other | xyz:URANIUM |
| Indices | xyz:SPY |
| Forex | xyz:EUR, xyz:GBP, xyz:JPY |
If a user says "buy NVDA" or "trade GOLD", use
xyz:NVDA/xyz:GOLD. These are real-world assets, not crypto.
All 13 commodity markets are HIP-3 builder-deployed perps. Their symbols use the xyz: prefix (e.g. xyz:GOLD, xyz:CL), NOT standard formats like XAU, XAG, or WTI.
Full commodity list: GOLD, SILVER, COPPER, PLATINUM, PALLADIUM, ALUMINIUM, CL (WTI crude), BRENTOIL, NATGAS, TTF (EU gas), CORN, WHEAT, URANIUM.
Key gotcha: HIP-3 assets are NOT included in allMids (the standard price feed). This means:
hl_market(coin="xyz:GOLD") may return no price or fail to find the assethl_market(dex="xyz") lists all builder markets but may not include mid pricesThe reliable way to get commodity prices is hl_candles:
The close field of the most recent candle = current price. The oldest candle's open vs latest close gives 24h change.
All existing tools work with xyz:TICKER — just pass the prefixed coin name:
xyz:NVDAhl_market(coin="xyz:NVDA") — Check current price, leverage limitshl_leverage(coin="xyz:NVDA", leverage=3) — Set leverage (builder perps use isolated margin)hl_order(coin="xyz:NVDA", side="buy", size=0.5, price=188) — Place limit buyhl_fills() — Check if filledhl_leverage handles this automaticallydex prefix (e.g. xyz) identifies which builder deployed the perpUser: "What's the gold price?" or "Show me commodity prices" or "Oil price?"
Name → Symbol mapping:
xyz:GOLD, SILVER→xyz:SILVER, COPPER→xyz:COPPER, PLATINUM→xyz:PLATINUM, PALLADIUM→xyz:PALLADIUM, ALUMINIUM→xyz:ALUMINIUMxyz:CL, Brent→xyz:BRENTOIL, Natural Gas→xyz:NATGAS, EU Gas→xyz:TTFxyz:CORN, Wheat→xyz:WHEATxyz:URANIUMSteps:
hl_candles(coin="xyz:GOLD", interval="1h", lookback=24) — Get 24h of hourly candlesclose(last_close - first_open) / first_open * 100Do NOT use hl_market() for commodities — HIP-3 assets are not in allMids. Always use hl_candles.
Liquidity note: CL (WTI) and BRENTOIL have the highest volume. ALUMINIUM, URANIUM, CORN, WHEAT, TTF may have zero or very low liquidity — warn the user before trading these.
User: "Buy BTC" or "Long ETH with 5x"
Agent workflow:
hl_total_balance() → Check available fundshl_leverage(coin="BTC", leverage=5) → Set leveragehl_order(...) → Place orderhl_fills() → Verify fill and report resultUser: "Buy NVIDIA" or "Short TESLA"
Agent workflow:
hl_total_balance() → Check available fundshl_leverage(coin="xyz:NVDA", leverage=10) → Set leveragehl_order(coin="xyz:NVDA", ...) → Place orderhl_fills() → Verify fill and report resultUser: "Close my BTC position"
Agent workflow:
hl_account() → Get current position sizehl_order(coin="BTC", side="sell", size=X, reduce_only=true) → Close positionhl_fills() → Report PnLFor always-on bots running inside FastAPI/worker services:
get_open_orders(address)get_user_fills(address)Important: Do not treat "order disappeared from open orders" as guaranteed fill. It can also mean cancel/reject/expired. Always confirm with get_user_fills (or get_order_status when needed).
User: "Buy 100 HYPE tokens"
Agent workflow:
hl_total_balance() → Check available USDChl_spot_order(coin="HYPE", side="buy", size=100) → Buy tokenshl_balances() → Verify purchaseDeposit:
User: "Deposit $500 USDC to Hyperliquid"
Agent: hl_deposit(amount=500) → Done
Withdraw:
User: "Withdraw $100 to my Arbitrum wallet"
Agent: hl_withdraw(amount=100) → Done (5 min, 1 USDC fee)
| Type | Parameter | Behavior |
|---|---|---|
| Limit (GTC) | order_type="limit" | Rests on book until filled or cancelled |
| Market (IoC) | omit price | Immediate-or-Cancel at mid +/- 3% slippage |
| Post-Only (ALO) | order_type="alo" | Rejected if it would cross the spread |
| Fill-or-Kill | order_type="ioc" + explicit price | Fill immediately at price or cancel |
| Stop Loss | hl_tpsl_order with tpsl="sl" | Triggers when price drops to limit losses |
| Take Profit | hl_tpsl_order with tpsl="tp" | Triggers when price rises to lock gains |
Stop loss and take profit orders are trigger orders that automatically execute when the market reaches a specified price level. Use these to manage risk and lock in profits without monitoring positions 24/7.
trigger_px, order activatesUse case: Limit losses on a position by automatically exiting if price moves against you.
Example: You're long BTC at $95,000 and want to exit if it drops below $90,000.
Use case: Lock in gains by automatically exiting when price reaches your profit target.
Example: You're long ETH at $3,000 and want to take profit at $3,500.
By default, TP/SL orders execute as market orders when triggered (instant fill, possible slippage).
For more control, use a limit order when triggered:
Trade-off: Limit orders avoid slippage but may not fill in fast-moving markets.
For short positions, reverse the side parameter:
Stop loss on short (exit if price rises):
Take profit on short (exit if price drops):
reduce_only=true (default) - ensures TP/SL only closes positions, never opens new oneshl_open_orders to verify TP/SL orders are active| Mistake | Problem | Solution |
|---|---|---|
| Wrong side | SL buys instead of sells | Long position → side="sell" for SL/TP |
| Size too large | TP/SL opens new position | Set size ≤ position size, use reduce_only=true |
| Trigger = limit | Confusion about prices | trigger_px = when to activate, limit_px = execution price |
| No SL on leverage | Liquidation risk | Always set stop loss on leveraged positions |
| Aspect | Perps | Spot |
|---|---|---|
| Tool | hl_order | hl_spot_order |
| Leverage | Yes (up to asset max) | No |
| Funding | Paid/received every hour | None |
| Short selling | Yes (native) | Must own tokens to sell |
| Check positions | hl_account | hl_balances |
Starchild automatically collects a 2 bps (0.02%) builder fee on every perp and spot order placed through this skill. This fee supports platform operations and is separate from Hyperliquid's own trading fees.
How it works:
ApproveBuilderFee action (signed by the user's main wallet)builder parameter: {"b": "0x2c5320F40305fFC933385c6DCec5493fbA7b98b8", "f": 20} (20 tenths-of-bps = 2 bps)Tools:
hl_approve_builder — Manually approve the Starchild builder (normally auto-done on first order)hl_builder_status — Check approval status and view unclaimed builder rewardsIf builder approval fails: Orders still go through without the builder parameter. The error is logged but does not block trading.
| Error | Fix |
|---|---|
| "Unknown perp asset" | Check coin name. Crypto: "BTC", "ETH". Stocks: "xyz:NVDA", "xyz:TSLA" |
| "Insufficient margin" | Use hl_total_balance to check funds. Reduce size or add more USDC |
| "Order must have minimum value of $10" | Increase size. Formula: size × price ≥ $10 |
| "Size too small" | BTC min is typically 0.001. Check asset's szDecimals |
| "Order would cross" | ALO order rejected. Use regular limit order instead |
| "User or wallet does not exist" | Deposit USDC first with hl_deposit(amount=500) |
| "Minimum deposit is 5 USDC" | Hyperliquid requires at least $5 per deposit |
| "Policy violation" | Load wallet-policy skill and propose wildcard policy |
| "Action disabled when unified account is active" | Transfers blocked in unified mode (default). Just place orders directly |
| "'side' must be one of: buy/sell ..." | You passed an unrecognized direction. Use "buy" or "sell". See Side Parameter Convention above |