Pre-launch Powered by Uniswap v4

Auto-compounding
for the top 500 v4 pools.

A Uniswap v4 hook that ranks every pool on-chain by smoothed volume and reinvests LP fees on every swap — for free, in the same range, with no keepers required.

Pools tracked
Top 500
on-chain min-heap, by smoothed volume
Compound trigger
Every swap
round-robin, gas-bounded
UNI500 supply
500M
capped, no inflation
Tax → compounding
2%
5% hard cap, no rug surface
How it works

Three steps. On-chain. On every swap.

The hook fires inside afterSwap for any pool that installs it. No keeper bots, no off-chain ranking, no privileged operators.

Rank

Each swap pushes |amountSpecified| into a 7-day decaying volume score. The pool is re-submitted to a 500-entry min-heap; the weakest member is evicted if a stronger one appears.

Compound

If the pool is in the top-500, the hook advances a round-robin cursor and compounds exactly one user position. Fees collected → liquidity added back into the same range, all in one EVM call.

Capture

The UNI500 transfer tax (2%, 5% hard cap) flows into the hook contract. Anyone can call compoundTaxBuffer() to convert it into protocol-owned wide-range liquidity in the canonical UNI500 pool.

Tokenomics

500,000,000 UNI500. No more, no less.

Anti-whale at launch. Tax routed straight into liquidity. Limits can only be loosened, never tightened — that constraint is enforced in the contract, not by promise.

Total supply500,000,000 UNI500
Decimals18
Max buy at launch5,000,000 1% of supply
Max balance at launch5,000,000 per non-exempt address
Transfer tax2% 5% hard cap
Tax destinationHook → POL liquidity
Architecture

Built native to v4. Per-LP positions preserved.

Each LP keeps their own concentrated range — the hook is the on-chain owner of every position, but PoolManager keys each user's stake under salt = uint160(user), so fee accrual is per-user for free.

Hook permissions

Three flags. Address mined with HookMiner so the bottom 14 bits encode the permission set v4 expects.

beforeAddLiquidity // route adds through hook
beforeRemoveLiquidity // route exits through hook
afterSwap // rank + compound

Top-500 ranking

Bounded min-heap keyed by EMA-style smoothed volume (τ = 7d). Admission is O(log 500) per swap.

// per-swap
score = decay(prev, dt) + amount;
heap.submit(poolId, score);

Per-LP positions

Hook is the owner; users are keyed by salt. PoolManager handles fee bookkeeping natively.

salt = bytes32(uint160(user));
poolManager.modifyLiquidity(
  key, params, salt, ...
);

Round-robin compound

Each swap compounds exactly one eligible position (cooldown ≥ 30 min). Per-swap gas stays bounded.

cursor = (cursor + 1) % positions.length;
if (eligible(cursor)) compound(cursor);
The Top 500

500 slots. Volume-ranked. On-chain.

Heap empty — populating post-launch.
Each square is a slot in the min-heap. The brightest are the highest-ranked. Rankings update on every swap; positions in the top 500 auto-compound their fees.

Contracts

Verified on Etherscan at launch.

Addresses below will populate after the Sepolia → Mainnet deploy. The repo's script/Deploy.s.sol uses CREATE2 with HookMiner so the addresses are deterministic per-chain.

UNI500 Token
0x… TBA
AutoCompoundHook
0x… TBA
UNI500 / WETH Pool
PoolId TBA
FAQ

Common questions

What does "auto-compounding" actually mean here?
On every swap in a top-500 pool, the hook collects accrued fees from one LP's concentrated position and re-adds them as new liquidity in the exact same tick range. The LP never has to claim, sign, or pay gas — their position grows automatically.
How is "top 500" determined? Is it manipulable?
A bounded min-heap of 500 entries, keyed by an EMA-style 7-day-decaying volume score. Admission is permissionless: any pool with volume above the weakest current member's score gets admitted. The 7-day decay means historical winners can't squat. Caveat: ranking by raw |amountSpecified| isn't comparable across token pairs — production deployments should normalise to a numéraire (ETH/USDC) via TWAP. This is called out in the repo README.
Where does the UNI500 transfer tax go?
Straight to the hook contract. Tax is hard-capped at 5% in setTaxBps(). Anyone can call compoundTaxBuffer() to convert accumulated tax into a wide-range protocol-owned position in the UNI500/WETH pool — making the pool more liquid over time.
What chain is this on?
Ethereum mainnet, after a Sepolia dry-run. Because the hook address encodes the permission bits, every chain gets a different deployment — but the source is identical. The script/Deploy.s.sol is chain-agnostic.
Is the code audited?
No. The repo passes a 28-test Foundry suite covering deposit, withdraw, afterSwap volume tracking, top-500 admission, and the UNI500 tax flow. Reference quality, not audited quality. Treat any deployment as experimental until a third-party review lands.
What are the launch limits and when do they lift?
1% of supply (5,000,000 UNI500) is both the per-tx max-buy and the per-address max-balance. Limits can only be loosened or disabled — never tightened — and the constraint is checked on-chain in setLimits(). There's no fixed timer; the owner decides when liquidity is deep enough that the caps stop being protective and start being friction.
Why can't I add liquidity directly through the v4 PositionManager?
beforeAddLiquidity reverts unless the caller is the hook itself. This is what lets the hook reliably index per-user positions under salt = uint160(user). Use the hook's own deposit() entrypoint instead — it handles approvals, settles deltas, and registers your position.