Mechanics & Yield

Mechanics & Yield

How the protocol works in practice. Verified numbers, fee paths, and what actually happens to a holder's position over time.

Verified facts (Sei mainnet, v4)

QuantityValueHow measured / sourced
jpSEI APR (gross validator yield)~4.4%Sei validator base rate. Net rate to jpSEI holders is gross minus operational drag, plus protocol-fee uplifts.
jpSEI exchange rate (current)1.0073 SEI per jpSEIstaker.exchangeRate() after the v4 smoke test. Started at 1.000 at deploy.
JellyPadStaker instant-unstake fee0.5–4% tiered based on buffer ratioSee tier table below. Set in JellyPadStaker.feeTiers[].
Slow-unstake (unstake)0% fee, 21-day Cosmos unbondBurns jpSEI, queues an undelegate to active validator
Min stake0.05 SEIMIN_STAKE constant; below this stake() reverts
Saphyre swap fee0.30% per sideStandard V2
SEI/USD price (snapshot 2026-05-02)$0.057CoinGecko

Instant-unstake fee tiers

Buffer ratioFee
≥ 100% of effective target0.5%
50% to 100%1.0%
20% to 50%2.0%
5% to 20%4.0%
< 5%reverts. Use slow-unstake instead.

The "effective target" is the static target by default. With dynamic mode on, it's max(staticTarget, supplyRatio × supply, pendingSlow, demand × multiplier). See decisions.mdx decision 5.

Fee paths

JellyPad has three protocol-level fees and one external one. Routing was finalised in v5.

TriggerFeeRouting
factory.createToken()0.01 SEI100% to staker buffer
token.buy() (curve phase)1% of incoming SEIfactory: 50% operator / 50% buffer
token.sell() (curve phase)1% of seller's SEIfactory: 50% operator / 50% buffer
_migrateToDex() (graduation)1% of accumulated jpSEIfactory holds as jpSEI; converted to native SEI for treasury via the 21-day slow-unstake pipeline (see below). Buffer is never drained for this.
router.buy() (post-grad)1% of incoming SEIfactory: 50% operator / 50% buffer
router.sell() (post-grad)1% of net SEIfactory: 50% operator / 50% buffer
staker.instantUnstake()0.5–4% (tiered)100% stays in buffer (lifts jpSEI rate)
Any swap on Saphyre0.30% per sideStays in the pool's reserves

The 50/50 split, bounded

factory.operatorFeeBps defaults to 5000 (50%). Owner can adjust via setOperatorFeeBps(uint256). Bounded by MAX_OPERATOR_FEE_BPS = 7000 so the owner can never raise above 70%. The "fees compound back to holders" mechanic is preserved by contract invariant, not by trust.

Why holders earn yield without doing anything

jpSEI is a yield-bearing ERC-20. The count of jpSEI in a wallet (or a pool) doesn't change over time. What changes is the exchange rate. 1 jpSEI represents progressively more SEI as:

  1. Validator rewards land in the contract (claim())
  2. Protocol fees flow into the buffer (every buy/sell)
  3. Instant-unstake fees stay in the buffer

The math:

exchangeRate = (bufferSei + totalDelegated) / totalSupply(jpSEI)

Three things grow the numerator without growing the denominator:

  • Validator rewards harvested into the buffer
  • Protocol-fee donations
  • Retained instant-unstake fees

New stakes are rate-neutral. Numerator and denominator grow together by the same proportional amount. So the rate only goes up; it never goes down.

When a JellyPad token graduates, the pool is paired as (jpSEI, TOKEN). The pool's jpSEI count stays static. Its SEI-equivalent value drifts upward at the rate-growth pace. A holder of TOKEN captures that delta at sell time. The jpSEI received from selling TOKEN is worth more SEI than it was when they bought.

Yield contribution by hold duration

Modelled on a $1k entry into a token that grows from $5k to $10M market cap over the indicated time, with a 30-day idle period before exit. The yield bonus is the jpSEI-side appreciation captured at sell time, on top of capital gains from price action.

Hold durationApprox yield bonusAs % of total ROI
24 hours~$0.10≈ 0%, negligible
7 dayssmall< 0.1%
1 month~$36k~1.9%
3 months~$110k~5.7%
1 year~$145k~7.7%

Two breakeven thresholds matter for sellers:

break-even on the staker 1% exit tier         ≈ 90 days hold
break-even on staker + Saphyre 0.6%           ≈ ~145 days hold

Sub-90-day holds finish slightly negative on the yield channel. The capital-gain channel is independent and unbounded above.

What yield does NOT do

