{
  "schemaVersion": "1.0",
  "item": {
    "slug": "silkyway",
    "name": "SilkyWay",
    "source": "tencent",
    "type": "skill",
    "category": "AI 智能",
    "sourceUrl": "https://clawhub.ai/silostack/silkyway",
    "canonicalUrl": "https://clawhub.ai/silostack/silkyway",
    "targetPlatform": "OpenClaw"
  },
  "install": {
    "downloadMode": "redirect",
    "downloadUrl": "/downloads/silkyway",
    "sourceDownloadUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=silkyway",
    "sourcePlatform": "tencent",
    "targetPlatform": "OpenClaw",
    "installMethod": "Manual import",
    "extraction": "Extract archive",
    "prerequisites": [
      "OpenClaw"
    ],
    "packageFormat": "ZIP package",
    "includedAssets": [
      "CHANGELOG.md",
      "README.md",
      "SKILL.md",
      "index.js",
      "package-lock.json",
      "package.json"
    ],
    "primaryDoc": "SKILL.md",
    "quickSetup": [
      "Download the package from Yavira.",
      "Extract the archive and review SKILL.md first.",
      "Import or place the package into your OpenClaw setup."
    ],
    "agentAssist": {
      "summary": "Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.",
      "steps": [
        "Download the package from Yavira.",
        "Extract it into a folder your agent can access.",
        "Paste one of the prompts below and point your agent at the extracted folder."
      ],
      "prompts": [
        {
          "label": "New install",
          "body": "I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Then review README.md for any prerequisites, environment setup, or post-install checks. Tell me what you changed and call out any manual steps you could not complete."
        },
        {
          "label": "Upgrade existing",
          "body": "I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Then review README.md for any prerequisites, environment setup, or post-install checks. Summarize what changed and any follow-up checks I should run."
        }
      ]
    },
    "sourceHealth": {
      "source": "tencent",
      "status": "healthy",
      "reason": "direct_download_ok",
      "recommendedAction": "download",
      "checkedAt": "2026-04-30T16:55:25.780Z",
      "expiresAt": "2026-05-07T16:55:25.780Z",
      "httpStatus": 200,
      "finalUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=network",
      "contentType": "application/zip",
      "probeMethod": "head",
      "details": {
        "probeUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=network",
        "contentDisposition": "attachment; filename=\"network-1.0.0.zip\"",
        "redirectLocation": null,
        "bodySnippet": null
      },
      "scope": "source",
      "summary": "Source download looks usable.",
      "detail": "Yavira can redirect you to the upstream package for this source.",
      "primaryActionLabel": "Download for OpenClaw",
      "primaryActionHref": "/downloads/silkyway"
    },
    "validation": {
      "installChecklist": [
        "Use the Yavira download entry.",
        "Review SKILL.md after the package is downloaded.",
        "Confirm the extracted package contains the expected setup assets."
      ],
      "postInstallChecks": [
        "Confirm the extracted package includes the expected docs or setup files.",
        "Validate the skill or prompts are available in your target agent workspace.",
        "Capture any manual follow-up steps the agent could not complete."
      ]
    },
    "downloadPageUrl": "https://openagent3.xyz/downloads/silkyway",
    "agentPageUrl": "https://openagent3.xyz/skills/silkyway/agent",
    "manifestUrl": "https://openagent3.xyz/skills/silkyway/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/silkyway/agent.md"
  },
  "agentAssist": {
    "summary": "Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.",
    "steps": [
      "Download the package from Yavira.",
      "Extract it into a folder your agent can access.",
      "Paste one of the prompts below and point your agent at the extracted folder."
    ],
    "prompts": [
      {
        "label": "New install",
        "body": "I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Then review README.md for any prerequisites, environment setup, or post-install checks. Tell me what you changed and call out any manual steps you could not complete."
      },
      {
        "label": "Upgrade existing",
        "body": "I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Then review README.md for any prerequisites, environment setup, or post-install checks. Summarize what changed and any follow-up checks I should run."
      }
    ]
  },
  "documentation": {
    "source": "clawhub",
    "primaryDoc": "SKILL.md",
    "sections": [
      {
        "title": "SilkyWay",
        "body": "Agent banking and payments on Solana. Send and receive stablecoins — non-custodial, on-chain."
      },
      {
        "title": "Install",
        "body": "npm install -g @silkysquad/silk\n\nRequires Node.js 18+."
      },
      {
        "title": "Setup",
        "body": "# 1. Initialize (creates wallet and agent ID)\nsilk init\n\n# 2. Check your wallet address\nsilk wallet list\n\nYour wallet and agent ID are saved at ~/.config/silkyway/config.json. Your private key never leaves your machine. silk init is idempotent — safe to run multiple times."
      },
      {
        "title": "Cluster configuration",
        "body": "Default cluster is mainnet-beta (real USDC). Switch to devnet for testing with free tokens.\n\nsilk config set-cluster devnet    # test tokens\nsilk config set-cluster mainnet-beta  # real USDC\nsilk config get-cluster           # show current\n\nClusterAPI Base URLNetworkmainnet-betahttps://api.silkyway.aiMainnet (real USDC)devnethttps://devnet-api.silkyway.aiDevnet (test USDC)"
      },
      {
        "title": "Fund your wallet (devnet)",
        "body": "On devnet, use the faucet — it gives you 0.1 SOL (for transaction fees) + 100 USDC:\n\nsilk config set-cluster devnet\nsilk wallet fund\nsilk balance\n\nOn mainnet, send SOL and USDC to your wallet address manually. SOL is required for Solana transaction fees."
      },
      {
        "title": "Sending Payments",
        "body": "silk pay <recipient> <amount> [--memo <text>]\n\nThis locks USDC into on-chain escrow. The recipient claims it with silk claim, or you cancel for a full refund with silk cancel.\n\nThe output includes a claim link (claimUrl) — a URL you can share with the recipient's human. They open it in a browser, connect their wallet, and claim the payment. This is the easiest way for a non-technical recipient to claim.\n\n# Send 10 USDC\nsilk pay 7xKXz9BpR3mFVDg2Thh3AG6sFRPqNrDJ4bHUkR8Y7vNx 10 --memo \"Payment for code review\"\n\n# Output includes claimUrl — share it with the recipient\n# Example: https://app.silkyway.ai/transfers/9aE5kBqRvF3...?cluster=devnet\n\n# Check your balance\nsilk balance\n\n# View your transfers\nsilk payments list\nsilk payments get <transfer-pda>"
      },
      {
        "title": "Claiming a payment",
        "body": "If someone sent you a payment:\n\nsilk payments list\nsilk claim <transfer-pda>"
      },
      {
        "title": "Cancelling a payment",
        "body": "Cancel a payment you sent (before the recipient claims it):\n\nsilk cancel <transfer-pda>"
      },
      {
        "title": "Address Book",
        "body": "Save contacts so you can send payments by name instead of address.\n\nsilk contacts add alice 7xKXz9BpR3mFVDg2Thh3AG6sFRPqNrDJ4bHUkR8Y7vNx\nsilk contacts list\nsilk contacts get alice\nsilk contacts remove alice\n\nOnce saved, use names anywhere you'd use an address:\n\nsilk pay alice 10 --memo \"Thanks for the review\"\nsilk account send alice 5\n\nContact names are case-insensitive and stored lowercase. Saved at ~/.config/silkyway/contacts.json."
      },
      {
        "title": "Multi-Wallet Support",
        "body": "silk wallet create second-wallet\nsilk wallet fund --wallet second-wallet\nsilk wallet list\n\nUse --wallet <label> on any command to select a non-default wallet:\n\nsilk pay <address> 10 --wallet second-wallet\nsilk balance --wallet second-wallet"
      },
      {
        "title": "Support Chat",
        "body": "silk chat \"How do I send a payment?\"\n\nA persistent agentId (UUID) is auto-generated on first use for session continuity."
      },
      {
        "title": "On-Chain Accounts (Optional)",
        "body": "A SilkyWay account is an on-chain wallet — like a bank account — that a human owner creates and funds with USDC. The owner can add agents as operators with per-transaction spending limits enforced on-chain. This is useful for automations, recurring payments, or any scenario where a human wants to delegate spending authority to an agent with guardrails.\n\nYou don't need an account to use SilkyWay. Escrow payments (silk pay) work with just a wallet. Accounts are an optional upgrade when your human wants to give you direct spending access with on-chain controls.\n\nKey concepts:\n\nOwner — The human who creates and funds the account. Full control: can transfer any amount, pause the account, add/remove operators.\nOperator — You (the agent). Authorized to send tokens from the account, subject to a per-transaction limit set by the owner.\nPer-transaction limit — Maximum USDC you can send in one transaction. Enforced on-chain — the Solana program rejects transactions that exceed it. A limit of 0 means unlimited.\nPause — The owner can pause the account, blocking all operator transfers until unpaused. You cannot unpause it."
      },
      {
        "title": "Setting up an account",
        "body": "Your human creates the account — you cannot create it yourself.\n\nShare the setup URL with your human (replace with your address from silk wallet list):\nhttps://app.silkyway.ai/account/setup?agent=YOUR_WALLET_ADDRESS\n\nThey'll connect their wallet, set your spending limit, and fund the account.\nImportant: Your human must select the same network (mainnet/devnet) on the setup page as your CLI cluster. If you're on devnet, tell them to switch to devnet before creating the account.\n\n\nAfter your human creates the account, sync it:\nsilk account sync\n\n\n\nCheck your status and send payments:\nsilk account status\nsilk account send <recipient> <amount>\n\nIf the amount exceeds your per-transaction limit, the transaction is rejected on-chain with ExceedsPerTxLimit. If the account is paused, you get AccountPaused.\n\nIf silk account sync returns \"No account found\", your human hasn't created the account yet — share the setup URL with them."
      },
      {
        "title": "Depositing and withdrawing",
        "body": "You can deposit tokens from your wallet into the account, or withdraw them back:\n\n# Deposit 10 USDC from your wallet into the account\nsilk account deposit 10\n\n# Withdraw 5 USDC from the account back to your wallet\nsilk account withdraw 5\n\ndeposit moves tokens from your wallet into the Silk account. withdraw is a convenience wrapper around account send where the recipient is your own wallet — it's subject to the same per-transaction limit as any other transfer."
      },
      {
        "title": "Viewing account activity",
        "body": "Query the audit trail for your account:\n\n# List all events\nsilk account events\n\n# Filter by event type\nsilk account events --type TRANSFER\nsilk account events --type DEPOSIT\n\nEvent types: ACCOUNT_CREATED, ACCOUNT_CLOSED, DEPOSIT, TRANSFER, OPERATOR_ADDED, OPERATOR_REMOVED, PAUSED, UNPAUSED."
      },
      {
        "title": "Multi-account behavior",
        "body": "If your wallet is an operator on multiple accounts (different owners added you), silk account sync picks one deterministically (sorted by PDA) and warns you. To target a specific account:\n\nsilk account sync --account <pda>"
      },
      {
        "title": "Accounts vs escrow payments",
        "body": "AccountsEscrow (silk pay)Setup requiredHuman creates account + adds you as operatorNone — just a funded walletSpending limitsPer-transaction limit enforced on-chainNo limitsRecipient claims?No — direct transfer, tokens arrive immediatelyYes — recipient must silk claimCancellable?No — transfer is instantYes — sender can cancel before claimBest forOngoing payments with human oversightOne-off payments between parties\n\nIf your human has set up an account for you, prefer silk account send — it's simpler (no claim step) and your human controls the spending limits."
      },
      {
        "title": "CLI Reference",
        "body": "CommandDescriptionsilk initInitialize CLI (create wallet, agent ID, and contacts file)silk wallet create [label]Create a new walletsilk wallet listList all wallets with addressessilk wallet fund [--sol] [--usdc] [--wallet <label>]Fund wallet from devnet faucetsilk balance [--wallet <label>]Show SOL and USDC balancessilk pay <recipient> <amount> [--memo <text>] [--wallet <label>]Send USDC payment into escrowsilk claim <transfer-pda> [--wallet <label>]Claim a received paymentsilk cancel <transfer-pda> [--wallet <label>]Cancel a sent paymentsilk payments list [--wallet <label>]List transferssilk payments get <transfer-pda>Get transfer detailssilk contacts add <name> <address>Save a contact to the address booksilk contacts remove <name>Remove a contactsilk contacts listList all saved contactssilk contacts get <name>Look up a contact's addresssilk account sync [--wallet <label>] [--account <pda>]Discover and sync your on-chain accountsilk account status [--wallet <label>]Show account balance, spending limit, and pause statesilk account events [--type <eventType>] [--wallet <label>]List account events (audit trail)silk account deposit <amount> [--wallet <label>]Deposit USDC from wallet into accountsilk account withdraw <amount> [--wallet <label>]Withdraw USDC from account back to your walletsilk account send <recipient> <amount> [--memo <text>] [--wallet <label>]Send from account (policy-enforced on-chain)silk chat <message>Ask SilkyWay support agent a questionsilk config set-cluster <cluster>Set cluster (mainnet-beta or devnet)silk config get-clusterShow current cluster and API URLsilk config reset-clusterReset cluster to default (mainnet-beta)\n\nUse --wallet <label> on any command to select a non-default wallet. Recipients accept contact names or Solana addresses."
      },
      {
        "title": "How Transactions Work",
        "body": "SilkyWay is non-custodial — your private keys never leave your machine.\n\nEvery payment follows a build-sign-submit flow:\n\nBuild — The SDK calls an API endpoint with payment details. The backend builds an unsigned Solana transaction and returns it as base64.\nSign — The SDK signs the transaction locally using your private key.\nSubmit — The SDK sends the signed transaction to the backend, which forwards it to Solana.\n\nThe backend handles Solana complexity (PDA derivation, instruction building, blockhash management). It never sees your private key — all authorization is enforced on-chain by the Solana program."
      },
      {
        "title": "API Endpoints",
        "body": "Base URL: https://api.silkyway.ai (mainnet) or https://devnet-api.silkyway.ai (devnet)\n\nAll requests use Content-Type: application/json."
      },
      {
        "title": "POST /api/tx/create-transfer",
        "body": "Build an unsigned create_transfer transaction. Locks USDC into escrow.\n\nRequest:\n\n{\n  \"sender\": \"BrKz4GQN1sxZWoGLbNTojp4G3JCFLRkSYk3mSRWhKsXp\",\n  \"recipient\": \"7xKXz9BpR3mFVDg2Thh3AG6sFRPqNrDJ4bHUkR8Y7vNx\",\n  \"amount\": 10.00,\n  \"token\": \"usdc\",\n  \"memo\": \"Payment for code review\"\n}\n\nFieldTypeRequiredDescriptionsenderstringyesSender's Solana public keyrecipientstringyesRecipient's Solana public keyamountnumberyesAmount in token units (e.g. 10.00 = 10 USDC)tokenstringyesToken symbol (e.g. \"usdc\")memostringnoHuman-readable memoclaimableAfternumbernoUnix timestamp — recipient cannot claim before this time\n\nYou can also pass mint (token mint pubkey) or poolPda directly instead of token, but token is the simplest option.\n\nResponse:\n\n{\n  \"ok\": true,\n  \"data\": {\n    \"transaction\": \"AQAAAAAAAAAAAAAA...base64...AAAAAAA=\",\n    \"transferPda\": \"9aE5kBqRvF3mNcXz8BpR3mFVDg2Thh3AG6sFRPqNrDJ4\",\n    \"nonce\": \"1738900000000\",\n    \"message\": \"Sign and submit via POST /api/tx/submit\"\n  }\n}\n\nThe transferPda is the on-chain address for this escrow. Save it — you need it to claim or cancel."
      },
      {
        "title": "POST /api/tx/claim-transfer",
        "body": "Build an unsigned claim_transfer transaction. Moves USDC from escrow to the recipient's wallet.\n\nOnly the designated recipient can claim. If claimableAfter was set, the claim will fail before that time.\n\nRequest:\n\n{\n  \"transferPda\": \"9aE5kBqRvF3mNcXz8BpR3mFVDg2Thh3AG6sFRPqNrDJ4\",\n  \"claimer\": \"7xKXz9BpR3mFVDg2Thh3AG6sFRPqNrDJ4bHUkR8Y7vNx\"\n}\n\nFieldTypeRequiredDescriptiontransferPdastringyesThe transfer's on-chain PDAclaimerstringyesRecipient's Solana public key\n\nResponse:\n\n{\n  \"ok\": true,\n  \"data\": {\n    \"transaction\": \"AQAAAAAAAAAAAAAA...base64...AAAAAAA=\",\n    \"message\": \"Sign and submit via POST /api/tx/submit\"\n  }\n}\n\nCommon errors:\n\nClaimTooEarly (6003) — claimableAfter hasn't passed yet\nTransferAlreadyClaimed (6000) — already claimed\nTransferAlreadyCancelled (6001) — sender cancelled first\nUnauthorized (6004) — claimer is not the designated recipient"
      },
      {
        "title": "POST /api/tx/cancel-transfer",
        "body": "Build an unsigned cancel_transfer transaction. Refunds USDC from escrow back to the sender.\n\nOnly the original sender can cancel, and only while the transfer is still ACTIVE (not yet claimed).\n\nRequest:\n\n{\n  \"transferPda\": \"9aE5kBqRvF3mNcXz8BpR3mFVDg2Thh3AG6sFRPqNrDJ4\",\n  \"canceller\": \"BrKz4GQN1sxZWoGLbNTojp4G3JCFLRkSYk3mSRWhKsXp\"\n}\n\nFieldTypeRequiredDescriptiontransferPdastringyesThe transfer's on-chain PDAcancellerstringyesSender's Solana public key\n\nResponse:\n\n{\n  \"ok\": true,\n  \"data\": {\n    \"transaction\": \"AQAAAAAAAAAAAAAA...base64...AAAAAAA=\",\n    \"message\": \"Sign and submit via POST /api/tx/submit\"\n  }\n}\n\nCommon errors:\n\nTransferAlreadyClaimed (6000) — recipient already claimed\nTransferAlreadyCancelled (6001) — already cancelled\nUnauthorized (6004) — canceller is not the original sender"
      },
      {
        "title": "POST /api/tx/submit",
        "body": "Submit a signed transaction to Solana.\n\nRequest:\n\n{\n  \"signedTx\": \"AQAAAAAAAAAAAAAA...base64-signed...AAAAAAA=\"\n}\n\nResponse:\n\n{\n  \"ok\": true,\n  \"data\": {\n    \"txid\": \"5UfDuXsrhFnxGZmyJxNR8z7Ee5JDFrgWHKPdTEJvoTpB3Qw8mKz4GQN1sxZWoGL\"\n  }\n}"
      },
      {
        "title": "GET /api/transfers/:pda",
        "body": "Get details for a single transfer.\n\nExample: GET /api/transfers/9aE5kBqRvF3mNcXz8BpR3mFVDg2Thh3AG6sFRPqNrDJ4\n\nResponse:\n\n{\n  \"ok\": true,\n  \"data\": {\n    \"transfer\": {\n      \"id\": \"a1b2c3d4-e5f6-7890-abcd-ef1234567890\",\n      \"transferPda\": \"9aE5kBqRvF3mNcXz8BpR3mFVDg2Thh3AG6sFRPqNrDJ4\",\n      \"sender\": \"BrKz4GQN1sxZWoGLbNTojp4G3JCFLRkSYk3mSRWhKsXp\",\n      \"recipient\": \"7xKXz9BpR3mFVDg2Thh3AG6sFRPqNrDJ4bHUkR8Y7vNx\",\n      \"amount\": \"10000000\",\n      \"amountRaw\": \"10000000\",\n      \"status\": \"ACTIVE\",\n      \"memo\": \"Payment for code review\",\n      \"createTxid\": \"5UfDuXsrhFnxGZmyJxNR8z7Ee5JDFrgWHKPdTEJvoTpB\",\n      \"claimTxid\": null,\n      \"cancelTxid\": null,\n      \"claimableAfter\": null,\n      \"claimableUntil\": null,\n      \"createdAt\": \"2025-02-07T12:00:00.000Z\",\n      \"updatedAt\": \"2025-02-07T12:00:00.000Z\",\n      \"token\": { \"mint\": \"4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU\", \"symbol\": \"USDC\", \"decimals\": 6 },\n      \"pool\": { \"poolPda\": \"3Fk8vMYJbCbEB2jzRCdRG9rFJhN2TCmPia9BjEKpTk5R\", \"feeBps\": 50 }\n    }\n  }\n}\n\nNote: amount is in raw token units. USDC has 6 decimals, so \"10000000\" = 10.00 USDC."
      },
      {
        "title": "GET /api/transfers?wallet=<pubkey>",
        "body": "List all transfers where the wallet is sender or recipient.\n\nExample: GET /api/transfers?wallet=BrKz4GQN1sxZWoGLbNTojp4G3JCFLRkSYk3mSRWhKsXp\n\nResponse:\n\n{\n  \"ok\": true,\n  \"data\": {\n    \"transfers\": [\n      {\n        \"transferPda\": \"9aE5kBqRvF3mNcXz8BpR3mFVDg2Thh3AG6sFRPqNrDJ4\",\n        \"sender\": \"BrKz4GQN1sxZWoGLbNTojp4G3JCFLRkSYk3mSRWhKsXp\",\n        \"recipient\": \"7xKXz9BpR3mFVDg2Thh3AG6sFRPqNrDJ4bHUkR8Y7vNx\",\n        \"amount\": \"10000000\",\n        \"status\": \"ACTIVE\",\n        \"memo\": \"Payment for code review\",\n        \"createdAt\": \"2025-02-07T12:00:00.000Z\",\n        \"token\": { \"mint\": \"4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU\", \"symbol\": \"USDC\", \"decimals\": 6 },\n        \"pool\": { \"poolPda\": \"3Fk8vMYJbCbEB2jzRCdRG9rFJhN2TCmPia9BjEKpTk5R\", \"feeBps\": 50 }\n      }\n    ]\n  }\n}"
      },
      {
        "title": "POST /api/tx/faucet",
        "body": "Airdrop devnet SOL or USDC. Devnet only.\n\nRequest:\n\n{\n  \"wallet\": \"BrKz4GQN1sxZWoGLbNTojp4G3JCFLRkSYk3mSRWhKsXp\",\n  \"token\": \"usdc\"\n}\n\ntoken is optional. Omit or use \"sol\" for SOL airdrop, \"usdc\" for USDC mint.\n\nResponse:\n\n{\n  \"ok\": true,\n  \"data\": {\n    \"amount\": 0.1,\n    \"txid\": \"5UfDuXsrhFnxGZmyJxNR8z7Ee5JDFrgWHKPdTEJvoTpB3Qw8mKz4GQN1sxZWoGL\"\n  }\n}"
      },
      {
        "title": "Account Endpoints",
        "body": "GET /api/account/by-operator/:pubkey\n\nFind accounts where your wallet is an operator. Used by silk account sync.\n\nExample: GET /api/account/by-operator/7xKXz9BpR3mFVDg2Thh3AG6sFRPqNrDJ4bHUkR8Y7vNx\n\nResponse:\n\n{\n  \"ok\": true,\n  \"data\": {\n    \"accounts\": [\n      {\n        \"pda\": \"9aE5kBqRvF3mNcXz8BpR3mFVDg2Thh3AG6sFRPqNrDJ4\",\n        \"owner\": \"BrKz4GQN1sxZWoGLbNTojp4G3JCFLRkSYk3mSRWhKsXp\",\n        \"mint\": \"4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU\",\n        \"mintDecimals\": 6,\n        \"isPaused\": false,\n        \"balance\": 10000000,\n        \"operatorSlot\": {\n          \"index\": 0,\n          \"perTxLimit\": 5000000,\n          \"dailyLimit\": 0\n        }\n      }\n    ]\n  }\n}\n\nReturns an empty array if no accounts found — this means your human hasn't set up your account yet.\n\nGET /api/account/:pda\n\nGet full account details. Used by silk account status.\n\nExample: GET /api/account/9aE5kBqRvF3mNcXz8BpR3mFVDg2Thh3AG6sFRPqNrDJ4\n\nResponse:\n\n{\n  \"ok\": true,\n  \"data\": {\n    \"pda\": \"9aE5kBqRvF3mNcXz8BpR3mFVDg2Thh3AG6sFRPqNrDJ4\",\n    \"owner\": \"BrKz4GQN1sxZWoGLbNTojp4G3JCFLRkSYk3mSRWhKsXp\",\n    \"mint\": \"4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU\",\n    \"mintDecimals\": 6,\n    \"isPaused\": false,\n    \"balance\": 10000000,\n    \"operators\": [\n      {\n        \"pubkey\": \"7xKXz9BpR3mFVDg2Thh3AG6sFRPqNrDJ4bHUkR8Y7vNx\",\n        \"perTxLimit\": 5000000,\n        \"dailyLimit\": 0\n      }\n    ]\n  }\n}\n\nNote: balance and perTxLimit are in raw token units. USDC has 6 decimals, so 5000000 = $5.00.\n\nPOST /api/account/transfer\n\nBuild an unsigned transfer transaction from a SilkyWay account. Used by silk account send.\n\nRequest:\n\n{\n  \"signer\": \"7xKXz9BpR3mFVDg2Thh3AG6sFRPqNrDJ4bHUkR8Y7vNx\",\n  \"accountPda\": \"9aE5kBqRvF3mNcXz8BpR3mFVDg2Thh3AG6sFRPqNrDJ4\",\n  \"recipient\": \"Dg2Thh3AG6sFRPqNrDJ4bHUkR8Y7vNx7xKXz9BpR3mFV\",\n  \"amount\": 3000000\n}\n\nFieldTypeRequiredDescriptionsignerstringyesYour wallet address (operator)accountPdastringyesThe account's on-chain PDArecipientstringyesRecipient's Solana public keyamountnumberyesAmount in raw token units (e.g. 3000000 = 3.00 USDC)\n\nResponse:\n\n{\n  \"ok\": true,\n  \"data\": {\n    \"transaction\": \"AQAAAAAAAAAAAAAA...base64...AAAAAAA=\"\n  }\n}\n\nSign and submit the returned transaction via POST /api/tx/submit.\n\nCommon errors:\n\nExceedsPerTxLimit — Amount exceeds your per-transaction spending limit\nAccountPaused — Account is paused by the owner; operator transfers blocked\nUnauthorized — Signer is not the owner or an operator on this account\n\nPOST /api/account/create\n\nBuild an unsigned create-account transaction. Used by the setup page (human-facing, not typically called by agents).\n\nRequest:\n\n{\n  \"owner\": \"BrKz4GQN1sxZWoGLbNTojp4G3JCFLRkSYk3mSRWhKsXp\",\n  \"mint\": \"4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU\",\n  \"operator\": \"7xKXz9BpR3mFVDg2Thh3AG6sFRPqNrDJ4bHUkR8Y7vNx\",\n  \"perTxLimit\": 5000000\n}\n\nPOST /api/account/deposit\n\nBuild an unsigned deposit transaction. Used by silk account deposit and the setup page.\n\nRequest:\n\n{\n  \"depositor\": \"BrKz4GQN1sxZWoGLbNTojp4G3JCFLRkSYk3mSRWhKsXp\",\n  \"accountPda\": \"9aE5kBqRvF3mNcXz8BpR3mFVDg2Thh3AG6sFRPqNrDJ4\",\n  \"amount\": 10000000\n}\n\nFieldTypeRequiredDescriptiondepositorstringyesWallet address depositing the tokensaccountPdastringyesThe account's on-chain PDAamountnumberyesAmount in raw token units (e.g. 10000000 = 10.00 USDC)\n\nSign and submit the returned transaction via POST /api/tx/submit.\n\nGET /api/account/:pda/events\n\nList audit trail events for an account. Used by silk account events.\n\nExample: GET /api/account/9aE5kBqRvF3mNcXz8BpR3mFVDg2Thh3AG6sFRPqNrDJ4/events\n\nQuery parameters:\n\nParamTypeRequiredDescriptioneventTypestringnoFilter by event type: ACCOUNT_CREATED, ACCOUNT_CLOSED, DEPOSIT, TRANSFER, OPERATOR_ADDED, OPERATOR_REMOVED, PAUSED, UNPAUSED\n\nExample with filter: GET /api/account/9aE5kBqRvF3.../events?eventType=TRANSFER"
      },
      {
        "title": "POST /chat",
        "body": "Send a message to the SilkyWay support agent. Returns an AI-generated response.\n\nRequest:\n\n{\n  \"agentId\": \"uuid-v4\",\n  \"message\": \"How do I send a payment?\"\n}\n\nFieldTypeRequiredDescriptionagentIdstringyesUUID v4 identifying the agent (auto-generated by the SDK)messagestringyesThe question to ask\n\nResponse (200):\n\n{\n  \"ok\": true,\n  \"data\": {\n    \"message\": \"Use silk pay...\",\n    \"agentId\": \"uuid-v4\"\n  }\n}"
      },
      {
        "title": "Transfer Statuses",
        "body": "StatusDescriptionACTIVETokens locked in escrow, awaiting claim or cancellationCLAIMEDRecipient claimed the tokensCANCELLEDSender cancelled and reclaimed the tokensEXPIREDTransfer expired past its claimableUntil window"
      },
      {
        "title": "Escrow Program Errors (Handshake)",
        "body": "CodeNameDescription6000TransferAlreadyClaimedTransfer has already been claimed6001TransferAlreadyCancelledTransfer has already been cancelled6002TransferExpiredTransfer has expired6003ClaimTooEarlyCannot claim before claimableAfter timestamp6004UnauthorizedSigner is not authorized for this action6005PoolPausedThe token's escrow pool is temporarily paused — try again later6006InsufficientFundsSender has insufficient token balance"
      },
      {
        "title": "Account Program Errors (Silkysig)",
        "body": "CodeNameDescription6000UnauthorizedSigner is not the owner or an operator on this account6001ExceedsPerTxLimitTransfer amount exceeds operator's per-transaction spending limit6002ExceedsDailyLimitTransfer exceeds operator daily limit (not yet enforced)6003AccountPausedAccount is paused — operator transfers blocked until owner unpauses6004MaxOperatorsReachedAccount already has 3 operators (maximum)6005OperatorNotFoundSpecified operator not found on account6006OperatorAlreadyExistsOperator is already on this account6007InsufficientBalanceAccount doesn't have enough tokens for this transfer6008MathOverflowArithmetic overflow in calculation"
      },
      {
        "title": "API Errors",
        "body": "ErrorHTTPDescriptionINVALID_PUBKEY400Invalid Solana public key formatINVALID_AMOUNT400Amount must be positiveMISSING_FIELD400Required field not providedTRANSFER_NOT_FOUND404No transfer found for the given PDAPOOL_NOT_FOUND404No escrow pool found for this tokenTOKEN_NOT_FOUND400Token symbol or mint not recognizedTX_FAILED400Transaction simulation or submission failedRATE_LIMITED429Too many faucet requestsFAUCET_FAILED400Faucet airdrop failed"
      },
      {
        "title": "Response Format",
        "body": "Success:\n\n{\n  \"ok\": true,\n  \"data\": { ... }\n}\n\nError:\n\n{\n   \"ok\": false,\n   \"error\": \"ERROR_CODE\",\n   \"message\": \"Human-readable description\"\n}"
      },
      {
        "title": "Security",
        "body": "Non-custodial — the backend builds unsigned transactions; you sign locally with your private key before submitting\nPrivate keys are never transmitted to the server\nAll authorization is enforced on-chain by the Solana program, not by the backend\nKeys are stored locally at ~/.config/silkyway/config.json — never share this file"
      }
    ],
    "body": "SilkyWay\n\nAgent banking and payments on Solana. Send and receive stablecoins — non-custodial, on-chain.\n\nInstall\nnpm install -g @silkysquad/silk\n\n\nRequires Node.js 18+.\n\nSetup\n# 1. Initialize (creates wallet and agent ID)\nsilk init\n\n# 2. Check your wallet address\nsilk wallet list\n\n\nYour wallet and agent ID are saved at ~/.config/silkyway/config.json. Your private key never leaves your machine. silk init is idempotent — safe to run multiple times.\n\nCluster configuration\n\nDefault cluster is mainnet-beta (real USDC). Switch to devnet for testing with free tokens.\n\nsilk config set-cluster devnet    # test tokens\nsilk config set-cluster mainnet-beta  # real USDC\nsilk config get-cluster           # show current\n\nCluster\tAPI Base URL\tNetwork\nmainnet-beta\thttps://api.silkyway.ai\tMainnet (real USDC)\ndevnet\thttps://devnet-api.silkyway.ai\tDevnet (test USDC)\nFund your wallet (devnet)\n\nOn devnet, use the faucet — it gives you 0.1 SOL (for transaction fees) + 100 USDC:\n\nsilk config set-cluster devnet\nsilk wallet fund\nsilk balance\n\n\nOn mainnet, send SOL and USDC to your wallet address manually. SOL is required for Solana transaction fees.\n\nSending Payments\nsilk pay <recipient> <amount> [--memo <text>]\n\n\nThis locks USDC into on-chain escrow. The recipient claims it with silk claim, or you cancel for a full refund with silk cancel.\n\nThe output includes a claim link (claimUrl) — a URL you can share with the recipient's human. They open it in a browser, connect their wallet, and claim the payment. This is the easiest way for a non-technical recipient to claim.\n\n# Send 10 USDC\nsilk pay 7xKXz9BpR3mFVDg2Thh3AG6sFRPqNrDJ4bHUkR8Y7vNx 10 --memo \"Payment for code review\"\n\n# Output includes claimUrl — share it with the recipient\n# Example: https://app.silkyway.ai/transfers/9aE5kBqRvF3...?cluster=devnet\n\n# Check your balance\nsilk balance\n\n# View your transfers\nsilk payments list\nsilk payments get <transfer-pda>\n\nClaiming a payment\n\nIf someone sent you a payment:\n\nsilk payments list\nsilk claim <transfer-pda>\n\nCancelling a payment\n\nCancel a payment you sent (before the recipient claims it):\n\nsilk cancel <transfer-pda>\n\nAddress Book\n\nSave contacts so you can send payments by name instead of address.\n\nsilk contacts add alice 7xKXz9BpR3mFVDg2Thh3AG6sFRPqNrDJ4bHUkR8Y7vNx\nsilk contacts list\nsilk contacts get alice\nsilk contacts remove alice\n\n\nOnce saved, use names anywhere you'd use an address:\n\nsilk pay alice 10 --memo \"Thanks for the review\"\nsilk account send alice 5\n\n\nContact names are case-insensitive and stored lowercase. Saved at ~/.config/silkyway/contacts.json.\n\nMulti-Wallet Support\nsilk wallet create second-wallet\nsilk wallet fund --wallet second-wallet\nsilk wallet list\n\n\nUse --wallet <label> on any command to select a non-default wallet:\n\nsilk pay <address> 10 --wallet second-wallet\nsilk balance --wallet second-wallet\n\nSupport Chat\nsilk chat \"How do I send a payment?\"\n\n\nA persistent agentId (UUID) is auto-generated on first use for session continuity.\n\nOn-Chain Accounts (Optional)\n\nA SilkyWay account is an on-chain wallet — like a bank account — that a human owner creates and funds with USDC. The owner can add agents as operators with per-transaction spending limits enforced on-chain. This is useful for automations, recurring payments, or any scenario where a human wants to delegate spending authority to an agent with guardrails.\n\nYou don't need an account to use SilkyWay. Escrow payments (silk pay) work with just a wallet. Accounts are an optional upgrade when your human wants to give you direct spending access with on-chain controls.\n\nKey concepts:\n\nOwner — The human who creates and funds the account. Full control: can transfer any amount, pause the account, add/remove operators.\nOperator — You (the agent). Authorized to send tokens from the account, subject to a per-transaction limit set by the owner.\nPer-transaction limit — Maximum USDC you can send in one transaction. Enforced on-chain — the Solana program rejects transactions that exceed it. A limit of 0 means unlimited.\nPause — The owner can pause the account, blocking all operator transfers until unpaused. You cannot unpause it.\nSetting up an account\n\nYour human creates the account — you cannot create it yourself.\n\nShare the setup URL with your human (replace with your address from silk wallet list):\n\nhttps://app.silkyway.ai/account/setup?agent=YOUR_WALLET_ADDRESS\n\n\nThey'll connect their wallet, set your spending limit, and fund the account.\n\nImportant: Your human must select the same network (mainnet/devnet) on the setup page as your CLI cluster. If you're on devnet, tell them to switch to devnet before creating the account.\n\nAfter your human creates the account, sync it:\n\nsilk account sync\n\n\nCheck your status and send payments:\n\nsilk account status\nsilk account send <recipient> <amount>\n\n\nIf the amount exceeds your per-transaction limit, the transaction is rejected on-chain with ExceedsPerTxLimit. If the account is paused, you get AccountPaused.\n\nIf silk account sync returns \"No account found\", your human hasn't created the account yet — share the setup URL with them.\n\nDepositing and withdrawing\n\nYou can deposit tokens from your wallet into the account, or withdraw them back:\n\n# Deposit 10 USDC from your wallet into the account\nsilk account deposit 10\n\n# Withdraw 5 USDC from the account back to your wallet\nsilk account withdraw 5\n\n\ndeposit moves tokens from your wallet into the Silk account. withdraw is a convenience wrapper around account send where the recipient is your own wallet — it's subject to the same per-transaction limit as any other transfer.\n\nViewing account activity\n\nQuery the audit trail for your account:\n\n# List all events\nsilk account events\n\n# Filter by event type\nsilk account events --type TRANSFER\nsilk account events --type DEPOSIT\n\n\nEvent types: ACCOUNT_CREATED, ACCOUNT_CLOSED, DEPOSIT, TRANSFER, OPERATOR_ADDED, OPERATOR_REMOVED, PAUSED, UNPAUSED.\n\nMulti-account behavior\n\nIf your wallet is an operator on multiple accounts (different owners added you), silk account sync picks one deterministically (sorted by PDA) and warns you. To target a specific account:\n\nsilk account sync --account <pda>\n\nAccounts vs escrow payments\n\tAccounts\tEscrow (silk pay)\nSetup required\tHuman creates account + adds you as operator\tNone — just a funded wallet\nSpending limits\tPer-transaction limit enforced on-chain\tNo limits\nRecipient claims?\tNo — direct transfer, tokens arrive immediately\tYes — recipient must silk claim\nCancellable?\tNo — transfer is instant\tYes — sender can cancel before claim\nBest for\tOngoing payments with human oversight\tOne-off payments between parties\n\nIf your human has set up an account for you, prefer silk account send — it's simpler (no claim step) and your human controls the spending limits.\n\nCLI Reference\nCommand\tDescription\nsilk init\tInitialize CLI (create wallet, agent ID, and contacts file)\nsilk wallet create [label]\tCreate a new wallet\nsilk wallet list\tList all wallets with addresses\nsilk wallet fund [--sol] [--usdc] [--wallet <label>]\tFund wallet from devnet faucet\nsilk balance [--wallet <label>]\tShow SOL and USDC balances\nsilk pay <recipient> <amount> [--memo <text>] [--wallet <label>]\tSend USDC payment into escrow\nsilk claim <transfer-pda> [--wallet <label>]\tClaim a received payment\nsilk cancel <transfer-pda> [--wallet <label>]\tCancel a sent payment\nsilk payments list [--wallet <label>]\tList transfers\nsilk payments get <transfer-pda>\tGet transfer details\nsilk contacts add <name> <address>\tSave a contact to the address book\nsilk contacts remove <name>\tRemove a contact\nsilk contacts list\tList all saved contacts\nsilk contacts get <name>\tLook up a contact's address\nsilk account sync [--wallet <label>] [--account <pda>]\tDiscover and sync your on-chain account\nsilk account status [--wallet <label>]\tShow account balance, spending limit, and pause state\nsilk account events [--type <eventType>] [--wallet <label>]\tList account events (audit trail)\nsilk account deposit <amount> [--wallet <label>]\tDeposit USDC from wallet into account\nsilk account withdraw <amount> [--wallet <label>]\tWithdraw USDC from account back to your wallet\nsilk account send <recipient> <amount> [--memo <text>] [--wallet <label>]\tSend from account (policy-enforced on-chain)\nsilk chat <message>\tAsk SilkyWay support agent a question\nsilk config set-cluster <cluster>\tSet cluster (mainnet-beta or devnet)\nsilk config get-cluster\tShow current cluster and API URL\nsilk config reset-cluster\tReset cluster to default (mainnet-beta)\n\nUse --wallet <label> on any command to select a non-default wallet. Recipients accept contact names or Solana addresses.\n\nHow Transactions Work\n\nSilkyWay is non-custodial — your private keys never leave your machine.\n\nEvery payment follows a build-sign-submit flow:\n\nBuild — The SDK calls an API endpoint with payment details. The backend builds an unsigned Solana transaction and returns it as base64.\nSign — The SDK signs the transaction locally using your private key.\nSubmit — The SDK sends the signed transaction to the backend, which forwards it to Solana.\n\nThe backend handles Solana complexity (PDA derivation, instruction building, blockhash management). It never sees your private key — all authorization is enforced on-chain by the Solana program.\n\nAPI Endpoints\n\nBase URL: https://api.silkyway.ai (mainnet) or https://devnet-api.silkyway.ai (devnet)\n\nAll requests use Content-Type: application/json.\n\nEscrow Endpoints\nPOST /api/tx/create-transfer\n\nBuild an unsigned create_transfer transaction. Locks USDC into escrow.\n\nRequest:\n\n{\n  \"sender\": \"BrKz4GQN1sxZWoGLbNTojp4G3JCFLRkSYk3mSRWhKsXp\",\n  \"recipient\": \"7xKXz9BpR3mFVDg2Thh3AG6sFRPqNrDJ4bHUkR8Y7vNx\",\n  \"amount\": 10.00,\n  \"token\": \"usdc\",\n  \"memo\": \"Payment for code review\"\n}\n\nField\tType\tRequired\tDescription\nsender\tstring\tyes\tSender's Solana public key\nrecipient\tstring\tyes\tRecipient's Solana public key\namount\tnumber\tyes\tAmount in token units (e.g. 10.00 = 10 USDC)\ntoken\tstring\tyes\tToken symbol (e.g. \"usdc\")\nmemo\tstring\tno\tHuman-readable memo\nclaimableAfter\tnumber\tno\tUnix timestamp — recipient cannot claim before this time\n\nYou can also pass mint (token mint pubkey) or poolPda directly instead of token, but token is the simplest option.\n\nResponse:\n\n{\n  \"ok\": true,\n  \"data\": {\n    \"transaction\": \"AQAAAAAAAAAAAAAA...base64...AAAAAAA=\",\n    \"transferPda\": \"9aE5kBqRvF3mNcXz8BpR3mFVDg2Thh3AG6sFRPqNrDJ4\",\n    \"nonce\": \"1738900000000\",\n    \"message\": \"Sign and submit via POST /api/tx/submit\"\n  }\n}\n\n\nThe transferPda is the on-chain address for this escrow. Save it — you need it to claim or cancel.\n\nPOST /api/tx/claim-transfer\n\nBuild an unsigned claim_transfer transaction. Moves USDC from escrow to the recipient's wallet.\n\nOnly the designated recipient can claim. If claimableAfter was set, the claim will fail before that time.\n\nRequest:\n\n{\n  \"transferPda\": \"9aE5kBqRvF3mNcXz8BpR3mFVDg2Thh3AG6sFRPqNrDJ4\",\n  \"claimer\": \"7xKXz9BpR3mFVDg2Thh3AG6sFRPqNrDJ4bHUkR8Y7vNx\"\n}\n\nField\tType\tRequired\tDescription\ntransferPda\tstring\tyes\tThe transfer's on-chain PDA\nclaimer\tstring\tyes\tRecipient's Solana public key\n\nResponse:\n\n{\n  \"ok\": true,\n  \"data\": {\n    \"transaction\": \"AQAAAAAAAAAAAAAA...base64...AAAAAAA=\",\n    \"message\": \"Sign and submit via POST /api/tx/submit\"\n  }\n}\n\n\nCommon errors:\n\nClaimTooEarly (6003) — claimableAfter hasn't passed yet\nTransferAlreadyClaimed (6000) — already claimed\nTransferAlreadyCancelled (6001) — sender cancelled first\nUnauthorized (6004) — claimer is not the designated recipient\nPOST /api/tx/cancel-transfer\n\nBuild an unsigned cancel_transfer transaction. Refunds USDC from escrow back to the sender.\n\nOnly the original sender can cancel, and only while the transfer is still ACTIVE (not yet claimed).\n\nRequest:\n\n{\n  \"transferPda\": \"9aE5kBqRvF3mNcXz8BpR3mFVDg2Thh3AG6sFRPqNrDJ4\",\n  \"canceller\": \"BrKz4GQN1sxZWoGLbNTojp4G3JCFLRkSYk3mSRWhKsXp\"\n}\n\nField\tType\tRequired\tDescription\ntransferPda\tstring\tyes\tThe transfer's on-chain PDA\ncanceller\tstring\tyes\tSender's Solana public key\n\nResponse:\n\n{\n  \"ok\": true,\n  \"data\": {\n    \"transaction\": \"AQAAAAAAAAAAAAAA...base64...AAAAAAA=\",\n    \"message\": \"Sign and submit via POST /api/tx/submit\"\n  }\n}\n\n\nCommon errors:\n\nTransferAlreadyClaimed (6000) — recipient already claimed\nTransferAlreadyCancelled (6001) — already cancelled\nUnauthorized (6004) — canceller is not the original sender\nPOST /api/tx/submit\n\nSubmit a signed transaction to Solana.\n\nRequest:\n\n{\n  \"signedTx\": \"AQAAAAAAAAAAAAAA...base64-signed...AAAAAAA=\"\n}\n\n\nResponse:\n\n{\n  \"ok\": true,\n  \"data\": {\n    \"txid\": \"5UfDuXsrhFnxGZmyJxNR8z7Ee5JDFrgWHKPdTEJvoTpB3Qw8mKz4GQN1sxZWoGL\"\n  }\n}\n\nGET /api/transfers/:pda\n\nGet details for a single transfer.\n\nExample: GET /api/transfers/9aE5kBqRvF3mNcXz8BpR3mFVDg2Thh3AG6sFRPqNrDJ4\n\nResponse:\n\n{\n  \"ok\": true,\n  \"data\": {\n    \"transfer\": {\n      \"id\": \"a1b2c3d4-e5f6-7890-abcd-ef1234567890\",\n      \"transferPda\": \"9aE5kBqRvF3mNcXz8BpR3mFVDg2Thh3AG6sFRPqNrDJ4\",\n      \"sender\": \"BrKz4GQN1sxZWoGLbNTojp4G3JCFLRkSYk3mSRWhKsXp\",\n      \"recipient\": \"7xKXz9BpR3mFVDg2Thh3AG6sFRPqNrDJ4bHUkR8Y7vNx\",\n      \"amount\": \"10000000\",\n      \"amountRaw\": \"10000000\",\n      \"status\": \"ACTIVE\",\n      \"memo\": \"Payment for code review\",\n      \"createTxid\": \"5UfDuXsrhFnxGZmyJxNR8z7Ee5JDFrgWHKPdTEJvoTpB\",\n      \"claimTxid\": null,\n      \"cancelTxid\": null,\n      \"claimableAfter\": null,\n      \"claimableUntil\": null,\n      \"createdAt\": \"2025-02-07T12:00:00.000Z\",\n      \"updatedAt\": \"2025-02-07T12:00:00.000Z\",\n      \"token\": { \"mint\": \"4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU\", \"symbol\": \"USDC\", \"decimals\": 6 },\n      \"pool\": { \"poolPda\": \"3Fk8vMYJbCbEB2jzRCdRG9rFJhN2TCmPia9BjEKpTk5R\", \"feeBps\": 50 }\n    }\n  }\n}\n\n\nNote: amount is in raw token units. USDC has 6 decimals, so \"10000000\" = 10.00 USDC.\n\nGET /api/transfers?wallet=<pubkey>\n\nList all transfers where the wallet is sender or recipient.\n\nExample: GET /api/transfers?wallet=BrKz4GQN1sxZWoGLbNTojp4G3JCFLRkSYk3mSRWhKsXp\n\nResponse:\n\n{\n  \"ok\": true,\n  \"data\": {\n    \"transfers\": [\n      {\n        \"transferPda\": \"9aE5kBqRvF3mNcXz8BpR3mFVDg2Thh3AG6sFRPqNrDJ4\",\n        \"sender\": \"BrKz4GQN1sxZWoGLbNTojp4G3JCFLRkSYk3mSRWhKsXp\",\n        \"recipient\": \"7xKXz9BpR3mFVDg2Thh3AG6sFRPqNrDJ4bHUkR8Y7vNx\",\n        \"amount\": \"10000000\",\n        \"status\": \"ACTIVE\",\n        \"memo\": \"Payment for code review\",\n        \"createdAt\": \"2025-02-07T12:00:00.000Z\",\n        \"token\": { \"mint\": \"4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU\", \"symbol\": \"USDC\", \"decimals\": 6 },\n        \"pool\": { \"poolPda\": \"3Fk8vMYJbCbEB2jzRCdRG9rFJhN2TCmPia9BjEKpTk5R\", \"feeBps\": 50 }\n      }\n    ]\n  }\n}\n\nPOST /api/tx/faucet\n\nAirdrop devnet SOL or USDC. Devnet only.\n\nRequest:\n\n{\n  \"wallet\": \"BrKz4GQN1sxZWoGLbNTojp4G3JCFLRkSYk3mSRWhKsXp\",\n  \"token\": \"usdc\"\n}\n\n\ntoken is optional. Omit or use \"sol\" for SOL airdrop, \"usdc\" for USDC mint.\n\nResponse:\n\n{\n  \"ok\": true,\n  \"data\": {\n    \"amount\": 0.1,\n    \"txid\": \"5UfDuXsrhFnxGZmyJxNR8z7Ee5JDFrgWHKPdTEJvoTpB3Qw8mKz4GQN1sxZWoGL\"\n  }\n}\n\nAccount Endpoints\nGET /api/account/by-operator/:pubkey\n\nFind accounts where your wallet is an operator. Used by silk account sync.\n\nExample: GET /api/account/by-operator/7xKXz9BpR3mFVDg2Thh3AG6sFRPqNrDJ4bHUkR8Y7vNx\n\nResponse:\n\n{\n  \"ok\": true,\n  \"data\": {\n    \"accounts\": [\n      {\n        \"pda\": \"9aE5kBqRvF3mNcXz8BpR3mFVDg2Thh3AG6sFRPqNrDJ4\",\n        \"owner\": \"BrKz4GQN1sxZWoGLbNTojp4G3JCFLRkSYk3mSRWhKsXp\",\n        \"mint\": \"4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU\",\n        \"mintDecimals\": 6,\n        \"isPaused\": false,\n        \"balance\": 10000000,\n        \"operatorSlot\": {\n          \"index\": 0,\n          \"perTxLimit\": 5000000,\n          \"dailyLimit\": 0\n        }\n      }\n    ]\n  }\n}\n\n\nReturns an empty array if no accounts found — this means your human hasn't set up your account yet.\n\nGET /api/account/:pda\n\nGet full account details. Used by silk account status.\n\nExample: GET /api/account/9aE5kBqRvF3mNcXz8BpR3mFVDg2Thh3AG6sFRPqNrDJ4\n\nResponse:\n\n{\n  \"ok\": true,\n  \"data\": {\n    \"pda\": \"9aE5kBqRvF3mNcXz8BpR3mFVDg2Thh3AG6sFRPqNrDJ4\",\n    \"owner\": \"BrKz4GQN1sxZWoGLbNTojp4G3JCFLRkSYk3mSRWhKsXp\",\n    \"mint\": \"4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU\",\n    \"mintDecimals\": 6,\n    \"isPaused\": false,\n    \"balance\": 10000000,\n    \"operators\": [\n      {\n        \"pubkey\": \"7xKXz9BpR3mFVDg2Thh3AG6sFRPqNrDJ4bHUkR8Y7vNx\",\n        \"perTxLimit\": 5000000,\n        \"dailyLimit\": 0\n      }\n    ]\n  }\n}\n\n\nNote: balance and perTxLimit are in raw token units. USDC has 6 decimals, so 5000000 = $5.00.\n\nPOST /api/account/transfer\n\nBuild an unsigned transfer transaction from a SilkyWay account. Used by silk account send.\n\nRequest:\n\n{\n  \"signer\": \"7xKXz9BpR3mFVDg2Thh3AG6sFRPqNrDJ4bHUkR8Y7vNx\",\n  \"accountPda\": \"9aE5kBqRvF3mNcXz8BpR3mFVDg2Thh3AG6sFRPqNrDJ4\",\n  \"recipient\": \"Dg2Thh3AG6sFRPqNrDJ4bHUkR8Y7vNx7xKXz9BpR3mFV\",\n  \"amount\": 3000000\n}\n\nField\tType\tRequired\tDescription\nsigner\tstring\tyes\tYour wallet address (operator)\naccountPda\tstring\tyes\tThe account's on-chain PDA\nrecipient\tstring\tyes\tRecipient's Solana public key\namount\tnumber\tyes\tAmount in raw token units (e.g. 3000000 = 3.00 USDC)\n\nResponse:\n\n{\n  \"ok\": true,\n  \"data\": {\n    \"transaction\": \"AQAAAAAAAAAAAAAA...base64...AAAAAAA=\"\n  }\n}\n\n\nSign and submit the returned transaction via POST /api/tx/submit.\n\nCommon errors:\n\nExceedsPerTxLimit — Amount exceeds your per-transaction spending limit\nAccountPaused — Account is paused by the owner; operator transfers blocked\nUnauthorized — Signer is not the owner or an operator on this account\nPOST /api/account/create\n\nBuild an unsigned create-account transaction. Used by the setup page (human-facing, not typically called by agents).\n\nRequest:\n\n{\n  \"owner\": \"BrKz4GQN1sxZWoGLbNTojp4G3JCFLRkSYk3mSRWhKsXp\",\n  \"mint\": \"4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU\",\n  \"operator\": \"7xKXz9BpR3mFVDg2Thh3AG6sFRPqNrDJ4bHUkR8Y7vNx\",\n  \"perTxLimit\": 5000000\n}\n\nPOST /api/account/deposit\n\nBuild an unsigned deposit transaction. Used by silk account deposit and the setup page.\n\nRequest:\n\n{\n  \"depositor\": \"BrKz4GQN1sxZWoGLbNTojp4G3JCFLRkSYk3mSRWhKsXp\",\n  \"accountPda\": \"9aE5kBqRvF3mNcXz8BpR3mFVDg2Thh3AG6sFRPqNrDJ4\",\n  \"amount\": 10000000\n}\n\nField\tType\tRequired\tDescription\ndepositor\tstring\tyes\tWallet address depositing the tokens\naccountPda\tstring\tyes\tThe account's on-chain PDA\namount\tnumber\tyes\tAmount in raw token units (e.g. 10000000 = 10.00 USDC)\n\nSign and submit the returned transaction via POST /api/tx/submit.\n\nGET /api/account/:pda/events\n\nList audit trail events for an account. Used by silk account events.\n\nExample: GET /api/account/9aE5kBqRvF3mNcXz8BpR3mFVDg2Thh3AG6sFRPqNrDJ4/events\n\nQuery parameters:\n\nParam\tType\tRequired\tDescription\neventType\tstring\tno\tFilter by event type: ACCOUNT_CREATED, ACCOUNT_CLOSED, DEPOSIT, TRANSFER, OPERATOR_ADDED, OPERATOR_REMOVED, PAUSED, UNPAUSED\n\nExample with filter: GET /api/account/9aE5kBqRvF3.../events?eventType=TRANSFER\n\nPOST /chat\n\nSend a message to the SilkyWay support agent. Returns an AI-generated response.\n\nRequest:\n\n{\n  \"agentId\": \"uuid-v4\",\n  \"message\": \"How do I send a payment?\"\n}\n\nField\tType\tRequired\tDescription\nagentId\tstring\tyes\tUUID v4 identifying the agent (auto-generated by the SDK)\nmessage\tstring\tyes\tThe question to ask\n\nResponse (200):\n\n{\n  \"ok\": true,\n  \"data\": {\n    \"message\": \"Use silk pay...\",\n    \"agentId\": \"uuid-v4\"\n  }\n}\n\nTransfer Statuses\nStatus\tDescription\nACTIVE\tTokens locked in escrow, awaiting claim or cancellation\nCLAIMED\tRecipient claimed the tokens\nCANCELLED\tSender cancelled and reclaimed the tokens\nEXPIRED\tTransfer expired past its claimableUntil window\nError Codes\nEscrow Program Errors (Handshake)\nCode\tName\tDescription\n6000\tTransferAlreadyClaimed\tTransfer has already been claimed\n6001\tTransferAlreadyCancelled\tTransfer has already been cancelled\n6002\tTransferExpired\tTransfer has expired\n6003\tClaimTooEarly\tCannot claim before claimableAfter timestamp\n6004\tUnauthorized\tSigner is not authorized for this action\n6005\tPoolPaused\tThe token's escrow pool is temporarily paused — try again later\n6006\tInsufficientFunds\tSender has insufficient token balance\nAccount Program Errors (Silkysig)\nCode\tName\tDescription\n6000\tUnauthorized\tSigner is not the owner or an operator on this account\n6001\tExceedsPerTxLimit\tTransfer amount exceeds operator's per-transaction spending limit\n6002\tExceedsDailyLimit\tTransfer exceeds operator daily limit (not yet enforced)\n6003\tAccountPaused\tAccount is paused — operator transfers blocked until owner unpauses\n6004\tMaxOperatorsReached\tAccount already has 3 operators (maximum)\n6005\tOperatorNotFound\tSpecified operator not found on account\n6006\tOperatorAlreadyExists\tOperator is already on this account\n6007\tInsufficientBalance\tAccount doesn't have enough tokens for this transfer\n6008\tMathOverflow\tArithmetic overflow in calculation\nAPI Errors\nError\tHTTP\tDescription\nINVALID_PUBKEY\t400\tInvalid Solana public key format\nINVALID_AMOUNT\t400\tAmount must be positive\nMISSING_FIELD\t400\tRequired field not provided\nTRANSFER_NOT_FOUND\t404\tNo transfer found for the given PDA\nPOOL_NOT_FOUND\t404\tNo escrow pool found for this token\nTOKEN_NOT_FOUND\t400\tToken symbol or mint not recognized\nTX_FAILED\t400\tTransaction simulation or submission failed\nRATE_LIMITED\t429\tToo many faucet requests\nFAUCET_FAILED\t400\tFaucet airdrop failed\nResponse Format\n\nSuccess:\n\n{\n  \"ok\": true,\n  \"data\": { ... }\n}\n\n\nError:\n\n{\n   \"ok\": false,\n   \"error\": \"ERROR_CODE\",\n   \"message\": \"Human-readable description\"\n}\n\nSecurity\nNon-custodial — the backend builds unsigned transactions; you sign locally with your private key before submitting\nPrivate keys are never transmitted to the server\nAll authorization is enforced on-chain by the Solana program, not by the backend\nKeys are stored locally at ~/.config/silkyway/config.json — never share this file"
  },
  "trust": {
    "sourceLabel": "tencent",
    "provenanceUrl": "https://clawhub.ai/silostack/silkyway",
    "publisherUrl": "https://clawhub.ai/silostack/silkyway",
    "owner": "silostack",
    "version": "1.0.9",
    "license": null,
    "verificationStatus": "Indexed source record"
  },
  "links": {
    "detailUrl": "https://openagent3.xyz/skills/silkyway",
    "downloadUrl": "https://openagent3.xyz/downloads/silkyway",
    "agentUrl": "https://openagent3.xyz/skills/silkyway/agent",
    "manifestUrl": "https://openagent3.xyz/skills/silkyway/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/silkyway/agent.md"
  }
}