nfo · how it works · what can and cannot happen
Overview Lifecycle Fee split Oracle & target Bonds Buybacks Staking Keepers Parameters Security & governance Risks Contracts FAQ

DOCUMENTATION

Nadir is a two-contract protocol layer attached to a fixed-supply token launched on Pons v2 (Robinhood Chain) and trading on Uniswap v4. It turns the token's creator fees into ETH yield for stakers and into buybacks that pay out bonds.

Overview

Pons tradescreator fee in ETH FeeSplitterharvest() Treasuryfixed share BondEngineprotocol share StakersETH rewards Buyback → cryptpays bonds

Lifecycle

  1. Deploy FeeSplitter with the treasury address and share.
  2. Launch on Pons with creatorFeeRecipient = FeeSplitter and the chosen creatorTaxBps. Both the tax and the fact that fees route through the splitter are visible on-chain from block one.
  3. Deploy BondEngine with the token address. The v4 pool id is derived on-chain from the Pons pool key. The deployer wires FeeSplitter.setProtocol(engine) exactly once.
  4. Curve phase. While the token is on the Pons bonding curve, fees accrue in the escrow and can already be harvested. The engine waits: start() only succeeds once the v4 pool exists.
  5. Graduation. Pons migrates liquidity to Uniswap v4. Anyone calls start(), the first price sample is taken, and epochs begin.
  6. Steady state. Every epoch a keeper calls poke(). Stakers accrue ETH, buybacks fill the crypt, bonds mature and are settled in order.

Fee split

Pons charges a base fee on every trade (currently 1%, of which 70% goes to the creator) plus an optional creator tax chosen at launch and immutable afterwards. All creator proceeds are credited in ETH to the recipient's balance in the Pons FeeEscrow.

DestinationShareMechanism
TreasurytreasuryBps of every harvestConstant in FeeSplitter. Cannot be changed, cannot be paused.
StakersstakingShareBps of the protocol shareAdded to a per-share accumulator the moment ETH arrives; claimable any time.
Buyback reservethe restreleaseBps of the reserve is swapped for the token every epoch and locked in the crypt.
If nobody is staking when ETH arrives, the staker share is not lost: it falls through to the buyback reserve.

Oracle & target

The engine reads sqrtPriceX96 from the Uniswap v4 StateView for the exact pool key Pons created (currency0 = ETH, currency1 = token, fee 0, tick spacing 200, hook = Pons MemeHook). The value is stored as tokens per ETH once per epoch, in a ring buffer of up to 168 samples (7 days at 1-hour epochs).

Target is the arithmetic mean of the last window samples. Discount is how far the current spot is below the target: discount = (spotTPE − targetTPE) / spotTPE, where a higher tokens-per-ETH means a cheaper token. When spot is at or above target the discount is zero and bonds are closed.

A spot price can be moved inside a block. The target cannot: it needs window epochs of sustained price to move. Bonuses are computed against the target, not against the last trade.

Bonds

bond(amount, minBonusBps) is available when the engine has at least minSamples samples, entries are not paused, and the discount is above zero.

  1. entryBurnBps of the amount is sent to the dead address.
  2. The remainder is the principal and goes to the crypt.
  3. The payout is principal × (1 + bonus), where bonus = maxBonusBps × min(discount, bandBps) / bandBps.
  4. The bond matures after vestEpochs epochs.

Bonds are paid strictly first-in, first-out by settle(n), which anyone can call. A bond is paid when it has matured and the crypt holds at least its payout. If the crypt is short, the queue waits for the next buybacks; nothing is paid out of order.

exit(id) cancels an unsettled bond at any time: the owner gets the principal minus penaltyBps, and the penalty stays in the crypt for the other bondholders.

Because payouts exceed principal, the crypt depends on inflows: buybacks funded by fees, entry penalties, and new principal. This is the same structure as coupon and bond systems in algorithmic protocols, and it is the risk described under Risks.

