
V4ECHO
PROTOCOL
Every swap leaves a ghost.
Price-snapshot ERC-1155 NFTs that bleed fees from the V4 pool.
Not just a swap.
A haunting.
V4Echo turns every Uniswap swap into a tradeable price snapshot. Hold the right ghost, bleed the right pool.
Price-Snapshot Ghosts
Every swap mints a Ghost NFT tied to the exact sqrtPrice at swap time. A live fee-futures market on price levels.
Range-Bound Fees
Ghost holders earn fees only from swaps touching their specific price range. Narrow ranges = high risk, high reward.
50-Block Lockup
Ghosts are non-transferable for 50 blocks after mint. No instant flips — secondary markets emerge after lockup.
Uniswap V4 Hook
Native V4 host hook. Every swap on the ETH/V4ECHO pool mints a ghost atomically in the same transaction.
Permissionless Burn
Anyone calls burnGhost() on an expired ghost. 5% of accrued fees go to the caller, 95% to the last holder. Zero admin keys.
Unforgeable Expiry
Expiry is derived from a future blockhash — unknowable at mint, unpredictable even to block proposers.
Ghost lifecycle
From swap to burn — six phases decide the fate of every ghost.
User swaps
User swaps ETH ↔ V4ECHO on the Uniswap V4 host pool. Min 0.01 ETH to qualify for ghost mint.
Ghost minted
afterSwap hook fires. Ghost ERC-1155 minted with { sqrtPrice, birthBlock, feeAccumulatorPointer }. Transfer locked 50 blocks.
Fees pile up
Every subsequent swap touching the ghost's price range atomically increments its feeAccumulator in hook storage.
Secondary market
After the 50-block lockup, ghost becomes transferable. A live secondary market on fee rights emerges.
Lock the expiry
Anyone calls commitExpiry() within 256 blocks to lock blockhash(birthBlock + 64) into storage. Countdown to burn becomes public.
Annihilation
Post-expiry, transfers freeze. burnGhost() distributes 5% of accrued fees to the caller, 95% to the last recorded holder.
Unforgeable Expiry
At mint we only fix birthBlock + sqrtPrice. The actual expiry is derived 64 blocks later from blockhash(birthBlock + 64) — a hash that does not exist at mint and is unpredictable even to the proposer of the current block.
Anyone can lock the value into storage via commitExpiry() while the blockhash is still in scope (256 blocks). After commit, the countdown to burn becomes public — and ghost markets reprice in real time.
function burnGhost(uint256 ghostId) external {
Ghost memory g = ghosts[ghostId];
require(block.number > g.expiryBlock, "alive");
uint256 fees = g.feeAccumulator;
uint256 bounty = fees * 5 / 100;
_pay(msg.sender, bounty);
_pay(g.lastHolder, fees - bounty);
_burn(ghostId);
}Pool fees,
three ways.
Every swap fee on the ETH/V4ECHO pool gets split 90/5/5 across LPs, ghosts, and stakers.
LPs of the ETH/V4ECHO pool
Pro-rata to ghosts whose price range was touched
Protocol-level yield for staked V4ECHO
Permissionless Burn
5% of every expired ghost's accrued fees flows to whoever calls burnGhost(). No admin key, no privileged role.
Wash-Trade Proof
Fee rights are weighted by price-range width. Pumping price burns ETH in fees and is never profitable.
Governance
V4ECHO holders vote on the min/max expiry window. Everything else is hardcoded into the hook.
Why V4Echo?
Compared with a vanilla Uniswap V4 pool without the hook.
Ready to spawn your first ghost?