Elytro - Ethereum Wallet
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.
安装 / 下载方式
TotalClaw CLI推荐
totalclaw install clawskills:jayden-sudo~elytrocURL直接下载,无需登录
curl -fsSL https://skills.taituai.com/api/skills/clawskills%3Ajayden-sudo~elytro/file -o elytro.mdGit 仓库获取源码
git clone https://github.com/openclaw/skills/commit/dfec8b458343c7cb65bd19cda968342586db9de6# 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
1. **Never guess on-chain data.** Always run the appropriate `elytro query` command to fetch balances, transaction status, token holdings, etc. Do NOT infer or assume values.
2. **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 send` shows "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.**
3. **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.
4. **Chain IDs are hex or decimal.** Common values: Ethereum mainnet=`1`, Sepolia testnet=`0xaa36a7` (=11155111), Base=`8453`, Arbitrum=`42161`.
5. **`value` in tx specs is always in ETH**, not wei.
6. **Smart accounts must be deployed before sending transactions.** Check `elytro account info <account>` → "Deployed: Yes" before sending. If not deployed, run `elytro account activate <account>` first.
7. **Use alias or address interchangeably** wherever `<account>` appears.
8. **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.
9. **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:
```json
{
"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:
```json
{
"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 → run `elytro account info <alias>` and display account detail with action buttons:
```json
{
"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:
```json
{
"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:
```json
{
"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
1. **Always show the Main Menu when user intent is ambiguous.** Do not ask "what do you want to do?" — show the menu.
2. **Every sub-screen must include a "⬅️ Back" button** (callback_data: parent menu ID, e.g., `menu_main`, `menu_accounts`).
3. **Fetching real data is mandatory before rendering.** Run the corresponding `elytro` CLI command to get live data (accounts, balances, security status, config), then render buttons with actual values. Never use placeholder data in production.
4. **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.
5. **Callback routing**: parse the callback_data prefix to determine the handler:
- `menu_*` → render the corresponding sub-menu
- `account_select_*` → fetch and sh