whitepaper · v0.1

$EGG

a demurrage memecoin. holding rots. providing liquidity ferments.

every wallet that holds $EGG bleeds 2% of its balance per day, continuously, into a rewards pool. that pool drains on every swap and pays out pro-rata to LPs in the canonical $EGG / ETH Uniswap v4 pool.

two roles, one egg:

  • holders lose 2% / day. forever. there is no staking, no vesting, no team unlock that fixes this. hold $EGG, watch the number go down.
  • LPs capture the rot. every gram lost from every wallet flows to the liquidity providers of the canonical pool, weighted by liquidity × time.

that's the entire game.

§1 · hard numbers

the parameters, frozen.

total supply
1,000,000,000 $EGG
fixed. no mint, no burn outside the LP NFT.
decay rate
2% / day · continuous-compound
balance(t) = balance(0) · exp(−r·t), where r = ln(1 / 0.98) / 86,400 s
after 1 day
× 0.98
after 30 days
× 0.5455
after 1 year
× 0.000628
≈ 0.06% of original
pool
Uniswap v4 · $EGG / ETH
fee 1% (10000), tickSpacing 200, full range
initial price
1 ETH = 4,200,000 $EGG
LP NFT
minted full-range
transferred to 0x…dEaD on launch — liquidity is irrevocable
launch cap
15,000,000 $EGG (1.5% of supply)
per non-exempt wallet · first 60 minutes only, then uncapped
§2 · the rot, mathematically

path-independent demurrage.

$EGG is a shares-based rebase ERC-20. each non-exempt wallet stores shares; balances are derived as

balance = shares · 1e18 / sharesPerToken

sharesPerToken grows continuously:

sharesPerToken(t) = sharesPerToken(0) · exp(r · t)

every state-changing call (transfer, swap, hook callback, manual poke()) settles accrual using Solady's expWad, so the math is path-independent:

SPT(t₁ + t₂) = SPT(t₁) · exp(r · t₂)

mass conservation is the central invariant. the “rotted” tokens are not destroyed — they're added to pendingNestRewards, which the NestHook drains.

exemptSupply + nonExemptSupply + pendingNestRewards = 1,000,000,000 $EGG
§3 · how LPs get paid

the hook, the accumulator.

the NestHook is a Uniswap v4 hook with permission bits for afterInitialize, before/afterAddLiquidity, before/afterRemoveLiquidity, and beforeSwap. reward bookkeeping is the standard Curve / MasterChef accumulator scaled by 2¹²⁸:

solidity
// on every swap, before the swap touches the pool:
uint256 claimed = EggToken.claimNestRewards();
rotPerLiquidityX128 += (claimed << 128) / poolLiquidity;

// on add: snapshot
position.entryRotPerLiquidityX128 = rotPerLiquidityX128;

// on remove: pay
uint256 owed = (rotPerLiquidityX128 − position.entry) * position.liquidity >> 128;
EggToken.transfer(lp, owed);

consequences:

  • LPs that enter mid-period earn only on rot accrued after their entry.
  • two LPs holding equal liquidity over the same window earn equal rewards.
  • LPs holding 2× the liquidity earn 2× the rewards.
  • rewards keep compounding for as long as the LP keeps liquidity.

to receive rewards, encode your LP address as hookData = abi.encode(yourAddress) when calling PositionManager.modifyLiquidities. if hookData is empty, the rewards go to whoever called modifyLiquidities (which, through PositionManager, is PositionManager itself, and they're stranded). always pass hookData.

§4 · exempt addresses

the four that don't rot.

a small fixed set of addresses do not rot:

  • Uniswap v4 PoolManager — so the pool's reserve cannot melt out from under it.
  • Uniswap v4 PositionManager — transient holder during liquidity moves.
  • the NestHook — claimed rewards don't re-rot.
  • the EggLauncher — only relevant during the launch, then irrelevant.

that's it. the set is frozen at deploy. every other address — yours, ours, exchanges', bots' — rots normally. the exempt mapping is owner-only and ownership is renounced immediately after the launch.

§5 · the pause switch

one lever, then none.

until ownership is renounced, the contract has a single privileged lever: pause(). while paused, rot accrual freezes; on unpause(), the paused interval is not retroactively decayed. this exists exclusively for the shadow-deploy validation window. the deployer renounces ownership in the same session, after which:

  • there is no pause
  • there is no exempt mutation
  • there is no nestHook re-binding
  • there is no admin

the contract is then frozen forever.

§6 · anti-whale window

60 minutes, 1.5%.

for 60 minutes after startLaunchClock() (called immediately after the pool is seeded), no non-exempt wallet can cross 15,000,000 $EGG (1.5% of supply). exempt addresses (the pool, the hook) are unaffected. after 60 minutes the cap is gone, also forever.

this blocks single-wallet sniping at launch. it does not block bot armies, sybil farms, or anything else fundamentally — that's a feature of permissionless launches and we accept it.

§7 · stack

what it's built with.

  • Solidity 0.8.26, optimizer 1M runs, Cancun EVM
  • Solady FixedPointMathLib.expWad for the demurrage exponential
  • OpenZeppelin Ownable (renounceable), IERC721Receiver
  • Uniswap v4-core PoolManager — 0x000000000004444c5dC75cB358380D2e3dE08A90
  • Uniswap v4-periphery PositionManager
  • Hook address CREATE2-mined via HookMiner so the lower 14 bits encode the required permission flags
  • Foundry for build / test / deploy
  • Forked-mainnet integration tests against the real PoolManager and PositionManager bytecode
§8 · what you can verify on-chain

run these. trust nothing else.

after launch, every claim made on this page is checkable:

bash
# total supply is exactly 1B, forever
cast call $EGG "totalSupply()(uint256)"

# the LP NFT belongs to the dead address
cast call $POSITION_MANAGER "ownerOf(uint256)(address)" $LP_TOKEN_ID

# the hook is locked to a single pool
cast call $HOOK "canonicalPoolId()(bytes32)"
cast call $HOOK "poolLocked()(bool)"

# ownership has been renounced
cast call $EGG "owner()(address)"   # → 0x0000…0000

# rot is currently accruing
cast call $EGG "pendingRot()(uint256)"

# you, specifically, have rotted this much since you bought:
cast call $EGG "balanceOf(address)(uint256)" $YOU
§9 · risks (the honest list)

what can go wrong.

  1. rot is real. if you hold for a year and never LP, you have approximately 0.06% of what you bought. this is the design, not a bug.
  2. LP rewards are paid in $EGG, which itself rots. if you LP and never remove, your rewards rot in the hook until you remove (or until anyone swaps, which folds them into the per-liquidity accumulator).
  3. 2% / day compounds. 30 days ≈ −45.5%. 1 year ≈ −99.94%. plan accordingly.
  4. the pool is permanent. the LP NFT is at 0x…dEaD. there is no rugpull vector via liquidity removal. there is also no upgrade path if something goes wrong, after ownership is renounced.
  5. hook code is bespoke. this is not a fork of an audited template. it has been written carefully and tested, but it is what it is. do your own research.
  6. v4 is new. PoolManager, PositionManager, hooks — all freshly mainnet. the integration is built against the canonical mainnet release; if you find a discrepancy, file an issue and don’t ape size.
tl;dr
  • 1B supply
  • 2% / day decay on every wallet
  • decay flows to v4 LPs of $EGG / ETH
  • LP NFT burned, ownership renounced
  • 15M-per-wallet cap for 60 min, then unconstrained
  • the egg always moves

the egg knows.