{
  "schemaVersion": "1.0",
  "item": {
    "slug": "reva",
    "name": "Reva",
    "source": "tencent",
    "type": "skill",
    "category": "AI 智能",
    "sourceUrl": "https://clawhub.ai/pax47/reva",
    "canonicalUrl": "https://clawhub.ai/pax47/reva",
    "targetPlatform": "OpenClaw"
  },
  "install": {
    "downloadMode": "redirect",
    "downloadUrl": "/downloads/reva",
    "sourceDownloadUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=reva",
    "sourcePlatform": "tencent",
    "targetPlatform": "OpenClaw",
    "installMethod": "Manual import",
    "extraction": "Extract archive",
    "prerequisites": [
      "OpenClaw"
    ],
    "packageFormat": "ZIP package",
    "includedAssets": [
      "SKILL.md",
      "scripts/send-otp.sh",
      "scripts/claim-payid.sh",
      "scripts/get-user-info.sh",
      "scripts/auth-manager.sh",
      "scripts/check-auth.sh"
    ],
    "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-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/reva"
    },
    "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/reva",
    "agentPageUrl": "https://openagent3.xyz/skills/reva/agent",
    "manifestUrl": "https://openagent3.xyz/skills/reva/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/reva/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": "Reva",
        "body": "Passwordless authentication and wallet management for Reva users.\n\nReva provides a simple way to authenticate users, claim unique PayID names, and manage cryptocurrency balances. All authentication is passwordless using email-based OTP verification."
      },
      {
        "title": "Authentication",
        "body": "Reva uses a passwordless authentication flow. Users receive a one-time password (OTP) via email, verify it, and receive an access token for subsequent operations."
      },
      {
        "title": "Login/Register Flow",
        "body": "There is no difference between registration and login - both use the same passwordless flow:\n\nUser provides their email address\nSystem sends OTP to the email\nUser provides the OTP code\nSystem verifies OTP and returns access token\nAccess token is stored securely for future operations\n\nThe access token MUST be stored securely after verification and reused for all protected operations."
      },
      {
        "title": "1. Login or Register",
        "body": "Triggers: When user wants to login, register, sign in, sign up, authenticate, or access Reva\n\nProcess:\n\nAsk user for their email address if not provided\nCall the authentication script to send OTP: {baseDir}/scripts/send-otp.sh <email>\nInform user that OTP has been sent to their email\nAsk user to provide the OTP code they received\nCall the verification script: {baseDir}/scripts/verify-otp.sh <email> <otp>\nIf successful, inform user they are now authenticated\nThe access token is automatically stored for future use"
      },
      {
        "title": "2. Claim PayID",
        "body": "Triggers: When user wants to claim a PayID, get a PayID name, register a PayID, or set their PayID\n\nRequirements: User must be authenticated first (have valid access token)\n\nProcess:\n\nCheck if user is authenticated by calling: {baseDir}/scripts/check-auth.sh\nIf not authenticated, prompt user to login first\nAsk user for their desired PayID name if not provided\nCall the claim script: {baseDir}/scripts/claim-payid.sh <desired_payid>\nHandle response:\n\nSuccess: Inform user their PayID was claimed successfully\nAlready taken: Inform user the PayID is taken and ask for another choice\nInvalid format: Explain format requirements and ask again\nUnauthorized: Token expired, ask user to login again"
      },
      {
        "title": "3. View Balance",
        "body": "Triggers: When user wants to check balance, see wallet balance, view funds, or check how much money they have\n\nRequirements: User must be authenticated first (have valid access token)\n\nProcess:\n\nCheck if user is authenticated by calling: {baseDir}/scripts/check-auth.sh\nIf not authenticated, prompt user to login first\nCall the balance script: {baseDir}/scripts/get-balance.sh\nDisplay the balance to user in a friendly format showing each token with its amount, symbol, and chain (network)\nIf unauthorized error, token expired - ask user to login again\n\nDisplay Format Example:\n\nYour current balance:\n- 0.001016 ETH on Base\n- 1.97 USDC on Base\n- 1.21 USDT on BNB Smart Chain\n- 0.80 USDC on BNB Smart Chain\n- 0.00088 BNB on BNB Smart Chain"
      },
      {
        "title": "4. Get User Information",
        "body": "Triggers: When user asks about their account details, PayID, wallet address, email, referral code, cashback points, connected Twitter, avatar, or wants to deposit funds\n\nRequirements: User must be authenticated first (have valid access token)\n\nProcess:\n\nCheck if user is authenticated by calling: {baseDir}/scripts/check-auth.sh\nIf not authenticated, prompt user to login first\nCall the user info script: {baseDir}/scripts/get-user-info.sh\nExtract and display the relevant information the user asked for:\n\nPayID: Show from payId field\nWallet Address: Show from walletAddress field\nEmail: Show from email field\nReferral Code: Show from referralCode field\nCashback Points: Show from cashbackPoints field\nConnected Twitter: Show from twitter field\nAvatar: Show from avatarUrl field\nTransaction Limit: Show transactionLimit and transactionUsed\n\n\nIf user wants to deposit funds, provide their wallet address and instruct them to send funds to it\n\nImportant for Deposits: When user asks to deposit, simply provide their wallet address from the /api/users/me response and tell them to send funds to that address."
      },
      {
        "title": "5. Send Funds",
        "body": "Triggers: When user wants to send money, send funds, send crypto, transfer tokens, or pay someone\n\nRequirements: User must be authenticated first (have valid access token)\n\nProcess:\n\nCRITICAL: You must parse the user's message and extract all required information to construct a proper transfer payload. Continue asking follow-up questions until ALL required fields are provided.\n\nCheck if user is authenticated by calling: {baseDir}/scripts/check-auth.sh\nIf not authenticated, prompt user to login first\nExtract the following information from user's message:\n\nToken Symbol: USDT, USDC, ETH, BNB, POL, or USD_STABLECOIN (these are the ONLY supported tokens)\nChain Symbol: ETH, POL, OP, BNB, or BASE (null for USD_STABLECOIN)\nRecipient: PayID name, Twitter username (starts with @), or wallet address\nAmount: Numeric value\n\n\nIf ANY field is missing, ask the user a follow-up question to get the missing information\nOnce ALL fields are collected, call: {baseDir}/scripts/send-funds.sh <tokenSymbol> <chainSymbol> <recipient> <amount>\nDisplay the success message or error to the user\n\nRecipient Type Detection:\n\nTwitter Username: If recipient starts with @, remove the @ and use as recipientTwitterUsername\n\nExample: @aminedd4 → recipientTwitterUsername: \"aminedd4\"\n\n\nWallet Address: If recipient starts with 0x, use as recipientWalletAddress\n\nExample: 0x1234... → recipientWalletAddress: \"0x1234...\"\n\n\nPayID Name: Otherwise, use as recipientPayid\n\nExample: aldo → recipientPayid: \"aldo\"\n\nUSD/Dollar Handling (IMPORTANT):\n\nWhen user mentions 'USD', 'dollar', 'dollars', or '$':\n\nSet tokenSymbol to USD_STABLECOIN (this is a special marker)\nSet chainSymbol to null - the system automatically selects the network with the highest USD stablecoin balance\nDO NOT ask for network when USD/dollar is mentioned - the system handles this automatically\n\nSupported Tokens (EXACT ENUMS):\n\nUSDT - Tether\nUSDC - USD Coin\nETH - Ethereum\nBNB - Binance Coin\nPOL - Polygon\nUSD_STABLECOIN - For USD/dollar requests (chainSymbol must be null)\n\nSupported Chains (EXACT ENUMS):\n\nETH - Ethereum\nPOL - Polygon\nOP - Optimism\nBNB - BNB Chain\nBASE - Base\nnull - Only when tokenSymbol is USD_STABLECOIN\n\nParsing Examples:\n\nExample 1: \"send 5 usdt on base to aldo\"\n\ntokenSymbol: USDT\nchainSymbol: BASE\nrecipientPayid: aldo\nrecipientTwitterUsername: null\nrecipientWalletAddress: null\namount: 5\n\nExample 2: \"transfer 0.3 BNB on bnb to @aminedd4\"\n\ntokenSymbol: BNB\nchainSymbol: BNB\nrecipientPayid: null\nrecipientTwitterUsername: aminedd4\nrecipientWalletAddress: null\namount: 0.3\n\nExample 3: \"send $10 to chris\"\n\ntokenSymbol: USD_STABLECOIN\nchainSymbol: null\nrecipientPayid: chris\nrecipientTwitterUsername: null\nrecipientWalletAddress: null\namount: 10\n\nExample 4: \"send 1 eth on ethereum to 0x742d35Cc6634C0532925a3b844Bc9e7595f0bEb\"\n\ntokenSymbol: ETH\nchainSymbol: ETH\nrecipientPayid: null\nrecipientTwitterUsername: null\nrecipientWalletAddress: 0x742d35Cc6634C0532925a3b844Bc9e7595f0bEb\namount: 1\n\nFollow-up Question Examples:\n\nUser: \"send some usdt to aldo\"\n→ Missing: amount, chain\n→ Ask: \"How much USDT would you like to send, and on which network? (ETH, POL, OP, BNB, or BASE)\"\n\n\nUser: \"send 5 usdt to aldo\"\n→ Missing: chain\n→ Ask: \"Which network would you like to use? (ETH, POL, OP, BNB, or BASE)\"\n\n\nUser: \"send 5 usdt on base\"\n→ Missing: recipient\n→ Ask: \"Who would you like to send it to? (PayID name, Twitter handle, or wallet address)\"\n\n\nUser: \"send $20 to aldo\"\n→ Nothing missing (USD doesn't need chain)\n→ Execute transfer immediately\n\nImportant Notes:\n\nOnly supported tokens are: USDT, USDC, ETH, BNB, POL, USD_STABLECOIN\nToken symbols and chain symbols must match the EXACT enums (case-sensitive)\nUSD_STABLECOIN is ONLY used for USD/dollar requests\nContinue asking questions until all required fields are provided\nDo NOT make assumptions - always ask the user for missing information"
      },
      {
        "title": "Token Expiration",
        "body": "If any protected operation returns an unauthorized error, the access token has expired. Inform the user and ask them to login again."
      },
      {
        "title": "Rate Limiting",
        "body": "If OTP request fails due to rate limiting, inform user to wait before trying again."
      },
      {
        "title": "Network Errors",
        "body": "If scripts fail due to network issues, inform user and suggest trying again."
      },
      {
        "title": "Invalid Input",
        "body": "Validate email format before sending requests. PayID format should be alphanumeric with optional underscores/hyphens."
      },
      {
        "title": "Security Notes",
        "body": "User Authentication and Control:\n\nAll operations require explicit user authentication - users must complete passwordless OTP verification before any protected operations\nTransfers are NEVER autonomous - every transfer requires the user to explicitly provide: token, chain, recipient, and amount\nThe skill cannot initiate transfers on its own; it only executes transfers when the user explicitly requests them with all required parameters\nUsers maintain full control over their wallet operations at all times\n\nToken Storage:\n\nAccess tokens are stored locally in ~/.openclaw/payid/auth.json with restricted file permissions (chmod 600)\nThis is a standard OAuth/JWT token pattern - tokens are stored locally for session persistence\nUsers can clear their token at any time by deleting the auth file or using the skill's logout functionality\nTokens expire and require re-authentication when invalid\n\nData Security:\n\nNever log or display access tokens to the user\nOTP codes are only entered once and never stored\nAll API requests use HTTPS encryption (enforced in scripts)\nAll JSON payloads are constructed using jq to prevent injection attacks\nThe skill communicates only with the official Reva API (https://api.revapay.ai)\n\nExternal API:\n\nThis skill integrates with Reva (https://revapay.ai), a legitimate cryptocurrency wallet service\nThe API endpoint (https://api.revapay.ai) is the official production API for Reva\nAll transfers are executed through user-authenticated API calls, not autonomous actions"
      },
      {
        "title": "Script Reference",
        "body": "All scripts are located in {baseDir}/scripts/:\n\nsend-otp.sh <email> - Send OTP to email\nverify-otp.sh <email> <otp> - Verify OTP and get access token\nclaim-payid.sh <payid> - Claim a PayID name\nget-balance.sh - Get wallet balance with all tokens across chains\nget-user-info.sh - Get current logged user information\nsend-funds.sh <tokenSymbol> <chainSymbol> <recipient> <amount> - Transfer funds to a recipient\ncheck-auth.sh - Check if user is authenticated"
      },
      {
        "title": "First Time User",
        "body": "User asks to login or register\nUser provides email\nSystem sends OTP\nUser provides OTP code\nUser is authenticated\nUser can now claim PayID or check balance"
      },
      {
        "title": "Claim PayID",
        "body": "User asks to claim a PayID\nCheck authentication status\nUser provides desired payid name\nSystem attempts to claim\nSuccess or ask for alternative if taken"
      },
      {
        "title": "Check Balance",
        "body": "User asks for balance\nCheck authentication status\nDisplay current balance"
      },
      {
        "title": "Get Account Info",
        "body": "User asks about their PayID, wallet address, referral code, etc.\nCheck authentication status\nFetch user info from /api/users/me\nDisplay the requested information"
      },
      {
        "title": "Deposit Funds",
        "body": "User asks how to deposit\nCheck authentication status\nGet wallet address from user info\nProvide wallet address for deposits"
      },
      {
        "title": "Send Funds (Simple)",
        "body": "User: \"send 0.01 usdt on bnb to aldo\"\nForward message to Reva AI\nReva AI processes and sends funds\nDisplay transaction confirmation with links"
      },
      {
        "title": "Send Funds (Multi-Step)",
        "body": "User: \"send some funds to aldo\"\nForward to Reva AI\nReva AI: \"which network?\"\nUser: \"bnb\"\nForward to Reva AI (same room)\nReva AI: \"which token?\"\nUser: \"0.01 usdt\"\nForward to Reva AI (same room)\nTransaction complete with confirmation"
      },
      {
        "title": "Login (Send OTP)",
        "body": "Method: POST\nPath: /api/openclaw/login\nBody: {\"email\": \"user@example.com\"}\nResponse: {\"success\": true, \"message\": \"OTP sent to your email\"}"
      },
      {
        "title": "Verify OTP",
        "body": "Method: POST\nPath: /api/openclaw/verify\nBody: {\"email\": \"user@example.com\", \"otp\": \"123456\"}\nResponse: {\"success\": true, \"token\": \"jwt_token\", \"user\": {...}}"
      },
      {
        "title": "Get Balance",
        "body": "Method: GET\nPath: /api/wallet?isForceUpdateWallet=true\nHeader: openclaw-token: <token>\nResponse: {\"success\": true, \"tokens\": [{\"name\": \"...\", \"symbol\": \"...\", \"balance\": ..., \"chain\": \"...\"}]}"
      },
      {
        "title": "Claim PayID",
        "body": "Method: POST\nPath: /api/payid/register\nHeader: openclaw-token: <token>\nBody: {\"payIdName\": \"payid_name\"}\nResponse: {\"success\": true, \"data\": {...}}"
      },
      {
        "title": "Get User Info",
        "body": "Method: GET\nPath: /api/users/me\nHeader: openclaw-token: <token>\nResponse: {\"user\": {\"id\": \"...\", \"email\": \"...\", \"payId\": \"...\", \"walletAddress\": \"...\", \"referralCode\": \"...\", \"cashbackPoints\": ..., \"twitter\": \"...\", ...}}"
      },
      {
        "title": "Transfer Funds",
        "body": "Method: POST\nPath: /api/message/transfer-funds\nHeader: openclaw-token: <token>\nBody:\n\n{\n  \"tokenSymbol\": \"USDT\" | \"USDC\" | \"ETH\" | \"BNB\" | \"POL\" | \"USD_STABLECOIN\",\n  \"chainSymbol\": \"ETH\" | \"POL\" | \"OP\" | \"BNB\" | \"BASE\" | null,\n  \"recipientPayid\": string | null,\n  \"recipientTwitterUsername\": string | null,\n  \"recipientWalletAddress\": string | null,\n  \"amount\": number\n}\n\nSuccess Response (200): {\"success\": true, \"data\": {\"message\": \"...\", \"recipientPayId\": \"...\", \"usdAmountToSend\": ...}, \"meta\": {\"message\": \"Transaction completed successfully\"}}\nError Response (400/500): {\"success\": false, \"error\": {\"code\": \"...\", \"message\": \"...\", \"details\": [...]}}"
      },
      {
        "title": "Tips",
        "body": "Always check authentication before performing protected operations\nDisplay all token balances with their respective chains for clarity\nFor deposits, simply provide the user's wallet address from /api/users/me\nCRITICAL for sending funds: Parse user's message to extract token, chain, recipient, and amount - ask follow-up questions for missing information\nUSD/dollar requests use USD_STABLECOIN token with null chain - do NOT ask for network\nOnly supported tokens are: USDT, USDC, ETH, BNB, POL, USD_STABLECOIN (case-sensitive)\nWhen user asks about account details (PayID, wallet, referral code, etc.), fetch from /api/users/me\nProvide clear error messages based on API responses\nGuide users through the authentication flow step-by-step\nSuggest alternative PayIDs if the desired one is taken\nDisplay transaction success messages from API responses"
      }
    ],
    "body": "Reva\n\nPasswordless authentication and wallet management for Reva users.\n\nReva provides a simple way to authenticate users, claim unique PayID names, and manage cryptocurrency balances. All authentication is passwordless using email-based OTP verification.\n\nAuthentication\n\nReva uses a passwordless authentication flow. Users receive a one-time password (OTP) via email, verify it, and receive an access token for subsequent operations.\n\nLogin/Register Flow\n\nThere is no difference between registration and login - both use the same passwordless flow:\n\nUser provides their email address\nSystem sends OTP to the email\nUser provides the OTP code\nSystem verifies OTP and returns access token\nAccess token is stored securely for future operations\n\nThe access token MUST be stored securely after verification and reused for all protected operations.\n\nAvailable Commands\n1. Login or Register\n\nTriggers: When user wants to login, register, sign in, sign up, authenticate, or access Reva\n\nProcess:\n\nAsk user for their email address if not provided\nCall the authentication script to send OTP: {baseDir}/scripts/send-otp.sh <email>\nInform user that OTP has been sent to their email\nAsk user to provide the OTP code they received\nCall the verification script: {baseDir}/scripts/verify-otp.sh <email> <otp>\nIf successful, inform user they are now authenticated\nThe access token is automatically stored for future use\n2. Claim PayID\n\nTriggers: When user wants to claim a PayID, get a PayID name, register a PayID, or set their PayID\n\nRequirements: User must be authenticated first (have valid access token)\n\nProcess:\n\nCheck if user is authenticated by calling: {baseDir}/scripts/check-auth.sh\nIf not authenticated, prompt user to login first\nAsk user for their desired PayID name if not provided\nCall the claim script: {baseDir}/scripts/claim-payid.sh <desired_payid>\nHandle response:\nSuccess: Inform user their PayID was claimed successfully\nAlready taken: Inform user the PayID is taken and ask for another choice\nInvalid format: Explain format requirements and ask again\nUnauthorized: Token expired, ask user to login again\n3. View Balance\n\nTriggers: When user wants to check balance, see wallet balance, view funds, or check how much money they have\n\nRequirements: User must be authenticated first (have valid access token)\n\nProcess:\n\nCheck if user is authenticated by calling: {baseDir}/scripts/check-auth.sh\nIf not authenticated, prompt user to login first\nCall the balance script: {baseDir}/scripts/get-balance.sh\nDisplay the balance to user in a friendly format showing each token with its amount, symbol, and chain (network)\nIf unauthorized error, token expired - ask user to login again\n\nDisplay Format Example:\n\nYour current balance:\n- 0.001016 ETH on Base\n- 1.97 USDC on Base\n- 1.21 USDT on BNB Smart Chain\n- 0.80 USDC on BNB Smart Chain\n- 0.00088 BNB on BNB Smart Chain\n\n4. Get User Information\n\nTriggers: When user asks about their account details, PayID, wallet address, email, referral code, cashback points, connected Twitter, avatar, or wants to deposit funds\n\nRequirements: User must be authenticated first (have valid access token)\n\nProcess:\n\nCheck if user is authenticated by calling: {baseDir}/scripts/check-auth.sh\nIf not authenticated, prompt user to login first\nCall the user info script: {baseDir}/scripts/get-user-info.sh\nExtract and display the relevant information the user asked for:\nPayID: Show from payId field\nWallet Address: Show from walletAddress field\nEmail: Show from email field\nReferral Code: Show from referralCode field\nCashback Points: Show from cashbackPoints field\nConnected Twitter: Show from twitter field\nAvatar: Show from avatarUrl field\nTransaction Limit: Show transactionLimit and transactionUsed\nIf user wants to deposit funds, provide their wallet address and instruct them to send funds to it\n\nImportant for Deposits: When user asks to deposit, simply provide their wallet address from the /api/users/me response and tell them to send funds to that address.\n\n5. Send Funds\n\nTriggers: When user wants to send money, send funds, send crypto, transfer tokens, or pay someone\n\nRequirements: User must be authenticated first (have valid access token)\n\nProcess:\n\nCRITICAL: You must parse the user's message and extract all required information to construct a proper transfer payload. Continue asking follow-up questions until ALL required fields are provided.\n\nCheck if user is authenticated by calling: {baseDir}/scripts/check-auth.sh\nIf not authenticated, prompt user to login first\nExtract the following information from user's message:\nToken Symbol: USDT, USDC, ETH, BNB, POL, or USD_STABLECOIN (these are the ONLY supported tokens)\nChain Symbol: ETH, POL, OP, BNB, or BASE (null for USD_STABLECOIN)\nRecipient: PayID name, Twitter username (starts with @), or wallet address\nAmount: Numeric value\nIf ANY field is missing, ask the user a follow-up question to get the missing information\nOnce ALL fields are collected, call: {baseDir}/scripts/send-funds.sh <tokenSymbol> <chainSymbol> <recipient> <amount>\nDisplay the success message or error to the user\n\nRecipient Type Detection:\n\nTwitter Username: If recipient starts with @, remove the @ and use as recipientTwitterUsername\nExample: @aminedd4 → recipientTwitterUsername: \"aminedd4\"\nWallet Address: If recipient starts with 0x, use as recipientWalletAddress\nExample: 0x1234... → recipientWalletAddress: \"0x1234...\"\nPayID Name: Otherwise, use as recipientPayid\nExample: aldo → recipientPayid: \"aldo\"\n\nUSD/Dollar Handling (IMPORTANT):\n\nWhen user mentions 'USD', 'dollar', 'dollars', or '$':\n\nSet tokenSymbol to USD_STABLECOIN (this is a special marker)\nSet chainSymbol to null - the system automatically selects the network with the highest USD stablecoin balance\nDO NOT ask for network when USD/dollar is mentioned - the system handles this automatically\n\nSupported Tokens (EXACT ENUMS):\n\nUSDT - Tether\nUSDC - USD Coin\nETH - Ethereum\nBNB - Binance Coin\nPOL - Polygon\nUSD_STABLECOIN - For USD/dollar requests (chainSymbol must be null)\n\nSupported Chains (EXACT ENUMS):\n\nETH - Ethereum\nPOL - Polygon\nOP - Optimism\nBNB - BNB Chain\nBASE - Base\nnull - Only when tokenSymbol is USD_STABLECOIN\n\nParsing Examples:\n\nExample 1: \"send 5 usdt on base to aldo\"\n\ntokenSymbol: USDT\nchainSymbol: BASE\nrecipientPayid: aldo\nrecipientTwitterUsername: null\nrecipientWalletAddress: null\namount: 5\n\n\nExample 2: \"transfer 0.3 BNB on bnb to @aminedd4\"\n\ntokenSymbol: BNB\nchainSymbol: BNB\nrecipientPayid: null\nrecipientTwitterUsername: aminedd4\nrecipientWalletAddress: null\namount: 0.3\n\n\nExample 3: \"send $10 to chris\"\n\ntokenSymbol: USD_STABLECOIN\nchainSymbol: null\nrecipientPayid: chris\nrecipientTwitterUsername: null\nrecipientWalletAddress: null\namount: 10\n\n\nExample 4: \"send 1 eth on ethereum to 0x742d35Cc6634C0532925a3b844Bc9e7595f0bEb\"\n\ntokenSymbol: ETH\nchainSymbol: ETH\nrecipientPayid: null\nrecipientTwitterUsername: null\nrecipientWalletAddress: 0x742d35Cc6634C0532925a3b844Bc9e7595f0bEb\namount: 1\n\n\nFollow-up Question Examples:\n\nUser: \"send some usdt to aldo\" → Missing: amount, chain → Ask: \"How much USDT would you like to send, and on which network? (ETH, POL, OP, BNB, or BASE)\"\n\nUser: \"send 5 usdt to aldo\" → Missing: chain → Ask: \"Which network would you like to use? (ETH, POL, OP, BNB, or BASE)\"\n\nUser: \"send 5 usdt on base\" → Missing: recipient → Ask: \"Who would you like to send it to? (PayID name, Twitter handle, or wallet address)\"\n\nUser: \"send $20 to aldo\" → Nothing missing (USD doesn't need chain) → Execute transfer immediately\n\nImportant Notes:\n\nOnly supported tokens are: USDT, USDC, ETH, BNB, POL, USD_STABLECOIN\nToken symbols and chain symbols must match the EXACT enums (case-sensitive)\nUSD_STABLECOIN is ONLY used for USD/dollar requests\nContinue asking questions until all required fields are provided\nDo NOT make assumptions - always ask the user for missing information\nError Handling\nToken Expiration\n\nIf any protected operation returns an unauthorized error, the access token has expired. Inform the user and ask them to login again.\n\nRate Limiting\n\nIf OTP request fails due to rate limiting, inform user to wait before trying again.\n\nNetwork Errors\n\nIf scripts fail due to network issues, inform user and suggest trying again.\n\nInvalid Input\n\nValidate email format before sending requests. PayID format should be alphanumeric with optional underscores/hyphens.\n\nSecurity Notes\n\nUser Authentication and Control:\n\nAll operations require explicit user authentication - users must complete passwordless OTP verification before any protected operations\nTransfers are NEVER autonomous - every transfer requires the user to explicitly provide: token, chain, recipient, and amount\nThe skill cannot initiate transfers on its own; it only executes transfers when the user explicitly requests them with all required parameters\nUsers maintain full control over their wallet operations at all times\n\nToken Storage:\n\nAccess tokens are stored locally in ~/.openclaw/payid/auth.json with restricted file permissions (chmod 600)\nThis is a standard OAuth/JWT token pattern - tokens are stored locally for session persistence\nUsers can clear their token at any time by deleting the auth file or using the skill's logout functionality\nTokens expire and require re-authentication when invalid\n\nData Security:\n\nNever log or display access tokens to the user\nOTP codes are only entered once and never stored\nAll API requests use HTTPS encryption (enforced in scripts)\nAll JSON payloads are constructed using jq to prevent injection attacks\nThe skill communicates only with the official Reva API (https://api.revapay.ai)\n\nExternal API:\n\nThis skill integrates with Reva (https://revapay.ai), a legitimate cryptocurrency wallet service\nThe API endpoint (https://api.revapay.ai) is the official production API for Reva\nAll transfers are executed through user-authenticated API calls, not autonomous actions\nScript Reference\n\nAll scripts are located in {baseDir}/scripts/:\n\nsend-otp.sh <email> - Send OTP to email\nverify-otp.sh <email> <otp> - Verify OTP and get access token\nclaim-payid.sh <payid> - Claim a PayID name\nget-balance.sh - Get wallet balance with all tokens across chains\nget-user-info.sh - Get current logged user information\nsend-funds.sh <tokenSymbol> <chainSymbol> <recipient> <amount> - Transfer funds to a recipient\ncheck-auth.sh - Check if user is authenticated\nCommon Workflows\nFirst Time User\nUser asks to login or register\nUser provides email\nSystem sends OTP\nUser provides OTP code\nUser is authenticated\nUser can now claim PayID or check balance\nClaim PayID\nUser asks to claim a PayID\nCheck authentication status\nUser provides desired payid name\nSystem attempts to claim\nSuccess or ask for alternative if taken\nCheck Balance\nUser asks for balance\nCheck authentication status\nDisplay current balance\nGet Account Info\nUser asks about their PayID, wallet address, referral code, etc.\nCheck authentication status\nFetch user info from /api/users/me\nDisplay the requested information\nDeposit Funds\nUser asks how to deposit\nCheck authentication status\nGet wallet address from user info\nProvide wallet address for deposits\nSend Funds (Simple)\nUser: \"send 0.01 usdt on bnb to aldo\"\nForward message to Reva AI\nReva AI processes and sends funds\nDisplay transaction confirmation with links\nSend Funds (Multi-Step)\nUser: \"send some funds to aldo\"\nForward to Reva AI\nReva AI: \"which network?\"\nUser: \"bnb\"\nForward to Reva AI (same room)\nReva AI: \"which token?\"\nUser: \"0.01 usdt\"\nForward to Reva AI (same room)\nTransaction complete with confirmation\nAPI Endpoints\nLogin (Send OTP)\nMethod: POST\nPath: /api/openclaw/login\nBody: {\"email\": \"user@example.com\"}\nResponse: {\"success\": true, \"message\": \"OTP sent to your email\"}\nVerify OTP\nMethod: POST\nPath: /api/openclaw/verify\nBody: {\"email\": \"user@example.com\", \"otp\": \"123456\"}\nResponse: {\"success\": true, \"token\": \"jwt_token\", \"user\": {...}}\nGet Balance\nMethod: GET\nPath: /api/wallet?isForceUpdateWallet=true\nHeader: openclaw-token: <token>\nResponse: {\"success\": true, \"tokens\": [{\"name\": \"...\", \"symbol\": \"...\", \"balance\": ..., \"chain\": \"...\"}]}\nClaim PayID\nMethod: POST\nPath: /api/payid/register\nHeader: openclaw-token: <token>\nBody: {\"payIdName\": \"payid_name\"}\nResponse: {\"success\": true, \"data\": {...}}\nGet User Info\nMethod: GET\nPath: /api/users/me\nHeader: openclaw-token: <token>\nResponse: {\"user\": {\"id\": \"...\", \"email\": \"...\", \"payId\": \"...\", \"walletAddress\": \"...\", \"referralCode\": \"...\", \"cashbackPoints\": ..., \"twitter\": \"...\", ...}}\nTransfer Funds\nMethod: POST\nPath: /api/message/transfer-funds\nHeader: openclaw-token: <token>\nBody:\n{\n  \"tokenSymbol\": \"USDT\" | \"USDC\" | \"ETH\" | \"BNB\" | \"POL\" | \"USD_STABLECOIN\",\n  \"chainSymbol\": \"ETH\" | \"POL\" | \"OP\" | \"BNB\" | \"BASE\" | null,\n  \"recipientPayid\": string | null,\n  \"recipientTwitterUsername\": string | null,\n  \"recipientWalletAddress\": string | null,\n  \"amount\": number\n}\n\nSuccess Response (200): {\"success\": true, \"data\": {\"message\": \"...\", \"recipientPayId\": \"...\", \"usdAmountToSend\": ...}, \"meta\": {\"message\": \"Transaction completed successfully\"}}\nError Response (400/500): {\"success\": false, \"error\": {\"code\": \"...\", \"message\": \"...\", \"details\": [...]}}\nTips\nAlways check authentication before performing protected operations\nDisplay all token balances with their respective chains for clarity\nFor deposits, simply provide the user's wallet address from /api/users/me\nCRITICAL for sending funds: Parse user's message to extract token, chain, recipient, and amount - ask follow-up questions for missing information\nUSD/dollar requests use USD_STABLECOIN token with null chain - do NOT ask for network\nOnly supported tokens are: USDT, USDC, ETH, BNB, POL, USD_STABLECOIN (case-sensitive)\nWhen user asks about account details (PayID, wallet, referral code, etc.), fetch from /api/users/me\nProvide clear error messages based on API responses\nGuide users through the authentication flow step-by-step\nSuggest alternative PayIDs if the desired one is taken\nDisplay transaction success messages from API responses"
  },
  "trust": {
    "sourceLabel": "tencent",
    "provenanceUrl": "https://clawhub.ai/pax47/reva",
    "publisherUrl": "https://clawhub.ai/pax47/reva",
    "owner": "pax47",
    "version": "0.1.5",
    "license": null,
    "verificationStatus": "Indexed source record"
  },
  "links": {
    "detailUrl": "https://openagent3.xyz/skills/reva",
    "downloadUrl": "https://openagent3.xyz/downloads/reva",
    "agentUrl": "https://openagent3.xyz/skills/reva/agent",
    "manifestUrl": "https://openagent3.xyz/skills/reva/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/reva/agent.md"
  }
}