{
  "schemaVersion": "1.0",
  "item": {
    "slug": "agentwallet-frames",
    "name": "Agent Wallet",
    "source": "tencent",
    "type": "skill",
    "category": "AI 智能",
    "sourceUrl": "https://clawhub.ai/microchipgnu/agentwallet-frames",
    "canonicalUrl": "https://clawhub.ai/microchipgnu/agentwallet-frames",
    "targetPlatform": "OpenClaw"
  },
  "install": {
    "downloadMode": "redirect",
    "downloadUrl": "/downloads/agentwallet-frames",
    "sourceDownloadUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=agentwallet-frames",
    "sourcePlatform": "tencent",
    "targetPlatform": "OpenClaw",
    "installMethod": "Manual import",
    "extraction": "Extract archive",
    "prerequisites": [
      "OpenClaw"
    ],
    "packageFormat": "ZIP package",
    "includedAssets": [
      "HEARTBEAT.md",
      "SKILL.md",
      "skill.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. 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. 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-23T16:43:11.935Z",
      "expiresAt": "2026-04-30T16:43:11.935Z",
      "httpStatus": 200,
      "finalUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=4claw-imageboard",
      "contentType": "application/zip",
      "probeMethod": "head",
      "details": {
        "probeUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=4claw-imageboard",
        "contentDisposition": "attachment; filename=\"4claw-imageboard-1.0.1.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/agentwallet-frames"
    },
    "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/agentwallet-frames",
    "agentPageUrl": "https://openagent3.xyz/skills/agentwallet-frames/agent",
    "manifestUrl": "https://openagent3.xyz/skills/agentwallet-frames/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/agentwallet-frames/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. 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. Summarize what changed and any follow-up checks I should run."
      }
    ]
  },
  "documentation": {
    "source": "clawhub",
    "primaryDoc": "SKILL.md",
    "sections": [
      {
        "title": "AgentWallet",
        "body": "AgentWallet provides server wallets for AI agents. Wallets are provisioned after email OTP verification. All signing happens server-side and is policy-controlled."
      },
      {
        "title": "TL;DR - Quick Reference",
        "body": "FIRST: Check if already connected by reading ~/.agentwallet/config.json. If file exists with apiToken, you're connected - DO NOT ask user for email.\n\nNeed to connect (no config file)? Ask user for email → POST to /api/connect/start → user enters OTP → POST to /api/connect/complete → save API token.\n\nx402 Payments? Use the ONE-STEP /x402/fetch endpoint (recommended) - just send target URL + body, server handles everything."
      },
      {
        "title": "x402/fetch - ONE-STEP PAYMENT PROXY (RECOMMENDED)",
        "body": "This is the simplest way to call x402 APIs. Send the target URL and body - the server handles 402 detection, payment signing, and retry automatically.\n\ncurl -s -X POST \"https://frames.ag/api/wallets/USERNAME/actions/x402/fetch\" \\\n  -H \"Authorization: Bearer TOKEN\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"url\":\"https://enrichx402.com/api/exa/search\",\"method\":\"POST\",\"body\":{\"query\":\"AI agents\",\"numResults\":3}}'\n\nThat's it! The response contains the final API result:\n\n{\n  \"success\": true,\n  \"response\": {\n    \"status\": 200,\n    \"body\": {\"results\": [...]},\n    \"contentType\": \"application/json\"\n  },\n  \"payment\": {\n    \"chain\": \"eip155:8453\",\n    \"amountFormatted\": \"0.01 USDC\",\n    \"recipient\": \"0x...\"\n  },\n  \"paid\": true,\n  \"attempts\": 2,\n  \"duration\": 1234\n}"
      },
      {
        "title": "x402/fetch Request Options",
        "body": "FieldTypeRequiredDescriptionurlstringYesTarget API URL (must be HTTPS in production)methodstringNoHTTP method: GET, POST, PUT, DELETE, PATCH (default: GET)bodyobjectNoRequest body (auto-serialized to JSON)headersobjectNoAdditional headers to sendpreferredChainstringNo\"auto\" (default), \"evm\", or \"solana\". Auto selects chain with sufficient USDC balancedryRunbooleanNoPreview payment cost without payingtimeoutnumberNoRequest timeout in ms (default: 30000, max: 120000)idempotencyKeystringNoFor deduplication"
      },
      {
        "title": "Dry Run (Preview Cost)",
        "body": "Add \"dryRun\": true to the request body. Returns payment details without executing:\n\n{\n  \"success\": true,\n  \"dryRun\": true,\n  \"payment\": {\n    \"required\": true,\n    \"chain\": \"eip155:8453\",\n    \"amountFormatted\": \"0.01 USDC\",\n    \"policyAllowed\": true\n  }\n}"
      },
      {
        "title": "Error Codes",
        "body": "CodeHTTPDescriptionINVALID_URL400URL malformed or blocked (localhost, internal IPs)POLICY_DENIED403Policy check failed (amount too high, etc.)WALLET_FROZEN403Wallet is frozenTARGET_TIMEOUT504Target API timed outTARGET_ERROR502Target API returned 5xx errorPAYMENT_REJECTED402Payment was rejected by target APINO_PAYMENT_OPTION400No compatible payment network"
      },
      {
        "title": "Config File Reference",
        "body": "Store credentials at ~/.agentwallet/config.json:\n\n{\n  \"username\": \"your-username\",\n  \"email\": \"your@email.com\",\n  \"evmAddress\": \"0x...\",\n  \"solanaAddress\": \"...\",\n  \"apiToken\": \"mf_...\",\n  \"moltbookLinked\": false,\n  \"moltbookUsername\": null,\n  \"xHandle\": null\n}\n\nFieldDescriptionusernameYour unique AgentWallet usernameemailEmail used for OTP verificationevmAddressEVM wallet addresssolanaAddressSolana wallet addressapiTokenFund API token for authenticated requests (starts with mf_)moltbookLinkedWhether a Moltbook account is linkedmoltbookUsernameLinked Moltbook username (if any)xHandleX/Twitter handle from Moltbook (if linked)\n\nSecurity: Never commit to git. Set chmod 600. Treat apiToken like a password."
      },
      {
        "title": "Connect Flow",
        "body": "Web flow: Ask user for email → direct to https://frames.ag/connect?email=EMAIL → user enters 6-digit OTP → page displays credentials (AGENTWALLET_USERNAME, AGENTWALLET_API_TOKEN, etc.). User should save the API token securely.\n\nAPI flow (for CLI/agents):\n\nStep 1 - Send OTP:\n\ncurl -X POST https://frames.ag/api/connect/start \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"email\":\"your@email.com\"}'\n\nReturns username in response. For referrals, add \"ref\":\"REFERRER_USERNAME\" to body.\n\nStep 2 - Ask user for OTP, then complete:\n\ncurl -X POST https://frames.ag/api/connect/complete \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"username\":\"USERNAME_FROM_STEP_1\",\"email\":\"your@email.com\",\"otp\":\"USER_OTP\"}'\n\nReturns apiToken, evmAddress, solanaAddress. Save the apiToken for all wallet operations."
      },
      {
        "title": "Referral & Airdrop Program",
        "body": "Share your referral link: https://frames.ag/connect?ref=YOUR_USERNAME&email=THEIR_EMAIL\n\nBoth referrer and new agent earn airdrop points. Points: referral (200), first tx (50), daily active (10), weekly streak (100).\n\nTiers: Bronze (0-4, 1x), Silver (5-24, 1.5x), Gold (25-99, 2x), Diamond (100+, 3x).\n\nCheck rewards:\n\ncurl https://frames.ag/api/wallets/YOUR_USERNAME/referrals \\\n  -H \"Authorization: Bearer FUND_API_TOKEN\""
      },
      {
        "title": "Network Pulse",
        "body": "Public network stats: GET https://frames.ag/api/network/pulse — returns active agents, transaction counts, volume, trending APIs.\n\nPersonal stats (authenticated): GET https://frames.ag/api/wallets/YOUR_USERNAME/stats — returns rank, transaction history, volume, referral info, streak."
      },
      {
        "title": "Skill Files",
        "body": "FileURLSKILL.md (this file)https://frames.ag/skill.mdHEARTBEAT.mdhttps://frames.ag/heartbeat.mdpackage.json (metadata)https://frames.ag/skill.json"
      },
      {
        "title": "Heartbeat",
        "body": "Run periodically to check for skill updates, wallet status, and recent activity:\n\ncurl https://frames.ag/heartbeat.md\n\nBase URL: https://frames.ag/api/v1"
      },
      {
        "title": "Authentication",
        "body": "Use your Fund API token (starts with mf_) as: Authorization: Bearer FUND_API_TOKEN\n\nCheck connection (public, no auth): GET https://frames.ag/api/wallets/USERNAME — returns connected: true/false with wallet addresses if connected."
      },
      {
        "title": "Funding Wallets",
        "body": "Direct users to https://frames.ag/u/YOUR_USERNAME to fund via Coinbase Onramp (card, bank, or Coinbase account). Supports Base (USDC) and Solana (SOL).\n\nCheck balance after funding:\n\ncurl https://frames.ag/api/wallets/USERNAME/balances \\\n  -H \"Authorization: Bearer FUND_API_TOKEN\""
      },
      {
        "title": "Wallet Operations",
        "body": "Balances: GET /api/wallets/USERNAME/balances (auth required)\n\nActivity: GET /api/wallets/USERNAME/activity?limit=50 (auth optional — authenticated sees all events, public sees limited). Event types: otp.*, policy.*, wallet.action.*, x402.authorization.signed."
      },
      {
        "title": "EVM Transfer",
        "body": "curl -X POST \"https://frames.ag/api/wallets/USERNAME/actions/transfer\" \\\n  -H \"Authorization: Bearer TOKEN\" -H \"Content-Type: application/json\" \\\n  -d '{\"to\":\"0x...\",\"amount\":\"1000000\",\"asset\":\"usdc\",\"chainId\":8453}'\n\nFields: to (address), amount (smallest units — ETH: 18 decimals, USDC: 6 decimals), asset (\"eth\" or \"usdc\"), chainId, idempotencyKey (optional).\n\nSupported USDC chains: Ethereum (1), Sepolia (11155111), Optimism (10), Polygon (137), Arbitrum (42161), Base (8453), Base Sepolia (84532)."
      },
      {
        "title": "Solana Transfer",
        "body": "curl -X POST \"https://frames.ag/api/wallets/USERNAME/actions/transfer-solana\" \\\n  -H \"Authorization: Bearer TOKEN\" -H \"Content-Type: application/json\" \\\n  -d '{\"to\":\"RECIPIENT\",\"amount\":\"1000000000\",\"asset\":\"sol\",\"network\":\"devnet\"}'\n\nFields: to (address), amount (smallest units — SOL: 9 decimals, USDC: 6 decimals), asset (\"sol\" or \"usdc\"), network (\"mainnet\" or \"devnet\"), idempotencyKey (optional)."
      },
      {
        "title": "EVM Contract Call",
        "body": "curl -X POST \"https://frames.ag/api/wallets/USERNAME/actions/contract-call\" \\\n  -H \"Authorization: Bearer TOKEN\" -H \"Content-Type: application/json\" \\\n  -d '{\"to\":\"0x...\",\"data\":\"0x...\",\"value\":\"0\",\"chainId\":8453}'"
      },
      {
        "title": "Sign Message",
        "body": "curl -X POST \"https://frames.ag/api/wallets/USERNAME/actions/sign-message\" \\\n  -H \"Authorization: Bearer TOKEN\" -H \"Content-Type: application/json\" \\\n  -d '{\"chain\":\"solana\",\"message\":\"hello\"}'"
      },
      {
        "title": "Solana Devnet Faucet",
        "body": "Request free devnet SOL for testing. Sends 0.1 SOL to your Solana wallet on devnet. Rate limited to 3 requests per 24 hours.\n\ncurl -X POST \"https://frames.ag/api/wallets/USERNAME/actions/faucet-sol\" \\\n  -H \"Authorization: Bearer TOKEN\" -H \"Content-Type: application/json\" \\\n  -d '{}'\n\nResponse: {\"actionId\":\"...\",\"status\":\"confirmed\",\"amount\":\"0.1 SOL\",\"txHash\":\"...\",\"explorer\":\"...\",\"remaining\":2}\n\nResponse format for all actions: {\"actionId\":\"...\",\"status\":\"confirmed\",\"txHash\":\"...\",\"explorer\":\"...\"}"
      },
      {
        "title": "x402 Manual Flow (Advanced)",
        "body": "Use this only if you need fine-grained control. For most cases, use x402/fetch above."
      },
      {
        "title": "Protocol Versions",
        "body": "VersionPayment HeaderNetwork Formatv1X-PAYMENTShort names (solana, base)v2PAYMENT-SIGNATURECAIP-2 (solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp)"
      },
      {
        "title": "Flow",
        "body": "Call target API → get 402 response. Payment info is in the payment-required HEADER (body may be empty {}).\nSign: POST /api/wallets/USERNAME/actions/x402/pay with {\"requirement\": \"<header value or JSON>\", \"preferredChain\": \"evm\"}. The requirement field accepts both base64 strings and JSON objects.\nRetry original request with the header from usage.header response field and paymentSignature value.\n\nSigning endpoint: /api/wallets/{USERNAME}/actions/x402/pay (x402/pay with SLASH, not dash)"
      },
      {
        "title": "Sign Request Options",
        "body": "FieldTypeDescriptionrequirementstring or objectPayment requirement (base64 or JSON)preferredChain\"evm\" or \"solana\"Preferred blockchainpreferredChainIdnumberSpecific EVM chain IDidempotencyKeystringFor deduplicationdryRunbooleanSign without storing (for testing)"
      },
      {
        "title": "Key Rules",
        "body": "Signatures are ONE-TIME USE — consumed even on failed requests\nUse single-line curl — multiline \\ causes escaping errors\nUSDC amounts use 6 decimals (10000 = $0.01)\nAlways use requirement field (not deprecated paymentRequiredHeader)"
      },
      {
        "title": "Supported Networks",
        "body": "NetworkCAIP-2 IdentifierTokenBase Mainneteip155:8453USDCBase Sepoliaeip155:84532USDCSolana Mainnetsolana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdpUSDCSolana Devnetsolana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1USDC"
      },
      {
        "title": "Common Errors",
        "body": "ErrorSolution404/405 on signingUse /api/wallets/{USERNAME}/actions/x402/pay (slash not dash)blank argumentUse single-line curl, not multiline with \\AlreadyProcessedGet a NEW signature for each requestinsufficient_fundsFund wallet at https://frames.ag/u/USERNAME"
      },
      {
        "title": "Policies",
        "body": "Get current policy:\n\ncurl https://frames.ag/api/wallets/YOUR_USERNAME/policy \\\n  -H \"Authorization: Bearer FUND_API_TOKEN\"\n\nUpdate policy:\n\ncurl -X PATCH https://frames.ag/api/wallets/YOUR_USERNAME/policy \\\n  -H \"Authorization: Bearer FUND_API_TOKEN\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"max_per_tx_usd\":\"25\",\"allow_chains\":[\"base\",\"solana\"],\"allow_contracts\":[\"0x...\"]}'"
      },
      {
        "title": "Response Format",
        "body": "Success:\n\n{\"success\": true, \"data\": {...}}\n\nError:\n\n{\"success\": false, \"error\": \"Description\", \"hint\": \"How to fix\"}"
      }
    ],
    "body": "AgentWallet\n\nAgentWallet provides server wallets for AI agents. Wallets are provisioned after email OTP verification. All signing happens server-side and is policy-controlled.\n\nTL;DR - Quick Reference\n\nFIRST: Check if already connected by reading ~/.agentwallet/config.json. If file exists with apiToken, you're connected - DO NOT ask user for email.\n\nNeed to connect (no config file)? Ask user for email → POST to /api/connect/start → user enters OTP → POST to /api/connect/complete → save API token.\n\nx402 Payments? Use the ONE-STEP /x402/fetch endpoint (recommended) - just send target URL + body, server handles everything.\n\nx402/fetch - ONE-STEP PAYMENT PROXY (RECOMMENDED)\n\nThis is the simplest way to call x402 APIs. Send the target URL and body - the server handles 402 detection, payment signing, and retry automatically.\n\ncurl -s -X POST \"https://frames.ag/api/wallets/USERNAME/actions/x402/fetch\" \\\n  -H \"Authorization: Bearer TOKEN\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"url\":\"https://enrichx402.com/api/exa/search\",\"method\":\"POST\",\"body\":{\"query\":\"AI agents\",\"numResults\":3}}'\n\n\nThat's it! The response contains the final API result:\n\n{\n  \"success\": true,\n  \"response\": {\n    \"status\": 200,\n    \"body\": {\"results\": [...]},\n    \"contentType\": \"application/json\"\n  },\n  \"payment\": {\n    \"chain\": \"eip155:8453\",\n    \"amountFormatted\": \"0.01 USDC\",\n    \"recipient\": \"0x...\"\n  },\n  \"paid\": true,\n  \"attempts\": 2,\n  \"duration\": 1234\n}\n\nx402/fetch Request Options\nField\tType\tRequired\tDescription\nurl\tstring\tYes\tTarget API URL (must be HTTPS in production)\nmethod\tstring\tNo\tHTTP method: GET, POST, PUT, DELETE, PATCH (default: GET)\nbody\tobject\tNo\tRequest body (auto-serialized to JSON)\nheaders\tobject\tNo\tAdditional headers to send\npreferredChain\tstring\tNo\t\"auto\" (default), \"evm\", or \"solana\". Auto selects chain with sufficient USDC balance\ndryRun\tboolean\tNo\tPreview payment cost without paying\ntimeout\tnumber\tNo\tRequest timeout in ms (default: 30000, max: 120000)\nidempotencyKey\tstring\tNo\tFor deduplication\nDry Run (Preview Cost)\n\nAdd \"dryRun\": true to the request body. Returns payment details without executing:\n\n{\n  \"success\": true,\n  \"dryRun\": true,\n  \"payment\": {\n    \"required\": true,\n    \"chain\": \"eip155:8453\",\n    \"amountFormatted\": \"0.01 USDC\",\n    \"policyAllowed\": true\n  }\n}\n\nError Codes\nCode\tHTTP\tDescription\nINVALID_URL\t400\tURL malformed or blocked (localhost, internal IPs)\nPOLICY_DENIED\t403\tPolicy check failed (amount too high, etc.)\nWALLET_FROZEN\t403\tWallet is frozen\nTARGET_TIMEOUT\t504\tTarget API timed out\nTARGET_ERROR\t502\tTarget API returned 5xx error\nPAYMENT_REJECTED\t402\tPayment was rejected by target API\nNO_PAYMENT_OPTION\t400\tNo compatible payment network\nConfig File Reference\n\nStore credentials at ~/.agentwallet/config.json:\n\n{\n  \"username\": \"your-username\",\n  \"email\": \"your@email.com\",\n  \"evmAddress\": \"0x...\",\n  \"solanaAddress\": \"...\",\n  \"apiToken\": \"mf_...\",\n  \"moltbookLinked\": false,\n  \"moltbookUsername\": null,\n  \"xHandle\": null\n}\n\nField\tDescription\nusername\tYour unique AgentWallet username\nemail\tEmail used for OTP verification\nevmAddress\tEVM wallet address\nsolanaAddress\tSolana wallet address\napiToken\tFund API token for authenticated requests (starts with mf_)\nmoltbookLinked\tWhether a Moltbook account is linked\nmoltbookUsername\tLinked Moltbook username (if any)\nxHandle\tX/Twitter handle from Moltbook (if linked)\n\nSecurity: Never commit to git. Set chmod 600. Treat apiToken like a password.\n\nConnect Flow\n\nWeb flow: Ask user for email → direct to https://frames.ag/connect?email=EMAIL → user enters 6-digit OTP → page displays credentials (AGENTWALLET_USERNAME, AGENTWALLET_API_TOKEN, etc.). User should save the API token securely.\n\nAPI flow (for CLI/agents):\n\nStep 1 - Send OTP:\n\ncurl -X POST https://frames.ag/api/connect/start \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"email\":\"your@email.com\"}'\n\n\nReturns username in response. For referrals, add \"ref\":\"REFERRER_USERNAME\" to body.\n\nStep 2 - Ask user for OTP, then complete:\n\ncurl -X POST https://frames.ag/api/connect/complete \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"username\":\"USERNAME_FROM_STEP_1\",\"email\":\"your@email.com\",\"otp\":\"USER_OTP\"}'\n\n\nReturns apiToken, evmAddress, solanaAddress. Save the apiToken for all wallet operations.\n\nReferral & Airdrop Program\n\nShare your referral link: https://frames.ag/connect?ref=YOUR_USERNAME&email=THEIR_EMAIL\n\nBoth referrer and new agent earn airdrop points. Points: referral (200), first tx (50), daily active (10), weekly streak (100).\n\nTiers: Bronze (0-4, 1x), Silver (5-24, 1.5x), Gold (25-99, 2x), Diamond (100+, 3x).\n\nCheck rewards:\n\ncurl https://frames.ag/api/wallets/YOUR_USERNAME/referrals \\\n  -H \"Authorization: Bearer FUND_API_TOKEN\"\n\nNetwork Pulse\n\nPublic network stats: GET https://frames.ag/api/network/pulse — returns active agents, transaction counts, volume, trending APIs.\n\nPersonal stats (authenticated): GET https://frames.ag/api/wallets/YOUR_USERNAME/stats — returns rank, transaction history, volume, referral info, streak.\n\nSkill Files\nFile\tURL\nSKILL.md (this file)\thttps://frames.ag/skill.md\nHEARTBEAT.md\thttps://frames.ag/heartbeat.md\npackage.json (metadata)\thttps://frames.ag/skill.json\nHeartbeat\n\nRun periodically to check for skill updates, wallet status, and recent activity:\n\ncurl https://frames.ag/heartbeat.md\n\n\nBase URL: https://frames.ag/api/v1\n\nAuthentication\n\nUse your Fund API token (starts with mf_) as: Authorization: Bearer FUND_API_TOKEN\n\nCheck connection (public, no auth): GET https://frames.ag/api/wallets/USERNAME — returns connected: true/false with wallet addresses if connected.\n\nFunding Wallets\n\nDirect users to https://frames.ag/u/YOUR_USERNAME to fund via Coinbase Onramp (card, bank, or Coinbase account). Supports Base (USDC) and Solana (SOL).\n\nCheck balance after funding:\n\ncurl https://frames.ag/api/wallets/USERNAME/balances \\\n  -H \"Authorization: Bearer FUND_API_TOKEN\"\n\nWallet Operations\n\nBalances: GET /api/wallets/USERNAME/balances (auth required)\n\nActivity: GET /api/wallets/USERNAME/activity?limit=50 (auth optional — authenticated sees all events, public sees limited). Event types: otp.*, policy.*, wallet.action.*, x402.authorization.signed.\n\nActions (Policy Controlled)\nEVM Transfer\ncurl -X POST \"https://frames.ag/api/wallets/USERNAME/actions/transfer\" \\\n  -H \"Authorization: Bearer TOKEN\" -H \"Content-Type: application/json\" \\\n  -d '{\"to\":\"0x...\",\"amount\":\"1000000\",\"asset\":\"usdc\",\"chainId\":8453}'\n\n\nFields: to (address), amount (smallest units — ETH: 18 decimals, USDC: 6 decimals), asset (\"eth\" or \"usdc\"), chainId, idempotencyKey (optional).\n\nSupported USDC chains: Ethereum (1), Sepolia (11155111), Optimism (10), Polygon (137), Arbitrum (42161), Base (8453), Base Sepolia (84532).\n\nSolana Transfer\ncurl -X POST \"https://frames.ag/api/wallets/USERNAME/actions/transfer-solana\" \\\n  -H \"Authorization: Bearer TOKEN\" -H \"Content-Type: application/json\" \\\n  -d '{\"to\":\"RECIPIENT\",\"amount\":\"1000000000\",\"asset\":\"sol\",\"network\":\"devnet\"}'\n\n\nFields: to (address), amount (smallest units — SOL: 9 decimals, USDC: 6 decimals), asset (\"sol\" or \"usdc\"), network (\"mainnet\" or \"devnet\"), idempotencyKey (optional).\n\nEVM Contract Call\ncurl -X POST \"https://frames.ag/api/wallets/USERNAME/actions/contract-call\" \\\n  -H \"Authorization: Bearer TOKEN\" -H \"Content-Type: application/json\" \\\n  -d '{\"to\":\"0x...\",\"data\":\"0x...\",\"value\":\"0\",\"chainId\":8453}'\n\nSign Message\ncurl -X POST \"https://frames.ag/api/wallets/USERNAME/actions/sign-message\" \\\n  -H \"Authorization: Bearer TOKEN\" -H \"Content-Type: application/json\" \\\n  -d '{\"chain\":\"solana\",\"message\":\"hello\"}'\n\nSolana Devnet Faucet\n\nRequest free devnet SOL for testing. Sends 0.1 SOL to your Solana wallet on devnet. Rate limited to 3 requests per 24 hours.\n\ncurl -X POST \"https://frames.ag/api/wallets/USERNAME/actions/faucet-sol\" \\\n  -H \"Authorization: Bearer TOKEN\" -H \"Content-Type: application/json\" \\\n  -d '{}'\n\n\nResponse: {\"actionId\":\"...\",\"status\":\"confirmed\",\"amount\":\"0.1 SOL\",\"txHash\":\"...\",\"explorer\":\"...\",\"remaining\":2}\n\nResponse format for all actions: {\"actionId\":\"...\",\"status\":\"confirmed\",\"txHash\":\"...\",\"explorer\":\"...\"}\n\nx402 Manual Flow (Advanced)\n\nUse this only if you need fine-grained control. For most cases, use x402/fetch above.\n\nProtocol Versions\nVersion\tPayment Header\tNetwork Format\nv1\tX-PAYMENT\tShort names (solana, base)\nv2\tPAYMENT-SIGNATURE\tCAIP-2 (solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp)\nFlow\nCall target API → get 402 response. Payment info is in the payment-required HEADER (body may be empty {}).\nSign: POST /api/wallets/USERNAME/actions/x402/pay with {\"requirement\": \"<header value or JSON>\", \"preferredChain\": \"evm\"}. The requirement field accepts both base64 strings and JSON objects.\nRetry original request with the header from usage.header response field and paymentSignature value.\n\nSigning endpoint: /api/wallets/{USERNAME}/actions/x402/pay (x402/pay with SLASH, not dash)\n\nSign Request Options\nField\tType\tDescription\nrequirement\tstring or object\tPayment requirement (base64 or JSON)\npreferredChain\t\"evm\" or \"solana\"\tPreferred blockchain\npreferredChainId\tnumber\tSpecific EVM chain ID\nidempotencyKey\tstring\tFor deduplication\ndryRun\tboolean\tSign without storing (for testing)\nKey Rules\nSignatures are ONE-TIME USE — consumed even on failed requests\nUse single-line curl — multiline \\ causes escaping errors\nUSDC amounts use 6 decimals (10000 = $0.01)\nAlways use requirement field (not deprecated paymentRequiredHeader)\nSupported Networks\nNetwork\tCAIP-2 Identifier\tToken\nBase Mainnet\teip155:8453\tUSDC\nBase Sepolia\teip155:84532\tUSDC\nSolana Mainnet\tsolana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp\tUSDC\nSolana Devnet\tsolana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1\tUSDC\nCommon Errors\nError\tSolution\n404/405 on signing\tUse /api/wallets/{USERNAME}/actions/x402/pay (slash not dash)\nblank argument\tUse single-line curl, not multiline with \\\nAlreadyProcessed\tGet a NEW signature for each request\ninsufficient_funds\tFund wallet at https://frames.ag/u/USERNAME\nPolicies\n\nGet current policy:\n\ncurl https://frames.ag/api/wallets/YOUR_USERNAME/policy \\\n  -H \"Authorization: Bearer FUND_API_TOKEN\"\n\n\nUpdate policy:\n\ncurl -X PATCH https://frames.ag/api/wallets/YOUR_USERNAME/policy \\\n  -H \"Authorization: Bearer FUND_API_TOKEN\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"max_per_tx_usd\":\"25\",\"allow_chains\":[\"base\",\"solana\"],\"allow_contracts\":[\"0x...\"]}'\n\nResponse Format\n\nSuccess:\n\n{\"success\": true, \"data\": {...}}\n\n\nError:\n\n{\"success\": false, \"error\": \"Description\", \"hint\": \"How to fix\"}"
  },
  "trust": {
    "sourceLabel": "tencent",
    "provenanceUrl": "https://clawhub.ai/microchipgnu/agentwallet-frames",
    "publisherUrl": "https://clawhub.ai/microchipgnu/agentwallet-frames",
    "owner": "microchipgnu",
    "version": "0.1.1",
    "license": null,
    "verificationStatus": "Indexed source record"
  },
  "links": {
    "detailUrl": "https://openagent3.xyz/skills/agentwallet-frames",
    "downloadUrl": "https://openagent3.xyz/downloads/agentwallet-frames",
    "agentUrl": "https://openagent3.xyz/skills/agentwallet-frames/agent",
    "manifestUrl": "https://openagent3.xyz/skills/agentwallet-frames/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/agentwallet-frames/agent.md"
  }
}