t2000-skills/skills/t2000-send/SKILL.md
Send USDC, USDsui, or SUI from the t2000 Agent Wallet to another Sui address. Use when asked to pay someone, transfer funds, send money, tip a creator, or make a payment to a specific Sui address, SuiNS name, or saved contact. Do NOT use for API payments — use the t2000-pay skill for MPP-protected services.
npx skillsauth add mission69b/t2000 t2000-sendInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Transfer USDC, USDsui, or SUI from the agent's available balance to any Sui address. USDC + USDsui are gasless — they go through Sui's protocol-level 0x2::balance::send_funds path (Sui foundation sponsored). SUI is not gasless — the wallet must hold some SUI to cover the gas fee (typically < $0.0002).
t2 send 5 alice.sui exits with a clear error pointing at the missing <asset> arg. Always pass one of USDC | USDsui | SUI.unsupported asset. To send a different asset, the user first swaps it via t2 swap (or audric.ai) into USDC, USDsui, or SUI.alice.sui). Raw addresses → isValidSuiAddress(). The SDK throws clear errors (CONTACT_NOT_FOUND, INVALID_ADDRESS, SUINS_NOT_REGISTERED); don't guess.alice.sui is preferred over a local contact named alice — SuiNS is the global standard. The local contact subsystem is deprecated and will sunset.Math.round can produce a number larger than the on-chain balance and the transfer will fail simulation.t2 send invocations (CLI) or N t2000_send tool calls (MCP). Each is atomic.t2 limit set --per-tx 50 and the request exceeds the cap, the CLI throws LIMIT_EXCEEDED. The user can override one time with --force. MCP writes do NOT currently gate on limits (Phase D consolidation).t2 send <amount> <asset> <recipient>
t2 send <amount> <asset> to <recipient> # `to` filler optional
# Examples:
t2 send 5 USDC 0x8b3e...d412 # 5 USDC to a hex address (gasless)
t2 send 5 USDsui alice.sui # 5 USDsui to a SuiNS name (gasless)
t2 send 50 USDC to mission69b@audric # @audric handle (gasless)
t2 send 0.1 SUI 0x8b3e...d412 # 0.1 SUI to a hex address (gas required)
Use --force to bypass an opt-in limit one time. Use --key <path> to point at a non-default wallet file.
✓ Sent $5.00 USDC → alex.sui (0x8b3e...d412)
Gas: gasless ⚡
Tx: https://suiscan.xyz/mainnet/tx/0xdigest...
For non-gasless sends (SUI), the gas line shows the actual SUI burn:
✓ Sent 0.1000 SUI → 0x8b3e...d412
Gas: 0.000123 SUI
Tx: https://suiscan.xyz/mainnet/tx/0xdigest...
{
"tx": "0xdigest...",
"amount": 5,
"to": "0x8b3e...d412",
"suinsName": "alex.sui",
"gasCost": 0,
"gasCostUnit": "SUI",
"asset": "USDC",
"gasless": true
}
--force.| Error code | Meaning |
|---|---|
| INSUFFICIENT_BALANCE | Wallet balance for the chosen asset is less than the requested amount. |
| INSUFFICIENT_GAS | SUI sends only — wallet has the asset but not enough SUI for gas. Suggest a swap. |
| INVALID_ADDRESS | Recipient is not a valid Sui hex address. |
| INVALID_ASSET | Asset is missing or not in the allowlist (USDC / USDsui / SUI). |
| SUINS_NOT_REGISTERED | The .sui name isn't registered. |
| CONTACT_NOT_FOUND | The name isn't a SuiNS name, an @audric handle, or a saved local contact. |
| LIMIT_EXCEEDED | CLI hit a t2 limit set cap. Use --force to override. |
| SIMULATION_FAILED | Transaction would fail on-chain (details in the error message). |
The SDK (T2000.resolveRecipient) handles resolution in this priority order:
0x) → validated via isValidSuiAddress(). If invalid → INVALID_ADDRESS.*.sui) → resolves via SuiNS registry. If unregistered → SUINS_NOT_REGISTERED.name@audric) → resolves via the audric.ai handle registry.~/.t2000/contacts.json (deprecated; will sunset).If the user's input doesn't match any path, the SDK throws CONTACT_NOT_FOUND with a suggestion to use a hex address or register a SuiNS name.
Offer (but don't auto-save):
"Want to save 0x8b3e…d412 as a contact? You can run
t2 contacts add <name> 0x8b3e…d412to keep it. (SuiNS at https://suins.io is the recommended path — globally resolvable.)"
The local contact subsystem is deprecated and will sunset. SuiNS is the canonical name layer for Sui addresses.
t2000_send tool)The MCP t2000_send tool has the same asset-required contract:
{
"to": "alice.sui",
"amount": 5,
"asset": "USDC",
"dryRun": false
}
dryRun: true returns a preview without signing — useful for confirming the resolved address + gasless badge before the actual write.asset is REQUIRED — calls without it return an error.t2 limit set caps in v4 Phase B. Use the CLI for limit-gated workflows.tools
Set up a t2000 Agent Wallet end-to-end on the user's machine. Use when the user says "set up t2000", "install the wallet", "create my Agent Wallet", "connect t2000 to Claude / Cursor", or pastes a one-prompt install URL. Covers wallet creation, optional spending limits, and MCP wiring. Read this first when bootstrapping a new user; the other skills assume this has run.
development
Discover MPP services payable via `t2 pay`. Use when the user asks "what can I pay for?", "what AI models are available?", "show me the service catalog", "is there a weather API?", or any other discovery question. Pairs with the t2000-pay skill (discovery first, then pay).
development
Pay for an MPP-protected API service using the t2000 wallet. Use when asked to call an AI model, search the web, generate images, send email, buy gift cards, send physical mail, check weather, execute code, or any task that requires a paid API. Handles the full MPP 402 challenge automatically. Use t2000_services to discover all available services first.
development
Swap tokens on Sui via Cetus Aggregator (20+ DEXs, best-route across SUI, USDC, USDsui, USDT, USDe, ETH, GOLD, NAVX, WAL, vSUI, and more). Use when asked to swap, trade, convert, exchange, or "turn X into Y". Do not use for sending — use the t2000-send skill for transfers.