Walletconnect Requester
by @bevanding
Secure WalletConnect integration for AI agents. Connect to user wallets as a DApp (Proposer) without ever handling private keys. Request transactions and sig...
clawhub install walletconnect-requesterπ About This Skill
name: walletconnect-requester description: Secure WalletConnect integration for AI agents. Connect to user wallets as a DApp (Proposer) without ever handling private keys. Request transactions and signatures - users approve everything in their wallet. Zero custody, maximum security. Use when you need to interact with user wallets securely via WalletConnect v2. metadata: openclaw: requires: env: - WC_PROJECT_ID (required): WalletConnect Cloud Project ID - WC_METADATA_NAME (optional): DApp name shown in wallet - WC_METADATA_URL (optional): DApp URL - WC_METADATA_ICONS (optional): DApp icon URLs (comma-separated) persistence: path: ~/.walletconnect-requester/ files: - sessions.json: Active WalletConnect sessions - audit.log: Transaction audit log (masked sensitive data) security_notes: - WalletConnect URI contains symmetric key (symKey) - treat as sensitive - Session tokens grant transaction request capability - protect accordingly - Audit logs contain masked addresses and tx hashes - review before sharing
WalletConnect Requester
> Zero custody. Maximum security. User always in control.
Why This Skill?
Unlike walletconnect-agent which holds private keys and auto-signs, this skill takes a fundamentally different approach:
| | walletconnect-agent | walletconnect-requester (this skill) | |---|---|---| | Private Keys | β οΈ Stored in agent | β Never touches agent | | Signing | β οΈ Auto-signs everything | β User approves each tx | | Security Model | Custodial (agent has full control) | Non-custodial (user has full control) | | If Agent is Compromised | β οΈ Funds can be stolen | β Funds are safe - no keys to steal |
This is the safest way for AI agents to interact with Web3.
What This Does
Security Guarantees
βββββββββββββββββββ βββββββββββββββββββ
β AI Agent β β User Wallet β
β (Requester) β βββ WalletConnect βββΊ β (Signer) β
β β Session β β
βββββββββββββββββββ βββββββββββββββββββ
β β
β 1. Request transaction β
β ββββββββββββββββββββββββββββββββββΊ β
β β
β 2. User reviews & approves β
β (in wallet UI) β
β β
β 3. Signed transaction β
β ββββββββββββββββββββββββββββββββββ β
β β
βΌ βΌ
NO PRIVATE KEYS PRIVATE KEYS
NO AUTO-SIGN USER APPROVES
USER IN CONTROL EVERYTHING
Installation
Step 1: Install Dependencies
This skill requires Node.js dependencies. Install them globally or locally:
# Install dependencies
npm install @walletconnect/sign-client @walletconnect/core qrcode
Step 2: Get WalletConnect Project ID
1. Go to WalletConnect Cloud 2. Create a new project 3. Copy your Project ID
Step 3: Set Environment Variable
export WC_PROJECT_ID="your_project_id_here"
Step 4: Run the Skill
node scripts/wc-requester.js connect
Quick Start
Step 1: Create a Session
export WC_PROJECT_ID="your_project_id"
node scripts/wc-requester.js connect
Output:
WalletConnect URI: wc:abc123...@2?relay-protocol=irn&symKey=xyzScan this QR code with your wallet:
[QR CODE]
Waiting for wallet to connect...
Step 2: Request a Transaction
node scripts/wc-requester.js request-tx \
--to 0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913 \
--data 0xa9059cbb... \
--value 0 \
--chain 8453
User sees in wallet:
Send 10 USDC to 0x1F3A...?
[Approve] [Reject]
Step 3: Request a Signature
node scripts/wc-requester.js request-sign \
--message "Sign this message to verify ownership" \
--chain 8453
Commands
connect - Create WalletConnect Session
node scripts/wc-requester.js connect [options]Options:
--chains Comma-separated chain IDs (default: 8453,1)
--methods Comma-separated methods (default: eth_sendTransaction,personal_sign)
--qr Generate QR code to file
--json Output as JSON
request-tx - Request Transaction
node scripts/wc-requester.js request-tx --to --data --value --chain
request-sign - Request Signature
node scripts/wc-requester.js request-sign --message --chain
or for typed data
node scripts/wc-requester.js request-sign --typed-data --chain
sessions - List Active Sessions
node scripts/wc-requester.js sessions
disconnect - End Session
node scripts/wc-requester.js disconnect --topic
Security Model
What Agent CAN Do
What Agent CANNOT Do
If Agent is Compromised
Local Data Persistence
This skill writes files to ~/.walletconnect-requester/:
| File | Purpose | Sensitivity |
|------|---------|-------------|
| sessions.json | Active WalletConnect sessions | β οΈ Contains session topics |
| audit.log | Transaction audit log | β οΈ Contains masked tx hashes |
Security recommendations:
audit.log before sharingsessions.json when no longer neededchmod 600 ~/.walletconnect-requester/*Sensitive Data Handling
| Data Type | How It's Handled |
|-----------|------------------|
| WalletConnect URI | Contains symKey - displayed once during connection, not logged |
| Session tokens | Stored locally in sessions.json, not transmitted externally |
| Transaction hashes | Logged in audit.log with masked addresses |
| Private keys | β Never handled by this skill |
Privacy Considerations
symKey) is printed to stdout for QR code generation0x8335... instead of full address)Configuration
Environment Variables
| Variable | Required | Description |
|----------|----------|-------------|
| WC_PROJECT_ID | Yes | WalletConnect Cloud Project ID |
| WC_METADATA_NAME | No | DApp name shown in wallet |
| WC_METADATA_URL | No | DApp URL |
| WC_METADATA_ICONS | No | DApp icon URL |
Namespaces Configuration
The skill requests minimal permissions by default:
{
"eip155": {
"chains": ["eip155:8453", "eip155:1"],
"methods": ["eth_sendTransaction", "personal_sign"],
"events": ["accountsChanged", "chainChanged"]
}
}
Example Workflows
Connect and Request Payment
# 1. Create session
node scripts/wc-requester.js connect --qr /tmp/qr.png
User scans QR with MetaMask
2. Request USDC transfer
node scripts/wc-requester.js request-tx \
--to 0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913 \
--data 0xa9059cbb0000... \
--chain 8453User sees: "Send 10 USDC?" β Approves in wallet
Returns: tx_hash
Verify Wallet Ownership
# 1. Connect
node scripts/wc-requester.js connect2. Request signature
node scripts/wc-requester.js request-sign \
--message "I own this wallet on March 9, 2026"User signs in wallet
Returns: signature
Comparison with Other Solutions
| Feature | This Skill | walletconnect-agent | MetaMask SDK | |---------|-----------|---------------------|--------------| | Private Key Storage | β Never | β οΈ In Agent | β Never | | Auto-sign | β Never | β Yes | β No | | User Approval Required | β Always | β No | β Always | | Multi-wallet Support | β Any WC wallet | β Any WC wallet | β MetaMask only | | Security Level | Highest | Medium | High | | Best For | User-controlled tx | Automated trading | MetaMask users |
Supported Wallets
Any wallet that supports WalletConnect v2:
Troubleshooting
"No active session"
Runconnect first to create a session."User rejected request"
User declined in their wallet. Ask if they want to retry."Session expired"
Sessions last 7 days by default. Reconnect to create a new session."Unsupported chain"
User's wallet doesn't support the requested chain. Ask them to switch networks.Audit Log
All requests are logged (without sensitive data):
~/.walletconnect-requester/audit.log{
"timestamp": "2026-03-09T02:00:00Z",
"action": "request_transaction",
"chain": 8453,
"to": "0x8335...",
"status": "approved",
"tx_hash": "0xabc123..."
}
When to Use This vs walletconnect-agent
| Use This Skill When | Use walletconnect-agent When | |--------------------|------------------------------| | User must approve every tx | Fully automated trading | | Maximum security required | You trust the agent completely | | One-time or occasional tx | 24/7 unattended operation | | User wants full control | User wants set-and-forget | | Agent runs in untrusted env | Agent runs in secure env |
When in doubt, use this skill. It's always safer.
License
MIT β Built with security as the #1 priority.
Maintainer: Web3 Investor Team Registry: https://clawhub.com/skills/walletconnect-requester
π‘ Examples
Step 1: Create a Session
export WC_PROJECT_ID="your_project_id"
node scripts/wc-requester.js connect
Output:
WalletConnect URI: wc:abc123...@2?relay-protocol=irn&symKey=xyzScan this QR code with your wallet:
[QR CODE]
Waiting for wallet to connect...
Step 2: Request a Transaction
node scripts/wc-requester.js request-tx \
--to 0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913 \
--data 0xa9059cbb... \
--value 0 \
--chain 8453
User sees in wallet:
Send 10 USDC to 0x1F3A...?
[Approve] [Reject]
Step 3: Request a Signature
node scripts/wc-requester.js request-sign \
--message "Sign this message to verify ownership" \
--chain 8453
βοΈ Configuration
Environment Variables
| Variable | Required | Description |
|----------|----------|-------------|
| WC_PROJECT_ID | Yes | WalletConnect Cloud Project ID |
| WC_METADATA_NAME | No | DApp name shown in wallet |
| WC_METADATA_URL | No | DApp URL |
| WC_METADATA_ICONS | No | DApp icon URL |
Namespaces Configuration
The skill requests minimal permissions by default:
{
"eip155": {
"chains": ["eip155:8453", "eip155:1"],
"methods": ["eth_sendTransaction", "personal_sign"],
"events": ["accountsChanged", "chainChanged"]
}
}
π Tips & Best Practices
"No active session"
Runconnect first to create a session.