waiaas
WAIaaS is a self-hosted wallet daemon for AI agents, enabling secure on-chain transactions across Solana and EVM chains with policy enforcement, multi-tier authentication, and extensive DeFi/NFT integrations.
Wallet & Asset Management
Get wallet addresses, balances, assets (native + tokens), and metadata
List registered tokens, resolve CAIP-19 asset identifiers, and manage multiple wallets/sessions
Transactions
Send native tokens (SOL/ETH), ERC-20/SPL tokens, and NFTs (ERC-721, ERC-1155, Metaplex)
Approve token spenders, call whitelisted smart contracts, and batch instructions (Solana)
Simulate transactions before execution (policy tier, fees, balance changes)
Transaction History & Monitoring
List/retrieve outgoing and incoming transactions with filters and period-based summaries
Security & Policies
View and enforce spending limits, token allowlists, contract whitelists, and rate limits
4-tier policy engine (INSTANT/NOTIFY/DELAY/APPROVAL) with 3-tier authentication (masterAuth/ownerAuth/sessionAuth)
Signing & Advanced Crypto
Sign messages (personal_sign, EIP-712), raw transactions without broadcasting, and HTTP requests (ERC-8128)
Build and sign ERC-4337 UserOperations for Smart Accounts
WalletConnect
Initiate, check status, and disconnect WalletConnect sessions
DeFi Integrations
Hyperliquid: Perpetual/spot positions, open orders, markets, funding rates, account state, trade history, spot balances, sub-accounts
Polymarket: Prediction market positions, CLOB orders, markets/events, USDC.e balance, PnL, and API key setup
Lending: DeFi lending positions, health factors (safe/warning/danger/critical)
NFTs
List NFTs and retrieve detailed metadata
x402 Payments
Automatically handle HTTP 402 payments when fetching URLs (EIP-3009)
Off-chain & Credentials
List off-chain action history (signed data across Polymarket, Hyperliquid, etc.)
List credential metadata (names, types, expiry)
Agent Identity (ERC-8004)
Get on-chain agent identity, reputation score, and validation status
Developer Utilities
Encode EVM calldata, get RPC proxy URLs (compatible with Forge, Hardhat, ethers.js, viem)
Admin UI for wallet management, session issuance, policy configuration, and security controls
Uses Chainlink as a price oracle to evaluate transaction values in USD, enabling real-time policy enforcement for AI agents.
Functions as a notification channel to deliver real-time transaction alerts and delivery logs to users.
Enables AI agents to perform on-chain transactions, manage ERC-20 tokens, and interact with smart contracts on the Ethereum network.
Integrates as a notification relay service to provide status updates and transaction logs through various push services.
Provides support for executing transactions and managing assets on the Optimism L2 network.
Supports asset management and transaction execution for AI agents on the Polygon network.
Utilized as a notification channel for reporting transaction activity, security events, and audit logs.
Allows AI agents to interact with the Solana blockchain, supporting native transfers and SPL/Token-2022 standards.
Serves as both a notification delivery channel and a bot interface for managing AI agent wallet activities.
Provides settings and integration capabilities for connecting and managing wallets within the daemon's administration interface.
WAIaaS
Wallet-as-a-Service for AI Agents
A self-hosted wallet daemon that lets AI agents perform on-chain transactions securely -- while the owner keeps full control of funds.
The Problem
AI agents that need to transact on-chain face an impossible choice: hold private keys (and risk total loss if compromised) or depend on a centralized custodian (single point of failure, trust dependency).
WAIaaS bridges the gap -- agents handle small transactions instantly, large amounts require owner approval, and everything runs on your machine with no third-party dependency.
Related MCP server: seashail
How It Works
WAIaaS is a local daemon that sits between your AI agent and the blockchain:
3-tier authentication -- Separate roles for the daemon operator (masterAuth), fund owner (ownerAuth), and AI agent (sessionAuth)
4-tier policy engine -- Transactions are auto-classified by USD value into INSTANT / NOTIFY / DELAY / APPROVAL tiers
12 policy types -- Cumulative spend limits, token allowlists, contract whitelists, approved spenders, and more
Defense in depth -- Kill Switch, AutoStop engine, audit logging, 4-channel notifications
See Security Model for full details.
Architecture
graph LR
subgraph Interfaces
SDK["TypeScript SDK"]
MCP["MCP Server"]
CLI["CLI"]
Admin["Admin UI"]
Skills["Skill Files"]
WalletSDK["Wallet SDK"]
end
subgraph Daemon
API["API Layer<br>(Hono + Middleware)"]
Services["Service Layer<br>(Policy, Notifications, Kill Switch)"]
Pipeline["Transaction Pipeline<br>(6-stage + 8-state)"]
Infra["Infrastructure<br>(SQLite, Keystore, Config)"]
end
subgraph Blockchain
Solana["Solana"]
EVM["EVM Chains"]
end
SDK & MCP & CLI & Admin & Skills & WalletSDK --> API
API --> Services --> Pipeline --> Infra
Infra --> Solana & EVM12 packages in a monorepo:
@waiaas/core — Shared types, Zod schemas, enums, and interfaces
@waiaas/daemon — Self-hosted wallet daemon (Hono HTTP server)
@waiaas/adapter-solana — Solana chain adapter (SPL / Token-2022)
@waiaas/adapter-evm — EVM chain adapter (ERC-20 via viem)
@waiaas/actions — DeFi Action Providers (Jupiter, 0x, LI.FI, Lido, Jito)
@waiaas/sdk — TypeScript client library
@waiaas/mcp — Model Context Protocol server for AI agents
@waiaas/cli — Command-line interface
@waiaas/admin — Preact-based Admin Web UI
@waiaas/wallet-sdk — Wallet Signing SDK for wallet app integration
@waiaas/push-relay — Push Relay Server (daemon → Pushwoosh/FCM native push)
@waiaas/skills — Pre-built
.skill.mdinstruction files for AI agents
See Architecture for the full technical deep-dive.
Quick Start
npm install -g @waiaas/cli
waiaas init # Create data directory + config.toml
waiaas start # Start daemon (sets master password on first run)
waiaas quickset --mode mainnet # Create wallets + MCP sessions in one stepThe quickset command does everything you need to get started:
Creates Solana Mainnet + EVM Ethereum Mainnet wallets automatically
Issues MCP session tokens for each wallet
Outputs a Claude Desktop MCP config snippet -- just copy and paste
We recommend configuring spending limits and registering an owner wallet for high-value transaction approval. For testing, use
waiaas quickset --mode testnetto create Solana Devnet + EVM Sepolia wallets instead.
Admin UI
After starting the daemon, manage everything from the admin panel at http://127.0.0.1:3100/admin (masterAuth required).
Connect Your AI Agent
After quickset, choose one of two integration paths:
Path A: MCP (Claude Desktop / Claude Code)
For AI agents that support the Model Context Protocol:
# quickset already printed the MCP config JSON -- paste it into
# ~/Library/Application Support/Claude/claude_desktop_config.json
# Or auto-register with all wallets:
waiaas mcp setup --allThe daemon runs as an MCP server. Your agent calls wallet tools directly -- send tokens, check balances, manage policies -- all through the MCP protocol.
Path B: Skill Files (Any AI Agent)
For agents that don't support MCP, or when you prefer REST API integration:
npx @waiaas/skills add allThis adds .skill.md instruction files to your project. Include them in your agent's context and it learns the WAIaaS API automatically. Available skills: setup, quickstart, wallet, transactions, policies, admin, actions, x402.
Agent Self-Setup (Auto-Provision)
AI agents can set up WAIaaS fully autonomously with no human interaction:
npm install -g @waiaas/cli
waiaas init --auto-provision # Generates random master password → recovery.key
waiaas start # No password prompt
waiaas quickset # Creates wallets + sessions automatically
waiaas set-master # (Later) Harden password, then delete recovery.keyThe --auto-provision flag generates a cryptographically random master password and saves it to ~/.waiaas/recovery.key. All subsequent CLI commands read it automatically. See the Agent Self-Setup Guide for the complete flow.
For manual setup with human-guided password entry, install skills and follow waiaas-setup/SKILL.md:
npx @waiaas/skills add allAlternative: Docker
git clone https://github.com/minho-yoo/waiaas.git && cd waiaas
docker compose up -dThe daemon listens on http://127.0.0.1:3100.
Using the SDK
import { WAIaaSClient } from '@waiaas/sdk';
const client = new WAIaaSClient({
baseUrl: 'http://127.0.0.1:3100',
sessionToken: process.env.WAIAAS_SESSION_TOKEN,
});
const balance = await client.getBalance();
console.log(`Balance: ${balance.balance} ${balance.symbol}`);
const tx = await client.sendToken({
to: 'recipient-address...',
amount: '0.1',
});
console.log(`Transaction: ${tx.id}`);Admin UI
Access the admin panel at http://127.0.0.1:3100/admin with your master password:
Dashboard -- System overview, wallet balances, recent transactions
Wallets -- Create, manage, and monitor wallets across chains; RPC endpoints, balance monitoring, and WalletConnect settings
Sessions -- Issue and revoke agent session tokens; session lifetime and rate limit settings
Policies -- Configure 12 policy types with visual form editors; default deny and tier settings
Notifications -- Channel status and delivery logs; Telegram, Discord, and Slack settings
Security -- Kill Switch emergency controls, AutoStop protection rules, JWT rotation
System -- API keys, display currency, price oracle, rate limits, log level, and daemon shutdown
Features include settings search (Ctrl+K / Cmd+K) and unsaved changes protection.
Enabled by default (admin_ui = true in config.toml).
Supported Networks
Chain | Environment | Networks |
Solana | mainnet | mainnet |
Solana | testnet | devnet, testnet |
EVM | mainnet | ethereum-mainnet, polygon-mainnet, arbitrum-mainnet, optimism-mainnet, base-mainnet |
EVM | testnet | ethereum-sepolia, polygon-amoy, arbitrum-sepolia, optimism-sepolia, base-sepolia |
13 networks total (Solana 3 + EVM 10).
Features
Self-hosted local daemon -- No central server; keys never leave your machine
Multi-chain -- Solana (SPL / Token-2022) and EVM (ERC-20) via
IChainAdapterToken, contract, and DeFi -- Native transfers, token transfers, contract calls, approve, batch transactions, Action Provider plugins (Jupiter Swap, etc.)
USD policy evaluation -- Price oracles (CoinGecko / Pyth / Chainlink) evaluate all transactions in USD
x402 payments -- Automatic HTTP 402 payment handling with EIP-3009 signatures
Multiple interfaces -- REST API, TypeScript SDK, Python SDK, MCP server, CLI, Admin Web UI, Tauri Desktop, Telegram Bot
Skill files -- Pre-built instruction files that teach AI agents how to use the API
Documentation
Document | Description |
System overview, package structure, pipeline, chain adapters | |
Authentication, policy engine, Kill Switch, AutoStop | |
Docker, npm, configuration reference | |
REST API endpoints and authentication | |
Fully autonomous setup with auto-provision | |
Universal guide for 27+ AI agent platforms | |
Skill files + MCP server setup for Claude Code | |
Quick setup for OpenClaw bot | |
Integration guide for wallet developers | |
Background on AI agent wallet security | |
Development setup, code style, testing, PR guidelines |
License
MIT -- Copyright (c) 2026 WAIaaS Contributors
Available Tools
60 toolsapprove_tokenB
Approve a spender to transfer tokens on your behalf. Requires APPROVED_SPENDERS policy.
Inputs: spender (required), token (required), amount (required), network, +2 more.
build_useropA
Build an unsigned ERC-4337 UserOperation from a transaction request. Returns sender, nonce, callData, buildId. Platform fills gas/paymaster fields before signing.
Inputs: wallet_id (required), type (required), network (required), to, +7 more.
call_contractA
Call a whitelisted smart contract. Requires CONTRACT_WHITELIST policy. For EVM: provide calldata (hex). For Solana: provide programId + instructionData + accounts.
Inputs: to (required), calldata, abi, value, +6 more.
connect_infoA
Get self-discovery info: accessible wallets, policies, capabilities, and AI-ready prompt. Call this first to understand your environment.
Inputs: no named parameters.
encode_calldataA
Encode EVM function call into calldata hex. Provide ABI fragment array, function name, and arguments. Returns hex calldata and function selector for use with call_contract.
Inputs: abi (required), functionName (required), args, wallet_id.
erc8004_get_agent_infoA
Get ERC-8004 agent identity info (on-chain ID, wallet, URI, metadata).
Inputs: agent_id (required).
erc8004_get_reputationB
Get ERC-8004 agent reputation summary (score, count, decimals).
Inputs: agent_id (required), tag1, tag2.
erc8004_get_validation_statusC
Get ERC-8004 validation request status.
Inputs: request_hash (required).
erc8128_sign_requestA
Sign an HTTP request using ERC-8128 (RFC 9421 + EIP-191). Returns Signature-Input, Signature, and Content-Digest headers for the given HTTP method, URL, headers, and body.
Inputs: method (required), url (required), headers, body, +4 more.
erc8128_verify_signatureB
Verify an ERC-8128 HTTP message signature. Checks RFC 9421 signature validity, recovers the signer's Ethereum address, and validates expiry.
Inputs: method (required), url (required), headers (required), signature_input (required), +2 more.
get_addressA
Get the public address of the wallet.
Inputs: wallet_id.
get_assetsB
Get all assets (native + tokens) held by the wallet.
Inputs: network, display_currency, wallet_id.
get_balanceC
Get the current balance of the wallet.
Inputs: network, display_currency, wallet_id.
get_incoming_summaryB
Get a period-based summary of incoming transactions (daily/weekly/monthly totals with USD conversion).
Inputs: period, chain, network, since, +2 more.
get_nft_metadataB
Get detailed metadata for a specific NFT (name, image, attributes, CAIP-19 assetId). EVM: contractAddress:tokenId, Solana: mintAddress.
Inputs: token_identifier (required), network (required), wallet_id.
get_nonceB
Get a nonce for owner wallet signature verification.
Inputs: wallet_id.
get_policiesA
Get policies applied to the wallet. Shows spending limits, whitelists, rate limits, and other rules.
Inputs: wallet_id, limit, offset.
get_provider_statusA
Get Smart Account provider status: provider name, supported chains, gas sponsorship (paymaster) status.
Inputs: wallet_id (required).
get_rpc_proxy_urlA
Get the EVM RPC proxy URL for a wallet and chain. Use this URL as --rpc-url for Forge, Hardhat, ethers.js, or viem.
Inputs: wallet_id (required), chain_id (required).
get_tokensB
Get registered tokens (builtin + custom) for a specific network.
Inputs: network (required).
get_transactionB
Get details of a specific transaction by ID.
Inputs: transaction_id (required), display_currency, wallet_id.
get_wallet_infoA
Get wallet info including chain, address, environment, and available networks.
Inputs: wallet_id.
list_credentialsA
List credential metadata for a wallet (names, types, expiry -- never shows values).
Inputs: wallet_id.
list_incoming_transactionsA
List incoming (received) transaction history with cursor-based pagination. Returns confirmed incoming transfers by default.
Inputs: limit, cursor, chain, network, +6 more.
list_nftsA
List NFTs (ERC-721, ERC-1155, Metaplex) owned by the wallet for a specific network. Requires NFT indexer API key.
Inputs: network (required), cursor, limit, group_by, +1 more.
list_offchain_actionsA
List off-chain action history (signedData/signedHttp) with venue/status filter and pagination.
Inputs: venue, status, limit, offset, +1 more.
list_sessionsA
List active sessions with pagination. Admin operation requiring master auth.
Inputs: wallet_id, limit, offset.
list_transactionsB
List transaction history with cursor-based pagination.
Inputs: limit, cursor, display_currency, wallet_id.
resolve_assetA
Resolve a CAIP-19 asset identifier to token metadata. Returns address, decimals, symbol, name, network, chainId, isNative, isRegistered.
Inputs: asset_id (required).
send_batchA
Send multiple instructions in a single atomic transaction (Solana only, 2-20 instructions).
Inputs: instructions (required), network, wallet_id, gas_condition.
send_tokenB
Send SOL/ETH or tokens from the wallet. For token transfers, specify type and token info.
Inputs: to (required), amount (required), memo, type, +4 more.
sign_messageA
Sign a message (personal_sign) or EIP-712 typed data (signTypedData). Returns the signature. EIP-712 is EVM-only.
Inputs: message, sign_type, typed_data, network, +1 more.
sign_transactionA
Sign an unsigned transaction without broadcasting. Provide raw transaction (base64 for Solana, hex for EVM). Returns signed transaction, parsed operations, and policy evaluation.
Inputs: transaction (required), network, wallet_id.
sign_useropA
Sign a completed UserOperation (with gas/paymaster fields). Returns signed UserOperation with signature and txId for tracking.
Inputs: wallet_id (required), build_id (required), sender (required), nonce (required), +13 more.
simulate_transactionA
Simulate a transaction without executing it. Returns policy tier, estimated fees, balance changes, and warnings. No side effects.
Inputs: to (required), amount (required), type, token, +11 more.
transfer_nftB
Transfer an NFT (ERC-721/ERC-1155/Metaplex) to a recipient address. Default tier: APPROVAL.
Inputs: to (required), token_address (required), token_id (required), standard (required), +3 more.
waiaas_get_defi_positionsC
Get DeFi lending positions with health factor and USD amounts.
Inputs: wallet_id.
waiaas_get_health_factorB
Get lending health factor (safe/warning/danger/critical).
Inputs: wallet_id, network.
waiaas_hl_get_account_stateB
Get Hyperliquid account state (balances, margins, positions).
Inputs: wallet_id.
waiaas_hl_get_funding_ratesB
Get funding rate history for a Hyperliquid perpetual market.
Inputs: market (required), start_time.
waiaas_hl_get_marketsA
Get Hyperliquid perpetual market list with metadata (leverage limits, etc.).
Inputs: no named parameters.
waiaas_hl_get_open_ordersC
Get Hyperliquid open orders for a wallet.
Inputs: wallet_id, sub_account.
waiaas_hl_get_positionsB
Get Hyperliquid perpetual positions for a wallet.
Inputs: wallet_id, sub_account.
waiaas_hl_get_spot_balancesB
Get Hyperliquid spot token balances for a wallet.
Inputs: wallet_id.
waiaas_hl_get_spot_marketsA
Get Hyperliquid spot market list (trading pairs, token info).
Inputs: no named parameters.
waiaas_hl_get_sub_positionsA
Get positions for a Hyperliquid sub-account.
Inputs: sub_account (required), wallet_id.
waiaas_hl_get_trade_historyB
Get Hyperliquid trade history (fills) for a wallet.
Inputs: wallet_id, limit.
waiaas_hl_list_sub_accountsB
List Hyperliquid sub-accounts for a wallet.
Inputs: wallet_id.
waiaas_pm_get_balanceB
Get Polymarket USDC.e balance and CTF token positions for a wallet.
Inputs: wallet_id.
waiaas_pm_get_eventsC
Get Polymarket events (groups of related markets).
Inputs: category.
waiaas_pm_get_market_detailB
Get detailed information about a specific Polymarket prediction market.
Inputs: condition_id (required).
waiaas_pm_get_marketsB
Browse Polymarket prediction markets with optional filters.
Inputs: category, status, keyword, limit.
waiaas_pm_get_ordersC
Get Polymarket CLOB orders for a wallet.
Inputs: wallet_id, status.
waiaas_pm_get_pnlA
Get Polymarket profit and loss summary for a wallet.
Inputs: wallet_id.
waiaas_pm_get_positionsB
Get Polymarket prediction market positions for a wallet.
Inputs: wallet_id.
waiaas_pm_setupA
Set up Polymarket API keys and optional CTF contract approval for a wallet.
Inputs: wallet_id (required), auto_approve.
wc_connectA
Start WalletConnect pairing. Returns a WC URI that the wallet owner can use to connect their external wallet (D'CENT, MetaMask, Phantom, etc). Share the URI with the user -- they can paste it into their wallet app.
Inputs: wallet_id.
wc_disconnectA
Disconnect the active WalletConnect session. After disconnecting, a new pairing must be initiated to reconnect.
Inputs: wallet_id.
wc_statusA
Get WalletConnect session status. Returns session info (peer wallet, chain, expiry) or error if no active session.
Inputs: wallet_id.
x402_fetchA
Fetch a URL with automatic x402 payment. If the server responds with HTTP 402, automatically sign a cryptocurrency payment and retry. Returns the response along with payment details if payment was made.
Inputs: url (required), method, headers, body, +1 more.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 60 tools
Many tools have overlapping purposes: get_balance, get_assets, get_tokens, and waiaas_hl_get_spot_balances all return balance-like data; get_transaction, list_transactions, and list_incoming_transactions all cover transaction history; waiaas_pm_get_markets and waiaas_pm_get_events both browse Polymarket data. The waiaas_* prefix is applied inconsistently, and several tools (get_wallet_info, connect_info, get_provider_status) all provide environment/wallet discovery info.
Naming is highly inconsistent: some tools use verb_noun (get_balance, list_transactions, send_token), some use domain prefixes (waiaas_pm_*, waiaas_hl_*, erc8004_*, erc8128_*), and some use bare names (connect_info, resolve_asset, x402_fetch). The waiaas_ prefix is applied to some tools but not others, and there is no clear pattern for when to use get_ vs list_ vs waiaas_<domain>_get_.
60 tools is far beyond the typical well-scoped server size. The server attempts to cover Polymarket, Hyperliquid, DeFi lending, ERC-8004, ERC-8128, WalletConnect, x402, NFTs, smart accounts, and generic wallet operations, resulting in a sprawling surface that is difficult for an agent to navigate.
The tool surface is broad but uneven. Core wallet operations (balance, send, transactions, signing) are well covered, and each domain has read-focused tools, but many domains lack write/action coverage (e.g., Hyperliquid has no order placement/cancellation, Polymarket has no order creation/cancellation, DeFi has no lending/borrowing actions). This leaves agents unable to complete full workflows in those domains.
Maintenance
Related MCP Connectors
Policy-gated MCP treasury for AI agents — x402 subscribe, 50+ tools, multi-chain.
Native Solana staking for AI agents. 26 MCP tools, one-shot signing, webhooks.
Multi-chain wallet MCP. 18 tools: balance, swap, bridge, stake, claim. Pay-per-call USDC (x402 v2).
Pay-per-use MCP tools for AI agents. USDC on Base via x402. No API keys.
Related MCP Servers
- AlicenseBqualityBmaintenanceProvides permissionless wallet infrastructure for AI agents to manage wallets, sign transactions, and handle tokens across Solana and all EVM-compatible chains. It includes 29 specialized tools for on-chain operations, featuring built-in security guards and automated x402 payment processing without KYC requirements.401,677 npm3MIT
- AlicenseNot gradedqualityDmaintenanceAgent-native, self-hosted MCP server for crypto trading and DeFi management. Enables agents to query balances, execute trades, and manage positions with a policy engine and secure key storage.8Apache 2.0
- AlicenseNot gradedqualityCmaintenanceSelf-hosted MCP server enabling AI agents to manage EVM wallets, check balances, swap tokens, and securely execute transactions via 1Claw Intents without exposing private keys.78 PyPIMIT
- AlicenseNot gradedqualityCmaintenanceMCP server that lets any AI agent operate a wallet directly on-chain: create wallets, send, swap, bridge, and deploy contracts across EVM and Bitcoin networks.1MIT