Requirements
- Target platform
- OpenClaw
- Install method
- Manual import
- Extraction
- Extract archive
- Prerequisites
- OpenClaw
- Primary doc
- SKILL.md
Wallets for AI agents with x402 payment signing, referral rewards, and policy-controlled actions.
Wallets for AI agents with x402 payment signing, referral rewards, and policy-controlled actions.
Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.
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.
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.
AgentWallet provides server wallets for AI agents. Wallets are provisioned after email OTP verification. All signing happens server-side and is policy-controlled.
FIRST: Check if already connected by reading ~/.agentwallet/config.json. If file exists with apiToken, you're connected - DO NOT ask user for email. Need 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. x402 Payments? Use the ONE-STEP /x402/fetch endpoint (recommended) - just send target URL + body, server handles everything.
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. curl -s -X POST "https://frames.ag/api/wallets/USERNAME/actions/x402/fetch" \ -H "Authorization: Bearer TOKEN" \ -H "Content-Type: application/json" \ -d '{"url":"https://enrichx402.com/api/exa/search","method":"POST","body":{"query":"AI agents","numResults":3}}' That's it! The response contains the final API result: { "success": true, "response": { "status": 200, "body": {"results": [...]}, "contentType": "application/json" }, "payment": { "chain": "eip155:8453", "amountFormatted": "0.01 USDC", "recipient": "0x..." }, "paid": true, "attempts": 2, "duration": 1234 }
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
Add "dryRun": true to the request body. Returns payment details without executing: { "success": true, "dryRun": true, "payment": { "required": true, "chain": "eip155:8453", "amountFormatted": "0.01 USDC", "policyAllowed": true } }
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
Store credentials at ~/.agentwallet/config.json: { "username": "your-username", "email": "your@email.com", "evmAddress": "0x...", "solanaAddress": "...", "apiToken": "mf_...", "moltbookLinked": false, "moltbookUsername": null, "xHandle": null } FieldDescriptionusernameYour 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) Security: Never commit to git. Set chmod 600. Treat apiToken like a password.
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. API flow (for CLI/agents): Step 1 - Send OTP: curl -X POST https://frames.ag/api/connect/start \ -H "Content-Type: application/json" \ -d '{"email":"your@email.com"}' Returns username in response. For referrals, add "ref":"REFERRER_USERNAME" to body. Step 2 - Ask user for OTP, then complete: curl -X POST https://frames.ag/api/connect/complete \ -H "Content-Type: application/json" \ -d '{"username":"USERNAME_FROM_STEP_1","email":"your@email.com","otp":"USER_OTP"}' Returns apiToken, evmAddress, solanaAddress. Save the apiToken for all wallet operations.
Share your referral link: https://frames.ag/connect?ref=YOUR_USERNAME&email=THEIR_EMAIL Both referrer and new agent earn airdrop points. Points: referral (200), first tx (50), daily active (10), weekly streak (100). Tiers: Bronze (0-4, 1x), Silver (5-24, 1.5x), Gold (25-99, 2x), Diamond (100+, 3x). Check rewards: curl https://frames.ag/api/wallets/YOUR_USERNAME/referrals \ -H "Authorization: Bearer FUND_API_TOKEN"
Public network stats: GET https://frames.ag/api/network/pulse β returns active agents, transaction counts, volume, trending APIs. Personal stats (authenticated): GET https://frames.ag/api/wallets/YOUR_USERNAME/stats β returns rank, transaction history, volume, referral info, streak.
FileURLSKILL.md (this file)https://frames.ag/skill.mdHEARTBEAT.mdhttps://frames.ag/heartbeat.mdpackage.json (metadata)https://frames.ag/skill.json
Run periodically to check for skill updates, wallet status, and recent activity: curl https://frames.ag/heartbeat.md Base URL: https://frames.ag/api/v1
Use your Fund API token (starts with mf_) as: Authorization: Bearer FUND_API_TOKEN Check connection (public, no auth): GET https://frames.ag/api/wallets/USERNAME β returns connected: true/false with wallet addresses if connected.
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). Check balance after funding: curl https://frames.ag/api/wallets/USERNAME/balances \ -H "Authorization: Bearer FUND_API_TOKEN"
Balances: GET /api/wallets/USERNAME/balances (auth required) Activity: 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.
curl -X POST "https://frames.ag/api/wallets/USERNAME/actions/transfer" \ -H "Authorization: Bearer TOKEN" -H "Content-Type: application/json" \ -d '{"to":"0x...","amount":"1000000","asset":"usdc","chainId":8453}' Fields: to (address), amount (smallest units β ETH: 18 decimals, USDC: 6 decimals), asset ("eth" or "usdc"), chainId, idempotencyKey (optional). Supported USDC chains: Ethereum (1), Sepolia (11155111), Optimism (10), Polygon (137), Arbitrum (42161), Base (8453), Base Sepolia (84532).
curl -X POST "https://frames.ag/api/wallets/USERNAME/actions/transfer-solana" \ -H "Authorization: Bearer TOKEN" -H "Content-Type: application/json" \ -d '{"to":"RECIPIENT","amount":"1000000000","asset":"sol","network":"devnet"}' Fields: to (address), amount (smallest units β SOL: 9 decimals, USDC: 6 decimals), asset ("sol" or "usdc"), network ("mainnet" or "devnet"), idempotencyKey (optional).
curl -X POST "https://frames.ag/api/wallets/USERNAME/actions/contract-call" \ -H "Authorization: Bearer TOKEN" -H "Content-Type: application/json" \ -d '{"to":"0x...","data":"0x...","value":"0","chainId":8453}'
curl -X POST "https://frames.ag/api/wallets/USERNAME/actions/sign-message" \ -H "Authorization: Bearer TOKEN" -H "Content-Type: application/json" \ -d '{"chain":"solana","message":"hello"}'
Request free devnet SOL for testing. Sends 0.1 SOL to your Solana wallet on devnet. Rate limited to 3 requests per 24 hours. curl -X POST "https://frames.ag/api/wallets/USERNAME/actions/faucet-sol" \ -H "Authorization: Bearer TOKEN" -H "Content-Type: application/json" \ -d '{}' Response: {"actionId":"...","status":"confirmed","amount":"0.1 SOL","txHash":"...","explorer":"...","remaining":2} Response format for all actions: {"actionId":"...","status":"confirmed","txHash":"...","explorer":"..."}
Use this only if you need fine-grained control. For most cases, use x402/fetch above.
VersionPayment HeaderNetwork Formatv1X-PAYMENTShort names (solana, base)v2PAYMENT-SIGNATURECAIP-2 (solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp)
Call target API β get 402 response. Payment info is in the payment-required HEADER (body may be empty {}). Sign: 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. Retry original request with the header from usage.header response field and paymentSignature value. Signing endpoint: /api/wallets/{USERNAME}/actions/x402/pay (x402/pay with SLASH, not dash)
FieldTypeDescriptionrequirementstring or objectPayment requirement (base64 or JSON)preferredChain"evm" or "solana"Preferred blockchainpreferredChainIdnumberSpecific EVM chain IDidempotencyKeystringFor deduplicationdryRunbooleanSign without storing (for testing)
Signatures are ONE-TIME USE β consumed even on failed requests Use single-line curl β multiline \ causes escaping errors USDC amounts use 6 decimals (10000 = $0.01) Always use requirement field (not deprecated paymentRequiredHeader)
NetworkCAIP-2 IdentifierTokenBase Mainneteip155:8453USDCBase Sepoliaeip155:84532USDCSolana Mainnetsolana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdpUSDCSolana Devnetsolana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1USDC
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
Get current policy: curl https://frames.ag/api/wallets/YOUR_USERNAME/policy \ -H "Authorization: Bearer FUND_API_TOKEN" Update policy: curl -X PATCH https://frames.ag/api/wallets/YOUR_USERNAME/policy \ -H "Authorization: Bearer FUND_API_TOKEN" \ -H "Content-Type: application/json" \ -d '{"max_per_tx_usd":"25","allow_chains":["base","solana"],"allow_contracts":["0x..."]}'
Success: {"success": true, "data": {...}} Error: {"success": false, "error": "Description", "hint": "How to fix"}
Agent frameworks, memory systems, reasoning layers, and model-native orchestration.
Largest current source with strong distribution and engagement signals.