chapters· Networks
04 · Getting started

Networks & addresses

One canonical address on all 14 mainnets — and why the address itself is the permission.

The hook and its linked library live at the same canonical addresses on every network, source-verified on each chain's explorer. Integrate once; the same bytes run everywhere.

canonical addresses — every network, no exceptions
GlueHook 0x03D482cB3Ff339C2d29736818D0F72c66dD6A040 GlueLiquidity 0x01f739de084e7Cd3554dd4fABA970D346d3DD8Bb
deployments — 19 networkssame address everywhere
networkhookenv
EthereumEthereum0x03D4…A040mainnet
BaseBase0x03D4…A040mainnet
UnichainUnichain0x03D4…A040mainnet
ArbitrumArbitrum0x03D4…A040mainnet
OptimismOptimism0x03D4…A040mainnet
BNB ChainBNB Chain0x03D4…A040mainnet
PolygonPolygon0x03D4…A040mainnet
World ChainWorld Chain0x03D4…A040mainnet
SoneiumSoneium0x03D4…A040mainnet
MegaETHMegaETH0x03D4…A040mainnet
RobinhoodRobinhood0x03D4…A040mainnet
AvalancheAvalanche0x03D4…A040mainnet
X LayerX Layer0x03D4…A040mainnet
ArcArc0x03D4…A040mainnet
SepoliaSepolia0x03D4…A040testnet
Base SepoliaBase Sepolia0x03D4…A040testnet
Unichain SepoliaUnichain Sepolia0x03D4…A040testnet
Arbitrum SepoliaArbitrum Sepolia0x03D4…A040testnet
Robinhood TestnetRobinhood Testnet0x03D4…A040testnet
canonical 0x03D482cB3Ff339C2d29736818D0F72c66dD6A040 — every network, no exceptions

Generations

generationhookbitsstatus
V30xbB02…A0400x2040canonical — new pools, Glue engines
V20x0F41…20c80x20C8legacy — live pools still served
V10xb216…60C80x20C8legacy — live pools still served

V3 is bound at compile time to GlueStick 0xBe99cB426fDf30F95784337d4e8CC460AC8e8608. Permission bits 0x2040 mean beforeInitialize + afterSwap only — no swap-delta flags, so aggregator quotes are exact.

The address IS the permission

Uniswap V4 encodes a hook's permissions in the low 14 bits of its address. The hook's address carries exactly the two flags it needs:

beforeInitialize | afterSwap = 0x2040 // 0x…A040 & 0x3FFF == 0x2040 — check it yourself

The deployer key was mined so that its second-ever transaction (nonce 1) lands on an address with those bits, and the constructor asserts its own address — a mis-deployment fails at deploy time. Plain CREATE (not CREATE2) is what makes the address identical on every chain: it commits only to (deployer, nonce), never to the init code, so the per-chain PoolManager constructor argument doesn't change the address.

a chain ships V4 later?

The same deployer key deploys there whenever its PoolManager exists, and the addresses still match — the deployment is repeatable by construction.

Verifying you're talking to the real hook

1
Check the address
It must be exactly 0x03D482cB3Ff339C2d29736818D0F72c66dD6A040 — on every network.
2
Check the flag bits
The low 14 bits must equal 0x2040.
3
Check the source
Every deployment is source-verified; diff it against the repository if you like.

FAQ

Why is the address the same on every chain?+

The contracts are deployed from a dedicated deployer key's first-ever transactions (nonce 0 and 1), so the CREATE addresses are identical by construction. Same bytecode, same address, every network.

Why does the address itself matter for V4?+

Uniswap V4 reads a hook's permissions from the low bits of its address. The canonical address carries exactly the flag bits the machine needs — an address mismatch simply couldn't run these callbacks.

Can you deploy to a chain that isn't listed?+

When a chain ships a canonical V4 PoolManager, the same deployer can repeat the deployment there with the same resulting address. Watch the repository or ask — the process is repeatable by design.

Are testnets supported?+

Yes — Sepolia, Base Sepolia, Unichain Sepolia, Arbitrum Sepolia and Robinhood Testnet run the same contracts at the same address, so a testnet integration ports to mainnet unchanged.

Is the source verified?+

On every network: Etherscan-family explorers, Blockscout instances, and Sourcify (full creation + runtime match). The docs' networks table links each explorer page directly.