Agent basket

A small, curated allocation across seven agent-economy tokens that rides on top of every vault deposit by default. Optional, atomic, and configurable per call.

What the basket is

Every prepare-deposit and execute-deposit call has two legs by default: the main vault deposit and an agent token basket leg. The basket is a fixed 7-token allocation that gives the depositor exposure to the broader agent-economy sector alongside the stable yield from the vault.

It's configurable per-call — flags let you turn the basket off entirely, allocate 100% to the basket, change slippage tolerance, or sell back any subset of holdings on exit. Defaults are 95% vault / 5% basket, 3% slippage.

Composition

Seven tokens, deliberately curated. The list reflects an agent- economy thesis: protocols, platforms, and infrastructure that AI agents actually use or that earn revenue from agent activity.

TokenChainLens
VIRTUALBaseAgent-launch platform
ROBOTBaseRobot Money protocol token
BNKRBaseAgent trading rails (Bankr)
JUNOBaseGenerative Ventures agent (operator of Robot Money)
ZFIBaseZyfai — autonomous stablecoin strategy
GIZABaseGiza — agent infrastructure
PEAQBaseMachine economy infrastructure

All seven trade on Uniswap V3 on Base. The basket leg routes through Uniswap UniversalRouter in a single transaction along with the vault deposit.

The basket is curated, not algorithmic
Token selection is maintained by Robot Money. Tokens may be added or removed; the changelog announces every adjustment. Allocation across tokens within the basket is roughly equal but is rebalanced occasionally to reflect listing changes. If you want fully programmatic exposure to the agent-economy sector, use --no-basket and assemble your own basket logic.

The 95/5 split

By default, deposits route 95% of input USDC into the vault and 5% into the basket, split roughly equally across the 7 tokens. So a --amount 1000 deposit puts $950 into rmUSDC and approximately $7.14 into each of the 7 basket tokens.

The split is reflected in the response's operation.summary:

json
{
  "operation": {
    "summary": {
      "type": "deposit",
      "vault": {
        "usdcAmount": "950.00",
        "expectedShares": "947.55"
      },
      "basket": {
        "usdcAmount": "50.00",
        "perTokenUsdc": "7.14",
        "tokens": ["VIRTUAL", "ROBOT", "BNKR", "JUNO", "ZFI", "GIZA", "PEAQ"],
        "slippageBps": 300
      }
    },
    "transactions": [
      { "purpose": "approve-vault", "target": "0x833589fc...", "...": "..." },
      { "purpose": "deposit-and-basket", "target": "0x4f835c9f...", "...": "..." }
    ]
  }
}

Slippage control

The basket leg can experience slippage because seven swaps execute in one block. The default tolerance is 300 bps (3%) per swap. Adjust per-call:

shell
# Tighter tolerance for low-volatility periods
npx @robotmoney/cli prepare-deposit --chain base \
  --user-address 0x... --amount 100 --receiver 0x... \
  --slippage-bps 100   # 1%

# Wider tolerance for volatile periods or larger sizes
npx @robotmoney/cli prepare-deposit --chain base \
  --user-address 0x... --amount 5000 --receiver 0x... \
  --slippage-bps 500   # 5%

Slippage applies to each token swap independently. If any swap exceeds the tolerance, the entire deposit transaction reverts — the basket leg is atomic with the vault leg.

Atomicity

The basket leg and the vault leg share a single transaction. Either both succeed or both revert. You can't end up in a state where the vault deposit went through but the basket purchase failed (or vice versa).

Atomic also means atomic in MEV terms. Front-running the basket swaps individually isn't possible without front-running the vault deposit, which is uneconomical at typical agent sizes.

Selling back

Withdrawals can sell any subset of basket holdings back to USDC, atomically with the vault redeem. Four sell-back modes:

Sell everything

shell
npx @robotmoney/cli prepare-redeem \
  --chain base --user-address 0x... --shares max --receiver 0x... \
  --sell-all

