Elute
𝕏connect
Docs

The whole protocol, in one sitting.

Elute is an identity with a website attached. This page is the identity, the four things that can move a rate, and the two places the arithmetic deliberately refuses to guess.

01The identity

Nothing is created and nothing is lost.

split(a):
  fee     = a × 10 ÷ 10000     (floor)
  minted  = a − fee

settle(minted, r₀, rT):
  principal = rT ≤ r₀ ? minted : minted × r₀ ÷ rT
  gross     = minted − principal
  yieldFee  = gross × 500 ÷ 10000  (floor)
  yieldNet  = gross − yieldFee

Exactly one division decides the split, and every other quantity is what remains after it. The natural way to write this — dividing for the principal and dividing again for the yield — produces two floors of parts that must sum to a whole, and they do not. The engine suite runs four thousand random positions through that version and it comes up short on essentially all of them.

i

principal + yield + fee ≡ minted

Always, in base units, on every input. Not a tolerance, not a rounding target — the yield is literally defined as what is left after the principal, so there is no remainder for dust to hide in.
ii

merge is free and never blocked

Hand back both halves and take the deposit, at any time, before or after maturity, whether or not the oracle is synced. It is the exit that does not depend on the rest of this working — including on our own oracle — and it is what pins the two halves to the whole.
iii

the yield fee never touches the principal

5% is taken from the growth and only from the growth. A position that earned nothing pays nothing beyond the 10 bps it paid on the way in.
02What can move a rate

Four things, and only one of them is yours.

yield

0 to +300 bps

Staking rewards and MEV tips. An epoch runs about two days and pays six to eight basis points, so the ceiling sits roughly forty epochs above anything real. This belongs to the yield token.
flat

zero, or too small to be anything

⚠ This page used to say a pool updates once an epoch and the rate is constant in between. It is not. Watching jitoSOL, the rate crept by 145 parts in 1.3×10¹⁸ between readings minutes apart while the pool's epoch counter never moved — deposits and withdrawals round its totals by dust continuously. That is nine orders of magnitude below one epoch of real reward, so it is called noise and nothing settles differently because of it.
loss

-500 to 0 bps

Slashing, or a manager raising the fee. It comes out of the yield token first and all the way to zero before it reaches the principal.
unclassified

anything else

A migration, a rescue, a bug, a number nobody has explained. The accountant stops: the rate reads null rather than stale, splits against that pool are refused, and merge keeps working.

The bands cannot overlap, so there is never a move a keeper could plausibly call either thing — which is the only reason nobody has to be trusted here.

03What this does not protect you from

Stated first, not buried.

The principal is a claim on tokens, not on SOL

If the rate falls between your split and settlement, the principal takes every token in the vault — and those tokens are worth less SOL than when you deposited. It is made whole in units, not in value. Anyone buying a principal token is taking that risk knowingly or not, so we say it here.

The yield token can end at zero

It is a claim on growth. If the rate does not grow, there is nothing to claim, and if the rate falls the claim is wiped out before the principal is touched. There is no leverage and no liquidation, but there is a floor and the floor is nothing.

We do not run the stake pools

The rate is set by whoever operates the pool. Elute reads it; it does not underwrite it, insure it, or promise anything about the validators behind it.

There is no on-chain program yet

Nothing is minted and nothing is custodied. Positions recorded here are bookkeeping against real rates, and the ledger says so in the first field of every state it returns. When that changes, this paragraph changes with it.
04The endpoints

Read it yourself.

/statewhat the ledger is, starting with what is real about it
/poolsthe 8 pools, their rates, and every classified move
/positionsevery position, marked against the rate its pool is reading now
/auditthe books re-added from each position rather than from the summary
/logthe raw event log, so the whole thing can be replayed with your own code

⚠ an annualised figure is withheld until the observation window is at least 6 hours. Two readings minutes apart annualise to something absurd, and an APY that swings by hundreds of percent because the sample was short looks exactly like an asset doing that.

See it classifying →