Skip to content
ProjectX
How it works

A prize funded by interest, on a deposit that never leaves your control

Principal is delegated to a validator and returned 1:1. The yield that principal earns is pooled, and each epoch the whole pot goes to one depositor instead of a fraction of it to everyone.

Sui mainnet
Parameters

The settings it runs on

These are the settings the pool runs on today.

Governance can adjust these within compiled ceilings. Any interface reads the current values live from the ProjectX API.

Epoch length24 hoursOne prize per epoch
Minimum deposit1SUI
Liquidity buffer10%Held unstaked so ordinary withdrawals settle at once
Tranche maturity7 daysBefore a tranche is rotated off the ladder
The epoch

Four phases, and the pool is only ever in one of them

An epoch closes, a winner is drawn, a price is checked, the prize is converted and paid. Each transition is a separate on-chain transaction, so a failure in one stage cannot corrupt another.

  1. 1Open

    Deposits and withdrawals are accepted. Yield accrues on the stake ladder.

    OPEN
  2. 2Draw

    The epoch has closed. A winner is selected, weighted by stake.

    AWAITING_DRAW
  3. 3Price check

    The oracle is read and the conversion rate is bounded before any swap.

    AWAITING_SWAP
  4. 4Settle

    The prize is converted through the DEX and paid to the winner in USDC.

    SWAP_IN_FLIGHT

What happens if a phase cannot complete

An epoch that closes with no yield, no depositors or no draw weight rolls over rather than aborting — the prize carries into the next epoch. This is deliberate: an abort would leave the pool stuck in a phase from which the harvest that creates a prize can never run. If the conversion cannot be made within the slippage bound, or the price feed is stale, settlement simply does not happen this epoch. In none of these paths is principal touched.

Where the yield comes from

A ladder, not a lump

Sui staking rewards accrue per epoch and are only realised when a stake is withdrawn. Staking everything as one position would mean unstaking everything to harvest — so the pool stakes in tranches of staggered age.

Stake ladder · depth 6captures 85.7% of available yield
  • tranche 11/6 epochs
  • tranche 22/6 epochs
  • tranche 33/6 epochs
  • tranche 44/6 epochs
  • tranche 55/6 epochs
  • tranche 6rotates

Each epoch the oldest mature tranche is unstaked, its yield harvested, and its principal restaked at the back of the ladder. Withdrawals are served from the liquid buffer first; only a withdrawal larger than the buffer reaches the ladder, and it takes from the head regardless of maturity — which resets that tranche’s clock.

Withdrawals come first

A 10% buffer stays liquid, so an ordinary withdrawal never has to disturb the ladder. A withdrawal larger than the buffer pulls from the ladder head immediately and regardless of maturity — your right to leave outranks the pool’s yield, every time, by design.

Yield is real, and it takes time

A tranche must sit for six complete Sui epochs before it is rotated and its rewards realised. On a young pool, or one being actively tested with withdrawals, harvests can legitimately return zero for a while. The protocol tracks consecutive zero-yield harvests and flags the anomaly rather than quietly reporting health.

The draw

Your chance is your share

Selection is proportional to stake. Twice the principal is twice the chance — never a guarantee, and never at anyone else's expense.

Selection · weighted by stake
ABCDErest
random pointwinning sliceO(log n) lookup

Randomness comes from Sui’s native on-chain source, consumed inside a non-public entry function so the drawn value cannot be read and acted on within the same transaction. Ineligible slots are resampled rather than skipped, which keeps the remaining distribution exactly proportional to principal.

A deposit made in epoch N becomes eligible to win in epoch N + 2. That waiting period is deliberate: without it, depositing immediately before a draw and withdrawing immediately after would be a way to buy a ticket without ever putting principal at work.

Losing costs nothing

If you are not drawn, your position is exactly what it was: the same principal, withdrawable on demand, entered in the next epoch. The only thing you forgo is the interest you would have earned on your own deposit — which is precisely what funds the prize.

The receipt cannot be taken from you

Your deposit receipt is a Move object with key and no store. No external transaction can transfer, sell, lend or wrap it — a whole class of drain exploits simply has no surface here.

Settlement

The prize is converted at a rate the contract checks first

Winners are paid in USDC. Getting there means a price and a swap, and both are bounded before either runs.

Step one

Read the oracle

A Switchboard on-demand aggregator is pulled and validated: positive mean, sample age inside the freshness window, dispersion within the permitted band. A reading that fails any check stops settlement.

Step two

Bound the swap

The oracle price sets fair value; the contract will not accept an execution worse than 2% from it. A DEX quote outside that bound reverts the settlement rather than selling the prize badly.

Step three

Pay the winner

The converted USDC is paid to the drawn depositor, less the 2% conversion spread, and the settlement is emitted as an on-chain event with the realised rate and slippage.

The honest caveat

Settlement depends on two external systems — one price feed and one DEX pool. There is no feed redundancy today; it is a known limitation and it is on the roadmap. The failure mode is a delayed prize, not a lost deposit: if either system is unavailable, the epoch does not settle and the pot rolls forward.

Every claim here resolves to an object on Sui

Open the package, the pool, the treasury or the price feed on a block explorer and read the same state this page describes.