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.
| network | hook | env |
|---|---|---|
| 0x03D4…A040 | mainnet | |
| 0x03D4…A040 | mainnet | |
| 0x03D4…A040 | mainnet | |
| 0x03D4…A040 | mainnet | |
| 0x03D4…A040 | mainnet | |
| 0x03D4…A040 | mainnet | |
| 0x03D4…A040 | mainnet | |
| 0x03D4…A040 | mainnet | |
| 0x03D4…A040 | mainnet | |
| 0x03D4…A040 | mainnet | |
| 0x03D4…A040 | mainnet | |
| 0x03D4…A040 | mainnet | |
| 0x03D4…A040 | mainnet | |
| 0x03D4…A040 | mainnet | |
| 0x03D4…A040 | testnet | |
| 0x03D4…A040 | testnet | |
| 0x03D4…A040 | testnet | |
| 0x03D4…A040 | testnet | |
| 0x03D4…A040 | testnet |
Generations
| generation | hook | bits | status |
|---|---|---|---|
| V3 | 0xbB02…A040 | 0x2040 | canonical — new pools, Glue engines |
| V2 | 0x0F41…20c8 | 0x20C8 | legacy — live pools still served |
| V1 | 0xb216…60C8 | 0x20C8 | legacy — 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:
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.
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
0x03D482cB3Ff339C2d29736818D0F72c66dD6A040 — on every network.0x2040.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.