tokenInfo. Reserves are priced through Scope, Kamino’s price aggregator.
How pricing works
Scope combines provider feeds (Chainlink and Pyth Pro) into a single, manipulation-resistant chain of indices, and exposes custom oracle types for fixed-income, pegged, multi-source, and LST assets. You wire a reserve to a Scope feed by settingscopeConfiguration in tokenInfo: the price chain, TWAP chain, and guards. For an asset that isn’t in Scope yet, coordinate with the Kamino team to add it before listing.
Required tokenInfo fields
| Field | Type | What it does |
|---|---|---|
name | string (≤32 bytes UTF-8) | Asset symbol |
maxAgePriceSeconds | u64 | Reject the spot price if older than this many seconds |
maxAgeTwapSeconds | u64 | Reject the TWAP if older than this many seconds. Required if TWAP is enabled |
maxTwapDivergenceBps | u64 | Maximum divergence between spot and TWAP in basis points. 0 disables the guard |
heuristic | { lower, upper, exp } | Sanity bounds. Reject prices outside [lower * 10^exp, upper * 10^exp]. All zeros disables |
blockPriceUsage | 0 or 1 | If 1, the reserve is configured but the program rejects any operation needing a price (emergency switch) |
scopeConfiguration— Scope feed pubkey + price chain + TWAP chain
- SDK
- API
- Kamino CLI
Update oracle config via SDK
The most direct path for changing just the Scope oracle on an existing reserve iskaminoManager.updateReserveScopeOracleConfigurationIxs. For broader reserve updates that include oracle changes, use updateReserveIxs with a full ReserveConfig.Update Scope oracle configuration
65535 (u16::MAX) is the unused-slot sentinel. A single-hop Scope chain uses [N, 65535, 65535, 65535].Looking up oracle IDs
get-oracle-mappings command (next tab) to retrieve the canonical IDs.TWAP and staleness guards
The two guards work together to reject manipulated or stale prices.| Guard | What it catches |
|---|---|
maxAgePriceSeconds | Spot price older than this is rejected. Set to 120 for liquid assets, lower for high-stakes reserves |
maxAgeTwapSeconds | TWAP older than this is rejected. Typically 2–4× maxAgePriceSeconds |
maxTwapDivergenceBps | If spot deviates from TWAP by more than this, the price is rejected. Set to 4050 (≈40.5%) for volatile assets, lower for stables. 0 disables |
maxTwapDivergenceBps > 0) the Scope feed must expose a TWAP chain. The on-chain validator returns InvalidTwapConfig if you enable the guard against a feed with no TWAP.
Price heuristic
The heuristic is an absolute price band:exp: 1, the price is accepted only when 0.9 ≤ price ≤ 1.1. Useful for stables you expect to peg. Set all zeros to disable.
Block price usage (emergency)
blockPriceUsage: 1 is an emergency switch: the reserve is configured normally but the program refuses any operation that needs the price. Use it when you need to halt a reserve immediately while preparing a real config update.
Choosing for new assets
| Asset type | Recommended setup |
|---|---|
| Major stablecoins (USDC, USDT, USDS) | Scope, with a tight heuristic and TWAP guard |
| Major liquid assets (SOL, BTC, ETH) | Scope |
| LSTs (mSOL, jitoSOL, INF, etc.) | Scope (uses LST → SOL → USD chain) |
| Pegged or fixed-income assets | Scope custom oracle types (CappedFloored, DiscountToMaturity) |
| Tokenized off-chain assets | Coordinate with the Kamino team to add to Scope |
Reference
- Reserve config reference — every
tokenInfofield documented - Oracle architecture overview — Scope, price protection, manipulation resistance