Single-source wallet skill for generate, import, get-balance, and send flows using local wallet files plus executable Node scripts. Use when the user asks for wallet creation, recovery, balance checks, or transaction sending.
Changelog: CHANGELOG.md
Use this file as the only wallet skill entrypoint for local wallet workflows.
viemWALLET_SECRET_KEY (used for local secret encryption/decryption)wallet/signer.jsonwallet/config.jsonRun these scripts from agent-wallet-skills for each action:
generate-wallet: node scripts/generate-wallet.js --method=<private-key|seed-phrase> [--overwrite=true]import-wallet: node scripts/import-wallet.js --seedPhrase="<words>" [--overwrite=true] or --privateKey=0x...get-balance: node scripts/get-balance.js --address=0x... [--tokenAddress=0x...] [--decimals=18] [--symbol=TOKEN]send: node scripts/send.js --to=0x... --amount=<native-amount> --confirm=trueNotes:
wallet/signer.json as encrypted fields only.wallet/config.json with shape [{ rpc_url, chain_id, current }].send.js requires explicit --confirm=true.generate-wallet or import-walletget-balancesendwallet/config.json for read/write chain operations (get-balance, send, and any network-aware generation flow):
[{ rpc_url, chain_id, current }]current: truerpc_url and chain_id on the current entrygenerate-wallet -> node scripts/generate-wallet.js --method=<private-key|seed-phrase>import-wallet -> node scripts/import-wallet.js --seedPhrase="<words>" or --privateKey=0x...get-balance -> node scripts/get-balance.js --address=0x... [--tokenAddress=0x...]send -> node scripts/send.js --to=0x... --amount=<native-amount> --confirm=truewallet/signer.json already exists and user asks to regenerate/import over it, require explicit confirmation first.Inputs:
0x prefixed or raw hex), or generation request--overwrite=true when replacing existing wallet/signer.jsonRules:
private-key unless user requests mnemonic.0x removal).Expected wallet/signer.json structure:
{
"method": "seed_phrase",
"address": "0x...",
"encryptedSeedPhrase": "<encrypted-secret>",
"encryptedPrivateKey": null,
"createdAt": "2026-04-13T00:00:00.000Z",
"updatedAt": "2026-04-13T00:00:00.000Z"
}
Inputs:
--address (required)--tokenAddress (optional for ERC-20 mode)--decimals and --symbolRules:
address and tokenAddress (when provided).wallet/config.json.getBalance and return raw + formatted values.balanceOf; read decimals/symbol when possible, otherwise fall back to defaults.Inputs:
--to recipient (required)--amount native amount (required)--confirm=true (required to broadcast)Rules:
wallet/signer.json (seed_phrase or private_key).WALLET_SECRET_KEY before deriving account.wallet/config.json.wallet/signer.json.wallet/signer.json, wallet/config.json).wallet/signer.json -> request generate/import first.wallet/config.json -> request default network setup first.current: true entries -> stop and request normalization.Before finishing:
generate, import, balance, send)Return this structure across all actions:
action: generate | import | balance | sendchain: chain id/name used, or none for offline-only generation/importaddress: active wallet or queried addresstxHash: transaction hash when available, else nullstatus: success | failed | needs_confirmationnext_step: one clear follow-up action