ClaimTrue?Why
"Hold through a 99% rug, recover via yield"No4% annualised cannot recover -99% within ~115 years
"Yield protects against price action"NoPrice moves dwarf yield on memecoins
"Every buy on Saphyre adds to the staking pool"NoSaphyre swaps don't call our contract. Only routed buys via the JellyPad frontend (or curve buys pre-graduation) trigger fresh staking
"Yield gives a structural floor on token value"YesThe pool's jpSEI side can't be drained. There's always something to redeem against, and that something gets thicker over time
"Long holders are rewarded structurally"YesPool compounds; sellers redeem the appreciated side

End-to-end example: 1 SEI buy → 1 SEI sell

Assume a graduated token, healthy pool (~100% buffer ratio → 1% staker tier), no price movement, 30 days held. User routes through the JellyPad frontend.

BUY  1.00 SEI
  → router takes 1% protocol fee:        -0.01 SEI to factory
                                            (0.005 to operator, 0.005 to buffer)
  → 0.99 SEI staked via JellyPadStaker:  contract receives ~0.989 jpSEI at rate 1.0009
  → jpSEI swapped on Saphyre for TOKEN, 0.3% pool fee retained
  → user receives TOKEN

30 days pass. jpSEI rate ↑ ~0.36% from validator rewards + protocol-fee compounding.

SELL the same TOKEN amount
  → TOKEN swapped on Saphyre for ~0.992 jpSEI
  → router calls staker.instantUnstake (1% tier): -0.0099 SEI fee
                                                    (stays in buffer)
  → router takes 1% protocol fee on net:           -0.0098 SEI to factory
  → user receives ~0.953 SEI

Round-trip cost at 30 days, zero price movement: ~4.7%. About 2.6% is unavoidable (1% staker exit + 1% protocol on each side + Saphyre 0.3% × 2). About 0.36% has been recouped from yield. Hold one year, recoup grows to ~4.4%, leaving net cost ~0.3%.

Graduation-revenue pipeline

The 1% graduation fee enters the factory as jpSEI, not native SEI. Two paths to convert it for ops:

Direct (withdrawGraduationRevenue) — owner pulls factory-held jpSEI to a recipient. Fast. Best when you want the recipient to hold yield-bearing principal, or when the buffer-tax of the alternative is acceptable.

Slow pipeline (queueGraduationUnstake → wait → claimGraduationRevenue) — owner queues a 21-day Cosmos undelegation against the factory's jpSEI. The staker burns the jpSEI immediately and decrements totalDelegated. After 21 days the validator returns native SEI to the contract, anyone calls the permissionless topUpFromUndelegation to credit it to bufferSei, then claimGraduationRevenue() sweeps the matured SEI directly to the treasury (suppressing receive()'s fee-split for the duration of the call). The whole flow is buffer-neutral for redemption purposes — slow-unstake pulls from delegated principal, not from the redemption-backing buffer.

graduation event
  ↓ token contract
1% of accumulated jpSEI → factory.spSeiToken balance
  ↓ owner: queueGraduationUnstake(amount)
factory's jpSEI burned, 21-day undelegation queued at validator
  ↓ ~21 days later, native SEI returns to staker
  ↓ anyone (frontend / keeper / community): topUpFromUndelegation
staker.bufferSei increases by exactly the unbonded amount
  ↓ owner: claimGraduationRevenue()
matured native SEI lands at factory, immediately forwarded to treasury

The pipeline keeps one cycle in flight at a time (the staker enforces one pending slow-unstake per address). For back-to-back graduations the owner can either (a) batch — wait for the previous cycle, then queue the accumulated jpSEI, or (b) take some via the direct path while a slow cycle matures.

The team's day-to-day operating cash flow comes from the 50% operator share of the 1% trade fee, which is real-time native SEI to treasury. The graduation pipeline is the lumpier, lagged, larger channel — bonus revenue, not payroll.

Where the data lives on-chain

Every claim above can be checked directly without trusting these docs.

What to readWhere
jpSEI exchange ratestaker.exchangeRate()
Buffer statestaker.bufferSei(), staker.targetBuffer(), staker.effectiveTargetBuffer()
One-call snapshotstaker.bufferHealth() (10-tuple — used by the operator console + dashboard)
Trailing demandstaker.trailingDemandSei()
Validator delegationstaker.totalDelegated()
Pending slow claimsstaker.totalPendingSlowSei()
Pending grad-revenue cyclefactory.pendingGraduationUnstake(), factory.graduationUnstakeReadyAt()
Saphyre feePair contract's Swap event amounts vs. constant-product invariant
Curve fees flowingBuy / Sell events on a JellyPad token + native-SEI delta on factory
Graduation feejpSEI Transfer from token contract to factory at graduation time + GraduationFeeReceived event
LP custodypair.balanceOf(0xdEaD). Burned at graduation