One token in. Two
fractions out — stake and reward.
A liquid staking token is a mixture: a fixed quantity of SOL, and every epoch of reward that lands before you sell. Held together they trade as one price. Elute runs the token through a column and collects the two separately — take the principal fraction, take the yield fraction, sell either, and pour both back for the deposit, whole and free, whenever you like.
8 stake pools read straight from their own accounts · split 10 bps · merge free, always · non-custodial
The two halves add up, exactly.
Deposit a base units at rate r₀. At maturity, against the final rate rT, the principal redeems what the deposit was worth on the day it went in and the yield redeems everything the rate earned on top:
principal = minted × r₀ ÷ rT yield = minted − principal principal + yield + fee ≡ minted
That last line is an identity, not a target. One side is divided; the other is what is left. Writing both as divisions is the obvious way to do it and it loses a base unit on essentially every input — dust in the vault that belongs to nobody. The engine is arranged so the remainder cannot exist.
- deposited
- 100.000000 LST
- split fee (10 bps)
- 0.100000
- minted, of each token
- 99.900000
- p
- 99.900000
- y
- 0.000000
- yield fee (5% of the drip)
- 0.000000
The chain does not say why the rate moved.
A stake pool publishes two numbers, and their ratio is the redemption rate. That ratio moves when rewards land, when MEV tips land, when a validator is slashed, when the manager changes the fee, and when something happens that nobody has explained yet. The first two belong to the yield token. The rest do not. Nothing on chain labels them.
A Solana epoch is about two days and pays six to eight basis points. Three hundred is forty epochs arriving at once, and that is not a reward.
A big pool's totals round by dust on every deposit — jitoSOL moved 145 parts in 1.3×10¹⁸ between two readings. Nine orders below a real reward, so it is noise, not a mystery.
Slashing or a commission change. It comes off the yield token first, all the way to zero, before it ever touches the principal.
The accountant stops. The rate reads null, not stale, and nothing settles against it until a person resolves it.
The bands cannot overlap — every possible move is exactly one of those four, and there is no judgement call for a keeper to sell. When a move lands in the gap between them, the oracle refuses to name it and says so in the same read, so nothing can settle against a number that is quietly wrong.
Watch the accountant →No price feed. The pool's own numbers.
Each rate below is total lamports divided by pool tokens outstanding, decoded from the stake pool's account on mainnet. Every pool was accepted only when the mint stored inside the account matched the mint listed beside it — a wrong byte offset that happens to produce a believable number is the failure worth guarding against.
| Pool | Rate (SOL per token) | Epoch | Annualised | State |
|---|---|---|---|---|
| reading the chain… | ||||
| reading the chain… | ||||
| reading the chain… | ||||
⚠ an annualised figure appears only once the observation window is long enough to mean something. A dash is a window, not a zero.
And what is not, in the same breath.
Read from mainnet stake pool accounts every minute, with the epoch each pool last updated in. Nothing is sampled from a price API and nothing is smoothed.
The engine on this page is the engine the ledger runs and the engine the tests attack. The identity holds in base units on every input, and the suite proves the naive version does not.
There is no on-chain program yet. Nothing is minted, nothing is custodied, and no transaction is ever signed. A position here is bookkeeping against a real rate, and the ledger says so in the first field it returns.