How the map is drawn.
Everything on a BasketMap report is either read from a finalized account, computed from those reads with the formulas below, or explicitly marked unknown. Nothing is estimated to fill a gap.
1 · Identity before arithmetic
A basket is accepted only when all of these hold for the mint you pasted:
- The mint account exists and is owned by the SPL Token or Token-2022 program.
- An account exists at the PDA
["index", mint]under the DiversiFi program. - That account is owned by the program, has a known size and discriminator
1. - Its
token_mintfield equals the mint you pasted. A non-empty PDA alone is not enough.
A token that fails any check is unsupported — even if its name or ticker looks like a basket, and even if it pays rewards in a basket token. Holding a reward coin is not holding a share of a vault.
2 · One finalized batch
- Discovery reads the index PDAs and basket mints, then the constituent mints (their token program decides each vault address).
- Final read: index config, basket mint, constituent mints and every vault in a single
getMultipleAccountsatfinalizedcommitment. - The config bytes in the final read are compared with discovery. If they moved, the read is repeated; after two retries the report is labelled
unstable_snapshotand never called atomic. - Each registry asset has an approved price-age limit: 15 minutes for actively traded tokens, 1 hour for thin markets the source re-prices less often. Older observations are stale and shown as last-known.
- Every account is hashed (sha256 of raw data) and listed in Evidence with its role and owner.
Live reports are cached for 60 seconds. If a source fails, the last good report is shown with its age; it is never relabelled as live.
3 · Index layout
The public integration guide documents a 246-byte index account with five constituent slots. Every index on mainnet today is 348 bytes with eight slots. The adapter decodes both by size and discriminator and records the version it read:
disc u8 = 1
manager pubkey
token_mint pubkey ← must equal the pasted mint
min_deposit u64
fee u16 (bps)
bump u8
mints [ { mint: pubkey, target: u16 bps } ; 5 | 8 ] empty = 1111…11114 · The arithmetic
S_k basket supply, atomic units Q_k your quantity, same units B_ki vault balance of underlying i, atomic units A_ki = Q_k × B_ki / S_k kept as a fraction; rounded only on screen V_ki = A_ki / 10^dec_i × P_i only with a fresh, unit-confirmed price w_ki = V_ki / Σ_i V_ki only when every constituent is valued O(k,l) = Σ_i min(w_ki, w_li) exact mint, fully valued pairs only
Targets (basis points from the config) are shown next to actual weights and never stand in for a price or a balance. Exposure across your positions adds A_ki by exact mint; wrapped or bridged versions of the same asset are not merged.
5 · Data states
| State | Meaning | Effect |
|---|---|---|
| Valued | Vault read, price within its asset limit, unit confirmed | Counts toward totals and weights |
| Zero balance | Vault exists and holds 0 | A real zero; does not block |
| Missing vault | Vault account not found | Basket partial |
| No price | No observation for that exact mint | Quantities kept, totals withheld |
| Stale price | Observation older than the asset's limit | Shown as last-known, totals withheld |
| Price = 0 | Source returned 0 | Treated as no price, not as worthless |
| Unit unconfirmed | Token-2022 scaled-UI multiplier ≠ 1, transfer fee or interest-bearing unit | Valuation blocked for that constituent |
| Supply 0 | Basket mint has no supply | No shares computed; no division |
6 · Report axes
account_snapshot— verified · partial · unknownprice_coverage— complete · partial · stale · conflictingprotocol_support— supported · partial · unsupported
A refresh creates a new report version with its own id; an older version keeps its slot and age. A shared link carries the frozen snapshot itself, so it can never quietly turn into live data.
7 · What it is not
- Not a redeemable NAV: fees, liabilities, redemption limits and slippage are not deducted.
- Not a risk or correlation score: overlap describes shared observed holdings only.
- Not advice: BasketMap does not suggest what to buy, sell or rebalance.
- Nested baskets are shown as unsupported constituents and are not expanded.