/ builder

Compose the
rules first

Five blocks, numbered the way the contract names them. Everything on this page is computed here in your browser by the same arithmetic the contract executes, and checked against the same validation the contract applies. Nothing is sent anywhere until you launch.

This page settles the rules and only the rules. A token’s name, its ticker and its opening price belong to the transaction that opens the pool, so they are asked for on the launch page — and the panel below the five blocks carries whatever you build here into it.

/ 01 Anti-snipe

Caps each buy at a share of the in-range reserve and adds a surcharge, for a fixed number of blocks after the pool opens.

beforeSwap · while the window is open

/ 02 Surge fees

The LP fee rises with how deep the trade bites into liquidity. No oracle, no keeper — it is arithmetic on the reserve.

beforeSwap · every buy

/ 03 Auto burn

A share of the tokens bought goes to the dead address inside the same swap. The pool's reserves are untouched; only the buyer receives less.

afterSwap · once the output is known

/ 04 LP rewards

A share of the ETH is donated to whoever holds in-range liquidity, before the swap sees it.

beforeSwap · out of the input

/ 05 Nth-buy pot

A share of each qualifying buy accumulates, and every Nth buy takes it. The counter advances at most once per block and is public.

beforeSwap · out of the input

/ one buy, end to end
in0.100000 ETH

beforeSwap

01Anti-snipecap 5% of the reserve, +1% feeallowed
02Surge fees0.3% → 5% by depthfee 1.347%
04LP rewards2% donated to in-range LPs−0.002000 ETH
05Nth-buy potnot armed · skipped
reaches the swap0.098000 ETH
the pool swaps at 1.347%

afterSwap

03Auto burnnot armed · skipped
outtokens, less the burn

The numbers are names, not a sequence. Auto Burn is block 03 and runs last, because it works on an output that does not exist until the swap has happened.

/ next

The rules are settled. The token is not.

A name, a ticker and an opening price belong to the transaction that opens the pool, not to the hook — so they are asked for on the launch page. This carries everything above into it unchanged, and sends nothing: the config travels in the address bar, which also makes it a link you can hand to someone else.

launch a token
with this hook →
/ what this stack costs
taken from each buy
2%LP rewards plus the pot, out of the ETH in
LP fee
0.3% → 5%rises with trade depth
burned from the output
nothing
gas on a buy
~93,34683,278 base + 10,068 for 3 blocks

Gas is measured, not estimated: a 0.1 ETH buy against a 10 ETH pool in test/unit/BlockGas.t.sol, second buy so the storage is warm. Your figure moves with the pool, not with this page.

/ simulate a buy
fee charged
1.347%
to in-range LPs
0.002000 ETH
to the pot
0.000000 ETH
reaches the swap
0.098000 ETH
of which the fee
0.001320 ETH
burned from the output
nothing
counts toward the pot
no pot
/ would the hook accept thisaccepted

Every check in BlockHook._validate passes. The chain would take this config as written.

These are the hook’s nine checks, in its order, naming the error it would revert with. Read them against the deployed hook.

/ the config
BlockConfig({
    guardBlocks: 300,
    maxBuyBps: 500,
    snipeTaxPips: 10000,
    baseFeePips: 3000,
    maxFeePips: 50000,
    surgeSens: 10000,
    burnBps: 0,
    burnTriggerWei: 0,
    lpBps: 200,
    potBps: 0,
    potEveryN: 0,
    potMinBuyWei: 0
})
(300,500,10000,3000,50000,10000,0,0,200,0,0,0)
/ hook flags

0x28CC

beforeInitializebeforeAddLiquiditybeforeSwapafterSwapbeforeSwapReturnDeltaafterSwapReturnDelta

The low 14 bits of the hook’s address, which is how v4 knows which callbacks to make. They belong to the deployed contract, not to your config: every pool Quench opens is served by the same hook, so this mask never changes. Check it against E8Cc at the end of its address.

/ publish

A published blueprint is a config anyone can launch against. It cannot be edited or withdrawn afterwards, and its royalty comes out of the creator’s fee share, never out of a buyer.

Connect a wallet to sign this. Everything above is computed without one.

Simulated against the launchpad before your wallet opens, so a refusal arrives by name rather than as a failed transaction.

Prefer to do it from a terminal? Copy the struct above and call publishBlueprint with cast send --account — see the docs.