ODEI
Docs Recipes · Best USDC yield on Base
Recipes · Wallet and Research data

Find the best USDC yield on Base and propose a deposit

Two reads and one proposal. Your agent reads live rates with their sources, picks a venue the ODEI Wallet can build on, proposes the deposit and hands you the review link. You sign, or you don't.

Live
  • GET /api/research/v1/best/yield and the Yield & Lending list, with no account.
  • odei_wallet_propose with aave-supply-withdraw or erc4626-deposit-withdraw on Base, then odei_wallet_status.
Not available
  • The agent signing or sending the deposit. Auto is coming soon; today the owner approves each operation in ODEI.

Checked against release 0f396bb04bde on my.odei.ai and 99060f15409f on network.odei.ai, 2026-11-08. Compare with /health.

What you need

  • A connection with Wallet access Read and prepare operations: economy.read, capital.propose, capital.plan. The default for a new connection. Connect.
  • USDC on Base in the owner's ODEI Wallet, plus a little ETH for gas.
  • Nothing for the rate read: Research data needs no account.

1. Read the best rate

curl -s 'https://network.odei.ai/api/research/v1/best/yield?asset=USDC&chain=8453&amount=1000'

The answer names one market, the rule it was chosen by, and how many venues were compared. Trimmed, as read on Nov 8 2026 at 16:50 UTC:

{
  "question": "best-yield",
  "order": "Supply rate, highest first. Ties by free-to-withdraw liquidity, then record id. A sort by the number, not a recommendation.",
  "eligibility": ["Read in the last 30 minutes", "Rate under 50%", "Free to withdraw at least 10 times the amount", "Rewards not counted", "..."],
  "answer": {
    "title": "USDC (Variable Rate) on Exactly, Base",
    "venue": {"id": "exactly", "name": "Exactly"},
    "metrics": {"supplyApyPct": 5.818262, "exitLiquidityUsd": 359502.48, "rewardApyPct": null},
    "unknown": ["rewardApyPct"],
    "source": {"name": "Base public RPC, Exactly lending", "call": "Multicall3 at block 54830707 ..."},
    "observedAt": "2026-11-08T16:48:37.000Z",
    "statusLabel": "Live data, not checked"
  }
}

Read observedAt and statusLabel before you quote a number. "Live data, not checked" means ODEI read it from the source and no agent has checked it. null means not known, never zero. Data and freshness.

2. List the venues

The best answer can be a venue the ODEI Wallet has no recipe for. List the category to see the others:

curl -s 'https://network.odei.ai/api/research/v1/categories/yield-lending?chain=8453&limit=20'

Records come sorted by supply rate, highest first. Each has venue, asset, metrics.supplyApyPct, source and observedAt.

On Base, the wallet recipes that deposit USDC are:

RecipeVenueRequired in params
aave-supply-withdrawAave v3action (supply or withdraw), asset, amountAtomic
erc4626-deposit-withdrawFluid fTokens (verified vaults only)action, vault, amountAtomic

Pick the best rate among the venues you can propose to, and tell the owner when the best number overall is somewhere else. The full recipe list per network: Wallet tools.

3. Propose the deposit

100 USDC to Aave v3 on Base. USDC on Base is 0x833589fcd6edb6e08f4c7c32d4f71b54bda02913, 6 decimals, so 100 USDC is 100000000.

odei_wallet_propose {"requestId":"req_<32 hex>","chainId":8453,"recipe":"aave-supply-withdraw","params":{"action":"supply","asset":"0x833589fcd6edb6e08f4c7c32d4f71b54bda02913","amountAtomic":"100000000"}}

Use a new requestId for every new operation, and the same one when you retry the same call. ODEI decodes, simulates and prepares the fee. The answer is awaiting_owner with ownerMessage and operationId.

4. Hand it to the owner

Relay ownerMessage exactly as it came. It holds reviewUrl, which the owner opens in ODEI to see the decoded calls, the simulation and the network fee, and to sign. Never say the deposit is done, and never say the owner can approve in chat.

5. Track it

odei_wallet_status {"operationId":"meop_<32 hex>","waitSeconds":20}

Call again at once until final:true. Only confirmed means the deposit happened on chain. If the owner changes their mind before signing, and asks you to, withdraw it with odei_wallet_cancel.

When it does not go through

You getDo
needs_permissionThe connection lacks Wallet access. Ask the owner to reconnect with Read and prepare operations.
needs_retryWait retryAfterMs and repeat the same call.
blocked with simulation_failederror.diagnosis names the call that failed. Fix the cause and propose with a NEW requestId.
blocked with balance_insufficientfundingShortfall gives the exact amount of ETH missing for gas. After the owner funds it, retry the same requestId.

Every refusal: Errors.