Install
openclaw skills install clawwalletManage multi-chain wallets, perform DeFi operations, multi-sig transactions, ENS registration, policy enforcement, agent identity, and real-time wallet event...
openclaw skills install clawwallet/**
import { randomUUID } from 'crypto';
// ============================================================ // Configuration // ============================================================
const DEFAULT_CONFIG = { walletServiceUrl: process.env.CLAW_WALLET_URL || 'http://localhost:3000', apiKey: process.env.CLAW_WALLET_API_KEY, defaultChain: process.env.CLAW_WALLET_CHAIN || 'base-sepolia', autoRegister: true, enablePayments: true, };
// Supported chains (from CLAWwallet docs) const SUPPORTED_CHAINS = { EVM: ['ethereum', 'base', 'base-sepolia', 'arbitrum', 'optimism', 'polygon', 'avalanche', 'bsc', 'sepolia'], NON_EVM: ['solana', 'aptos', 'sui', 'starknet', 'polygon-zkevm', 'zksync'], };
// ============================================================ // Skill State // ============================================================
class MultiWalletSkill { constructor(config = {}) { this.config = { ...DEFAULT_CONFIG, ...config }; this.wallets = new Map(); // agentName -> wallet info this.initialized = false; }
/**
// Store context for later use
this.context = context;
// Test connection to wallet service
try {
const health = await this._request('/health');
console.log(`✅ Wallet service healthy: ${health.status}`);
} catch (error) {
console.warn('⚠️ Wallet service not reachable:', error.message);
}
this.initialized = true;
return {
name: 'CLAWwallet',
version: '2.0.0',
description: 'Enterprise wallet infrastructure for AI agents - multi-chain, DeFi, policy guardrails',
documentation: 'https://clawwallet.pages.dev',
capabilities: [
// Wallet Operations
'create_wallet',
'import_wallet',
'get_balance',
'get_token_balances',
'send_payment',
'send_token',
'sweep_wallet',
'estimate_gas',
'get_transaction_receipt',
// Multi-Chain
'get_supported_chains',
'switch_chain',
// DeFi - Swaps
'swap_tokens',
'get_swap_quote',
'get_best_quote',
// DeFi - Staking
'stake_eth',
'unstake_eth',
'get_staking_positions',
'stake_lido',
'unstake_lido',
// DeFi - Lending
'supply_to_lending',
'borrow_from_lending',
'repay_lending',
'withdraw_from_lending',
'get_lending_positions',
// DeFi - Cross-chain
'cross_chain_transfer',
'send_via_layerzero',
'send_via_axelar',
// DeFi - Price Feeds
'get_price',
'token_to_usd',
'usd_to_token',
// Multi-Sig
'create_multisig',
'submit_multisig_transaction',
'confirm_multisig_transaction',
'execute_multisig_transaction',
'get_multisig_transactions',
// Policy Engine
'set_policy',
'get_policy',
'apply_policy_preset',
'check_approval_status',
// ENS
'check_ens_availability',
'get_ens_price',
'register_ens',
// Agent Registry
'register_agent',
'get_agent',
'list_agents',
'search_agents',
'pay_agent',
'get_agent_balance',
// Services Marketplace
'get_services',
'add_service',
'get_economy_stats',
// Identity
'create_identity',
'link_social_account',
// Webhooks
'register_webhook',
'list_webhooks',
'delete_webhook',
// Transaction History
'get_transaction_history',
'get_wallet_activity',
// Utilities
'get_doctor_diagnostics',
],
supportedChains: SUPPORTED_CHAINS,
};
}
// ============================================================ // Wallet Operations // ============================================================
/**
const wallet = response.wallet;
// Store locally
this.wallets.set(agentName, {
address: wallet.address,
chain: wallet.chain,
id: wallet.id,
});
return {
success: true,
agentName,
address: wallet.address,
chain: wallet.chain,
message: `Wallet created for ${agentName} on ${chain}`,
};
}
/**
const wallet = response.wallet;
this.wallets.set(agentName, {
address: wallet.address,
chain: wallet.chain,
id: wallet.id,
});
return {
success: true,
agentName,
address: wallet.address,
chain: wallet.chain,
message: `Wallet imported for ${agentName}`,
};
}
/**
/wallet/${address}/balance?chain=${chain});return {
address,
chain: response.balance.chain,
eth: response.balance.eth,
rpc: response.balance.rpc,
};
}
/**
/wallet/${address}/tokens?chain=${chain});
return response.tokens || [];
}/**
/wallet/${fromAddress}/send, {
method: 'POST',
body: {
to: toAddress,
value: amount,
chain,
},
});return {
success: true,
txHash: response.transaction?.hash,
from: fromAddress,
to: toAddress,
amount,
chain,
message: `Sent ${amount} ETH from ${fromAddress.slice(0, 8)}... to ${toAddress.slice(0, 8)}...`,
};
}
/**
/wallet/${fromAddress}/send-token, {
method: 'POST',
body: {
to: toAddress,
token: tokenAddress,
amount,
chain,
},
});return {
success: true,
txHash: response.transaction?.hash,
from: fromAddress,
to: toAddress,
token: tokenAddress,
amount,
chain,
};
}
/**
/wallet/${fromAddress}/sweep, {
method: 'POST',
body: { to: toAddress, chain },
});return {
success: true,
txHash: response.transaction?.hash,
from: fromAddress,
to: toAddress,
amount: response.swept,
chain,
};
}
/**
return response.estimate;
}
/**
/wallet/tx/${txHash}?chain=${chain});
return response.receipt;
}/**
// Try to get from service
const response = await this._request('/wallet');
const wallets = response.wallets || [];
for (const w of wallets) {
if (w.agentName === agentName) {
return {
address: w.address,
chain: w.chain,
id: w.id,
};
}
}
return null;
}
// ============================================================ // Multi-Chain Operations // ============================================================
/**
/**
/chains/${chain});
return response.config;
}// ============================================================ // DeFi - Swaps // ============================================================
/**
return response.quote;
}
/**
return response.quote;
}
/**
return {
success: true,
txHash: response.transaction?.hash,
fromToken,
toToken,
amount,
chain,
};
}
// ============================================================ // DeFi - Staking // ============================================================
/**
return {
success: true,
txHash: response.transaction?.hash,
stakedAmount: response.staked,
chain,
};
}
/**
return {
success: true,
txHash: response.transaction?.hash,
chain,
};
}
/**
/defi/stake/positions/${walletAddress}?chain=${chain});
return response.positions || [];
}/**
/**
// ============================================================ // DeFi - Lending // ============================================================
/**
return {
success: true,
txHash: response.transaction?.hash,
supplied: amount,
chain,
};
}
/**
return {
success: true,
txHash: response.transaction?.hash,
borrowed: amount,
chain,
};
}
/**
return {
success: true,
txHash: response.transaction?.hash,
repaid: amount,
chain,
};
}
/**
return {
success: true,
txHash: response.transaction?.hash,
withdrawn: amount,
chain,
};
}
/**
/defi/lending/positions/${walletAddress}?chain=${chain});
return response.positions || [];
}// ============================================================ // DeFi - Cross-Chain // ============================================================
/**
return {
success: true,
txHash: response.transaction?.hash,
sourceChain,
destChain,
protocol,
};
}
/**
/**
// ============================================================ // DeFi - Price Feeds // ============================================================
/**
/defi/price/${token}?chain=${chain});
return response.price;
}/**
return response.usdValue;
}
/**
return response.tokenAmount;
}
// ============================================================ // Multi-Sig Wallet // ============================================================
/**
return {
success: true,
address: response.wallet.address,
owners,
threshold,
chain,
};
}
/**
/multisig/${multisigAddress}/submit, {
method: 'POST',
body: { to, value, description, chain },
});return {
success: true,
txId: response.transaction.id,
description,
};
}
/**
/multisig/tx/${txId}/confirm, {
method: 'POST',
body: { signerAddress, signature },
});return {
success: true,
confirmations: response.confirmations,
};
}
/**
/multisig/tx/${txId}/execute, {
method: 'POST',
body: { executorAddress },
});return {
success: true,
txHash: response.transaction?.hash,
};
}
/**
/multisig/${multisigAddress}/transactions?status=${status});
return response.transactions || [];
}// ============================================================ // Policy Engine (Guardrails) // ============================================================
/**
return {
success: true,
policy: response.policy,
};
}
/**
/policy/${walletAddress});
return response.policy;
}/**
return {
success: true,
policy: response.policy,
};
}
/**
/policy/approval/${approvalId});
return response.status;
}// ============================================================ // ENS Operations // ============================================================
/**
/ens/check/${name});
return {
available: response.available,
name: response.name,
};
}/**
return {
price: response.price,
duration: durationYears,
};
}
/**
return {
success: true,
txHash: response.transaction?.hash,
name: `${name}.eth`,
expires: response.expires,
};
}
// ============================================================ // Agent Registry Operations // ============================================================
/**
return {
success: true,
agent: response.agent,
message: `Agent '${agentName}' registered as '${agentType}'`,
};
}
/**
/agents/${agentName});
return response.agent;
} catch (error) {
return null;
}
}/**
/agents${params ? '?' + params : ''});
return response.agents || [];
}/**
/agents/search/${query});
return response.agents || [];
}// ============================================================ // Agent-to-Agent Payments // ============================================================
/**
return {
success: true,
payment: response.payment,
instructions: response.instructions,
message: `Payment of ${amount} ETH queued for ${toAgent}`,
};
}
/**
/agents/${agentName}/balance);
return response.balance;
}// ============================================================ // Service Marketplace // ============================================================
/**
/**
/agents/${agentName}/services, {
method: 'POST',
body: service,
});return {
success: true,
service: response.service,
};
}
// ============================================================ // Economy Stats // ============================================================
/**
/**
/agents/popular?limit=${limit});
return response.agents || [];
}// ============================================================ // Identity (ERC-8004) // ============================================================
/**
return {
success: true,
identity: response.identity,
};
}
// ============================================================ // Social Identity // ============================================================
/**
return {
success: true,
link: response.link,
};
}
// ============================================================ // Webhooks // ============================================================
/**
return {
success: true,
webhook: response.webhook,
};
}
/**
/**
/webhooks/${webhookId}, {
method: 'DELETE',
});return {
success: true,
};
}
// ============================================================ // Transaction History // ============================================================
/**
/explorer/transactions/${address}?limit=${limit});
return response.transactions || [];
}/**
/agents/${agentId}/activity?limit=${limit});
return response.activities || [];
}// ============================================================ // Doctor / Diagnostics // ============================================================
/**
/**
return {
fixed: response.fixed,
remaining: response.remaining,
};
}
// ============================================================ // Helper Methods // ============================================================
/**
${this.config.walletServiceUrl}${path};
const headers = {
'Content-Type': 'application/json',
};if (this.config.apiKey) {
headers['X-API-Key'] = this.config.apiKey;
}
const response = await fetch(url, {
...options,
headers: { ...headers, ...options.headers },
});
if (!response.ok) {
const error = await response.json().catch(() => ({ error: 'Request failed' }));
throw new Error(error.error || `HTTP ${response.status}`);
}
return await response.json();
}
/**
// ============================================================ // Factory Function for Easy Integration // ============================================================
/**
/**
// ============================================================ // Agent Framework Adapters // ============================================================
/**
async install(agent) { const skill = new MultiWalletSkill(); await skill.initialize({ framework: 'openclaw', agent });
// Register skill methods with agent - Enhanced v2.0
// Wallet Operations
agent.createWallet = (name, chain) => skill.createWallet(name, chain);
agent.importWallet = (pk, name, chain) => skill.importWallet(pk, name, chain);
agent.getBalance = (addr, chain) => skill.getBalance(addr, chain);
agent.getTokenBalances = (addr, chain) => skill.getTokenBalances(addr, chain);
agent.sendPayment = (from, to, amount, chain) => skill.sendPayment(from, to, amount, chain);
agent.sendToken = (from, to, token, amount, chain) => skill.sendToken(from, to, token, amount, chain);
agent.sweepWallet = (from, to, chain) => skill.sweepWallet(from, to, chain);
agent.estimateGas = (from, to, value, chain) => skill.estimateGas(from, to, value, chain);
agent.getTransactionReceipt = (hash, chain) => skill.getTransactionReceipt(hash, chain);
// Multi-Chain
agent.getSupportedChains = () => skill.getSupportedChains();
agent.getChainConfig = (chain) => skill.getChainConfig(chain);
// DeFi - Swaps
agent.getSwapQuote = (from, to, amount, chain) => skill.getSwapQuote(from, to, amount, chain);
agent.getBestQuote = (from, to, amount, chain) => skill.getBestQuote(from, to, amount, chain);
agent.swapTokens = (wallet, from, to, amount, chain) => skill.swapTokens(wallet, from, to, amount, chain);
// DeFi - Staking
agent.stakeEth = (wallet, amount, chain) => skill.stakeEth(wallet, amount, chain);
agent.unstakeEth = (wallet, amount, chain) => skill.unstakeEth(wallet, amount, chain);
agent.getStakingPositions = (wallet, chain) => skill.getStakingPositions(wallet, chain);
// DeFi - Lending
agent.supplyToLending = (wallet, asset, amount, chain) => skill.supplyToLending(wallet, asset, amount, chain);
agent.borrowFromLending = (wallet, asset, amount, chain) => skill.borrowFromLending(wallet, asset, amount, chain);
agent.repayLending = (wallet, asset, amount, chain) => skill.repayLending(wallet, asset, amount, chain);
agent.withdrawFromLending = (wallet, asset, amount, chain) => skill.withdrawFromLending(wallet, asset, amount, chain);
agent.getLendingPositions = (wallet, chain) => skill.getLendingPositions(wallet, chain);
// DeFi - Cross-chain
agent.crossChainTransfer = (wallet, to, amount, src, dest, protocol) => skill.crossChainTransfer(wallet, to, amount, src, dest, protocol);
agent.sendViaLayerZero = (wallet, to, amount, src, dest) => skill.sendViaLayerZero(wallet, to, amount, src, dest);
agent.sendViaAxelar = (wallet, to, amount, src, dest) => skill.sendViaAxelar(wallet, to, amount, src, dest);
// DeFi - Price
agent.getPrice = (token, chain) => skill.getPrice(token, chain);
agent.tokenToUsd = (token, amount, chain) => skill.tokenToUsd(token, amount, chain);
agent.usdToToken = (token, usd, chain) => skill.usdToToken(token, usd, chain);
// Multi-Sig
agent.createMultisig = (owners, threshold, chain) => skill.createMultisig(owners, threshold, chain);
agent.submitMultisigTransaction = (msig, to, value, desc, chain) => skill.submitMultisigTransaction(msig, to, value, desc, chain);
agent.confirmMultisigTransaction = (txId, signer, sig) => skill.confirmMultisigTransaction(txId, signer, sig);
agent.executeMultisigTransaction = (txId, executor) => skill.executeMultisigTransaction(txId, executor);
agent.getMultisigTransactions = (msig, status) => skill.getMultisigTransactions(msig, status);
// Policy
agent.setPolicy = (wallet, policy) => skill.setPolicy(wallet, policy);
agent.getPolicy = (wallet) => skill.getPolicy(wallet);
agent.applyPolicyPreset = (wallet, preset) => skill.applyPolicyPreset(wallet, preset);
agent.checkApprovalStatus = (id) => skill.checkApprovalStatus(id);
// ENS
agent.checkEnsAvailability = (name) => skill.checkEnsAvailability(name);
agent.getEnsPrice = (name, years) => skill.getEnsPrice(name, years);
agent.registerEns = (wallet, name, years) => skill.registerEns(wallet, name, years);
// Agent Registry
agent.registerAgent = (name, type, wallet) => skill.registerAgent(name, type, wallet);
agent.getAgent = (name) => skill.getAgent(name);
agent.listAgents = (filters) => skill.listAgents(filters);
agent.searchAgents = (query) => skill.searchAgents(query);
agent.payAgent = (to, amount, desc) => skill.payAgent(to, amount, desc);
agent.getAgentBalance = (name) => skill.getAgentBalance(name);
// Services & Economy
agent.getServices = () => skill.getServices();
agent.addService = (name, service) => skill.addService(name, service);
agent.getEconomyStats = () => skill.getEconomyStats();
agent.getPopularAgents = (limit) => skill.getPopularAgents(limit);
// Identity
agent.createIdentity = (wallet, name, desc, type) => skill.createIdentity(wallet, name, desc, type);
agent.linkSocialAccount = (id, platform, username) => skill.linkSocialAccount(id, platform, username);
// Webhooks
agent.registerWebhook = (url, events, secret) => skill.registerWebhook(url, events, secret);
agent.listWebhooks = () => skill.listWebhooks();
agent.deleteWebhook = (id) => skill.deleteWebhook(id);
// History & Diagnostics
agent.getTransactionHistory = (addr, limit) => skill.getTransactionHistory(addr, limit);
agent.getWalletActivity = (id, limit) => skill.getWalletActivity(id, limit);
agent.getDoctorDiagnostics = () => skill.getDoctorDiagnostics();
agent.fixIssues = (issues) => skill.fixIssues(issues);
console.log('✅ CLAWwallet v2.0 skill installed on agent');
return skill;
}, };
/**