From 88ff2004bd0311888b2c24fa79d4fee80b31e16a Mon Sep 17 00:00:00 2001 From: Francesco Andreoli Date: Thu, 2 Jul 2026 20:23:13 +0200 Subject: [PATCH 1/2] Update skills for CLI v3.2.0 - Bump cliVersion pin to 3.2.0 (metamask-agent-wallet 4.1.0 -> 4.2.0, metamask-agent-workflows 4.0.0 -> 4.1.0) so `mm doctor` no longer reports the skills as incompatible with the current CLI release - Document confirmation prompts on `mm logout` and `mm reset` and the new `--yes` flag for non-interactive use (CLI 3.2.0) - Update QR login notes: `mm login qr` is now available in production (CLI 3.1.0), no longer returns COMING_SOON - Update README CLI version reference Co-Authored-By: Claude Fable 5 --- README.md | 2 +- skills/metamask-agent-wallet/SKILL.md | 8 ++++---- .../metamask-agent-wallet/references/auth.md | 20 ++++++++++++------- .../metamask-agent-wallet/workflows/login.md | 2 +- .../workflows/troubleshooting.md | 2 +- skills/metamask-agent-workflows/SKILL.md | 8 ++++---- .../workflows/login.md | 2 +- .../workflows/troubleshooting.md | 2 +- 8 files changed, 26 insertions(+), 20 deletions(-) diff --git a/README.md b/README.md index 2f282f2..1486f1a 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # MetaMask Agent CLI Skills -SKILLs for the MetaMask Agent CLI (`@metamask/agentic-cli` v3.0.0). These skills enable AI agents to authenticate, manage wallets, swap tokens, bridge across chains, trade perpetual futures, and more using the MetaMask Agent CLI. +SKILLs for the MetaMask Agent CLI (`@metamask/agentic-cli` v3.2.0). These skills enable AI agents to authenticate, manage wallets, swap tokens, bridge across chains, trade perpetual futures, and more using the MetaMask Agent CLI. ## Skills diff --git a/skills/metamask-agent-wallet/SKILL.md b/skills/metamask-agent-wallet/SKILL.md index 6b35c37..03c7c81 100644 --- a/skills/metamask-agent-wallet/SKILL.md +++ b/skills/metamask-agent-wallet/SKILL.md @@ -4,8 +4,8 @@ description: Use when the user asks anything about blockchain wallets, transacti license: MIT metadata: author: metamask - version: "4.1.0" - cliVersion: "3.0.0" + version: "4.2.0" + cliVersion: "3.2.0" --- # MetaMask Agentic CLI Skill @@ -155,7 +155,7 @@ Run these checks before the first CLI operation in a session, in order. ### 1. Version compatibility -This skill is written for `@metamask/agentic-cli` **v3.0.0** (see `cliVersion` in the frontmatter). Check the installed version: +This skill is written for `@metamask/agentic-cli` **v3.2.0** (see `cliVersion` in the frontmatter). Check the installed version: ```bash mm --version @@ -169,7 +169,7 @@ npm view @metamask/agentic-cli version If the installed `major.minor` differs from the pinned `cliVersion`, or the installed version is behind the latest release, warn the user once and continue: -> Version mismatch: installed CLI ``, this skill is pinned to `3.0.0`, latest release is ``. Command syntax in this skill may be inaccurate until they are aligned. Update the CLI with `npm install -g @metamask/agentic-cli@latest`, then re-install the skills with `npx skills add metaMask/agent-skills`. +> Version mismatch: installed CLI ``, this skill is pinned to `3.2.0`, latest release is ``. Command syntax in this skill may be inaccurate until they are aligned. Update the CLI with `npm install -g @metamask/agentic-cli@latest`, then re-install the skills with `npx skills add metaMask/agent-skills`. Run this check once per session. Do not block operations on it. diff --git a/skills/metamask-agent-wallet/references/auth.md b/skills/metamask-agent-wallet/references/auth.md index 2f684c1..2aa5bb0 100644 --- a/skills/metamask-agent-wallet/references/auth.md +++ b/skills/metamask-agent-wallet/references/auth.md @@ -86,7 +86,7 @@ mm login --token "cliToken:cliRefreshToken" ### Note - If already authenticated, the CLI returns `ALREADY_AUTHENTICATED`. Run `mm logout` first, then log in again. -- `mm login qr` (scan with MetaMask Mobile) is available on non-production builds (dev/uat). On production it returns `COMING_SOON`; use browser sign-in instead. +- `mm login qr` (scan with MetaMask Mobile) is available on all environments, including production. - Pairing codes tolerate `-` and whitespace separators (e.g. `608-225` is equivalent to `608225`). - Use `mm login browser --no-wait` for non-interactive/CI flows. The command prints a sign-in URL; the user completes login in the browser (Google or Email). Bare `mm login --no-wait` fails without a TTY because no method is selected. - `--no-wait` is not supported with QR login. Complete authentication later with `mm login --token`. @@ -115,22 +115,25 @@ mm auth status --toon ## `logout` Command -Sign out and clear auth credentials plus local init state, wallet selection, and stored BYOK mnemonic. +Sign out and clear auth credentials plus local init state, wallet selection, and stored BYOK mnemonic. Prompts for confirmation before signing out. ### Syntax ```bash -mm logout +mm logout [--yes] ``` ### Supported Flags -This command does not support flags. +| Name | Required | Description | +| --- | --- | --- | +| `--yes` | No | Skip the confirmation prompt (for non-interactive/scripted use) | ### Example ```bash mm logout +mm logout --yes ``` ## `config get` Command @@ -204,22 +207,25 @@ mm config set format toon ## `reset` Command -Clear the local CLI session entirely, including auth credentials, wallet state, mnemonic, swap quotes, and persisted config. +Clear the local CLI session entirely, including auth credentials, wallet state, mnemonic, swap quotes, and persisted config. Prompts for confirmation before resetting. ### Syntax ```bash -mm reset +mm reset [--yes] ``` ### Supported Flags -This command does not support flags. +| Name | Required | Description | +| --- | --- | --- | +| `--yes` | No | Skip the confirmation prompt (for non-interactive/scripted use) | ### Example ```bash mm reset +mm reset --yes ``` ## `wallet password set` Command diff --git a/skills/metamask-agent-wallet/workflows/login.md b/skills/metamask-agent-wallet/workflows/login.md index 8084561..05f7541 100644 --- a/skills/metamask-agent-wallet/workflows/login.md +++ b/skills/metamask-agent-wallet/workflows/login.md @@ -20,7 +20,7 @@ mm login browser --no-wait The command prints a sign-in URL. The user opens it in a browser and chooses Google or Email to complete sign-in. -`mm login qr` (scan with MetaMask Mobile) is available on non-production builds (dev/uat); on production it returns `COMING_SOON`. QR login keeps the CLI attached to the relay, so it does not support `--no-wait`. +`mm login qr` (scan with MetaMask Mobile) is available on all environments, including production. QR login keeps the CLI attached to the relay, so it does not support `--no-wait`. ## Verify diff --git a/skills/metamask-agent-wallet/workflows/troubleshooting.md b/skills/metamask-agent-wallet/workflows/troubleshooting.md index ebe5983..566e86d 100644 --- a/skills/metamask-agent-wallet/workflows/troubleshooting.md +++ b/skills/metamask-agent-wallet/workflows/troubleshooting.md @@ -48,4 +48,4 @@ For raw error-code meanings, load `../references/errors.md`. Relay CLI errors ve ## Reset Last -Use `mm reset` only after checking version, auth status, and the failing command's help output. Reset clears local session state and should not be the first troubleshooting step. Always ask the user for explicit confirmation before running reset. +Use `mm reset` only after checking version, auth status, and the failing command's help output. Reset clears local session state and should not be the first troubleshooting step. Always ask the user for explicit confirmation before running reset. The command itself also prompts for confirmation; pass `--yes` to skip the prompt in non-interactive sessions. diff --git a/skills/metamask-agent-workflows/SKILL.md b/skills/metamask-agent-workflows/SKILL.md index 1ae328e..5a3c273 100644 --- a/skills/metamask-agent-workflows/SKILL.md +++ b/skills/metamask-agent-workflows/SKILL.md @@ -4,8 +4,8 @@ description: Use when the user needs to perform multi-step operations with the M license: MIT metadata: author: metamask - version: "4.0.0" - cliVersion: "3.0.0" + version: "4.1.0" + cliVersion: "3.2.0" --- # MetaMask Agent Workflows @@ -47,7 +47,7 @@ Run these checks before the first CLI operation in a session, in order. ### 1. Version compatibility -This skill is written for `@metamask/agentic-cli` **v3.0.0** (see `cliVersion` in the frontmatter). Check the installed version: +This skill is written for `@metamask/agentic-cli` **v3.2.0** (see `cliVersion` in the frontmatter). Check the installed version: ```bash mm --version @@ -61,7 +61,7 @@ npm view @metamask/agentic-cli version If the installed `major.minor` differs from the pinned `cliVersion`, or the installed version is behind the latest release, warn the user once and continue: -> Version mismatch: installed CLI ``, this skill is pinned to `3.0.0`, latest release is ``. Command syntax in this skill may be inaccurate until they are aligned. Update the CLI with `npm install -g @metamask/agentic-cli@latest`, then re-install the skills with `npx skills add metaMask/agent-skills`. +> Version mismatch: installed CLI ``, this skill is pinned to `3.2.0`, latest release is ``. Command syntax in this skill may be inaccurate until they are aligned. Update the CLI with `npm install -g @metamask/agentic-cli@latest`, then re-install the skills with `npx skills add metaMask/agent-skills`. Run this check once per session. Do not block operations on it. diff --git a/skills/metamask-agent-workflows/workflows/login.md b/skills/metamask-agent-workflows/workflows/login.md index 6dde959..2d84042 100644 --- a/skills/metamask-agent-workflows/workflows/login.md +++ b/skills/metamask-agent-workflows/workflows/login.md @@ -20,7 +20,7 @@ mm login browser --no-wait The command prints a sign-in URL. The user opens it in a browser and chooses Google or Email to complete sign-in. -`mm login qr` (scan with MetaMask Mobile) is available on non-production builds (dev/uat); on production it returns `COMING_SOON`. QR login keeps the CLI attached to the relay, so it does not support `--no-wait`. +`mm login qr` (scan with MetaMask Mobile) is available on all environments, including production. QR login keeps the CLI attached to the relay, so it does not support `--no-wait`. ## Verify diff --git a/skills/metamask-agent-workflows/workflows/troubleshooting.md b/skills/metamask-agent-workflows/workflows/troubleshooting.md index ebe5983..566e86d 100644 --- a/skills/metamask-agent-workflows/workflows/troubleshooting.md +++ b/skills/metamask-agent-workflows/workflows/troubleshooting.md @@ -48,4 +48,4 @@ For raw error-code meanings, load `../references/errors.md`. Relay CLI errors ve ## Reset Last -Use `mm reset` only after checking version, auth status, and the failing command's help output. Reset clears local session state and should not be the first troubleshooting step. Always ask the user for explicit confirmation before running reset. +Use `mm reset` only after checking version, auth status, and the failing command's help output. Reset clears local session state and should not be the first troubleshooting step. Always ask the user for explicit confirmation before running reset. The command itself also prompts for confirmation; pass `--yes` to skip the prompt in non-interactive sessions. From cade6288b7e70d5b026d71d307dfa9364cf57b99 Mon Sep 17 00:00:00 2001 From: AyushBherwani1998 Date: Fri, 3 Jul 2026 15:59:40 +0400 Subject: [PATCH 2/2] update SKILLs --- README.md | 2 +- skills/metamask-agent-wallet/SKILL.md | 14 +++++------ .../metamask-agent-wallet/references/auth.md | 11 +++++---- .../references/wallet.md | 2 +- .../workflows/aave-borrow.md | 22 ++++++++++-------- .../workflows/aave-collateral.md | 22 ++++++++++-------- .../workflows/aave-markets.md | 17 ++++---------- .../workflows/aave-positions.md | 23 +++++++++---------- .../workflows/aave-repay.md | 22 ++++++++++-------- .../workflows/aave-supply.md | 22 ++++++++++-------- .../workflows/aave-withdraw.md | 22 ++++++++++-------- .../workflows/onboarding.md | 8 +++---- skills/metamask-agent-workflows/SKILL.md | 8 +++---- .../workflows/aave-borrow.md | 22 ++++++++++-------- .../workflows/aave-collateral.md | 22 ++++++++++-------- .../workflows/aave-markets.md | 17 ++++---------- .../workflows/aave-positions.md | 23 +++++++++---------- .../workflows/aave-repay.md | 22 ++++++++++-------- .../workflows/aave-supply.md | 22 ++++++++++-------- .../workflows/aave-withdraw.md | 22 ++++++++++-------- 20 files changed, 175 insertions(+), 170 deletions(-) diff --git a/README.md b/README.md index 1486f1a..16b06c0 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # MetaMask Agent CLI Skills -SKILLs for the MetaMask Agent CLI (`@metamask/agentic-cli` v3.2.0). These skills enable AI agents to authenticate, manage wallets, swap tokens, bridge across chains, trade perpetual futures, and more using the MetaMask Agent CLI. +SKILLs for the MetaMask Agent CLI (`@metamask/agentic-cli` v4.0.0). These skills enable AI agents to authenticate, manage wallets, swap tokens, bridge across chains, trade perpetual futures, and more using the MetaMask Agent CLI. ## Skills diff --git a/skills/metamask-agent-wallet/SKILL.md b/skills/metamask-agent-wallet/SKILL.md index 03c7c81..79b6e32 100644 --- a/skills/metamask-agent-wallet/SKILL.md +++ b/skills/metamask-agent-wallet/SKILL.md @@ -4,8 +4,8 @@ description: Use when the user asks anything about blockchain wallets, transacti license: MIT metadata: author: metamask - version: "4.2.0" - cliVersion: "3.2.0" + version: "5.0.0" + cliVersion: "4.0.0" --- # MetaMask Agentic CLI Skill @@ -155,7 +155,7 @@ Run these checks before the first CLI operation in a session, in order. ### 1. Version compatibility -This skill is written for `@metamask/agentic-cli` **v3.2.0** (see `cliVersion` in the frontmatter). Check the installed version: +This skill is written for `@metamask/agentic-cli` **v4.0.0** (see `cliVersion` in the frontmatter). Check the installed version: ```bash mm --version @@ -169,7 +169,7 @@ npm view @metamask/agentic-cli version If the installed `major.minor` differs from the pinned `cliVersion`, or the installed version is behind the latest release, warn the user once and continue: -> Version mismatch: installed CLI ``, this skill is pinned to `3.2.0`, latest release is ``. Command syntax in this skill may be inaccurate until they are aligned. Update the CLI with `npm install -g @metamask/agentic-cli@latest`, then re-install the skills with `npx skills add metaMask/agent-skills`. +> Version mismatch: installed CLI ``, this skill is pinned to `4.0.0`, latest release is ``. Command syntax in this skill may be inaccurate until they are aligned. Update the CLI with `npm install -g @metamask/agentic-cli@latest`, then re-install the skills with `npx skills add metaMask/agent-skills`. Run this check once per session. Do not block operations on it. @@ -262,15 +262,15 @@ Flag to the user before proceeding if a signing payload or transaction contains: When raw calldata is unfamiliar or was not constructed by you, run `mm decode --payload <0x-calldata>` first and confirm the decoded intent with the user before signing or sending. See [decode.md](references/decode.md). -## Server Wallet Async Model +## Async Model -In server-wallet mode, signing and transaction commands return a `pollingId` instead of an immediate result. Handle this consistently: +In both server-wallet and BYOK mode, signing and transaction commands go through a job-polling loop and return a `pollingId`. Handle this consistently: 1. Prefer `--wait` to block until complete. 2. If not using `--wait`, inform the user of the `pollingId` and how to track it: - `mm wallet requests list` - `mm wallet requests watch --polling-id ` -3. In BYOK mode, results are returned immediately. If the mnemonic is password-encrypted, the user must set `MM_PASSWORD` environment variable to unlock it for the operation. +3. In BYOK mode, the local key signs locally but the operation still produces a pending job and a `pollingId`. If the mnemonic is password-encrypted, the user must set `MM_PASSWORD` environment variable to unlock it for the operation. Transfers, swaps, perps, predict orders, and predict withdraws attach a human-readable `intent` summary to their wallet request (e.g. `Transfer 0.5 ETH to 0x...`, `Withdraw 10 pUSD to 0x...`). When surfacing a pending request from `wallet requests list` or `wallet requests watch`, show the `intent` summary so the user can confirm what they are approving. diff --git a/skills/metamask-agent-wallet/references/auth.md b/skills/metamask-agent-wallet/references/auth.md index 2aa5bb0..6126991 100644 --- a/skills/metamask-agent-wallet/references/auth.md +++ b/skills/metamask-agent-wallet/references/auth.md @@ -17,7 +17,7 @@ mm init [--wallet ] [--mode ] [--mnemonic ] [--password ] [--mode ] [--mnemonic ] [--password ] [--name ] [--trading-mode | --- | --- | --- | | `--chain-namespace` | No | Wallet chain namespace: `evm` (EIP-155) (allowed: `evm`) | | `--name` | No | Display name for the wallet | -| `--trading-mode` | No | `guard` enforces outflow/whitelist policies and blocks malicious transactions. `beast` skips policy checks but still blocks malicious transactions. Only applies to server-wallet mode (allowed: `guard`, `beast`) | +| `--trading-mode` | No | `guard` enforces outflow/whitelist policies and blocks malicious transactions. `beast` skips policy checks but still blocks malicious transactions (allowed: `guard`, `beast`) | | `--password` | No | Password to unlock the BYOK mnemonic (BYOK mode only) [env: `MM_PASSWORD`] | ### Example diff --git a/skills/metamask-agent-wallet/workflows/aave-borrow.md b/skills/metamask-agent-wallet/workflows/aave-borrow.md index 08372dc..40ff6cc 100644 --- a/skills/metamask-agent-wallet/workflows/aave-borrow.md +++ b/skills/metamask-agent-wallet/workflows/aave-borrow.md @@ -11,16 +11,18 @@ Use this workflow to borrow assets from Aave V3 against supplied collateral. ## Resolve chain and addresses -If the user doesn't specify a chain, ask. Look up the pool address: - -| Chain | Chain ID | Pool address | -| --- | --- | --- | -| Ethereum | 1 | `0x87870Bca3F3fD6335C3F4ce8392D69350B4fA4E2` | -| Polygon | 137 | `0x794a61358D6845594F94dc1DB02A252b5b4814aD` | -| Arbitrum | 42161 | `0x794a61358D6845594F94dc1DB02A252b5b4814aD` | -| Optimism | 10 | `0x794a61358D6845594F94dc1DB02A252b5b4814aD` | -| Avalanche | 43114 | `0x794a61358D6845594F94dc1DB02A252b5b4814aD` | -| Base | 8453 | `0x794a61358D6845594F94dc1DB02A252b5b4814aD` | +If the user doesn't specify a chain, ask. Fetch the available markets for the chain from the Aave API to get pool addresses: + +```bash +curl -s -X POST https://api.v3.aave.com/graphql \ + -H 'Content-Type: application/json' \ + -d '{"query":"{ markets(request: { chainIds: [] }) { address reserves { underlyingToken { symbol } } } }"}' +``` + +Each entry in the response is a separate Aave V3 market. Extract `address` from each — this is the pool contract address. + +- If one market is returned, use its `address` as ``. +- If multiple markets are returned, present them to the user (showing the `address` and up to 5 representative token symbols from `reserves[].underlyingToken.symbol`) and ask which market they want to interact with. ## Check collateral diff --git a/skills/metamask-agent-wallet/workflows/aave-collateral.md b/skills/metamask-agent-wallet/workflows/aave-collateral.md index 70df584..afa968e 100644 --- a/skills/metamask-agent-wallet/workflows/aave-collateral.md +++ b/skills/metamask-agent-wallet/workflows/aave-collateral.md @@ -11,16 +11,18 @@ Use this workflow to enable or disable an asset as collateral on Aave V3. ## Resolve chain and addresses -If the user doesn't specify a chain, ask. Look up the pool address: - -| Chain | Chain ID | Pool address | -| --- | --- | --- | -| Ethereum | 1 | `0x87870Bca3F3fD6335C3F4ce8392D69350B4fA4E2` | -| Polygon | 137 | `0x794a61358D6845594F94dc1DB02A252b5b4814aD` | -| Arbitrum | 42161 | `0x794a61358D6845594F94dc1DB02A252b5b4814aD` | -| Optimism | 10 | `0x794a61358D6845594F94dc1DB02A252b5b4814aD` | -| Avalanche | 43114 | `0x794a61358D6845594F94dc1DB02A252b5b4814aD` | -| Base | 8453 | `0x794a61358D6845594F94dc1DB02A252b5b4814aD` | +If the user doesn't specify a chain, ask. Fetch the available markets for the chain from the Aave API to get pool addresses: + +```bash +curl -s -X POST https://api.v3.aave.com/graphql \ + -H 'Content-Type: application/json' \ + -d '{"query":"{ markets(request: { chainIds: [] }) { address reserves { underlyingToken { symbol } } } }"}' +``` + +Each entry in the response is a separate Aave V3 market. Extract `address` from each — this is the pool contract address. + +- If one market is returned, use its `address` as ``. +- If multiple markets are returned, present them to the user (showing the `address` and up to 5 representative token symbols from `reserves[].underlyingToken.symbol`) and ask which market they want to interact with. ## Check status diff --git a/skills/metamask-agent-wallet/workflows/aave-markets.md b/skills/metamask-agent-wallet/workflows/aave-markets.md index 4b791c4..0b4705a 100644 --- a/skills/metamask-agent-wallet/workflows/aave-markets.md +++ b/skills/metamask-agent-wallet/workflows/aave-markets.md @@ -10,16 +10,7 @@ Use this workflow to discover available Aave V3 tokens, supply/borrow rates, and ## Resolve chain -If the user doesn't specify a chain, ask. Aave V3 is deployed on these chains: - -| Chain | Chain ID | -| --- | --- | -| Ethereum | 1 | -| Polygon | 137 | -| Arbitrum | 42161 | -| Optimism | 10 | -| Avalanche | 43114 | -| Base | 8453 | +If the user doesn't specify a chain, ask. ## Query available markets @@ -27,13 +18,15 @@ If the user doesn't specify a chain, ask. Aave V3 is deployed on these chains: curl -s -X POST https://api.v3.aave.com/graphql \ -H 'Content-Type: application/json' \ -d '{ - "query": "{ markets(request: { chainIds: [] }) { reserves { underlyingToken { symbol decimals } supplyInfo { apy { formatted } } borrowInfo { apy { formatted } availableLiquidity { amount { value } usd } borrowCapReached } isFrozen isPaused } } }" + "query": "{ markets(request: { chainIds: [] }) { address reserves { underlyingToken { symbol decimals } supplyInfo { apy { formatted } } borrowInfo { apy { formatted } availableLiquidity { amount { value } usd } borrowCapReached } isFrozen isPaused } } }" }' ``` +The response returns one entry per market. Each entry has an `address` (the pool contract address) and a `reserves` array. + ## Present results -Filter out reserves where `isFrozen` or `isPaused` is `true`. For each active reserve, show: +Group reserves by market `address`. Within each market, filter out reserves where `isFrozen` or `isPaused` is `true`. For each active reserve, show: - Token symbol and decimals (`underlyingToken.symbol`, `underlyingToken.decimals`) - Supply APY (`supplyInfo.apy.formatted`) diff --git a/skills/metamask-agent-wallet/workflows/aave-positions.md b/skills/metamask-agent-wallet/workflows/aave-positions.md index cae93a2..d65a5bb 100644 --- a/skills/metamask-agent-wallet/workflows/aave-positions.md +++ b/skills/metamask-agent-wallet/workflows/aave-positions.md @@ -16,30 +16,29 @@ Get the wallet address: mm wallet address ``` -If the user doesn't specify a chain, ask. Aave V3 is deployed on these chains: +If the user doesn't specify a chain, ask. Fetch all markets for the chain to get pool addresses: -| Chain | Chain ID | Pool address | -| --- | --- | --- | -| Ethereum | 1 | `0x87870Bca3F3fD6335C3F4ce8392D69350B4fA4E2` | -| Polygon | 137 | `0x794a61358D6845594F94dc1DB02A252b5b4814aD` | -| Arbitrum | 42161 | `0x794a61358D6845594F94dc1DB02A252b5b4814aD` | -| Optimism | 10 | `0x794a61358D6845594F94dc1DB02A252b5b4814aD` | -| Avalanche | 43114 | `0x794a61358D6845594F94dc1DB02A252b5b4814aD` | -| Base | 8453 | `0x794a61358D6845594F94dc1DB02A252b5b4814aD` | +```bash +curl -s -X POST https://api.v3.aave.com/graphql \ + -H 'Content-Type: application/json' \ + -d '{"query":"{ markets(request: { chainIds: [] }) { address } }"}' +``` + +Collect all returned `address` values as ``. ## Query positions -Query supply and borrow positions in a single request: +Query supply and borrow positions across all markets in a single request. Build the `markets` array from all addresses returned above: ```bash curl -s -X POST https://api.v3.aave.com/graphql \ -H 'Content-Type: application/json' \ -d '{ - "query": "{ userSupplies(request: { markets: [{ address: \"\", chainId: }], user: \"\" }) { currency { symbol decimals } balance { amount { value } usd } apy { formatted } isCollateral } userBorrows(request: { markets: [{ address: \"\", chainId: }], user: \"\" }) { currency { symbol decimals } debt { amount { value } usd } apy { formatted } } }" + "query": "{ userSupplies(request: { markets: [{ address: \"\", chainId: }, { address: \"\", chainId: }], user: \"\" }) { currency { symbol decimals } balance { amount { value } usd } apy { formatted } isCollateral marketAddress } userBorrows(request: { markets: [{ address: \"\", chainId: }, { address: \"\", chainId: }], user: \"\" }) { currency { symbol decimals } debt { amount { value } usd } apy { formatted } marketAddress } }" }' ``` -The response contains both `userSupplies` and `userBorrows` arrays. +Include one `{ address, chainId }` entry per market returned by the previous query. The response contains both `userSupplies` and `userBorrows` arrays spanning all markets. ## Health factor preview diff --git a/skills/metamask-agent-wallet/workflows/aave-repay.md b/skills/metamask-agent-wallet/workflows/aave-repay.md index ac458a6..11a830c 100644 --- a/skills/metamask-agent-wallet/workflows/aave-repay.md +++ b/skills/metamask-agent-wallet/workflows/aave-repay.md @@ -11,16 +11,18 @@ Use this workflow to repay borrowed assets on Aave V3. ## Resolve chain and addresses -If the user doesn't specify a chain, ask. Look up the pool address: - -| Chain | Chain ID | Pool address | -| --- | --- | --- | -| Ethereum | 1 | `0x87870Bca3F3fD6335C3F4ce8392D69350B4fA4E2` | -| Polygon | 137 | `0x794a61358D6845594F94dc1DB02A252b5b4814aD` | -| Arbitrum | 42161 | `0x794a61358D6845594F94dc1DB02A252b5b4814aD` | -| Optimism | 10 | `0x794a61358D6845594F94dc1DB02A252b5b4814aD` | -| Avalanche | 43114 | `0x794a61358D6845594F94dc1DB02A252b5b4814aD` | -| Base | 8453 | `0x794a61358D6845594F94dc1DB02A252b5b4814aD` | +If the user doesn't specify a chain, ask. Fetch the available markets for the chain from the Aave API to get pool addresses: + +```bash +curl -s -X POST https://api.v3.aave.com/graphql \ + -H 'Content-Type: application/json' \ + -d '{"query":"{ markets(request: { chainIds: [] }) { address reserves { underlyingToken { symbol } } } }"}' +``` + +Each entry in the response is a separate Aave V3 market. Extract `address` from each — this is the pool contract address. + +- If one market is returned, use its `address` as ``. +- If multiple markets are returned, present them to the user (showing the `address` and up to 5 representative token symbols from `reserves[].underlyingToken.symbol`) and ask which market they want to interact with. ## Check debt diff --git a/skills/metamask-agent-wallet/workflows/aave-supply.md b/skills/metamask-agent-wallet/workflows/aave-supply.md index 1e914d2..7a1f749 100644 --- a/skills/metamask-agent-wallet/workflows/aave-supply.md +++ b/skills/metamask-agent-wallet/workflows/aave-supply.md @@ -11,16 +11,18 @@ Use this workflow to supply (deposit) assets into Aave V3 and earn interest. ## Resolve chain and addresses -If the user doesn't specify a chain, ask. Look up the pool address: - -| Chain | Chain ID | Pool address | -| --- | --- | --- | -| Ethereum | 1 | `0x87870Bca3F3fD6335C3F4ce8392D69350B4fA4E2` | -| Polygon | 137 | `0x794a61358D6845594F94dc1DB02A252b5b4814aD` | -| Arbitrum | 42161 | `0x794a61358D6845594F94dc1DB02A252b5b4814aD` | -| Optimism | 10 | `0x794a61358D6845594F94dc1DB02A252b5b4814aD` | -| Avalanche | 43114 | `0x794a61358D6845594F94dc1DB02A252b5b4814aD` | -| Base | 8453 | `0x794a61358D6845594F94dc1DB02A252b5b4814aD` | +If the user doesn't specify a chain, ask. Fetch the available markets for the chain from the Aave API to get pool addresses: + +```bash +curl -s -X POST https://api.v3.aave.com/graphql \ + -H 'Content-Type: application/json' \ + -d '{"query":"{ markets(request: { chainIds: [] }) { address reserves { underlyingToken { symbol } } } }"}' +``` + +Each entry in the response is a separate Aave V3 market. Extract `address` from each — this is the pool contract address. + +- If one market is returned, use its `address` as ``. +- If multiple markets are returned, present them to the user (showing the `address` and up to 5 representative token symbols from `reserves[].underlyingToken.symbol`) and ask which market they want to interact with. Resolve the asset's contract address on the target chain. If the user provides a symbol instead of an address, run `mm token list search --query --chain `. diff --git a/skills/metamask-agent-wallet/workflows/aave-withdraw.md b/skills/metamask-agent-wallet/workflows/aave-withdraw.md index d8ebde8..6c4dd11 100644 --- a/skills/metamask-agent-wallet/workflows/aave-withdraw.md +++ b/skills/metamask-agent-wallet/workflows/aave-withdraw.md @@ -11,16 +11,18 @@ Use this workflow to withdraw supplied assets from Aave V3. ## Resolve chain and addresses -If the user doesn't specify a chain, ask. Look up the pool address: - -| Chain | Chain ID | Pool address | -| --- | --- | --- | -| Ethereum | 1 | `0x87870Bca3F3fD6335C3F4ce8392D69350B4fA4E2` | -| Polygon | 137 | `0x794a61358D6845594F94dc1DB02A252b5b4814aD` | -| Arbitrum | 42161 | `0x794a61358D6845594F94dc1DB02A252b5b4814aD` | -| Optimism | 10 | `0x794a61358D6845594F94dc1DB02A252b5b4814aD` | -| Avalanche | 43114 | `0x794a61358D6845594F94dc1DB02A252b5b4814aD` | -| Base | 8453 | `0x794a61358D6845594F94dc1DB02A252b5b4814aD` | +If the user doesn't specify a chain, ask. Fetch the available markets for the chain from the Aave API to get pool addresses: + +```bash +curl -s -X POST https://api.v3.aave.com/graphql \ + -H 'Content-Type: application/json' \ + -d '{"query":"{ markets(request: { chainIds: [] }) { address reserves { underlyingToken { symbol } } } }"}' +``` + +Each entry in the response is a separate Aave V3 market. Extract `address` from each — this is the pool contract address. + +- If one market is returned, use its `address` as ``. +- If multiple markets are returned, present them to the user (showing the `address` and up to 5 representative token symbols from `reserves[].underlyingToken.symbol`) and ask which market they want to interact with. ## Check positions diff --git a/skills/metamask-agent-wallet/workflows/onboarding.md b/skills/metamask-agent-wallet/workflows/onboarding.md index 3537c3e..94d8041 100644 --- a/skills/metamask-agent-wallet/workflows/onboarding.md +++ b/skills/metamask-agent-wallet/workflows/onboarding.md @@ -52,13 +52,13 @@ mm doctor If `initialized` is `true`, skip this step. -For server-wallet mode, if the account already has a remote wallet, `mm init` syncs it and reuses the existing trading mode — no trading-mode prompt. +For server-wallet mode, if the account already has a remote wallet, `mm init` syncs it and reuses the existing trading mode — no trading-mode prompt. For BYOK mode, if a trading mode is already set server-side for the wallet, it is loaded without prompting. Otherwise, ask the user which wallet mode they want: - `server-wallet` (recommended) — keys are hosted by MetaMask infrastructure. No need to manage private keys or mnemonics. - `byok` — bring your own mnemonic. The user manages their own keys locally. -Ask the user which trading mode they want (server-wallet only): +Ask the user which trading mode they want (applies to both server-wallet and BYOK): - `guard` — enforces outflow and whitelist policies. When a policy is violated, the CLI requires MFA confirmation before proceeding. - `beast` — skips all policy checks and confirmations. Useful for scripting or experienced users who want faster execution. @@ -74,7 +74,7 @@ Never pass `--mnemonic` or `--password` as inline flags. Always instruct the use ```bash export MM_MNEMONIC="word1 word2 ..." -mm init --wallet byok +mm init --wallet byok --mode guard ``` If the user wants to encrypt their mnemonic with a password during init: @@ -82,7 +82,7 @@ If the user wants to encrypt their mnemonic with a password during init: ```bash export MM_MNEMONIC="word1 word2 ..." export MM_PASSWORD="mypassword" -mm init --wallet byok +mm init --wallet byok --mode guard ``` If the mnemonic was stored unencrypted, suggest setting a password afterward: diff --git a/skills/metamask-agent-workflows/SKILL.md b/skills/metamask-agent-workflows/SKILL.md index 5a3c273..7a2142d 100644 --- a/skills/metamask-agent-workflows/SKILL.md +++ b/skills/metamask-agent-workflows/SKILL.md @@ -4,8 +4,8 @@ description: Use when the user needs to perform multi-step operations with the M license: MIT metadata: author: metamask - version: "4.1.0" - cliVersion: "3.2.0" + version: "5.0.0" + cliVersion: "4.0.0" --- # MetaMask Agent Workflows @@ -47,7 +47,7 @@ Run these checks before the first CLI operation in a session, in order. ### 1. Version compatibility -This skill is written for `@metamask/agentic-cli` **v3.2.0** (see `cliVersion` in the frontmatter). Check the installed version: +This skill is written for `@metamask/agentic-cli` **v4.0.0** (see `cliVersion` in the frontmatter). Check the installed version: ```bash mm --version @@ -61,7 +61,7 @@ npm view @metamask/agentic-cli version If the installed `major.minor` differs from the pinned `cliVersion`, or the installed version is behind the latest release, warn the user once and continue: -> Version mismatch: installed CLI ``, this skill is pinned to `3.2.0`, latest release is ``. Command syntax in this skill may be inaccurate until they are aligned. Update the CLI with `npm install -g @metamask/agentic-cli@latest`, then re-install the skills with `npx skills add metaMask/agent-skills`. +> Version mismatch: installed CLI ``, this skill is pinned to `4.0.0`, latest release is ``. Command syntax in this skill may be inaccurate until they are aligned. Update the CLI with `npm install -g @metamask/agentic-cli@latest`, then re-install the skills with `npx skills add metaMask/agent-skills`. Run this check once per session. Do not block operations on it. diff --git a/skills/metamask-agent-workflows/workflows/aave-borrow.md b/skills/metamask-agent-workflows/workflows/aave-borrow.md index 08372dc..40ff6cc 100644 --- a/skills/metamask-agent-workflows/workflows/aave-borrow.md +++ b/skills/metamask-agent-workflows/workflows/aave-borrow.md @@ -11,16 +11,18 @@ Use this workflow to borrow assets from Aave V3 against supplied collateral. ## Resolve chain and addresses -If the user doesn't specify a chain, ask. Look up the pool address: - -| Chain | Chain ID | Pool address | -| --- | --- | --- | -| Ethereum | 1 | `0x87870Bca3F3fD6335C3F4ce8392D69350B4fA4E2` | -| Polygon | 137 | `0x794a61358D6845594F94dc1DB02A252b5b4814aD` | -| Arbitrum | 42161 | `0x794a61358D6845594F94dc1DB02A252b5b4814aD` | -| Optimism | 10 | `0x794a61358D6845594F94dc1DB02A252b5b4814aD` | -| Avalanche | 43114 | `0x794a61358D6845594F94dc1DB02A252b5b4814aD` | -| Base | 8453 | `0x794a61358D6845594F94dc1DB02A252b5b4814aD` | +If the user doesn't specify a chain, ask. Fetch the available markets for the chain from the Aave API to get pool addresses: + +```bash +curl -s -X POST https://api.v3.aave.com/graphql \ + -H 'Content-Type: application/json' \ + -d '{"query":"{ markets(request: { chainIds: [] }) { address reserves { underlyingToken { symbol } } } }"}' +``` + +Each entry in the response is a separate Aave V3 market. Extract `address` from each — this is the pool contract address. + +- If one market is returned, use its `address` as ``. +- If multiple markets are returned, present them to the user (showing the `address` and up to 5 representative token symbols from `reserves[].underlyingToken.symbol`) and ask which market they want to interact with. ## Check collateral diff --git a/skills/metamask-agent-workflows/workflows/aave-collateral.md b/skills/metamask-agent-workflows/workflows/aave-collateral.md index 70df584..afa968e 100644 --- a/skills/metamask-agent-workflows/workflows/aave-collateral.md +++ b/skills/metamask-agent-workflows/workflows/aave-collateral.md @@ -11,16 +11,18 @@ Use this workflow to enable or disable an asset as collateral on Aave V3. ## Resolve chain and addresses -If the user doesn't specify a chain, ask. Look up the pool address: - -| Chain | Chain ID | Pool address | -| --- | --- | --- | -| Ethereum | 1 | `0x87870Bca3F3fD6335C3F4ce8392D69350B4fA4E2` | -| Polygon | 137 | `0x794a61358D6845594F94dc1DB02A252b5b4814aD` | -| Arbitrum | 42161 | `0x794a61358D6845594F94dc1DB02A252b5b4814aD` | -| Optimism | 10 | `0x794a61358D6845594F94dc1DB02A252b5b4814aD` | -| Avalanche | 43114 | `0x794a61358D6845594F94dc1DB02A252b5b4814aD` | -| Base | 8453 | `0x794a61358D6845594F94dc1DB02A252b5b4814aD` | +If the user doesn't specify a chain, ask. Fetch the available markets for the chain from the Aave API to get pool addresses: + +```bash +curl -s -X POST https://api.v3.aave.com/graphql \ + -H 'Content-Type: application/json' \ + -d '{"query":"{ markets(request: { chainIds: [] }) { address reserves { underlyingToken { symbol } } } }"}' +``` + +Each entry in the response is a separate Aave V3 market. Extract `address` from each — this is the pool contract address. + +- If one market is returned, use its `address` as ``. +- If multiple markets are returned, present them to the user (showing the `address` and up to 5 representative token symbols from `reserves[].underlyingToken.symbol`) and ask which market they want to interact with. ## Check status diff --git a/skills/metamask-agent-workflows/workflows/aave-markets.md b/skills/metamask-agent-workflows/workflows/aave-markets.md index 4b791c4..0b4705a 100644 --- a/skills/metamask-agent-workflows/workflows/aave-markets.md +++ b/skills/metamask-agent-workflows/workflows/aave-markets.md @@ -10,16 +10,7 @@ Use this workflow to discover available Aave V3 tokens, supply/borrow rates, and ## Resolve chain -If the user doesn't specify a chain, ask. Aave V3 is deployed on these chains: - -| Chain | Chain ID | -| --- | --- | -| Ethereum | 1 | -| Polygon | 137 | -| Arbitrum | 42161 | -| Optimism | 10 | -| Avalanche | 43114 | -| Base | 8453 | +If the user doesn't specify a chain, ask. ## Query available markets @@ -27,13 +18,15 @@ If the user doesn't specify a chain, ask. Aave V3 is deployed on these chains: curl -s -X POST https://api.v3.aave.com/graphql \ -H 'Content-Type: application/json' \ -d '{ - "query": "{ markets(request: { chainIds: [] }) { reserves { underlyingToken { symbol decimals } supplyInfo { apy { formatted } } borrowInfo { apy { formatted } availableLiquidity { amount { value } usd } borrowCapReached } isFrozen isPaused } } }" + "query": "{ markets(request: { chainIds: [] }) { address reserves { underlyingToken { symbol decimals } supplyInfo { apy { formatted } } borrowInfo { apy { formatted } availableLiquidity { amount { value } usd } borrowCapReached } isFrozen isPaused } } }" }' ``` +The response returns one entry per market. Each entry has an `address` (the pool contract address) and a `reserves` array. + ## Present results -Filter out reserves where `isFrozen` or `isPaused` is `true`. For each active reserve, show: +Group reserves by market `address`. Within each market, filter out reserves where `isFrozen` or `isPaused` is `true`. For each active reserve, show: - Token symbol and decimals (`underlyingToken.symbol`, `underlyingToken.decimals`) - Supply APY (`supplyInfo.apy.formatted`) diff --git a/skills/metamask-agent-workflows/workflows/aave-positions.md b/skills/metamask-agent-workflows/workflows/aave-positions.md index cae93a2..d65a5bb 100644 --- a/skills/metamask-agent-workflows/workflows/aave-positions.md +++ b/skills/metamask-agent-workflows/workflows/aave-positions.md @@ -16,30 +16,29 @@ Get the wallet address: mm wallet address ``` -If the user doesn't specify a chain, ask. Aave V3 is deployed on these chains: +If the user doesn't specify a chain, ask. Fetch all markets for the chain to get pool addresses: -| Chain | Chain ID | Pool address | -| --- | --- | --- | -| Ethereum | 1 | `0x87870Bca3F3fD6335C3F4ce8392D69350B4fA4E2` | -| Polygon | 137 | `0x794a61358D6845594F94dc1DB02A252b5b4814aD` | -| Arbitrum | 42161 | `0x794a61358D6845594F94dc1DB02A252b5b4814aD` | -| Optimism | 10 | `0x794a61358D6845594F94dc1DB02A252b5b4814aD` | -| Avalanche | 43114 | `0x794a61358D6845594F94dc1DB02A252b5b4814aD` | -| Base | 8453 | `0x794a61358D6845594F94dc1DB02A252b5b4814aD` | +```bash +curl -s -X POST https://api.v3.aave.com/graphql \ + -H 'Content-Type: application/json' \ + -d '{"query":"{ markets(request: { chainIds: [] }) { address } }"}' +``` + +Collect all returned `address` values as ``. ## Query positions -Query supply and borrow positions in a single request: +Query supply and borrow positions across all markets in a single request. Build the `markets` array from all addresses returned above: ```bash curl -s -X POST https://api.v3.aave.com/graphql \ -H 'Content-Type: application/json' \ -d '{ - "query": "{ userSupplies(request: { markets: [{ address: \"\", chainId: }], user: \"\" }) { currency { symbol decimals } balance { amount { value } usd } apy { formatted } isCollateral } userBorrows(request: { markets: [{ address: \"\", chainId: }], user: \"\" }) { currency { symbol decimals } debt { amount { value } usd } apy { formatted } } }" + "query": "{ userSupplies(request: { markets: [{ address: \"\", chainId: }, { address: \"\", chainId: }], user: \"\" }) { currency { symbol decimals } balance { amount { value } usd } apy { formatted } isCollateral marketAddress } userBorrows(request: { markets: [{ address: \"\", chainId: }, { address: \"\", chainId: }], user: \"\" }) { currency { symbol decimals } debt { amount { value } usd } apy { formatted } marketAddress } }" }' ``` -The response contains both `userSupplies` and `userBorrows` arrays. +Include one `{ address, chainId }` entry per market returned by the previous query. The response contains both `userSupplies` and `userBorrows` arrays spanning all markets. ## Health factor preview diff --git a/skills/metamask-agent-workflows/workflows/aave-repay.md b/skills/metamask-agent-workflows/workflows/aave-repay.md index ac458a6..11a830c 100644 --- a/skills/metamask-agent-workflows/workflows/aave-repay.md +++ b/skills/metamask-agent-workflows/workflows/aave-repay.md @@ -11,16 +11,18 @@ Use this workflow to repay borrowed assets on Aave V3. ## Resolve chain and addresses -If the user doesn't specify a chain, ask. Look up the pool address: - -| Chain | Chain ID | Pool address | -| --- | --- | --- | -| Ethereum | 1 | `0x87870Bca3F3fD6335C3F4ce8392D69350B4fA4E2` | -| Polygon | 137 | `0x794a61358D6845594F94dc1DB02A252b5b4814aD` | -| Arbitrum | 42161 | `0x794a61358D6845594F94dc1DB02A252b5b4814aD` | -| Optimism | 10 | `0x794a61358D6845594F94dc1DB02A252b5b4814aD` | -| Avalanche | 43114 | `0x794a61358D6845594F94dc1DB02A252b5b4814aD` | -| Base | 8453 | `0x794a61358D6845594F94dc1DB02A252b5b4814aD` | +If the user doesn't specify a chain, ask. Fetch the available markets for the chain from the Aave API to get pool addresses: + +```bash +curl -s -X POST https://api.v3.aave.com/graphql \ + -H 'Content-Type: application/json' \ + -d '{"query":"{ markets(request: { chainIds: [] }) { address reserves { underlyingToken { symbol } } } }"}' +``` + +Each entry in the response is a separate Aave V3 market. Extract `address` from each — this is the pool contract address. + +- If one market is returned, use its `address` as ``. +- If multiple markets are returned, present them to the user (showing the `address` and up to 5 representative token symbols from `reserves[].underlyingToken.symbol`) and ask which market they want to interact with. ## Check debt diff --git a/skills/metamask-agent-workflows/workflows/aave-supply.md b/skills/metamask-agent-workflows/workflows/aave-supply.md index 1e914d2..7a1f749 100644 --- a/skills/metamask-agent-workflows/workflows/aave-supply.md +++ b/skills/metamask-agent-workflows/workflows/aave-supply.md @@ -11,16 +11,18 @@ Use this workflow to supply (deposit) assets into Aave V3 and earn interest. ## Resolve chain and addresses -If the user doesn't specify a chain, ask. Look up the pool address: - -| Chain | Chain ID | Pool address | -| --- | --- | --- | -| Ethereum | 1 | `0x87870Bca3F3fD6335C3F4ce8392D69350B4fA4E2` | -| Polygon | 137 | `0x794a61358D6845594F94dc1DB02A252b5b4814aD` | -| Arbitrum | 42161 | `0x794a61358D6845594F94dc1DB02A252b5b4814aD` | -| Optimism | 10 | `0x794a61358D6845594F94dc1DB02A252b5b4814aD` | -| Avalanche | 43114 | `0x794a61358D6845594F94dc1DB02A252b5b4814aD` | -| Base | 8453 | `0x794a61358D6845594F94dc1DB02A252b5b4814aD` | +If the user doesn't specify a chain, ask. Fetch the available markets for the chain from the Aave API to get pool addresses: + +```bash +curl -s -X POST https://api.v3.aave.com/graphql \ + -H 'Content-Type: application/json' \ + -d '{"query":"{ markets(request: { chainIds: [] }) { address reserves { underlyingToken { symbol } } } }"}' +``` + +Each entry in the response is a separate Aave V3 market. Extract `address` from each — this is the pool contract address. + +- If one market is returned, use its `address` as ``. +- If multiple markets are returned, present them to the user (showing the `address` and up to 5 representative token symbols from `reserves[].underlyingToken.symbol`) and ask which market they want to interact with. Resolve the asset's contract address on the target chain. If the user provides a symbol instead of an address, run `mm token list search --query --chain `. diff --git a/skills/metamask-agent-workflows/workflows/aave-withdraw.md b/skills/metamask-agent-workflows/workflows/aave-withdraw.md index d8ebde8..6c4dd11 100644 --- a/skills/metamask-agent-workflows/workflows/aave-withdraw.md +++ b/skills/metamask-agent-workflows/workflows/aave-withdraw.md @@ -11,16 +11,18 @@ Use this workflow to withdraw supplied assets from Aave V3. ## Resolve chain and addresses -If the user doesn't specify a chain, ask. Look up the pool address: - -| Chain | Chain ID | Pool address | -| --- | --- | --- | -| Ethereum | 1 | `0x87870Bca3F3fD6335C3F4ce8392D69350B4fA4E2` | -| Polygon | 137 | `0x794a61358D6845594F94dc1DB02A252b5b4814aD` | -| Arbitrum | 42161 | `0x794a61358D6845594F94dc1DB02A252b5b4814aD` | -| Optimism | 10 | `0x794a61358D6845594F94dc1DB02A252b5b4814aD` | -| Avalanche | 43114 | `0x794a61358D6845594F94dc1DB02A252b5b4814aD` | -| Base | 8453 | `0x794a61358D6845594F94dc1DB02A252b5b4814aD` | +If the user doesn't specify a chain, ask. Fetch the available markets for the chain from the Aave API to get pool addresses: + +```bash +curl -s -X POST https://api.v3.aave.com/graphql \ + -H 'Content-Type: application/json' \ + -d '{"query":"{ markets(request: { chainIds: [] }) { address reserves { underlyingToken { symbol } } } }"}' +``` + +Each entry in the response is a separate Aave V3 market. Extract `address` from each — this is the pool contract address. + +- If one market is returned, use its `address` as ``. +- If multiple markets are returned, present them to the user (showing the `address` and up to 5 representative token symbols from `reserves[].underlyingToken.symbol`) and ask which market they want to interact with. ## Check positions