Skills bou-wallet
git clone https://github.com/openclaw/skills
T=$(mktemp -d) && git clone --depth=1 https://github.com/openclaw/skills "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/0xcipher0/bou-wallet" ~/.claude/skills/clawdbot-skills-bou-wallet && rm -rf "$T"
skills/0xcipher0/bou-wallet/SKILL.mdBOU Wallet
Use direct HTTP requests with
curl. Prefer this skill when the task is to operate this backend through an existing agent bearer key instead of building a separate SDK or CLI first.
First-time setup after install
If the user has installed this skill but does not have an agent API key yet, walk them through this setup first:
- Open
https://app.bankofuniverse.org/ - Sign in, then create an agent in the app
- Generate the agent API key, then copy it and use it as
in requestsAGENT_KEY
If the user has not completed these steps yet, do not pretend the skill can run successfully. First help them obtain a valid
ak_... key.
Required inputs
Collect these values before making any request:
: useBASE_URL
unless the user explicitly gives a different backendhttps://api.bankofuniverse.org/
: bearer token inAGENT_KEY
formatak_...
Treat the agent key as secret. Do not print, commit, or store it in repo files.
Common request pattern
Use the same bearer auth for all three capability groups.
curl -sS "$BASE_URL/..." \ -H "Authorization: Bearer $AGENT_KEY" \ -H "Accept: application/json"
For JSON request bodies, also add:
-H "Content-Type: application/json"
Most responses use the shared wrapper:
{ "code": 0, "message": "", "data": {} }
Capability 1: x402 pay-and-call
Use
POST /agent/pay-and-call when the agent needs to access an x402-protected upstream URL through this backend. Call this backend endpoint, not the merchant directly.
Body shape:
{ "url": "https://merchant.example.com/path", "method": "GET", "headers": { "X-Custom-Header": "value" }, "body": { "query": "ETH price" } }
Rules:
- Send a full upstream
orhttp://
URL inhttps://url - Use the upstream HTTP verb in
method - Pass merchant headers as a JSON object when needed
- Pass
only when the upstream endpoint expects onebody - The backend enforces agent status and USDC payment limits before paying
- The backend rejects requests when the required payment is
USDC>= 0.1
Example:
curl -sS -X POST "$BASE_URL/agent/pay-and-call" \ -H "Authorization: Bearer $AGENT_KEY" \ -H "Content-Type: application/json" \ -d '{ "url": "https://api.example.com/search", "method": "POST", "body": { "query": "BTC" } }'
x402 test cases
Use these upstream URLs to quickly test the
pay-and-call flow.
Test case 1: random number
Upstream endpoint:
GET /cos/crypto/chainlink/random
Expected response body:
{ "number": 42 }
Example:
curl -sS -X POST "https://api.bankofuniverse.org/agent/pay-and-call" \ -H "Authorization: Bearer $AGENT_KEY" \ -H "Content-Type: application/json" \ -d '{ "url": "https://skills.bankofuniverse.org/cos/crypto/chainlink/random", "method": "GET" }'
Test case 2: crypto price
Upstream endpoint:
GET /cos/crypto/price/:symbol
Supported symbols:
ETHBTCUSDCUSDTTRXBNB
Expected response body:
{ "symbol": "BTC", "supportedSymbols": ["ETH", "BTC", "USDC", "USDT", "TRX", "BNB"], "price": 84000.12, "timestamp": 1710000000000 }
Example:
curl -sS -X POST "https://api.bankofuniverse.org/agent/pay-and-call" \ -H "Authorization: Bearer $AGENT_KEY" \ -H "Content-Type: application/json" \ -d '{ "url": "https://skills.bankofuniverse.org/cos/crypto/price/BTC", "method": "GET" }'
Capability 2: current agent info
Use
GET /agent/me to inspect the current agent resolved by the bearer key.
This endpoint returns the resolved agent, matched API key metadata, cumulative spent USDC, and a best-effort Base USDC balance lookup.
Example:
curl -sS "$BASE_URL/agent/me" \ -H "Authorization: Bearer $AGENT_KEY"
Capability 3: Hyperliquid operations
Use the
/hyperliquid endpoints when the agent needs to inspect or trade through the backend's Hyperliquid integration. All requests use the same bearer auth pattern.
Read endpoints
Purpose: verify the current agent is authorized to use Hyperliquid for the resolved account. Key return fields:GET /hyperliquid/status
is the resolved Hyperliquid account address. In agent mode, the response may also include signer-related identity information returned by the backend. Use it when: you want to confirm the bearer key is valid and Hyperliquid access is ready before reading balances or sending orders.address
Purpose: fetch the latest account balance snapshot from Hyperliquid. Key return fields:GET /hyperliquid/balances
contains the balance payload returned by Hyperliquid for the resolved account, including available funds and account balance details. Use it when: you need to check available funds before trading, transferring, or withdrawing.data
Purpose: list current open orders, optionally filtered by one symbol. Key return fields: each item is normalized to include readableGET /hyperliquid/open-orders?coin=BTC
,coin
, andside
; the rest of the item is the underlying open-order data. Use it when: you want to inspect working orders before canceling or placing another order.marketType
Purpose: list supported spot or perp markets. Key return fields: spot markets include fields such asGET /hyperliquid/markets?marketType=perp
,coin
,pairId
,base
,quote
,szDecimals
, andweiDecimals
; perp markets include fields such asmarketType
,coin
,base
,quote
,dexName
,maxLeverage
,szDecimals
,onlyIsolated
, andmarginMode
. Use it when: you need to discover valid symbols, decimals, supported dex markets, or leverage-related metadata before trading.marketType
Purpose: inspect the current account trading state for one perp coin. Key return fields:GET /hyperliquid/active-asset-data?coin=BTC
,coin
,leverage
,isCross
,leverageType
,maxTradeSzs
, andavailableToTrade
.markPx
andmaxTradeSzs
are two-element arrays: indexavailableToTrade
is the0
value and indexBUY
is the1
value. Use it when: you need the current leverage mode, tradeable size, or mark price for a perp coin before placing or sizing an order.SELL
Purpose: fetch current and next funding information for one perp market. Key return fields:GET /hyperliquid/funding?coin=BTC
,coin
,fundingRate
,nextFundingRate
,nextFundingTimestamp
, andmarkPrice
. Use it when: you want to evaluate funding cost, expected next funding, or compare mark price with oracle/index price.indexPrice
Purpose: fetch the live L2 order book for one market. Key return fields:GET /hyperliquid/orderbook?coin=BTC
is the raw Hyperliquid order book snapshot, including bid and ask levels plus the snapshot time. Use it when: you need market depth, best bid/ask context, or raw book levels for quoting and execution logic.data
Purpose: list current perp positions across available dex contexts for the account. Key return fields: each position includesGET /hyperliquid/positions
,dexName
,marketType
,coin
,szi
,leverage
,isCross
,leverageType
,entryPx
,positionValue
,unrealizedPnl
,returnOnEquity
,liquidationPx
,marginUsed
, andmaxLeverage
. Use it when: you want a full view of current exposure, PnL, liquidation risk, and leverage usage.cumFunding
Purpose: list historical fills for the account, optionally filtered by symbol, start time, and result count. Key return fields: each fill is normalized to include readableGET /hyperliquid/fills?coin=BTC&since=1710000000000&limit=100
,coin
, andside
; the rest of the fill fields come from Hyperliquid's fill history. Use it when: you want recent execution history for trade reconciliation, reporting, or strategy logic.marketType
Purpose: fetch a compact ticker-style market snapshot for one symbol. Key return fields:GET /hyperliquid/ticker?coin=BTC&marketType=perp
,coin
,marketType
,last
,bid
,ask
,open
,close
,change
,percentage
,volume
, andquoteVolume
. Use it when: you need a lightweight summary of current price, spread, daily move, and volume without reading the full order book.timestamp
Query rules:
:marketType
orperpspot
: short asset symbol such ascoin
orBTCETH
for fills:limit
to1500
for orderbook:nSigFigs
,2
,3
, or45
for orderbook:mantissa
or25
Write endpoints
POST /hyperliquid/orderPOST /hyperliquid/cancelPOST /hyperliquid/cancel-allPOST /hyperliquid/set-leveragePOST /hyperliquid/transferPOST /hyperliquid/withdraw
Place order
Request body:
{ "coin": "BTC", "marketType": "perp", "orderType": "limit", "side": "BUY", "size": "0.001", "price": "50000", "reduceOnly": false, "timeInForce": "Gtc" }
Field rules:
:orderType
,market
,limit
,stop_limit
, orstop_markettwap
:side
orBUYSELL
: numeric stringsize
: optional in the DTO, but required for limit-style orders such asprice
andlimitstop_limit
: optional in the DTO, but use it for stop orders such astriggerPrice
andstop_limitstop_market
andtpPrice
: optional take-profit and stop-loss valuesslPrice
:timeInForce
,Gtc
, orIocAlo
: optional in the DTO, mindurationMinutes
, max5
; use it for TWAP-style flows when required by the backend logic1440
: optional boolean for TWAP-style flowsrandomizeSlices
Example:
curl -sS -X POST "$BASE_URL/hyperliquid/order" \ -H "Authorization: Bearer $AGENT_KEY" \ -H "Content-Type: application/json" \ -d '{ "coin": "BTC", "marketType": "perp", "orderType": "limit", "side": "BUY", "size": "0.001", "price": "50000" }'
Cancel selected orders
Request body:
{ "orders": [ { "coin": "BTC", "orderId": 123456 } ] }
Field rules:
: required array with at mostorders
items100
: required string for each itemcoin
: required integer for each item, minimumorderId0
Cancel all orders
Request body:
{ "coin": "BTC" }
Omit
coin to cancel all open orders across supported assets.
Set leverage
Request body:
{ "coin": "BTC", "leverage": 5, "isCross": true }
Transfer asset
Request body:
{ "amount": "10", "dex": "", "fromPerp": true }
Field rules:
: required numeric stringamount
: optional dex name string; omit it to use the primary dex.dex
: optional boolean,fromPerp
means transfer from perp sidetrue
Withdraw asset
Use this endpoint to withdraw Perps USDC to the Arbitrum network.
Request body:
{ "destination": "0x1234567890abcdef1234567890abcdef12345678", "amount": "10" }
Field rules:
: required EVM addressdestination
: required numeric stringamount
Execution checklist
Before running requests:
- Verify
is correctBASE_URL - Verify the token looks like
ak_... - Verify JSON is valid
- Verify Hyperliquid enum values match the accepted casing exactly
- Prefer the two built-in x402 test cases above when validating a new agent key
- Use
when you need status codes or headers for debugging-i
If a request fails, inspect the wrapped JSON
message plus the HTTP status first.