deploy Universal Router 2.1 to Robinhood Chain#141
Closed
david-uniswap wants to merge 2 commits into
Closed
Conversation
Adds UniversalRouter v2.1 to the Robinhood Chain (4663) deployment, with UnsupportedProtocol as the acrossSpokePool placeholder. Deployed: - UniversalRouter (v2.1): 0x248a454ac3584c2a48d1fcb28d3910a6b6ea00af Tx: 0x66347de408f4f8f5de452b1f3b709c4ec4313c77ce75d69fea9924526004c8e3 - UnsupportedProtocol: 0x7332D11BD10d18A04B119Cd4671a96f3148002c4 Tx: 0x029d23d957e6d9f39b2bd655a10d01e764999b32344c2ccdcb9667259cd80f24 Why v2.1 over v2.0: v2.1 includes features that have nothing to do with Across (proxy approval swapping via SwapProxy, PAY_PORTION_FULL_PRECISION for high-precision fees, per-hop slippage via minHopPriceX36 on v3SwapExactInput/Output). The spokePool arg is only consumed by command 0x40 (ACROSS_V4_DEPOSIT_V3); pointing it at UnsupportedProtocol means any attempted Across call reverts cleanly with UnsupportedProtocolError() instead of the empty extcodesize revert that address(0) produces. Deploy was run in two steps because Deploy-all.s.sol reads acrossSpokePool.value directly from the task config and doesn't propagate UnsupportedProtocol's deployed address. Step A deployed UnsupportedProtocol; Step B wired its address into acrossSpokePool.value and deployed UR. Chronicles required a manual patch into deployments/json/4663.json: UR v2.1 uses CREATE2 via the canonical 0x4e59...956c deployer, which leaves contractName=null in the broadcast file and causes chronicles to skip it (ambiguous match against v2.0 vs v2.1 artifacts). v2.0 used plain CREATE, which was self-labeling. Constructor args (RouterParameters struct): - permit2: 0x000000000022D473030F116dDEE9F6B43aC78BA3 - weth9: 0x0Bd7D308f8E1639FAb988df18A8011f41EAcAD73 - v2Factory: 0x8bcEaA40B9AcdfAedF85AdF4FF01F5Ad6517937f - v3Factory: 0x1f7d7550B1b028f7571E69A784071F0205FD2EfA - v2PairInitCodeHash: 0x96e8ac4277198ff8b6f785478aa9a39f403cb768dd02cbee326c3e7da348845f - v3PoolInitCodeHash: 0xe34f199b19b2b4f47f68442619d555527d244f78a3297ea89325f843f87b8b54 - v4PoolManager: 0x8366a39CC670B4001A1121B8F6A443A643e40951 - v3NFTPositionMgr: 0x73991a25C818Bf1f1128dEAaB1492D45638DE0D3 - v4PositionMgr: 0x58daec3116aae6D93017bAAea7749052E8a04fA7 - spokePool: 0x7332D11BD10d18A04B119Cd4671a96f3148002c4 (UnsupportedProtocol)
Chronicles index regeneration overwrote "Tempo Mainnet" (4217) and "Robinhood Chain" (4663) with generic "Chain 4217" / "Chain 4663" fallbacks. Restore the human-readable names. These show up as the fallback when forge-chronicles' bundled chains.json doesn't carry the chain — both of these are recent additions not yet in chainid.network. The fix is purely cosmetic to the index page.
This was referenced May 26, 2026
Collaborator
Author
david-uniswap
added a commit
that referenced
this pull request
May 28, 2026
deploy Universal Router 2.1.1 to Robinhood Chain (replaces #141)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Deploys UniversalRouter v2.1 to Robinhood Chain (4663). Replaces the prior v2.0 PR (closing in favor of this).
0x248a454ac3584c2a48d1fcb28d3910a6b6ea00af0x66347de408f4f8f5de452b1f3b709c4ec4313c77ce75d69fea9924526004c8e30x7332D11BD10d18A04B119Cd4671a96f3148002c40x029d23d957e6d9f39b2bd655a10d01e764999b32344c2ccdcb9667259cd80f24Why v2.1 over v2.0
v2.1 includes features that have nothing to do with Across:
SwapProxy(no Permit2 signed messages required)PAY_PORTION_FULL_PRECISION(command0x07) for high-precision feesminHopPriceX36on v3SwapExactInput/OutputThe
spokePoolconstructor arg is only consumed by command0x40(ACROSS_V4_DEPOSIT_V3). Pointing it at our deployedUnsupportedProtocolmeans any Across call reverts cleanly withUnsupportedProtocolError()instead of the empty extcodesize revert thataddress(0)produces — same pattern Uniswap uses elsewhere for missing protocols on a given chain.When/if Across adds a SpokePool on Robinhood, we can redeploy UR pointing at the real SpokePool.
Two-step deploy
Deploy-all.s.solreadsacrossSpokePool.valuedirectly from the task config and doesn't propagateUnsupportedProtocol's deployed address, so the deploy ran in two passes:unsupported-protocolenabled. DeployedUnsupportedProtocol.UnsupportedProtocolmarkeddeploy: false + address,acrossSpokePool.valueset to its address,universal-routerflipped todeploy: true. DeployedUniversalRouter.Constructor args (RouterParameters struct)
0x000000000022D473030F116dDEE9F6B43aC78BA30x0Bd7D308f8E1639FAb988df18A8011f41EAcAD730x8bcEaA40B9AcdfAedF85AdF4FF01F5Ad6517937f0x1f7d7550B1b028f7571E69A784071F0205FD2EfA0x96e8ac4277198ff8b6f785478aa9a39f403cb768dd02cbee326c3e7da348845f0xe34f199b19b2b4f47f68442619d555527d244f78a3297ea89325f843f87b8b540x8366a39CC670B4001A1121B8F6A443A643e409510x73991a25C818Bf1f1128dEAaB1492D45638DE0D30x58daec3116aae6D93017bAAea7749052E8a04fA70x7332D11BD10d18A04B119Cd4671a96f3148002c4(UnsupportedProtocol)Verification
Onchain immutables match expected wiring:
SPOKE_POOL()→ UnsupportedProtocol ✓V3_POSITION_MANAGER()→ v3 NPM ✓V4_POSITION_MANAGER()→ v4 PM ✓poolManager()→ v4 PoolManager ✓Chronicles patching
UR v2.1 uses
CREATE2via the canonical0x4e59…956cdeployer, which leavescontractName=nullin the broadcast file and causesforge-chroniclesto skip it (can't disambiguate between v2.0 and v2.1 artifacts). The v2.0 deployer used plainCREATEso the previous chronicles run worked automatically. For v2.1, the entries indeployments/json/4663.jsonwere patched in manually (see commit body).Cost
Test plan