wallet について
wallet は、残高確認、送金、署名を行うエージェント向けのスクリプト型マルチチェーンウォレットスキルです。EVM と Solana に対応し、ウォレットポリシーの確認や提案も行えます。
主な機能
- 01EVM と Solana の残高確認
- 02トランザクションの送信または署名
- 03メッセージと型付きデータへの署名
- 04トランザクション履歴の確認
- 05ウォレットポリシーの確認と提案
活用シーン
- 01複数チェーンの残高確認
- 02EVM または Solana での送金
- 03メッセージやトランザクションデータへの署名
- 04ウォレットポリシーの確認や変更
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ starchild-ai-agent/ official-skills --skill walletインストール後、Claude Code で/walletを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
__init__.pyexports.pywallet.py詳細
💰 ウォレットスキル
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() | すべての AGENT ウォレットアドレスを取得 |
get_user_wallets() | ユーザー自身のウォレット(ログイン用 + セカンダリ)— 読み取り専用、env から取得 |
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 トランザクションをブロードキャスト(ガスはデフォルトでスポンサー提供) |
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) | ポリシールールを提案する前に事前検証 |
ユーザー自身のウォレット(ログイン用 / セカンダリ)
エージェントウォレットはユーザーのウォレットではありません。プラットフォームは ユーザー自身のウォレット識別情報を環境変数として注入します(コンテナ起動時および ユーザーのウォレット操作時にコントロールプレーンから同期されます):
USER_LOGIN_WALLET_ADDRESS/USER_LOGIN_WALLET_TYPE— ユーザーがログインに 使用する(またはプライマリとして紐付けた)ウォレット。USER_SECONDARY_WALLET_ADDRESS/USER_SECONDARY_WALLET_TYPE— ユーザーが リンクしたもう一方のウォレット(例: ログインが EVM の場合の Solana)。
「自分のウォレットは?」「自分のログインウォレットは?」「自分の残高を確認して」と 聞かれた場合は、これらを読み取ってください — エージェントウォレットで答えたり、 わからないと答えたりしないでください:
python3 -c "from core.skill_tools import wallet; import json; print(json.dumps(wallet.get_user_wallets()))"
値が空/存在しない場合は、ユーザーがそのスロットにウォレットを一度も紐付けていない (例: ソーシャルログイン)ことを意味します — その旨を伝え、Web アプリでのウォレット 紐付けを案内してください。
ルール:
- 読み取り専用。 エージェントはこれらのウォレットの鍵を保有しません。ユーザーの
残高を確認するには、アドレスを
wallet_balance(chain, address=...)/wallet_sol_balance(address=...)に渡してください。 - ユーザーのウォレットからのトランザクションは決してスクリプト関数を経由しません
— ネイティブの
frontend_action(action_type="user_wallet_tx", ...)フローを使用して ください。このフローではユーザーが UI で署名し、expected_fromがサーバー側で 強制されます。
主なポイント
- EVM では金額は wei 単位です(
wallet_transfer/wallet_sign_transaction)。0.01 ETH =10000000000000000。ERC-20 トークンの送金では、amountは0(ネイティブ)となり、送金はdataの calldata にエンコードされます。 - EVM チェーンではガスはデフォルトでスポンサーされます — ユーザーはガス用のネイティブトークンを用意する必要はありません。利用できない場合はユーザー負担にフォールバックします。ウォレット残高からガスを支払うには
sponsor=Falseを渡します。 - ポリシーのデフォルト: OFF(すべて許可)。ポリシーが有効な場合にのみ、トランザクションに UI での確認が必要になります。
- サポートされる EVM チェーン: DeBank がサポートするすべてのチェーン。一般的な名前は自動マッピングされます(例:
avalanche→avax、bsc→bsc、zksync→era)。フォールバックエイリアスには ethereum/base/arbitrum/optimism/polygon/linea/bsc/avalanche/fantom/gnosis/zksync/scroll/blast/mantle/celo/aurora、さらに monad/world/unichain/abstract/sonic/berachain が含まれます。 - 残高ソース: 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. check
python3 -c "from core.skill_tools import wallet; import json; print(json.dumps(wallet.wallet_balance(chain='base')))"
# 2. transfer (amount in 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. verify
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 で確認し、署名します。チェーンごとに1回呼び出します(EVM + Solana = 2回の呼び出し)。frontend_action(action_type="update_wallet_policy", chain_type="ethereum", rules=[...])
標準ワイルドカードポリシー(必要な場合)
rules = [
{"name": "Deny key export", "method": "exportPrivateKey", "conditions": [], "action": "DENY"},
{"name": "Allow all", "method": "*", "conditions": [], "action": "ALLOW"},
]
ポリシーモード — 重要な判断表
⚠️ Privy では DENY > ALLOW です。 DENY * はすべての ALLOW ルールを上書きします。決して混在させないでください。
| モード | ルール | 効果 |
|---|---|---|
| すべて許可(デフォルト) | DENY exportPrivateKey + ALLOW * | キーのエクスポート以外はすべて許可 |
| すべて拒否(ロックダウン) | DENY exportPrivateKey + DENY * | 何も動作しません。ALLOW ルールはなし! |
| ホワイトリスト(選択的) | DENY exportPrivateKey + 特定の ALLOW ルールのみ | ホワイトリストに登録された操作のみ動作し、残りは暗黙的に拒否 |
モード 1: すべて許可(標準ワイルドカード)
rules = [
{"name": "Deny key export", "method": "exportPrivateKey", "conditions": [], "action": "DENY"},
{"name": "Allow all", "method": "*", "conditions": [], "action": "ALLOW"},
]
モード 2: すべて拒否(ロックダウン)
rules = [
{"name": "Deny key export", "method": "exportPrivateKey", "conditions": [], "action": "DENY"},
{"name": "Deny all actions", "method": "*", "conditions": [], "action": "DENY"},
]
# ⚠️ NO ALLOW rules here — DENY * would override them!
モード 3: ホワイトリスト(選択的許可)
rules = [
{"name": "Deny key export", "method": "exportPrivateKey", "conditions": [], "action": "DENY"},
{"name": "Allow transfer to Uniswap", "method": "eth_sendTransaction", "conditions": [
{"field_source": "ethereum_transaction", "field": "to", "operator": "eq", "value": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"}
], "action": "ALLOW"},
]
# ⚠️ NO "DENY *" here! enabled=true already denies everything not ALLOWed.
# Adding DENY * would override the ALLOW rules above (DENY > ALLOW).
Privy ポリシールール — 主な制約
| ルール | 詳細 |
|---|---|
| デフォルトの動作 | enabled=true → 明示的に ALLOW されない限りすべて拒否 |
| DENY > ALLOW | 両方が一致する場合、DENY が常に優先されます |
| 空の条件 | exportPrivateKey と *(ワイルドカード)のみが conditions: [] を許可します |
| TX メソッドには条件が必要 | eth_sendTransaction、eth_signTransaction、eth_signTypedData_v4、eth_signUserOperation、signAndSendTransaction などはすべて1つ以上の条件が必要です |
| 有効な field_sources | 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", ...) を2回呼び出します |
注意点
- ポリシーの提案は
frontend_actionツールを経由します — アクティブな SSE セッションが必要です(バックグラウンドタスクからは動作しません)。 wallet_balanceにはchainが必要です — 検出にはwallet_get_all_balancesを使用します。- EVM + Solana の両方のポリシーについては、
frontend_actionを2回呼び出します(chain_type ごとに1回)。