Skip to content

Latest commit

 

History

History
222 lines (189 loc) · 13.7 KB

File metadata and controls

222 lines (189 loc) · 13.7 KB

UniswapX V3 deployments

V3DutchOrderReactor + OrderQuoter deployed across all chains the Uniswap AMM front-end currently supports (see playbook/chains/README.md for the chain list). All deploys go through the canonical Arachnid CREATE2 factory (0x4e59b44847b379578588920cA78FbF26c0B4956C).

  • Reactor: per-chain (salt, address) pair mined against (PERMIT2, owner), where owner is read from each chain's v4 PoolManager.owner(). Per-chain config in playbook/chains/salts.json. Deploy script: script/DeployDutchV3.s.sol + multi-chain wrapper scripts/deploy-v3-multichain.sh.
  • OrderQuoter: stateless lens with no constructor args, so a single global salt produces the same address on every chain. Deploys to 0x00000000a3db63Df9078cBF3dF88B4CAdD5a7F58 everywhere. Deploy script: script/DeployOrderQuoter.s.sol + multi-chain wrapper scripts/deploy-quoter-multichain.sh.

Deployed by 0x2179a60856E37dfeAacA0ab043B931fE224b27B6 on 2026-05-07 (except Optimism, which had been deployed by an earlier broadcast attempt that ran into a mainnet gas-limit issue, and Tempo's pre-existing OrderQuoter from ECO-365 phase 1b).

Robinhood (4663) + Arc (5042) deployed by 0xA53247dEeC5884B5A10667dee1C378e729a93e03 on 2026-06-12. Robinhood's reactor is built from post-BlockNumberish-4663 bytecode (Robinhood is an Arbitrum Orbit chain; decay reads ArbSys.arbBlockNumber()), so its creationCode — and therefore any future chain's mined salt — differs from the 17 chains deployed before that change. Arc's reactor was mined and deployed against the pre-change bytecode. See playbook/chains/{robinhood,arc}.md.

OrderQuoter address

Same address on every chain: 0x00000000a3db63Df9078cBF3dF88B4CAdD5a7F58.

Chain ID Status Verified
Mainnet 1 ✅ deployed ✅ Etherscan
Optimism 10 ✅ deployed ✅ Etherscan
BNB 56 ✅ deployed ✅ Etherscan
Unichain 130 ✅ deployed (via cast send fallback — public RPC pruning blocked forge) ✅ Etherscan
Polygon 137 ✅ deployed ✅ Etherscan
Monad 143 ✅ deployed ✅ Etherscan (V2 unified URL)
XLayer 196 ✅ deployed ❌ (OKLink: manual upload only)
Worldchain 480 ✅ deployed ✅ Etherscan
Soneium 1868 ✅ deployed ✅ Sourcify (Blockscout)
Tempo 4217 ✅ pre-existing (ECO-365 phase 1b) ✅ Sourcify
Robinhood 4663 ✅ deployed 2026-06-12 ❌ (mainnet explorer URL not yet published)
Arc 5042 ✅ deployed 2026-06-12 ❌ (Arcscan mainnet verifier not yet confirmed)
Base 8453 ✅ deployed (recovered after a transient Cloudflare 502) ✅ Etherscan
Arbitrum 42161 ✅ deployed ✅ Etherscan
Celo 42220 ✅ deployed ✅ Etherscan
Avalanche 43114 ✅ deployed ✅ Etherscan
Linea 59144 (deferred — same as reactor, no v4 PoolManager)
Blast 81457 ✅ deployed ✅ Etherscan
Zora 7777777 ✅ deployed ✅ Blockscout

Reactor addresses

Chain ID Reactor address Protocol fee owner Verified
Mainnet 1 0x0000000015757c461808EA25Eb309638B62681cf 0x1a9C8182C09F50C8318d769245beA52c32BE35BC
Optimism 10 0x000000000923439A92daE8930613568824108631 0xa1dD330d602c32622AA270Ea73d078B803Cb3518
BNB 56 0x00000000a55e50C71b70Db3C8B58749cd1E18eB2 0x341c1511141022cf8eE20824Ae0fFA3491F1302b
Unichain 130 0x000000005aF66799D1a6317714D66800f9CA1406 0x2bad8182c09f50c8318d769245bea52c32be46cd
Polygon 137 0x00000000bAB6E234db8AD638B6A6395b7c499Bc4 0x8a1B966aC46F42275860f905dbC75EfBfDC12374
Monad 143 0x000000000Ac008F7e07210CFb6648e40249232c2 0xE783DE89a7F0408687f051e3E6D0BEb62719EbAd
XLayer 196 0x000000005aF66799D1a6317714D66800f9CA1406 0x2bad8182c09f50c8318d769245bea52c32be46cd ❌ (OKLink: manual upload only)
Worldchain 480 0x00000000d714EA34028930b762E96bFBe50F42C2 0xcb2436774C3e191c85056d248EF4260ce5f27A9D
Soneium 1868 0x000000005aF66799D1a6317714D66800f9CA1406 0x2bad8182c09f50c8318d769245bea52c32be46cd
Tempo 4217 0x00000000fc1E66C9f582566EAd00108e55F1c0C6 0xCFB43dC56B55bE9611deD8384201cECf06A9811b 🟡 Sourcify (explorer ingest unconfirmed)
Robinhood 4663 0x000000007A1C8e570011EeDF86A2A35593013cBA 0x2bad8182c09f50c8318d769245bea52c32be46cd ❌ (explorer TBD)
Arc 5042 0x0000000015134054eA82AE0bb9fda66b36402C36 0x33f26c5d69e2c40956f22c6195b6a499cf4151e8 ❌ (explorer TBD)
Base 8453 0x000000008a8330B5d1F43A62Bf4C673A49f27ba0 0x31FAfd4889FA1269F7a13A66eE0fB458f27D72A9
Arbitrum 42161 0xB274d5F4b833b61B340b654d600A864fB604a87c (see uniswapx-sdk) ✅ (pre-existing)
Celo 42220 0x00000000B8077fdf2281A80bE96f6c282B5d943A 0x0Eb863541278308c3A64F8E908BC646e27BFD071
Avalanche 43114 0x00000000862cCF095823fc7576Fa6C7e6b7385ef 0xeb0BCF27D1Fb4b25e708fBB815c421Aeb51eA9fc
Linea 59144 (deferred — no v4 PoolManager yet)
Blast 81457 0x0000000086f50C5E1a2500602183D4390A7FFc98 0x2339C0d23b60739B3E5ABF201F05903D24A26C77
Zora 7777777 0x000000002C9A3812e15cf233190992E9a57EDB56 0x36eEC182D0B24Df3DC23115D64DB521A93D5154f

Notes on the canonical-address chains

Three chains converge on the same reactor address 0x000000005aF66799D1a6317714D66800f9CA1406: Unichain, XLayer, Soneium. Each has the same v4 PoolManager.owner() value 0x2bad8182c09f50c8318d769245bea52c32be46cd, so the same (salt, owner, bytecode) tuple produces the same CREATE2 address across chains.

Transaction hashes

Chain ID Tx hash
Mainnet 1 0xbc038f17af40f47314fcadbfdaec2ce8fcc84a5f392a9092c6c441e8a143afa0
Optimism 10 0x60bd63640fc40ba5248060e0f2520ed47e64c7a5864d168ab99cde107f4df984
BNB 56 0xaf103098f478d0195d852e8cd009333edad0c7a73d8d97255264cecd2cce1bcc
Unichain 130 0xe377cc75b5ba2144e939d0c3ecf77a96fd9b1785aaab0b9b368828c9db90eaea
Polygon 137 0xe3419102fa71ca82ab63e68dea6e5a555b4117359778a662369d90ac25748fc3
Monad 143 0x3b745a3e7ddf28b42302eff6059ee8ed08772436b34462b3bdc0d4ddb0093b7f
XLayer 196 0x98f6c6013c2e0619e9b951c61e784cb3b17c4c584a8598a9d8049ea2134150e6
Worldchain 480 0x540948dcd8e6b2dca528a1f562aafa579199ba6ee0ce0a8001cb0e05950117f4
Soneium 1868 0xcb5a9516b309b1ab2e12992058f2480b4773bbf5f851ea689331ab25c13b6dce
Tempo 4217 0x5e97c535dc39893f883c8c96ba29f49a7a911d6fd2c584c3b3e02ece1cedb92d
Robinhood 4663 0xc9abd2162ed894365b5190cb55048bbb9e29b4d1fd448eef999d7e66f34e4e6b (quoter: 0xe9ebd4c203f899a57dce7b87f10e2a4f94a94489736747462e43de52b4cd24fc)
Arc 5042 0x9362b52b9b93f7b01e680d43d6f6c7355b0f832148617abfbbcd3a029409c096 (quoter: 0xd2c470b6df102890d28820bb34d0c48d7499a1a3d1df4921da2fb79842140646)
Base 8453 0xef1b4c1893bba99de9f5f56d1e2f0c9850424ecea2875ae16e95598ce9ab5d09
Celo 42220 0x02f1c4477908154ab7eac35d95757b57ba9ec04ec944b54c58667f03baf3b760
Avalanche 43114 0x1ee85f6ea0dc5b7c83f7e7a3d107391022dd1aee0f0fad8483f2b64a1c970afe
Blast 81457 0x54cf96c8a74a9142da93f8d88755aaafb3eb47815da9de3a3d2caaf6c500f9c6
Zora 7777777 0xa64c2743279f4c6d677a57488af1b97ca0c28401617c2f615e470a0c3e0d8570

Integration test results

All 18 reactor instances were exercised with the V3 Dutch order integration suite (test/integration/V3DutchOrderIntegration.t.sol) against their respective chain's public RPC, fork pinned to current-block-minus-50 (Robinhood + Arc added 2026-06-23):

FOUNDRY_RPC_URL=<chain rpc>
INTEGRATION_REACTOR=<reactor addr>
INTEGRATION_FORK_BLOCK=<recent block>
FOUNDRY_PROFILE=integration forge test --match-contract V3DutchOrderIntegrationTest

Each suite runs 6 tests across three tiers: sanity (reactor/quoter/permit2 have code, reactor bound to canonical Permit2), tier-2 (off-chain order resolution via OrderQuoter), tier-3 (end-to-end fill round-trip).

Tier-2/3 deploy fresh MockERC20s on the fork as trade tokens (some chains' native stablecoins use chain-specific opcodes that revert under Foundry's local EVM). The OrderQuoter lens is the real on-chain instance at 0x00000000a3db63Df9078cBF3dF88B4CAdD5a7F58 on every chain — the multi-chain quoter deploy made the fork-deploy fallback that earlier versions of the test had unnecessary.

Arbitrum One and Robinhood require a vm.mockCall on the ArbSys precompile (0x64) since the reactor's BlockNumberish mixin captures the chainid at deploy time and routes block-number reads through ArbSys on those chains (42161 and 4663 — both Arbitrum Orbit), which Foundry's local EVM doesn't implement.

Chain ID Reactor Tests
Mainnet 1 0x0000000015757c461808EA25Eb309638B62681cf ✅ 6/6
Optimism 10 0x000000000923439A92daE8930613568824108631 ✅ 6/6
BNB 56 0x00000000a55e50C71b70Db3C8B58749cd1E18eB2 ✅ 6/6
Unichain 130 0x000000005aF66799D1a6317714D66800f9CA1406 ✅ 6/6
Polygon 137 0x00000000bAB6E234db8AD638B6A6395b7c499Bc4 ✅ 6/6
Monad 143 0x000000000Ac008F7e07210CFb6648e40249232c2 ✅ 6/6
XLayer 196 0x000000005aF66799D1a6317714D66800f9CA1406 ✅ 6/6
Worldchain 480 0x00000000d714EA34028930b762E96bFBe50F42C2 ✅ 6/6
Soneium 1868 0x000000005aF66799D1a6317714D66800f9CA1406 ✅ 6/6
Tempo 4217 0x00000000fc1E66C9f582566EAd00108e55F1c0C6 ✅ 6/6
Robinhood 4663 0x000000007A1C8e570011EeDF86A2A35593013cBA ✅ 6/6
Arc 5042 0x0000000015134054eA82AE0bb9fda66b36402C36 ✅ 6/6
Base 8453 0x000000008a8330B5d1F43A62Bf4C673A49f27ba0 ✅ 6/6
Arbitrum 42161 0xB274d5F4b833b61B340b654d600A864fB604a87c ✅ 6/6
Celo 42220 0x00000000B8077fdf2281A80bE96f6c282B5d943A ✅ 6/6
Avalanche 43114 0x00000000862cCF095823fc7576Fa6C7e6b7385ef ✅ 6/6
Blast 81457 0x0000000086f50C5E1a2500602183D4390A7FFc98 ✅ 6/6
Zora 7777777 0x000000002C9A3812e15cf233190992E9a57EDB56 ✅ 6/6

All sanity, off-chain quote, and end-to-end fill paths verified against each deployed reactor on its native chain.

Block explorer verification

Verification status (authoritative — confirmed via Etherscan V2 API on 2026-05-07):

Verified on respective explorer (15 of 16 chains):

  • Etherscan family (11 chains, pushed via Etherscan V2 unified API): Mainnet, Optimism, BNB, Unichain, Polygon, Monad, Worldchain, Base, Celo, Avalanche, Blast.
  • Blockscout family (2 chains, picked up from Sourcify push): Soneium, Zora.
  • Arbitrum: pre-existing Etherscan verification of 0xB274d5F4....

Tempo (4217): source code is on Sourcify (perfect match) but Tempo's explorer doesn't expose a verification API, so explorer-side ingest can't be programmatically confirmed. Spot-check at explorer.tempo.xyz before considering it fully verified.

XLayer (196): unverified. OKLink doesn't accept Etherscan-style API submissions; source must be uploaded via the OKLink portal: docs.

Useful commands

Re-check status across all Etherscan-family chains (uses ETHERSCAN_API_KEY from .env — V2 unified key works for all listed chains except XLayer/Tempo):

curl "https://api.etherscan.io/v2/api?chainid=<id>&module=contract&action=getsourcecode&address=<addr>&apikey=$ETHERSCAN_API_KEY"

To re-push verification on any chain:

# Etherscan-family (with --chain registered in forge):
forge verify-contract --chain <chainId> \
  --etherscan-api-key $ETHERSCAN_API_KEY --watch \
  --constructor-args $(cast abi-encode "constructor(address,address)" \
    0x000000000022D473030F116dDEE9F6B43aC78BA3 <owner-from-table-above>) \
  <reactor-address> \
  src/reactors/V3DutchOrderReactor.sol:V3DutchOrderReactor

# Etherscan V2 chains not yet in forge's registry (Monad and similar):
forge verify-contract \
  --verifier etherscan \
  --verifier-url "https://api.etherscan.io/v2/api?chainid=<chainId>" \
  --etherscan-api-key $ETHERSCAN_API_KEY --watch \
  --constructor-args $(cast abi-encode "constructor(address,address)" \
    0x000000000022D473030F116dDEE9F6B43aC78BA3 <owner-from-table-above>) \
  <reactor-address> \
  src/reactors/V3DutchOrderReactor.sol:V3DutchOrderReactor

# Sourcify (Blockscout-integrated chains: Soneium, Zora, Worldchain, etc.):
forge verify-contract --chain <chainId> --verifier sourcify --watch \
  --constructor-args ... <addr> <contract>