SKILL.md
readonly只读
name
wallet
description
多链钱包:EVM 和 Solana 余额、转账、签名及策略。 在查询余额、发送代币、签名结构化数据或提议钱包策略时使用(例如:在 Base 上发送 10 USDC、签名 EIP-712、查询 Solana 余额)。
version
3.6.1
💰 钱包技能
多链钱包,支持 EVM(DeBank 支持的链)和 Solana。余额查询、转账、签名和策略管理。脚本技能 — 通过 bash 调用以下函数;不注册钱包工具。
如何调用
所有读/转账/签名操作都是 core.skill_tools.wallet 中的 Python 函数。从 bash 运行并读取 JSON 结果:
python3 -c "from core.skill_tools import wallet; import json; print(json.dumps(wallet.wallet_balance(chain='base')))"
唯一不是脚本函数的操作是提议钱包策略 — 它需要在 UI 中渲染确认卡片,因此通过原生 frontend_action 工具进行(参见下面的策略管理)。
函数(from core.skill_tools import wallet)
| 函数 | 描述 |
|---|---|
wallet_info() |
获取所有钱包地址 |
wallet_balance(chain, address="", asset="") |
查询指定链上的 EVM 余额(DeBank)。chain 必填 |
wallet_sol_balance(address="", asset="") |
查询 Solana 余额(Birdeye) |
wallet_get_all_balances(evm_address="", sol_address="") |
一次性查询所有链的余额 |
wallet_transfer(to, amount, chain_id=1, data="", **kw) |
广播 EVM 交易(默认赞助 gas) |
wallet_sign_transaction(to, amount, chain_id=1, data="", **kw) |
签名 EVM 交易(不广播) |
wallet_sign(message) |
EIP-191 消息签名 |
wallet_sign_typed_data(domain, types, primaryType, message) |
EIP-712 结构化数据签名 |
wallet_transactions(chain="ethereum", asset="", limit=20) |
EVM 交易历史 |
wallet_sol_transfer(transaction, caip2=...) |
广播 Solana 交易(base64) |
wallet_sol_sign_transaction(transaction) |
签名 Solana 交易(不广播) |
wallet_sol_sign(message) |
Solana 消息签名 |
wallet_sol_transactions(chain="solana", asset="sol", limit=20) |
Solana 交易历史 |
wallet_get_policy(chain_type="ethereum") |
检查策略状态 |
validate_and_clean_rules(rules, chain_type) |
在提议前预验证策略规则 |
关键事实
- EVM 金额单位为 wei(
wallet_transfer/wallet_sign_transaction)。0.01 ETH =10000000000000000。对于 ERC-20 代币发送,amount为0(原生),转账编码在datacalldata 中。 - EVM 链默认赞助 gas — 用户无需原生代币支付 gas。如果不可用则回退到用户自付。传递
sponsor=False从钱包余额支付 gas。 - 策略默认关闭(允许所有)。仅在策略启用时交易需要 UI 确认。
- 支持的 EVM 链:所有 DeBank 支持的链。常见名称自动映射(例如
avalanche→avax,bsc→bsc,zksync→era)。16 条常见链(ethereum, base, arbitrum, optimism, polygon, linea, bsc, avalanche, fantom, gnosis, zksync, scroll, blast, mantle, celo, aurora)有内置回退映射。 - 余额来源:DeBank(EVM)、Birdeye(Solana)、wallet-service(回退)。DeBank/Birdeye 密钥由 sc-proxy 自动注入。
工作流程
查询余额
python3 -c "from core.skill_tools import wallet; import json; print(json.dumps(wallet.wallet_balance(chain='base')))"
python3 -c "from core.skill_tools import wallet; import json; print(json.dumps(wallet.wallet_get_all_balances()))"
发送交易(EVM)
始终先验证余额,再验证结果/历史。
# 1. 检查
python3 -c "from core.skill_tools import wallet; import json; print(json.dumps(wallet.wallet_balance(chain='base')))"
# 2. 转账(金额单位为 wei)
python3 -c "from core.skill_tools import wallet; import json; print(json.dumps(wallet.wallet_transfer(to='0x...', amount='10000000000000000', chain_id=8453)))"
# 3. 验证
python3 -c "from core.skill_tools import wallet; import json; print(json.dumps(wallet.wallet_transactions(chain='base')))"
签名 EIP-712 结构化数据
python3 -c "from core.skill_tools import wallet; import json; print(json.dumps(wallet.wallet_sign_typed_data(domain={...}, types={...}, primaryType='Permit', message={...})))"
策略管理
检查策略是脚本函数;提议策略使用原生 frontend_action 工具(它在 UI 中渲染签名卡片 — 脚本无法做到)。
- 检查当前策略:
python3 -c "from core.skill_tools import wallet; import json; print(json.dumps(wallet.wallet_get_policy(chain_type='ethereum')))" - (可选)预验证规则:
python3 -c "from core.skill_tools import wallet; import json; print(json.dumps(wallet.validate_and_clean_rules([...], 'ethereum')))" - 提议 — 调用
frontend_action工具(不是脚本):
用户在 UI 中确认并签名。每条链调用一次(EVM + Solana 共两次调用)。frontend_action(action_type="update_wallet_policy", chain_type="ethereum", rules=[...])
标准通配符策略(需要时)
rules = [
{"name": "禁止导出密钥", "method": "exportPrivateKey", "conditions": [], "action": "DENY"},
{"name": "允许所有", "method": "*", "conditions": [], "action": "ALLOW"},
]
策略模式 — 关键决策表
⚠️ 在 Privy 中 DENY > ALLOW。 DENY * 会覆盖所有 ALLOW 规则。切勿混用。
| 模式 | 规则 | 效果 |
|---|---|---|
| 允许所有(默认) | DENY exportPrivateKey + ALLOW * |
除导出密钥外全部允许 |
| 拒绝所有(锁定) | DENY exportPrivateKey + DENY * |
全部不可用。无 ALLOW 规则! |
| 白名单(选择性) | DENY exportPrivateKey + 仅特定 ALLOW 规则 |
仅白名单操作可用,其余隐式拒绝 |
模式 1:允许所有(标准通配符)
rules = [
{"name": "禁止导出密钥", "method": "exportPrivateKey", "conditions": [], "action": "DENY"},
{"name": "允许所有", "method": "*", "conditions": [], "action": "ALLOW"},
]
模式 2:拒绝所有(锁定)
rules = [
{"name": "禁止导出密钥", "method": "exportPrivateKey", "conditions": [], "action": "DENY"},
{"name": "禁止所有操作", "method": "*", "conditions": [], "action": "DENY"},
]
# ⚠️ 此处无 ALLOW 规则 — DENY * 会覆盖它们!
模式 3:白名单(选择性允许)
rules = [
{"name": "禁止导出密钥", "method": "exportPrivateKey", "conditions": [], "action": "DENY"},
{"name": "允许向 Uniswap 转账", "method": "eth_sendTransaction", "conditions": [
{"field_source": "ethereum_transaction", "field": "to", "operator": "eq", "value": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"}
], "action": "ALLOW"},
]
# ⚠️ 此处无 "DENY *"!enabled=true 已拒绝所有未 ALLOW 的操作。
# 添加 DENY * 会覆盖上面的 ALLOW 规则(DENY > ALLOW)。
Privy 策略规则 — 关键约束
| 规则 | 详情 |
|---|---|
| 默认行为 | enabled=true → 拒绝所有,除非显式 ALLOW |
| DENY > ALLOW | 两者匹配时 DENY 始终优先 |
| 空条件 | 仅 exportPrivateKey 和 *(通配符)允许 conditions: [] |
| TX 方法需要条件 | eth_sendTransaction、eth_signTransaction、eth_signTypedData_v4、eth_signUserOperation、signAndSendTransaction 等均需至少一个条件 |
| 有效的 field_source | EVM:ethereum_transaction(to/value/chain_id)、ethereum_calldata(function_name)、ethereum_typed_data_domain(chainId/verifyingContract)、ethereum_typed_data_message、system |
| 有效的运算符 | eq、gt、gte、lt、lte、in(数组,最多 100 个值) |
| 双链 | 为 EVM 和 Solana 分别调用 frontend_action(action_type="update_wallet_policy", ...) 两次 |
注意事项
- 策略提议通过
frontend_action工具进行 — 需要活跃的 SSE 会话(后台任务无法工作)。 wallet_balance需要chain— 使用wallet_get_all_balances进行发现。- 对于 EVM 和 Solana 策略,分别调用
frontend_action两次(每条链类型一次)。






