🛠️ Elytro
AIエージェントがイーサリアムの
📺 まず動画で見る(YouTube)
▶ 【衝撃】最強のAIエージェント「Claude Code」の最新機能・使い方・プログラミングをAIで効率化する超実践術を解説! ↗
※ jpskill.com 編集部が参考用に選んだ動画です。動画の内容と Skill の挙動は厳密には一致しないことがあります。
📜 元の英語説明(参考)
Ethereum EIP-4337 smart contract wallet designed for AI agents. Use this skill whenever the user wants to manage Ethereum accounts, check balances, send ETH/tokens, swap tokens on Uniswap, manage 2FA security hooks, or do anything with their Elytro wallet. Supports gasless transactions via sponsorship. For token swaps, combines with the Uniswap swap-planner skill.
🇯🇵 日本人クリエイター向け解説
AIエージェントがイーサリアムの
※ jpskill.com 編集部が日本のビジネス現場向けに補足した解説です。Skill本体の挙動とは独立した参考情報です。
下記のコマンドをコピーしてターミナル(Mac/Linux)または PowerShell(Windows)に貼り付けてください。 ダウンロード → 解凍 → 配置まで全自動。
mkdir -p ~/.claude/skills && cd ~/.claude/skills && curl -L -o elytro.zip https://jpskill.com/download/4762.zip && unzip -o elytro.zip && rm elytro.zip
$d = "$env:USERPROFILE\.claude\skills"; ni -Force -ItemType Directory $d | Out-Null; iwr https://jpskill.com/download/4762.zip -OutFile "$d\elytro.zip"; Expand-Archive "$d\elytro.zip" -DestinationPath $d -Force; ri "$d\elytro.zip"
完了後、Claude Code を再起動 → 普通に「動画プロンプト作って」のように話しかけるだけで自動発動します。
💾 手動でダウンロードしたい(コマンドが難しい人向け)
- 1. 下の青いボタンを押して
elytro.zipをダウンロード - 2. ZIPファイルをダブルクリックで解凍 →
elytroフォルダができる - 3. そのフォルダを
C:\Users\あなたの名前\.claude\skills\(Win)または~/.claude/skills/(Mac)へ移動 - 4. Claude Code を再起動
⚠️ ダウンロード・利用は自己責任でお願いします。当サイトは内容・動作・安全性について責任を負いません。
🎯 このSkillでできること
下記の説明文を読むと、このSkillがあなたに何をしてくれるかが分かります。Claudeにこの分野の依頼をすると、自動で発動します。
📦 インストール方法 (3ステップ)
- 1. 上の「ダウンロード」ボタンを押して .skill ファイルを取得
- 2. ファイル名の拡張子を .skill から .zip に変えて展開(macは自動展開可)
- 3. 展開してできたフォルダを、ホームフォルダの
.claude/skills/に置く- · macOS / Linux:
~/.claude/skills/ - · Windows:
%USERPROFILE%\.claude\skills\
- · macOS / Linux:
Claude Code を再起動すれば完了。「このSkillを使って…」と話しかけなくても、関連する依頼で自動的に呼び出されます。
詳しい使い方ガイドを見る →- 最終更新
- 2026-05-17
- 取得日時
- 2026-05-18
- 同梱ファイル
- 1
💬 こう話しかけるだけ — サンプルプロンプト
- › Elytro を使って、最小構成のサンプルコードを示して
- › Elytro の主な使い方と注意点を教えて
- › Elytro を既存プロジェクトに組み込む方法を教えて
これをClaude Code に貼るだけで、このSkillが自動発動します。
📖 Skill本文(日本語訳)
※ 原文(英語/中国語)を Gemini で日本語化したものです。Claude 自身は原文を読みます。誤訳がある場合は原文をご確認ください。
[Skill 名] elytro
Elytro ウォレット
エージェント向け Ethereum EIP-4337 スマートコントラクトウォレットです。ガスレス取引、2FAセキュリティフック、およびメールOTPをサポートしています。
- リポジトリ: https://github.com/Elytro-eth/Elytro
- インストール:
npm install -g @elytro/cli(Node >=24 が必要です)
ルール — すべてのアクションの前に読んでください
- オンチェーンデータを決して推測しないでください。 残高、取引ステータス、トークン保有量などを取得するには、常に適切な
elytro queryコマンドを実行してください。値を推測したり仮定したりしないでください。 - インラインボタンを使用したインタラクティブなプロンプトを確定する前に、常にユーザーに確認してください。 コマンドが
(y/N)などと出力した場合は、停止して、確認のためにユーザーにTelegramインラインボタンを提示してください(例: 「確認」、「キャンセル」、または「承認」、「拒否」)。例:elytro tx sendが「このトランザクションに署名して送信しますか? (y/N)」と表示した場合、一時停止して、テキスト入力を求める代わりに、コールバックオプション付きのインラインボタンメッセージをユーザーに送信してください。すべての確認はインラインボタンを使用する必要があり、テキスト入力は決して使用しないでください。 - すべてのリスト表示にインラインボタンを使用してください。 リスト(アカウントリスト、トークンリスト、残高詳細、取引履歴など)を表示する際は常に、各アイテムを、そのアイテムのアクションを指す
callback_dataを持つクリック可能なインラインボタンとしてレンダリングしてください。例: アカウント選択の場合、プレーンテキストを表示してユーザーにタイプを求める代わりに、[{"text": "myWallet (0x...)", "callback_data": "account_select_myWallet"}]のようなボタンを作成してください。 - チェーンIDは16進数または10進数です。 一般的な値: Ethereum mainnet=
1、Sepolia testnet=0xaa36a7(=11155111)、Base=8453、Arbitrum=42161。 - 取引仕様の
valueは常に ETH 単位であり、wei 単位ではありません。 - スマートアカウントは、取引を送信する前にデプロイされている必要があります。 送信する前に
elytro account info <account>→ 「Deployed: Yes」を確認してください。デプロイされていない場合は、まずelytro account activate <account>を実行してください。 <account>が表示される場所では、エイリアスまたはアドレスを相互に交換して使用してください。- 他のエージェントのためのインラインボタンの慣例: このスキルを読み込むすべてのエージェントは、一貫性のために以下の
callback_data命名規則に従う必要があります。- 確認:
confirm_yes、confirm_no、confirm_cancel - アカウント選択:
account_select_<alias_or_address> - トークン選択:
token_select_<tokenAddress> - 取引承認:
tx_approve、tx_reject、tx_simulate - アクションメニュー:
action_<action_name>(例:action_send、action_swap、action_balance_check) - これにより、すべてのエージェントが Elytro ワークフローエコシステム全体でコールバックを解析し、理解できるようになります。
- 確認:
- 意図が不明確な場合のデフォルトメニュー。 ユーザーが特定の行動なしにウォレットを開いたり言及したりした場合(例: 「打开钱包」、「open wallet」、「show elytro」、「check my wallet」)、何をしたいか尋ねないでください。代わりに、すぐにメインメニューをインラインボタンとして表示してください。 各ボタンは、以下のナビゲーションフローマップで定義されているサブメニューまたはアクションフローにつながります。
ナビゲーションフローマップ(インラインボタンUI)
以下のすべてのナビゲーション画面は、インラインボタンを使用してレンダリングする必要があります。ユーザーがボタンをクリックすると、エージェントは対応するサブ画面に進みます。すべてのサブ画面には、親メニューに戻るための「⬅️ Back」ボタンが含まれています。
レベル0 — メインメニュー(デフォルトのエントリーポイント)
トリガー: ユーザーが「open wallet」、「打开钱包」、「elytro」、「我的钱包」などの曖昧な発言をした場合。
エージェントはまずバックグラウンドで elytro account list をサイレントに実行し、その後以下をレンダリングする必要があります。
{
"text": "💎 Elytro Wallet\n\nWelcome! What would you like to do?",
"reply_markup": {
"inline_keyboard": [
[
{ "text": "👛 My Accounts", "callback_data": "menu_accounts" },
{ "text": "💰 Check Balance", "callback_data": "menu_balance" }
],
[
{ "text": "💸 Send", "callback_data": "menu_send" },
{ "text": "🔄 Swap", "callback_data": "menu_swap" }
],
[
{ "text": "🔐 Security / 2FA", "callback_data": "menu_security" },
{ "text": "⚙️ Settings", "callback_data": "menu_settings" }
],
[
{ "text": "➕ Create New Account", "callback_data": "action_create_account" }
]
]
}
}
レベル1 — サブメニュー
menu_accounts → elytro account list を実行し、各アカウントをボタンとしてレンダリングします。
{
"text": "👛 Your Accounts:",
"reply_markup": {
"inline_keyboard": [
[{ "text": "myWallet (0x1234...5678) - Sepolia ✅", "callback_data": "account_select_myWallet" }],
[{ "text": "tradingBot (0x8765...4321) - Base ⏳", "callback_data": "account_select_tradingBot" }],
[{ "text": "➕ Create New Account", "callback_data": "action_create_account" }],
[{ "text": "⬅️ Back", "callback_data": "menu_main" }]
]
}
}
- ✅ = デプロイ済み、⏳ = 未デプロイ
account_select_<alias>コールバック時 →elytro account info <alias>を実行し、アクションボタン付きのアカウント詳細を表示します。{ "text": "👛 myWallet\n📍 Sepolia (0xaa36a7)\n🏷 0x1234...5678\n✅ Deployed\n💎 0.5 ETH", "reply_markup": { "inline_keyboard": [ [ { "text": "💸 Send", "callback_data": "action_send_from_myWallet" }, { "text": "💰 Tokens", "callback_data": "action_tokens_myWallet" } ], [ { "text": "🔄 Swap", "callback_data": "action_swap_from_myWallet" }, { "text": "🔐 Security", "callback_data": "menu_security" } ], [{ "text": "⬅️ Back", "callback_data": "menu_accounts" }] ] } }
menu_balance → 複数のアカウントがある場合は、まずアカウントセレクターを表示します(menu_accounts と同じですが、コールバックは残高表示につながります)。アカウントが1つしかない場合は、アクションボタン付きの残高表示に直接進みます(以下の「クエリ」セクションで定義されています)。
menu_send → 複数のアカウントがある場合は、アカウントセレクターを表示します(コールバック: action_send_from_<alias>)。その後、確認インラインボタンフローを使用して受信者アドレスと金額をプロンプトします(取引概要 → 承認 / 拒否 / シミュレート)。
menu_swap → Uniswap スワッププランナースキルを呼び出します。複数のアカウントがある場合は、まずアカウントセレクターを表示します。
menu_security → elytro security status を実行し、以下を表示します。
{
"text": "🔐 Securi
(原文がここで切り詰められています) 📜 原文 SKILL.md(Claudeが読む英語/中国語)を展開
Elytro Wallet
Ethereum EIP-4337 smart contract wallet for agents. Supports gasless transactions, 2FA security hooks, and email OTP.
- Repo: https://github.com/Elytro-eth/Elytro
- Install:
npm install -g @elytro/cli(requires Node >=24)
RULES — Read before every action
-
Never guess on-chain data. Always run the appropriate
elytro querycommand to fetch balances, transaction status, token holdings, etc. Do NOT infer or assume values. -
Always ask the user before confirming interactive prompts using Inline Buttons. When any command outputs
(y/N)or similar, STOP and present the user with Telegram Inline Buttons for confirmation (e.g., "Confirm", "Cancel" or "Approve", "Reject"). Example:elytro tx sendshows "Sign and send this transaction? (y/N)" — pause and send an Inline Button message to the user with callback options instead of asking for text input. ALL confirmations must use Inline Buttons, never text input. -
Use Inline Buttons for all list displays. Whenever displaying lists (account list, token list, balance details, transaction history, etc.), render each item as a clickable Inline Button with callback_data pointing to that item's action. Example: for account selection, create buttons like
[{"text": "myWallet (0x...)", "callback_data": "account_select_myWallet"}]instead of showing plain text and asking the user to type. -
Chain IDs are hex or decimal. Common values: Ethereum mainnet=
1, Sepolia testnet=0xaa36a7(=11155111), Base=8453, Arbitrum=42161. -
valuein tx specs is always in ETH, not wei. -
Smart accounts must be deployed before sending transactions. Check
elytro account info <account>→ "Deployed: Yes" before sending. If not deployed, runelytro account activate <account>first. -
Use alias or address interchangeably wherever
<account>appears. -
Inline Button Convention for Other Agents: All agents reading this skill must adhere to the following callback_data naming scheme for consistency:
- Confirmations:
confirm_yes,confirm_no,confirm_cancel - Account selection:
account_select_<alias_or_address> - Token selection:
token_select_<tokenAddress> - Transaction approval:
tx_approve,tx_reject,tx_simulate - Action menu:
action_<action_name>(e.g.,action_send,action_swap,action_balance_check) - This ensures all agents can parse and understand callbacks across the entire Elytro workflow ecosystem.
- Confirmations:
-
Default Menu on Ambiguous Intent. When the user opens or mentions the wallet without a specific action (e.g., "打开钱包", "open wallet", "show elytro", "check my wallet"), do NOT ask what they want. Instead, immediately display the Main Menu as Inline Buttons. Each button leads to a sub-menu or action flow as defined in the Navigation Flow Map below.
Navigation Flow Map (Inline Button UI)
All navigation screens below must be rendered using Inline Buttons. When the user clicks a button, the agent proceeds to the corresponding sub-screen. Every sub-screen includes a "⬅️ Back" button to return to the parent menu.
Level 0 — Main Menu (default entry point)
Trigger: user says anything ambiguous like "open wallet", "打开钱包", "elytro", "我的钱包", etc.
Agent must first run elytro account list silently in the background, then render:
{
"text": "💎 Elytro Wallet\n\nWelcome! What would you like to do?",
"reply_markup": {
"inline_keyboard": [
[
{ "text": "👛 My Accounts", "callback_data": "menu_accounts" },
{ "text": "💰 Check Balance", "callback_data": "menu_balance" }
],
[
{ "text": "💸 Send", "callback_data": "menu_send" },
{ "text": "🔄 Swap", "callback_data": "menu_swap" }
],
[
{ "text": "🔐 Security / 2FA", "callback_data": "menu_security" },
{ "text": "⚙️ Settings", "callback_data": "menu_settings" }
],
[
{ "text": "➕ Create New Account", "callback_data": "action_create_account" }
]
]
}
}
Level 1 — Sub-menus
menu_accounts → Run elytro account list, render each account as a button:
{
"text": "👛 Your Accounts:",
"reply_markup": {
"inline_keyboard": [
[{ "text": "myWallet (0x1234...5678) - Sepolia ✅", "callback_data": "account_select_myWallet" }],
[{ "text": "tradingBot (0x8765...4321) - Base ⏳", "callback_data": "account_select_tradingBot" }],
[{ "text": "➕ Create New Account", "callback_data": "action_create_account" }],
[{ "text": "⬅️ Back", "callback_data": "menu_main" }]
]
}
}
- ✅ = deployed, ⏳ = not yet deployed
- Upon
account_select_<alias>callback → runelytro account info <alias>and display account detail with action buttons:{ "text": "👛 myWallet\n📍 Sepolia (0xaa36a7)\n🏷 0x1234...5678\n✅ Deployed\n💎 0.5 ETH", "reply_markup": { "inline_keyboard": [ [ { "text": "💸 Send", "callback_data": "action_send_from_myWallet" }, { "text": "💰 Tokens", "callback_data": "action_tokens_myWallet" } ], [ { "text": "🔄 Swap", "callback_data": "action_swap_from_myWallet" }, { "text": "🔐 Security", "callback_data": "menu_security" } ], [{ "text": "⬅️ Back", "callback_data": "menu_accounts" }] ] } }
menu_balance → If multiple accounts, show account selector first (same as menu_accounts but callback leads to balance view). If only one account, go straight to balance display with action buttons (as defined in the "Query" section below).
menu_send → If multiple accounts, show account selector (callback: action_send_from_<alias>). Then prompt for recipient address and amount using the confirmation Inline Button flow (tx summary → Approve / Reject / Simulate).
menu_swap → Invoke the Uniswap swap-planner skill. If multiple accounts, show account selector first.
menu_security → Run elytro security status, display:
{
"text": "🔐 Security Status\n\n2FA: Installed ✅\nEmail OTP: user@example.com\nSpending Limit: $100/day",
"reply_markup": {
"inline_keyboard": [
[
{ "text": "Install/Uninstall 2FA", "callback_data": "action_2fa_toggle" },
{ "text": "Change Email", "callback_data": "action_email_change" }
],
[
{ "text": "Set Spending Limit", "callback_data": "action_spending_limit" }
],
[{ "text": "⬅️ Back", "callback_data": "menu_main" }]
]
}
}
menu_settings → Run elytro config show, display:
{
"text": "⚙️ Configuration\n\nAlchemy Key: ✅ Set\nPimlico Key: ❌ Not set\nActive Account: myWallet",
"reply_markup": {
"inline_keyboard": [
[
{ "text": "Set Alchemy Key", "callback_data": "action_set_alchemy" },
{ "text": "Set Pimlico Key", "callback_data": "action_set_pimlico" }
],
[
{ "text": "Switch Account", "callback_data": "menu_accounts" }
],
[{ "text": "⬅️ Back", "callback_data": "menu_main" }]
]
}
}
menu_main → Return to Level 0 Main Menu.
Navigation Rules for Agents
- Always show the Main Menu when user intent is ambiguous. Do not ask "what do you want to do?" — show the menu.
- Every sub-screen must include a "⬅️ Back" button (callback_data: parent menu ID, e.g.,
menu_main,menu_accounts). - Fetching real data is mandatory before rendering. Run the corresponding
elytroCLI command to get live data (accounts, balances, security status, config), then render buttons with actual values. Never use placeholder data in production. - Multi-step flows (e.g., Send ETH): guide the user through each step using successive Inline Button screens: account selection → recipient input → amount input → tx summary with Approve/Reject/Simulate.
- Callback routing: parse the callback_data prefix to determine the handler:
menu_*→ render the corresponding sub-menuaccount_select_*→ fetch and show account detailstoken_select_*→ fetch and show token detailsaction_*→ execute the corresponding action or start an action flowtx_*→ handle transaction lifecycle (approve, reject, simulate)confirm_*→ handle generic yes/no/cancel prompts
Setup (first-time)
# 1. Initialize wallet (once per machine)
elytro init
# 2. Create a smart account on a chain
elytro account create --chain <chainId> --alias <alias>
# Example: elytro account create --chain 0xaa36a7 --alias myWallet
# 3. Deploy the smart contract on-chain (gasless by default)
elytro account activate <alias-or-address>
Account Management
elytro account list # List all accounts
elytro account list --chain <chainId> # Filter by chain
elytro account info <account> # On-chain details (balance, deployed status, etc.)
elytro account switch <account> # Set active account
Inline Button Display for Account List:
After running elytro account list, render results as Inline Buttons instead of plain text. Example:
{
"text": "Select an account to manage:",
"reply_markup": {
"inline_keyboard": [
[
{ "text": "myWallet (0x1234...5678) - Sepolia", "callback_data": "account_select_myWallet" },
{ "text": "tradingBot (0x8765...4321) - Base", "callback_data": "account_select_tradingBot" }
],
[
{ "text": "➕ Create New Account", "callback_data": "action_create_account" }
]
]
}
}
Upon callback (e.g., account_select_myWallet), fetch account details via elytro account info and present next actions (send, check balance, swap, etc.) also as Inline Buttons.
Query (read-only, no confirmation needed)
# ETH balance — ALWAYS run this; never guess the balance
elytro query balance <account>
# ERC-20 token balance
elytro query balance --token <tokenAddress> <account>
# All ERC-20 holdings
elytro query tokens <account>
# Transaction status by hash
elytro query tx <hash>
# Current chain info
elytro query chain
Inline Button Display for Balance & Token Lists:
When displaying balances or token holdings, format as Inline Buttons for quick action:
Example balance display with action buttons:
{
"text": "💰 Account: myWallet\n\n💎 ETH: 0.5 ETH (~$1,200)\n🪙 USDC: 2,000 USDC\n🌈 DAI: 1,500 DAI",
"reply_markup": {
"inline_keyboard": [
[
{ "text": "💸 Send ETH", "callback_data": "action_send_eth" },
{ "text": "🔄 Swap", "callback_data": "action_swap" }
],
[
{ "text": "🪙 Select Token", "callback_data": "action_select_token" },
{ "text": "📊 History", "callback_data": "action_history" }
],
[
{ "text": "🔐 Security", "callback_data": "action_security" }
]
]
}
}
Token selection example:
{
"text": "Select a token to view or manage:",
"reply_markup": {
"inline_keyboard": [
[
{ "text": "ETH (0.5)", "callback_data": "token_select_ETH" },
{ "text": "USDC (2000)", "callback_data": "token_select_0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48" }
],
[
{ "text": "DAI (1500)", "callback_data": "token_select_0x6B175474E89094C44Da98b954EedeAC495271d0F" }
]
]
}
}
Multi-Step Action Flows
Send ETH / Token Flow (Inline Button Driven)
Step 1: Account Selection (if multiple accounts exist)
- Render
menu_accountsbuttons. - Upon
account_select_<alias>callback, proceed to Step 2.
Step 2: Recipient Input
- Send a message to the user requesting recipient address.
- User replies with address.
- Agent validates the address and proceeds to Step 3.
Step 3: Amount Input
- Send a message requesting the amount to send.
- User replies with amount.
- Agent validates the amount against account balance and proceeds to Step 4.
Step 4: Transaction Summary & Approval
- Render the tx summary as Inline Buttons (Approve, Reject, Simulate):
{ "text": "📋 Transaction Summary\n\n💰 Account: myWallet\n📤 To: 0xabcd...ef01\n💵 Amount: 0.1 ETH\n⛽ Gas: ~0.001 ETH (sponsored)\n\nProceed?", "reply_markup": { "inline_keyboard": [ [ { "text": "✅ Approve", "callback_data": "tx_approve" }, { "text": "❌ Reject", "callback_data": "tx_reject" } ], [ { "text": "🔍 Simulate First", "callback_data": "tx_simulate" } ], [ { "text": "⬅️ Back", "callback_data": "menu_send" } ] ] } }
Step 5: Execution
- Upon
tx_approvecallback, runelytro tx sendand report result. - Upon
tx_rejectcallback, abort and return to Main Menu. - Upon
tx_simulatecallback, runelytro tx simulate, show gas estimate and paymaster availability, then re-display approval buttons.
Swap Flow (Inline Button Driven)
Step 1: Account Selection (if multiple accounts exist)
- Render
menu_accountsbuttons. - Upon
account_select_<alias>callback, proceed to Step 2.
Step 2: Token Pair Selection
- Render token list as Inline Buttons for "From" token.
- Upon
token_select_<fromToken>callback, render list for "To" token. - Upon second
token_select_<toToken>callback, proceed to Step 3.
Step 3: Amount Input
- Request swap amount from user (text input).
- User replies with amount.
- Proceed to Step 4.
Step 4: Price & Route Preview (via swap-planner)
- Invoke Uniswap swap-planner skill to fetch live price.
- Display swap route and estimated output:
{ "text": "🔄 Swap Preview\n\n💵 From: 0.5 ETH\n💎 To: ~1,200 USDC\n📊 Price: 1 ETH = 2400 USDC\n⛽ Gas: ~0.001 ETH (sponsored)\n\nReady to swap?", "reply_markup": { "inline_keyboard": [ [ { "text": "✅ Confirm Swap", "callback_data": "tx_approve" }, { "text": "❌ Cancel", "callback_data": "tx_reject" } ], [ { "text": "⬅️ Adjust Amount", "callback_data": "menu_swap" } ] ] } }
Step 5: Execution
- Upon
tx_approvecallback, open the Uniswap link (viaopencommand) for user to confirm in-wallet. - Report completion or error.
Transactions
Send (requires user confirmation)
# ⚠ STOP before confirming — ask the user first!
elytro tx send --tx "to:<address>,value:<ethAmount>,data:<hex>"
# Multiple calls in one UserOp (batched)
elytro tx send --tx "to:0xA,value:0.1,data:0x" --tx "to:0xB,value:0,data:0xcafe"
# Skip sponsorship (user pays gas)
elytro tx send --no-sponsor --tx "to:<address>,value:<ethAmount>,data:0x"
# Skip 2FA hook check
elytro tx send --no-hook --tx "to:<address>,value:<ethAmount>,data:0x"
# Send a pre-built UserOp
elytro tx send --userop '<userOpJson>'
Simulate (safe, no confirmation)
# Preview gas estimate and sponsor check without sending
elytro tx simulate --tx "to:<address>,value:<ethAmount>,data:<hex>"
Build unsigned UserOp (no send)
elytro tx build --tx "to:<address>,value:<ethAmount>,data:<hex>" <account>
Token Swaps (via Uniswap)
Elytro does not have a built-in swap command. To swap tokens, use the Uniswap swap-planner skill to generate a deep link, then open it — the user connects their Elytro wallet inside the Uniswap interface to confirm.
Required skill
skill: uniswap-driver / swap-planner
source: https://github.com/Uniswap/uniswap-ai/blob/main/packages/plugins/uniswap-driver/skills/swap-planner/SKILL.md
Invoke it via slash command or describe the intent:
/swap-planner
or simply say (contextual activation):
Swap 0.1 ETH for USDC on Base
Swap workflow
- Invoke swap-planner skill — gather token pair, amount, and chain.
- Skill generates a Uniswap deep link, e.g.:
https://app.uniswap.org/swap?chain=base&inputCurrency=NATIVE&outputCurrency=0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913&value=0.1&field=INPUT - Open the link in the browser (
open <url>on macOS,xdg-open <url>on Linux). - User connects their Elytro wallet in the Uniswap interface (WalletConnect or injected provider).
- User reviews and confirms the swap inside Uniswap — do NOT auto-confirm on their behalf.
Rules for swaps
- Never guess swap output amounts. The swap-planner skill fetches live prices via DexScreener/DefiLlama — always use it.
- Always verify token addresses before building the link. Scam tokens often mimic legitimate names.
- Disclose slippage and liquidity risk surfaced by the swap-planner skill before opening the URL.
- Elytro is ERC-4337 compatible with the Uniswap interface — no special configuration needed.
Example
# 1. User: "Swap 0.5 ETH for USDC on Arbitrum"
# 2. Invoke swap-planner — it resolves addresses, fetches price, generates link
# 3. Open link
open "https://app.uniswap.org/swap?chain=arbitrum&inputCurrency=NATIVE&outputCurrency=0xaf88d065e77c8cC2239327C5EDb3A432268e5831&value=0.5&field=INPUT"
# 4. Tell user: connect Elytro wallet in the Uniswap tab, review, and confirm.
Security / 2FA
# View current security status
elytro security status
# Install SecurityHook (2FA)
elytro security 2fa install --capability 2 # 1=SIGNATURE_ONLY, 2=USER_OP_ONLY, 3=BOTH
# Uninstall SecurityHook
elytro security 2fa uninstall
elytro security 2fa uninstall --force # Start force-uninstall countdown
elytro security 2fa uninstall --execute # Execute after safety delay
# Email OTP
elytro security email bind <email> # Bind email for OTP delivery
elytro security email change <email> # Change bound email
# Spending limit (USD/day)
elytro security spending-limit # View current limit
elytro security spending-limit 100 # Set to $100/day
Configuration
elytro config show # Show current endpoint config
elytro config set alchemy-key <apiKey> # Set Alchemy API key
elytro config set pimlico-key <apiKey> # Set Pimlico API key
elytro config remove alchemy-key # Remove key, revert to public endpoint
elytro config remove pimlico-key
Common Workflows
Check ETH balance
elytro query balance <account>
# Returns JSON: { "result": { "balance": "0.01", "symbol": "ETH", ... } }
Send ETH to an address
# Step 1: Simulate first (optional but recommended)
elytro tx simulate --tx "to:<toAddress>,value:<amount>,data:0x"
# Step 2: Send — PAUSE at confirmation prompt, ask user before proceeding
elytro tx send --tx "to:<toAddress>,value:<amount>,data:0x"
First-time full setup on Sepolia
elytro init
elytro account create --chain 0xaa36a7 --alias myWallet
elytro account activate myWallet
elytro account info myWallet # Verify Deployed: Yes
Confirmation Prompt Protocol (Inline Button Version)
Some commands are interactive and will pause for user input. All confirmations MUST use Telegram Inline Buttons, never plain text prompts.
| Command | Prompt | Action |
|---|---|---|
tx send |
Sign and send this transaction? (y/N) |
Send Inline Buttons: Approve (callback_data: tx_approve), Reject (callback_data: tx_reject), Simulate First (callback_data: tx_simulate) |
account activate |
activation confirmation | Send Inline Buttons: Activate Now (callback_data: confirm_yes), Cancel (callback_data: confirm_cancel) |
security 2fa uninstall |
uninstall confirmation | Send Inline Buttons: Uninstall 2FA (callback_data: confirm_yes), Keep 2FA (callback_data: confirm_no) |
Inline Button Template for Confirmations:
{
"text": "Transaction Summary:\n• To: 0x1234...5678\n• Amount: 0.5 ETH\n• Gas: ~0.001 ETH (sponsorship available)\n\nDo you approve this transaction?",
"reply_markup": {
"inline_keyboard": [
[
{ "text": "✅ Approve", "callback_data": "tx_approve" },
{ "text": "❌ Reject", "callback_data": "tx_reject" }
],
[
{ "text": "🔍 Simulate First", "callback_data": "tx_simulate" }
]
]
}
}
Rules:
- Never auto-confirm. Always surface the transaction summary and wait for explicit Inline Button approval.
- Callback handling: Upon receiving a callback (e.g.,
tx_approve), execute the corresponding action and report the result via another message (or update the existing message with the result). - Audit logging: Log every confirmation decision (approve/reject/simulate) with timestamp, callback_data, and user ID for compliance and troubleshooting.
Agent Implementation Checklist
When implementing Elytro wallet interactions, ensure:
- [ ] Ambiguous intent detection: When user says "open wallet", "打开钱包", "elytro", etc., immediately show Main Menu (Level 0) without asking.
- [ ] Real-time data fetching: Always run
elytro account list,elytro query balance, etc. before rendering UI. Never use placeholder data. - [ ] Inline Button rendering: All menus, lists, confirmations, and action flows use Telegram Inline Buttons exclusively.
- [ ] Back button on all sub-menus: Every screen below Main Menu includes a "⬅️ Back" button.
- [ ] Callback routing: Parse callbackdata prefixes (menu, accountselect, action*, tx, confirm_) and route to correct handler.
- [ ] Multi-step action flows: For Send and Swap, guide user through account → input → summary → approval steps using Inline Buttons.
- [ ] Audit logging: Log all callback events (callback_data, timestamp, user_id, action taken, result).
- [ ] Error handling: If a command fails (e.g.,
elytro tx sendreturns error), display error message with a "⬅️ Back" button to retry or return to menu.
Inter-Agent Communication & Inline Button Convention
All agents using the Elytro skill must follow this Inline Button standard to ensure seamless integration and user experience consistency.
Callback Data Naming Convention
Agents must adhere to the following callback_data format for cross-agent compatibility:
| Use Case | Callback Format | Example |
|---|---|---|
| Confirmations | confirm_yes, confirm_no, confirm_cancel |
{ "text": "Approve", "callback_data": "confirm_yes" } |
| Account Selection | account_select_<alias_or_address> |
{ "text": "myWallet", "callback_data": "account_select_myWallet" } |
| Token Selection | token_select_<tokenAddress_or_symbol> |
{ "text": "USDC", "callback_data": "token_select_0xA0b8..." } |
| Transaction Actions | tx_approve, tx_reject, tx_simulate |
{ "text": "Send", "callback_data": "tx_approve" } |
| Action Menu | action_<action_name> |
{ "text": "Send ETH", "callback_data": "action_send_eth" } |
For Other AI Agents Reading This Skill
Important: If you are another AI agent tasked with Elytro wallet operations:
- Always use Inline Buttons for confirmations and list displays — never fall back to text input prompts.
- Follow the callback_data naming convention above — this ensures consistency across all agents using Elytro.
- When displaying lists (accounts, tokens, transactions, etc.), render each item as a clickable button with the appropriate callback format.
- Upon receiving a callback, parse the callback_data and execute the corresponding action (e.g.,
confirm_yes→ proceed with tx,account_select_<alias>→ fetch account details). - Log all callback events for audit purposes: timestamp, user_id, callback_data, action taken, result.
- Update this section if you introduce new callback patterns — keep the standard extensible and well-documented for future agents.
Notes
- Elytro uses EIP-4337 (Account Abstraction) — transactions are submitted as UserOps via a Bundler, not regular EOA transactions.
- Sponsored transactions are gasless by default when a paymaster is available.
- The wallet data directory is
~/.elytro. --chainaccepts both hex (0xaa36a7) and decimal (11155111) chain IDs.datafield in tx spec must be a valid hex string; use0xfor plain ETH transfers.- Inline Button usage is mandatory for all user-facing confirmations and list displays in Elytro workflows. This ensures a consistent, modern UX across all agents and reduces friction in high-stakes wallet operations.