The policy
Every ceiling the agent lives inside, and the exact worst case of a rogue key.
An agentic basket's agent holds exactly one power: calling
rebalance(legs, newTokens) on the BasketToken2 contract. This page is
the complete list of what bounds that power. Every bound is either an
immutable contract constant (the ceiling, the same for every basket
ever deployed) or an immutable per-basket policy value chosen by the
curator at deploy — inside the ceiling, never beyond it.
The ceilings
| Limit | Contract constant | Meaning |
|---|---|---|
| Cooldown | MIN_COOLDOWN = 1 day | minimum wait between rebalances |
| Turnover | MAX_TURNOVER_BPS = 2500 (25% of NAV) | value sold in a single rebalance |
| Slippage | MAX_SLIPPAGE_BPS = 100 (1% of NAV) | value the trade may cost, per rebalance |
| Universe | on-chain AssetRegistry | it can only BUY registered assets; it can always SELL |
| Backing | full, every trade | units are recomputed as the floor of real balances |
The three live pilots all deployed at the ceilings: 1-day cooldown, 25%
turnover, 1% slippage (verifiable on Blockscout: rebalanceCooldown(),
maxTurnoverBps(), maxSlippageBps()).
How a rebalance is checked
A rebalance executes trades through settlement contracts whitelisted in the
MakerRegistry, then hands back the new
constituent set. The contract then, in the same transaction:
- prices NAV before and after through the frozen feeds;
- reverts if more than
maxTurnoverBpsof NAV changed hands; - reverts if NAV fell by more than
maxSlippageBps; - recomputes the units as the floor of the balances it actually holds,
so the token stays fully backed by construction —
isFullyBacked()holds after every rebalance, same as after every mint and redeem; - rejects any leg that would buy an asset the registry doesn't cover, or route value anywhere except a whitelisted settlement contract (delta-checked to the exact amount) or the holders' payout distributor.
If any check fails, the entire rebalance reverts and nothing changes.
The worst case, precisely
A compromised or malicious agent key can cost holders at most the slippage budget of NAV per cooldown window — for the live pilots, 1% of NAV per day — by trading at bad prices. The invariant is measured on total NAV, not on the notional traded. Beyond that, the agent has no path to mint, redeem, fees, custody, or the fee recipient. It can never touch custody, never block redemption, never route value anywhere but a whitelisted settlement venue or the holders' distributor.
If something goes wrong
- The curator rotates the agent key with
setAgent(curator-only). - As a global brake, the protocol Safe can disable settlement contracts or buyable assets in the registries: any rebalance that would move value then reverts instantly. There is no dedicated pause on rebalance, and none is needed — the brakes above stop value movement without ever touching redemption or minting, which read no prices at all.
Disabling an asset blocks only new buys; baskets already holding it keep pricing, selling, and redeeming it in-kind. Because a feed is frozen at registration and can never be repointed, every listing is vetted for a live, correctly-shaped, fresh feed before it is added.