Install
openclaw skills install gate-exchange-transferGate Exchange same-UID internal transfer skill. Use when the user asks to move funds between their own Gate accounts. Triggers on 'transfer funds', 'move USDT to futures', 'internal transfer'.
openclaw skills install gate-exchange-transfer⚠️ STOP — You MUST read and strictly follow the shared runtime rules before proceeding.
Do NOT select or call any tool until all rules are read. These rules have the highest priority.
→ Read ./references/gate-runtime-rules.md
Execute same-UID internal transfers between Gate trading accounts: spot, isolated margin, perpetual, delivery, and options. Single execution endpoint: POST /wallet/transfers (MCP: cex_wallet_create_transfer).
Scope (Phase 1)
| MCP Server | Status |
|---|---|
| Gate (main) | ✅ Required |
Query Operations (Read-only)
Execution Operations (Write)
GATE_API_KEY, GATE_API_SECRET)Read and strictly follow references/mcp.md, then execute this skill's transfer workflow.
SKILL.md keeps transfer intent routing and account-type mapping.references/mcp.md is the authoritative MCP execution layer for transfer pre-check, confirmation gate, execution, and ledger verification.| Precondition | If not met |
|---|---|
| User logged in | Do not call API; prompt to log in (exception flow). |
| Account mode known | Infer from context or assume classic: Spot ↔ USDT perpetual. For unified/trading account advanced mode: Trading account ↔ BTC perpetual. |
| Source balance verifiable | Call balance API for from account before showing draft; if unavailable, prompt user to check on web. |
Every internal transfer is fully specified by four elements. The assistant must resolve or infer them before showing a Transfer Draft.
| Element | API param | Required when | Notes |
|---|---|---|---|
| From | from | Always | spot | margin | futures | delivery | options |
| To | to | Always | Same enum as from |
| Currency | currency | Always | USDT, BTC, etc. (platform-supported). Missing → auto-complete by target (case2). |
| Amount | amount | Always | String, > 0, up to 8 decimals. Missing → ask user (case8). |
Conditional params
currency_pair required (e.g. BTC_USDT) when from or to is margin.settle required (usdt | btc) when from or to is futures or delivery.| Endpoint | Method | Meaning | Rate limit |
|---|---|---|---|
/wallet/transfers | POST | Same-UID internal transfer | 80 req/10s |
| Group | Tool (jsonrpc: call.method) |
|---|---|
| Main account internal transfer | cex_wallet_create_transfer |
| Case | Scenario | Action |
|---|---|---|
| case1 | All four elements present | Show Transfer Draft → confirm → call API → Transfer Result Report |
| case2 | Currency missing | Auto-complete currency by target account → same as case1 |
| case3 | Transfer completed (API success) | Output Transfer Result Report + product suggestion |
| case4 | Insufficient balance | Pre-check fails; no API call; show shortfall and suggest deposit/adjust |
| case5 | Missing from/to or ambiguous intent | Show missing-info card; do not call API |
| case6 | Account mode conflict (e.g. trading account → USDT perpetual not allowed) | Explain and suggest alternative path |
| case7 | Currency vs To mismatch (e.g. USDT to BTC perpetual) | Auto-correct or prompt correction → then case1 |
| case8 | Amount missing | Ask for amount; after user provides, proceed to case1/case2 |
| case9 | User cancels or declines after draft | Acknowledge; do not call API |
| case10 | Confirmation ambiguous or stale | Re-present draft; ask for explicit "Confirm" / "Yes"; do not execute |
| case11 | Rate limit / service error | Do not retry blindly; prompt retry later or use web UI |
Before calling cex_wallet_create_transfer, output a Transfer Draft and wait for explicit confirmation in the immediately following user turn.
Draft contents
from (account name)to (account name)currencyamountsettle (for futures/delivery), currency_pair (for margin)Confirmation rule
Trigger
"Transfer 100 USDT from my spot account to perpetual futures account" / "Transfer 1000 USDT from spot to USDT-margined futures" / "Transfer 0.5 BTC from coin-margined to spot"
Steps
from, to, currency, amount; add settle or currency_pair if needed.cex_wallet_create_transfer.Request mapping
| Intent | API parameter | Values |
|---|---|---|
| Source account | from | spot | margin | futures | delivery | options |
| Target account | to | spot | margin | futures | delivery | options |
| Currency | currency | USDT, BTC, etc. |
| Amount | amount | String, > 0, up to 8 decimals |
| Margin pair | currency_pair | Required if from/to is margin, e.g. BTC_USDT |
| Settlement | settle | Required if from/to is futures or delivery: usdt | btc |
Trigger
"Transfer 100 to my USDT-margined account" / "Transfer 500 to futures" / "Transfer 1000 to perpetual"
Logic
Set currency by target account:
| Target account | Default currency |
|---|---|
| USDT perpetual (futures settle=usdt) | USDT |
| BTC perpetual (futures settle=btc) | BTC |
| TradFi | USDT |
| Delivery | USDT |
| Options | USDT |
| Spot / margin | Infer from context or ask |
Steps
Same as case1 after currency is set.
Output (draft)
"Detected transfer of {amount} to {to account name}. Based on account type, default currency is {currency}. Please confirm."
Trigger
User confirmed; cex_wallet_create_transfer returned success.
Output
Trigger
Pre-check: source available balance < transfer amount.
Action
Do not call transfer API.
Output
"Your {from account name} has insufficient balance (available: {available} {currency}). Please adjust the amount or deposit first."
Trigger
"Contract is about to be liquidated, transfer some funds for margin" / "Top up my futures margin" / "How do I adjust account funds"
Logic
Output
"I can help with margin top-up. Please specify: from account, to account, and currency (and amount if you know it)."
Trigger
User in trading account advanced mode asks to transfer to USDT perpetual. In this mode, direct transfer to USDT perpetual may be disallowed (path not available).
Output
"You are in trading account mode; direct transfer to USDT perpetual is not available. You can transfer to BTC perpetual (coin-margined) instead, or adjust account mode on the web."
Trigger
"Transfer some USDT to my BTC perpetual account"
Logic
BTC perpetual settles in BTC; USDT is inconsistent.
Output
"BTC perpetual uses BTC settlement. I've corrected the transfer to use BTC (or: please specify amount in BTC). Please confirm." Or: "For USDT, use USDT perpetual account instead."
Trigger
"Transfer USDT from spot to futures" / "Move my USDT to perpetual" (no amount).
Action
Ask: "How much {currency} do you want to transfer from {from} to {to}?" After user provides amount, resolve currency if still missing (case2), then proceed to case1.
Trigger
After Transfer Draft, user says "No" / "Cancel" / "Don't do it" / "Never mind".
Action
Do not call API. Acknowledge: "Transfer cancelled. No changes made."
Trigger
After draft, user replies with something other than clear confirmation (e.g. new question, different amount, or vague "ok" in a long thread).
Action
Do not execute. Re-present the Transfer Draft and say: "To execute this transfer, please confirm explicitly (e.g. 'Confirm' or 'Yes')."
Trigger
API returns TOO_MANY_REQUESTS or server/network error.
Action
Do not retry automatically in the same turn.
Output
"Request failed (rate limit / service error). Please try again later or use the web app to transfer."
| Exception | Handling | Block execution |
|---|---|---|
| Not logged in | Prompt to log in | Yes |
| Insufficient balance | Show shortfall + suggest deposit/adjust (case4) | Yes |
| Invalid account path (e.g. from/to not allowed) | Guide user to correct (case5/case6) | No, guide |
| User cancel / decline | Acknowledge (case9) | Yes |
| Confirmation missing/ambiguous | Re-present draft, ask explicit confirm (case10) | Yes |
| Rate limit / service error | Retry later or use web (case11) | Yes |
| Risk control / quota | Show clear reason | Yes |
{
"currency": "USDT",
"from": "spot",
"to": "futures",
"amount": "100",
"currency_pair": "",
"settle": "usdt"
}
| API value | Product name |
|---|---|
| spot | Spot |
| margin | Isolated margin |
| futures | Perpetual (use settle) |
| delivery | Delivery |
| options | Options |
| settle | Account |
|---|---|
| usdt | USDT perpetual |
| btc | BTC perpetual |
Required when from or to is margin; e.g. BTC_USDT.
After a transfer, user may ask for history. By account type:
| Account | Query tool (if MCP provides) | Notes |
|---|---|---|
| Spot | cex_spot_list_spot_account_book | currency, time, limit |
| Perpetual | cex_fx_list_fx_account_book | settle, type=dnw |
| Delivery | cex_dc_list_dc_account_book | settle, type=dnw |
| Margin | cex_margin_list_margin_account_book | currency_pair, time, limit |
| Options | cex_options_list_options_account_book | per MCP docs |
REST: Delivery GET /delivery/{settle}/account_book?type=dnw; Perpetual GET /futures/{settle}/account_book?type=dnw; Margin GET /margin/account_book.
| Code | Meaning |
|---|---|
| BALANCE_NOT_ENOUGH | Insufficient balance; do not retry same amount |
| TOO_MANY_REQUESTS | Rate limit; prompt retry later (case11) |
| QUOTA_NOT_ENOUGH | Quota exceeded; show message |
POST /wallet/transfers (cex_wallet_create_transfer). No main-sub in Phase 1.currency_pair for margin; settle for futures/delivery.