chapters· Networks
04 · Getting started

Networks & addresses

One canonical address on all 23 networks — 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 0xb216070c3509047ea597E2E626A29cea427a60C8 GlueLiquidity 0x26CD66aDec6176c11f894A9DE5bC504235c90241
deployments — 23 networkssame address everywhere
networkhookenv
EthereumEthereum0xb216…60C8mainnet
BaseBase0xb216…60C8mainnet
UnichainUnichain0xb216…60C8mainnet
ArbitrumArbitrum0xb216…60C8mainnet
OptimismOptimism0xb216…60C8mainnet
BNB ChainBNB Chain0xb216…60C8mainnet
PolygonPolygon0xb216…60C8mainnet
World ChainWorld Chain0xb216…60C8mainnet
ZoraZora0xb216…60C8mainnet
SoneiumSoneium0xb216…60C8mainnet
MegaETHMegaETH0xb216…60C8mainnet
RobinhoodRobinhood0xb216…60C8mainnet
TempoTempo0xb216…60C8mainnet
AvalancheAvalanche0xb216…60C8mainnet
BlastBlast0xb216…60C8mainnet
CeloCelo0xb216…60C8mainnet
MonadMonad0xb216…60C8mainnet
X LayerX Layer0xb216…60C8mainnet
SepoliaSepolia0xb216…60C8testnet
Base SepoliaBase Sepolia0xb216…60C8testnet
Unichain SepoliaUnichain Sepolia0xb216…60C8testnet
Arbitrum SepoliaArbitrum Sepolia0xb216…60C8testnet
Robinhood TestnetRobinhood Testnet0xb216…60C8testnet
canonical 0xb216070c3509047ea597E2E626A29cea427a60C8 — every network, no exceptions

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 four flags it needs:

beforeInitialize | beforeSwap | afterSwap | beforeSwapReturnsDelta = 0x20C8 // 0x…60C8 & 0x3FFF == 0x20C8 — 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 0xb216070c3509047ea597E2E626A29cea427a60C8 — on every network.
2
Check the flag bits
The low 14 bits must equal 0x20C8.
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.