Buybacks

On every poke() the engine takes releaseBps of its ETH reserve and swaps it for the token directly on the Uniswap v4 PoolManager (unlock → exact-input swap → settle ETH → take tokens). The Pons hook applies its normal fees to that swap, exactly as it would for any trader. Tokens received are added to the crypt and counted in totalBoughtBack.

Releasing a fixed fraction per epoch makes the buyback a predictable, continuous bid that cannot be front-run for size: the amount is public before the epoch ends.

Staking

stake(amount) deposits the token; unstake(amount) withdraws it at any time. Rewards are ETH, tracked with a per-share accumulator. earned(user) shows what is claimable, and claimRewards() sends it. Staking never pauses withdrawals: only new deposits can be paused by the guardian.

Keepers

Three functions keep the protocol moving and all of them are permissionless:

FunctionWhenIncentive
FeeSplitter.harvest()whenever the escrow shows a balancenone needed; gas is negligible on Robinhood Chain
BondEngine.poke()once per epochcaller receives TIP_BPS of the reserve, capped at TIP_CAP
BondEngine.settle(n)after bonds maturenone; bondholders will call it
# reference keeper (Hardhat project)
ENGINE=0x… SPLITTER=0x… LOOP=1 npx hardhat run scripts/3-start-and-poke.js --network robinhood

Parameters

NameDefaultMeaning
epochLength3600 sone sample and one buyback per hour (immutable)
window24target = mean of the last 24 samples
minSamples6bonds open 6 epochs after start()
maxBonusBps5000+50% payout at the full discount band
bandBps5000full bonus reached at 50% below target
entryBurnBps1001% of each bond entry burned
vestEpochs24bonds mature after 24 epochs
penaltyBps2000early exit returns principal minus 20%
releaseBps100010% of the ETH reserve bought back per epoch
stakingShareBps5000half of incoming ETH to stakers, half to the reserve

Changing any parameter requires proposeParams() by the guardian followed by a public executeParams() at least 48 hours later. Bounds are enforced on-chain (for example, entry burn ≤ 10%, penalty ≤ 50%).

Security & governance

ActorCanCannot
Guardianpause new bonds and stakes for ≤ 7 days per call; propose parameters with a 48h delaymove any token or ETH, block unstake / exit / settle / claims / poke, change addresses or the pool
FeeSplitter deployerset the protocol address oncechange shares, withdraw, set it twice
Anyoneharvest, poke, settle, start, executeParams after the delay

Risks

Contracts

ContractAddress
BondEnginesee config
FeeSplittersee config
Tokensee config
Pons FeeEscrow0xd3AFEB2a57f70eF218Aa82451c51B2fb0416Ac9e
Pons MemeHook0xE5e702641Ea86F4ae6cC3cDaeD2B886f976Be044
Uniswap v4 PoolManager0x8366a39cc670b4001a1121b8f6a443a643e40951
Uniswap v4 StateView0xf3334192d15450cdd385c8b70e03f9a6bd9e673b

FAQ

Why are rewards paid in ETH and not in the token?

Because the fees arrive in ETH and because a reward that does not come from printing the token is the only kind that does not dilute holders.

Who decides when to pause?

The guardian address, and only for new entries. Anyone can always withdraw. A pause expires by itself after at most 7 days unless renewed.

Can the creator tax change?

No. It is set once in the Pons launch transaction and is immutable. The fee recipient can only be changed through the Pons factory with a 3-day timelock, which is public.

What happens to fees before graduation?

They accrue in the escrow and can be harvested at any time. The engine holds the protocol share as reserve until the pool exists, then starts buying back.

NADIR · NOTHING IS MINTED · NO ADMIN KEYS · FEES SPLIT IN CODE · BUYBACK EVERY EPOCH · STAKERS PAID IN ETH · BOND THE BOTTOM · NADIR · NOTHING IS MINTED · NO ADMIN KEYS · FEES SPLIT IN CODE ·