Install
openclaw skills install revaComplete Reva wallet management - passwordless authentication, PayID name claiming, multi-chain crypto transfers to PayIDs or wallet addresses, balance track...
openclaw skills install revaPasswordless authentication and wallet management for Reva users.
Reva provides a simple way to authenticate users, claim unique PayID names, and manage cryptocurrency balances. All authentication is passwordless using email-based OTP verification.
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.
There is no difference between registration and login - both use the same passwordless flow:
The access token MUST be stored securely after verification and reused for all protected operations.
Triggers: When user wants to login, register, sign in, sign up, authenticate, or access Reva
Process:
{baseDir}/scripts/send-otp.sh <email>{baseDir}/scripts/verify-otp.sh <email> <otp>Triggers: When user wants to claim a PayID, get a PayID name, register a PayID, or set their PayID
Requirements: User must be authenticated first (have valid access token)
Process:
{baseDir}/scripts/check-auth.sh{baseDir}/scripts/claim-payid.sh <desired_payid>Triggers: When user wants to check balance, see wallet balance, view funds, or check how much money they have
Requirements: User must be authenticated first (have valid access token)
Process:
{baseDir}/scripts/check-auth.sh{baseDir}/scripts/get-balance.shDisplay Format Example:
Your current balance:
- 0.001016 ETH on Base
- 1.97 USDC on Base
- 1.21 USDT on BNB Smart Chain
- 0.80 USDC on BNB Smart Chain
- 0.00088 BNB on BNB Smart Chain
Triggers: When user asks about their account details, PayID, wallet address, email, referral code, cashback points, connected Twitter, avatar, or wants to deposit funds
Requirements: User must be authenticated first (have valid access token)
Process:
{baseDir}/scripts/check-auth.sh{baseDir}/scripts/get-user-info.shpayId fieldwalletAddress fieldemail fieldreferralCode fieldcashbackPoints fieldtwitter fieldavatarUrl fieldtransactionLimit and transactionUsedImportant 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.
Triggers: When user wants to send money, send funds, send crypto, transfer tokens, or pay someone
Requirements: User must be authenticated first (have valid access token)
Process:
CRITICAL: 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.
{baseDir}/scripts/check-auth.sh{baseDir}/scripts/send-funds.sh <tokenSymbol> <chainSymbol> <recipient> <amount>Recipient Type Detection:
@, remove the @ and use as recipientTwitterUsername
@aminedd4 → recipientTwitterUsername: "aminedd4"0x, use as recipientWalletAddress
0x1234... → recipientWalletAddress: "0x1234..."recipientPayid
aldo → recipientPayid: "aldo"USD/Dollar Handling (IMPORTANT):
When user mentions 'USD', 'dollar', 'dollars', or '$':
tokenSymbol to USD_STABLECOIN (this is a special marker)chainSymbol to null - the system automatically selects the network with the highest USD stablecoin balanceSupported Tokens (EXACT ENUMS):
USDT - TetherUSDC - USD CoinETH - EthereumBNB - Binance CoinPOL - PolygonUSD_STABLECOIN - For USD/dollar requests (chainSymbol must be null)Supported Chains (EXACT ENUMS):
ETH - EthereumPOL - PolygonOP - OptimismBNB - BNB ChainBASE - Basenull - Only when tokenSymbol is USD_STABLECOINParsing Examples:
Example 1: "send 5 usdt on base to aldo"
tokenSymbol: USDT
chainSymbol: BASE
recipientPayid: aldo
recipientTwitterUsername: null
recipientWalletAddress: null
amount: 5
Example 2: "transfer 0.3 BNB on bnb to @aminedd4"
tokenSymbol: BNB
chainSymbol: BNB
recipientPayid: null
recipientTwitterUsername: aminedd4
recipientWalletAddress: null
amount: 0.3
Example 3: "send $10 to chris"
tokenSymbol: USD_STABLECOIN
chainSymbol: null
recipientPayid: chris
recipientTwitterUsername: null
recipientWalletAddress: null
amount: 10
Example 4: "send 1 eth on ethereum to 0x742d35Cc6634C0532925a3b844Bc9e7595f0bEb"
tokenSymbol: ETH
chainSymbol: ETH
recipientPayid: null
recipientTwitterUsername: null
recipientWalletAddress: 0x742d35Cc6634C0532925a3b844Bc9e7595f0bEb
amount: 1
Follow-up Question Examples:
User: "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)"
User: "send 5 usdt to aldo" → Missing: chain → Ask: "Which network would you like to use? (ETH, POL, OP, BNB, or BASE)"
User: "send 5 usdt on base" → Missing: recipient → Ask: "Who would you like to send it to? (PayID name, Twitter handle, or wallet address)"
User: "send $20 to aldo" → Nothing missing (USD doesn't need chain) → Execute transfer immediately
Important Notes:
If any protected operation returns an unauthorized error, the access token has expired. Inform the user and ask them to login again.
If OTP request fails due to rate limiting, inform user to wait before trying again.
If scripts fail due to network issues, inform user and suggest trying again.
Validate email format before sending requests. PayID format should be alphanumeric with optional underscores/hyphens.
User Authentication and Control:
Token Storage:
~/.openclaw/payid/auth.json with restricted file permissions (chmod 600)Data Security:
jq to prevent injection attacksExternal API:
All scripts are located in {baseDir}/scripts/:
send-otp.sh <email> - Send OTP to emailverify-otp.sh <email> <otp> - Verify OTP and get access tokenclaim-payid.sh <payid> - Claim a PayID nameget-balance.sh - Get wallet balance with all tokens across chainsget-user-info.sh - Get current logged user informationsend-funds.sh <tokenSymbol> <chainSymbol> <recipient> <amount> - Transfer funds to a recipientcheck-auth.sh - Check if user is authenticated/api/users/me/api/openclaw/login{"email": "user@example.com"}{"success": true, "message": "OTP sent to your email"}/api/openclaw/verify{"email": "user@example.com", "otp": "123456"}{"success": true, "token": "jwt_token", "user": {...}}/api/wallet?isForceUpdateWallet=trueopenclaw-token: <token>{"success": true, "tokens": [{"name": "...", "symbol": "...", "balance": ..., "chain": "..."}]}/api/payid/registeropenclaw-token: <token>{"payIdName": "payid_name"}{"success": true, "data": {...}}/api/users/meopenclaw-token: <token>{"user": {"id": "...", "email": "...", "payId": "...", "walletAddress": "...", "referralCode": "...", "cashbackPoints": ..., "twitter": "...", ...}}/api/message/transfer-fundsopenclaw-token: <token>{
"tokenSymbol": "USDT" | "USDC" | "ETH" | "BNB" | "POL" | "USD_STABLECOIN",
"chainSymbol": "ETH" | "POL" | "OP" | "BNB" | "BASE" | null,
"recipientPayid": string | null,
"recipientTwitterUsername": string | null,
"recipientWalletAddress": string | null,
"amount": number
}
{"success": true, "data": {"message": "...", "recipientPayId": "...", "usdAmountToSend": ...}, "meta": {"message": "Transaction completed successfully"}}{"success": false, "error": {"code": "...", "message": "...", "details": [...]}}/api/users/meUSD_STABLECOIN token with null chain - do NOT ask for network/api/users/me