EtherealFactory
EthereumEtherealFactory is a Uniswap v4 hook on Ethereum. Brand new: its first pool went live today. Active: 120 trades in the last week, and 2 new pools this week.
- Contract name
- EtherealFactory
How this hook works
Token launcherEthereal is a one-contract token launchpad: the same contract creates the token, puts in its liquidity and acts as its hook. Every trade pays a fee in ETH, shared between the token creator and the platform.
Launch in one step
One call creates the token, sets up its pool with the launch liquidity and, if the token creator wants, makes their first buy, all at once.
The code that does this (launch):function launch(LaunchParams calldata p) external payable returns (address token) { if ( p.startTick <= 0 || p.startTick % TICK_SPACING != 0 || p.startTick > TickMath.maxUsableTick(TICK_SPACING) || p.feeBps > MAX_FEE_BPS || bytes(p.name).length == 0 || bytes(p.symbol).length == 0 || msg.value < launchFee ) revert BadParams(); uint256 devBuy = msg.value - launchFee; if (devBuy != 0 && p.buyRecipient == address(0)) revert BadParams(); token = _deployToken(p); if (uint160(token) & VANITY_MASK != VANITY) revert BadVanity(); allTokens.push(token); PoolKey memory key = _key(token); uint256 positionId = _seed(token, key, p.startTick); launches[token] = LaunchInfo({ feeRecipient: msg.sender, feeBps: p.feeBps, startTick: p.startTick, openedAt: uint32(block.timestamp), migrateTick: _migrateTick(p.startTick), creator: msg.sender, positionId: positionId }); uint256 bought; if (msg.value != 0) bought = _launchPayments(token, key, devBuy, p.feeBps, p.buyRecipient); if (bought < p.minTokensOut) revert TooLittleReceived(); if (bought != 0) _checkMigrate(token, key, launches[token]); // dev buy alone may cross the milestone // …Fee on every trade in ETH
Each buy and sell pays a fee from the ETH side. The token creator gets the base fee part, minus the platform’s share, and can claim it whenever they like.
The code that does this (_distribute):function _distribute(address token, address recipient, bool isBuy, uint256 gross, uint256 fee, uint256 basePart) private { if (basePart > fee) basePart = fee; uint256 toCreator = basePart - basePart * platformShareBps / BPS; uint256 toPlatform = fee - toCreator; if (toCreator != 0) pendingFees[recipient] += toCreator; if (toPlatform != 0) pendingFees[platformWallet] += toPlatform; emit Fee(token, isBuy, gross, fee, toCreator, toPlatform); }Higher fee right after launch
For a short time after launch the fee is much higher, to make sniping by bots expensive. Then it drops to the token’s normal rate.
The code that does this (_rate):function _rate(uint256 baseBps, uint32 openedAt) private view returns (uint256) { uint256 elapsed = block.timestamp - openedAt; if (elapsed >= SNIPE_DURATION || SNIPE_START_BPS <= baseBps) return baseBps; return SNIPE_START_BPS; }Milestone tracking
The hook notes when a token’s price passes its launch range and records its market value at that point.
The code that does this (_checkMigrate):function _checkMigrate(address token, PoolKey memory key, LaunchInfo storage l) private { int24 mt = l.migrateTick; if (mt == MIGRATED) return; PoolId id = key.toId(); (uint160 sqrtC, int24 tick,,) = poolManager.getSlot0(id); if (tick > mt) return; l.migrateTick = MIGRATED; uint160 sqrtU = TickMath.getSqrtPriceAtTick(l.startTick); uint256 ethInLp = sqrtC < sqrtU ? SqrtPriceMath.getAmount0Delta(sqrtC, sqrtU, _launchLiquidity(l.startTick), false) : 0; uint256 mc = FullMath.mulDiv(FullMath.mulDiv(TOTAL_SUPPLY, 1 << 96, sqrtC), 1 << 96, sqrtC); // ETH per token * supply emit Migrate(token, id, ethInLp, mc, tick); }
Who controls it: Each token’s base fee is set at launch. The token creator can change where their share is paid. The code itself can’t be changed.
Based on the hook’s published code.What do these labels mean?
What it can do
Its code executes inside each trade in pools that use it.
It can take or add tokens during a swap. Fees, burns and custom curves work this way, and so do scams.
It runs when a pool is created, often to lock in that pool’s settings.
Hook history
- Took its fee from a trade 120 times
Latest transactions
- 0x7cb5ddb3…6532da block 26,406,356 · 0.000946 Axiom
- 0x34723c50…2373e5 block 26,406,356 · 0.000566 Axiom
- 0x096fb274…3cfa91 block 26,406,356 · 0.000468 Axiom
- 0xbf82b61b…2ed7ec block 26,406,356 · 0.000722 Axiom
- 0xdd1271b6…7ce90d block 26,406,348 · 0.00179 Axiom
- 0x82289ffb…dce4f8 block 26,406,348 · 0.00156 Axiom
- 0xf8bd80be…1c8121 block 26,406,348 · 0.00195 Axiom
- 0xf050c9e0…e0ef2e block 26,406,348 · 0.00205 Axiom
- 0x5ec58eed…80c395 block 26,406,348 · 0.00337 Axiom
- 0x43cbad28…b53bee block 26,406,347 · 0.000246 Axiom
- A wallet claimed its fees 2 times
Latest transactions
- 0x08aeffd6…2abcd4 block 26,406,153
- 0x08aeffd6…2abcd4 block 26,406,153
- A new token launched 2 times
Latest transactions
- 0xa388acb1…27f354 block 26,406,280
- 0x6b76f81b…f084fc block 26,406,116
- Burned tokens 2 times
Latest transactions
- 0xa388acb1…27f354 block 26,406,280 · 2.07e-15 Axiom
- 0x6b76f81b…f084fc block 26,406,116 · 2.07e-15 BEEF
Counted from what the hook recorded on-chain across all its pools, for every action in its published code, plus token transfers in and out of it.