Sells the full balance of every basket token the user holds, plus redeems all rmUSDC. Returns one USDC amount to the receiver.

Sell a percentage of everything

shell
npx @robotmoney/cli prepare-redeem \
  --chain base --user-address 0x... --shares max --receiver 0x... \
  --sell-percent 50

Sells 50% of every basket holding. Useful for proportional de-risking — exit half your vault position and half your basket exposure in one transaction.

Sell specific tokens

shell
npx @robotmoney/cli prepare-redeem \
  --chain base --user-address 0x... --shares max --receiver 0x... \
  --sell-tokens VIRTUAL,JUNO

Sells the full balance of just the listed tokens. Other basket holdings stay in the wallet.

Sell specific amounts of specific tokens

shell
npx @robotmoney/cli prepare-redeem \
  --chain base --user-address 0x... --shares max --receiver 0x... \
  --sell-tokens VIRTUAL,JUNO \
  --sell-amounts 1.5,200

Sells exactly the listed amounts (1.5 VIRTUAL, 200 JUNO). Other basket holdings stay. The order of --sell-amounts matches the order of --sell-tokens.

Basket-only flows

Two flags let you skip the vault leg entirely:

Deposit only to basket

shell
npx @robotmoney/cli prepare-deposit \
  --chain base --user-address 0x... --amount 100 --receiver 0x... \
  --basket-only

Routes 100% of the input to the basket (~$14.29 per token). Useful when the caller wants pure agent-economy exposure without the yield leg.

Deposit only to vault

shell
npx @robotmoney/cli prepare-deposit \
  --chain base --user-address 0x... --amount 100 --receiver 0x... \
  --no-basket

Routes 100% of the input to the vault. The basket leg is skipped and no swaps execute. Same gas profile as a vanilla ERC-4626 deposit.

Reading holdings

Inspect any wallet's basket position with get-basket-holdings:

shell
npx @robotmoney/cli get-basket-holdings --chain base --user-address 0x...

Sample response:

json
{
  "userAddress": "0xabc...",
  "chain": "base",
  "tokens": [
    { "symbol": "VIRTUAL", "balance": "12.5",  "valueUsd": "44.21" },
    { "symbol": "ROBOT",   "balance": "1820",  "valueUsd": "33.04" },
    { "symbol": "BNKR",    "balance": "85.3",  "valueUsd": "27.91" },
    { "symbol": "JUNO",    "balance": "1240",  "valueUsd": "31.04" },
    { "symbol": "ZFI",     "balance": "210",   "valueUsd": "29.18" },
    { "symbol": "GIZA",    "balance": "405",   "valueUsd": "27.40" },
    { "symbol": "PEAQ",    "balance": "8500",  "valueUsd": "30.12" }
  ],
  "totalUsd": "222.90",
  "pricedAt": "2026-06-08T14:22:11.301Z"
}

Add --no-pricing to skip the dollar-value fetch and return token balances only. Useful when you only need quantities (faster, fewer external calls).

Design notes

A few choices that explain why the basket exists in its current shape.

  • 5% is small enough to be honest, big enough to matter. The default split treats the basket as a tilt, not a strategy. Operators who want bigger agent-economy exposure should set it explicitly via --basket-only or by following deposits with separate basket buys.
  • Curated, not indexed. The token list is maintained by humans. There's no on-chain governance process for additions or removals; the curation is part of what Robot Money signs for. If you disagree with the composition, use --no-basket.
  • Atomic with vault operations, not standalone. The basket is designed as a leg on top of vault deposits, not as a separate product. That keeps gas profile reasonable (one tx instead of eight) and avoids the failure modes of partially completed multi-leg trades.
  • The basket isn't in the vault. rmUSDC holders are not exposed to basket tokens through the vault mechanic — the basket sits in the depositor's wallet, not inside the vault. The vault is pure USDC yield. The basket is alongside it.