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)
| Quantity | Value | How 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 jpSEI | staker.exchangeRate() after the v4 smoke test. Started at 1.000 at deploy. |
| JellyPadStaker instant-unstake fee | 0.5–4% tiered based on buffer ratio | See tier table below. Set in JellyPadStaker.feeTiers[]. |
Slow-unstake (unstake) | 0% fee, 21-day Cosmos unbond | Burns jpSEI, queues an undelegate to active validator |
| Min stake | 0.05 SEI | MIN_STAKE constant; below this stake() reverts |
| Saphyre swap fee | 0.30% per side | Standard V2 |
| SEI/USD price (snapshot 2026-05-02) | $0.057 | CoinGecko |
Instant-unstake fee tiers
| Buffer ratio | Fee |
|---|---|
| ≥ 100% of effective target | 0.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.
| Trigger | Fee | Routing |
|---|---|---|
factory.createToken() | 0.01 SEI | 100% to staker buffer |
token.buy() (curve phase) | 1% of incoming SEI | factory: 50% operator / 50% buffer |
token.sell() (curve phase) | 1% of seller's SEI | factory: 50% operator / 50% buffer |
_migrateToDex() (graduation) | 1% of accumulated jpSEI | factory 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 SEI | factory: 50% operator / 50% buffer |
router.sell() (post-grad) | 1% of net SEI | factory: 50% operator / 50% buffer |
staker.instantUnstake() | 0.5–4% (tiered) | 100% stays in buffer (lifts jpSEI rate) |
| Any swap on Saphyre | 0.30% per side | Stays 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:
- Validator rewards land in the contract (
claim()) - Protocol fees flow into the buffer (every buy/sell)
- 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 duration | Approx yield bonus | As % of total ROI |
|---|---|---|
| 24 hours | ~$0.10 | ≈ 0%, negligible |
| 7 days | small | < 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 holdSub-90-day holds finish slightly negative on the yield channel. The capital-gain channel is independent and unbounded above.
What yield does NOT do
| Claim | True? | Why |
|---|---|---|
| "Hold through a 99% rug, recover via yield" | No | 4% annualised cannot recover -99% within ~115 years |
| "Yield protects against price action" | No | Price moves dwarf yield on memecoins |
| "Every buy on Saphyre adds to the staking pool" | No | Saphyre 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" | Yes | The 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" | Yes | Pool 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 SEIRound-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 treasuryThe 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 read | Where |
|---|---|
| jpSEI exchange rate | staker.exchangeRate() |
| Buffer state | staker.bufferSei(), staker.targetBuffer(), staker.effectiveTargetBuffer() |
| One-call snapshot | staker.bufferHealth() (10-tuple — used by the operator console + dashboard) |
| Trailing demand | staker.trailingDemandSei() |
| Validator delegation | staker.totalDelegated() |
| Pending slow claims | staker.totalPendingSlowSei() |
| Pending grad-revenue cycle | factory.pendingGraduationUnstake(), factory.graduationUnstakeReadyAt() |
| Saphyre fee | Pair contract's Swap event amounts vs. constant-product invariant |
| Curve fees flowing | Buy / Sell events on a JellyPad token + native-SEI delta on factory |
| Graduation fee | jpSEI Transfer from token contract to factory at graduation time + GraduationFeeReceived event |
| LP custody | pair.balanceOf(0xdEaD). Burned at graduation |