Install
openclaw skills install sumplus-arsenalExecute DeFi skills on Ethereum, Sui, Solana, and 10+ chains via Arsenal. Use for swaps, lending, liquidity, portfolio queries, and any blockchain operation.
openclaw skills install sumplus-arsenalArsenal is Sumplus's on-chain execution platform. When the user asks for anything blockchain-related — swaps, lending, balances, liquidity positions — call Arsenal.
Base URL: https://arsenal.sumplus.xyz
Auth: Authorization: Bearer {ARSENAL_API_KEY} (inject from env, never ask the user)
GET /api/skills?search={intent}&limit=5
Always search first. Don't guess a skill_id.
# Example: user wants to swap on Sui
curl "https://arsenal.sumplus.xyz/api/skills?search=cetus+swap+sui&limit=5"
Response includes id, name, schema.input (what params to send), schema.output (what comes back).
POST /api/execute
Authorization: Bearer {ARSENAL_API_KEY}
Content-Type: application/json
{
"skill_id": "<id from Step 1>",
"input": {
"action": "<action>",
... other params from schema.input
}
}
Every call requires action. Check the skill's schema.input for the full list.
| Param | Description |
|---|---|
action | Required. Which operation: get_quote, build_swap_tx, get_markets, etc. |
sender | Wallet address. EVM: 0x... (40 hex). Sui: 0x... (64 hex). |
tokenIn / token_in | Input token symbol (ETH, USDC) or contract address |
tokenOut / token_out | Output token |
amountIn / amount_in | Human-readable amount string: "0.1", "100" |
slippage | Decimal, default 0.01 (= 1%) |
chain | Chain name: ethereum, optimism, arbitrum, base, bsc, solana |
get_quote){
"amount_in": "0.1",
"amount_out": "243.52",
"price_impact": "0.04%",
"fee": "0.3%"
}
Show this to the user. Ask if they want to proceed before building a transaction.
build_swap_tx){
"transactions": [
{ "to": "0x...", "data": "0x...", "value": "0x0", "description": "Approve WETH" },
{ "to": "0x...", "data": "0x...", "value": "0x0", "description": "Swap WETH → USDC" }
],
"amount_out_estimated": "243.52",
"amount_out_minimum": "241.1"
}
Execute transactions in order. Each tx must confirm before sending the next.
build_swap_tx){
"tx_bytes": "<base64 PTB>",
"instructions": ["Pass tx_bytes to any Sui wallet to sign and submit."]
}
Pass tx_bytes to Privy send_sui_transaction or the user's Sui wallet.
build_swap_tx){
"transaction": "<base64 VersionedTransaction>",
"amount_in": "0.1",
"amount_out": "14.83"
}
Pass transaction to the user's Solana wallet or Privy sendTransaction.
EVM (Ethereum, Optimism, Arbitrum, Base, Polygon, BSC)
get_quote, build_swap_txget_quote, build_swap_tx (Optimism only)get_quote, build_swap_tx, get_pool_infoget_markets, get_reserves, get_user_account, get_user_supplies, get_user_borrowsget_markets, get_position, get_funding_ratesget_markets, get_orderbook, get_user_positionsSui
get_quote, build_swap_tx, get_pool_info, get_pools, get_positionlist_vaults, get_vault_info, get_user_position, deposit, withdrawget_pools, get_pool_info, get_quote, build_swap_txget_markets, get_user_position, get_reserve_dataget_markets, get_user_positionget_markets, get_user_positionget_balance, get_tokens, get_nfts, get_transactionsSolana
get_quote, build_swap_tx, get_token_priceget_pools, get_pool_info, get_quoteCross-chain
get_balance, get_tokens, get_transactionsget_recommendations, compare_protocols| Status | Meaning | Action |
|---|---|---|
| 400 | Bad input / missing field | Check details.fieldErrors, fix params |
| 401 | Invalid or missing API key | Check ARSENAL_API_KEY env var |
| 404 | Skill not found | Re-search with different keywords |
| 422 | Skill ran but failed logically (no pool, bad amount) | Tell user, suggest alternatives |
| 500 | Infrastructure error | Retry once, then report to user |
User: "Swap 0.5 SUI for USDC on Cetus"
GET /api/skills?search=cetus+swap+suiidPOST /api/execute with action: "get_quote", tokenIn: "SUI", tokenOut: "USDC", amountIn: "0.5"POST /api/execute with action: "build_swap_tx", sender: "<user_address>", same tokens + amounttx_bytes to user's Sui wallet for signingIf the user needs an Arsenal API key:
POST https://arsenal.sumplus.xyz/api/auth/signup
{ "email": "...", "password": "...", "role": "agent" }
Then: POST /api/auth/apikey (with JWT) → { "api_key": "sk_live_..." }