How baskets work
A basket is an ERC-20 token backed one-to-one by a fixed recipe: a list of component stock tokens and a fixed amount of each per basket token. The recipe is set when the basket is created and never changes.
The recipe
Say the curator of bAI (“AI Leaders”) sets the recipe:
| Component | Units per basket token |
|---|---|
| NVDA | 0.010 |
| MSFT | 0.008 |
| GOOGL | 0.012 |
| META | 0.006 |
Holding 100 bAI means the basket contract holds, verifiably onchain, 1.0 NVDA, 0.8 MSFT, 1.2 GOOGL, and 0.6 META on your behalf. Nothing is synthetic. There is no counterparty exposure beyond the stock tokens themselves.
Because the streaming fee is zero at launch, those units do not shrink over time either. The 100 bAI you hold in five years claims the same 1.0 NVDA it claims today. The only thing that changes is what those shares are worth.
Minting and redeeming are in-kind
issue(amount)pulls exactlyunits[i] × amountof each component from you and mintsamountbasket tokens:amount − mintFeeto you, the fee slice to the curator and treasury. Supply is always fully backed; fees are carved from what’s minted, never minted on top.redeem(amount)burns your basket tokens and transfers the components back (minus the redeem fee, retained in kind).
There is no pricing function in the core. The cost of minting is defined by the recipe, not by pool balances or an internal valuation. This is a deliberate security property: the attack class that drained comparable protocols, manipulating an internal price to mint cheap shares, has no surface here. Anything price-shaped (the Zap, savings-plan execution) lives in the periphery and is bounded against Chainlink feeds.
Rounding always favors the basket: component amounts round up when you mint and down when you redeem, and a minimum mint granularity guarantees no component amount ever rounds to zero. Dust accrues to the basket, i.e. to all holders.
Total return, automatically
Robinhood stock tokens handle dividends and splits through an onchain multiplier: dividends are reinvested, raw balances never rebase, and the Chainlink feed price already includes the multiplier. Because Basquets recipes are defined in raw units, a basket tracks total return with zero unit adjustments and zero corporate-action accounting. During a corporate action a component’s oracle pauses and the affected basket simply pauses minting and redemption until it clears; see Market hours & corporate actions.
Redemption can never be held hostage
If a single component token is ever paused or a transfer is blocked (see Security for who has these powers), atomic redemption of that basket would fail. For that case there is an escape hatch:
redeemToClaims(amount)burns your basket tokens and records a per-component entitlement.claimComponent(token)lets you withdraw each component individually, whenever it is transferable.
One frozen component can delay its own claim; it can never trap the other components in the basket.
Immutability
Basket contracts are minimal proxies of a single audited implementation, initialized once, with no setters. The curator cannot change the recipe, cannot upgrade the contract, and cannot touch the components. A curator’s only ongoing relationship with a basket is collecting their fee share.