From 62027d7690f685bca89faaeacbbf2e98acd7d95b Mon Sep 17 00:00:00 2001 From: chrisli30 Date: Wed, 12 Aug 2026 20:41:49 -0700 Subject: [PATCH] feat: add Robinhood Chain (4663) Uniswap V3 + WETH Official Uniswap Robinhood deployments plus WETH from Robinhood token-contracts docs. No AAVE; no Circle USDC (day-one stable is USDG). --- .changeset/robinhood-uniswap-weth.md | 5 +++++ README.md | 4 ++-- src/chains.ts | 1 + src/protocols/uniswap-v3.ts | 9 +++++++++ src/protocols/wrapped.ts | 2 ++ tests/catalog.test.ts | 10 ++++++++++ 6 files changed, 29 insertions(+), 2 deletions(-) create mode 100644 .changeset/robinhood-uniswap-weth.md diff --git a/.changeset/robinhood-uniswap-weth.md b/.changeset/robinhood-uniswap-weth.md new file mode 100644 index 0000000..9e9c8e3 --- /dev/null +++ b/.changeset/robinhood-uniswap-weth.md @@ -0,0 +1,5 @@ +--- +"@avaprotocol/protocols": minor +--- + +Add Robinhood Chain (4663) Uniswap V3 (SwapRouter02 / QuoterV2 / Factory / NFT Position Manager / Permit2 / Universal Router) plus `wrapped.weth`. Addresses from the official Uniswap Robinhood deployment page and Robinhood token-contracts docs. No AAVE; no Circle USDC (the chain's day-one stable is USDG). diff --git a/README.md b/README.md index 99a7b05..aabc6f2 100644 --- a/README.md +++ b/README.md @@ -35,8 +35,8 @@ const sig = Protocols.aaveV3.eventTopics.Borrow; | **Sky (sDAI)** | sDAI vault + standard ERC-4626 ABI | Mainnet | | **Spark** | SparkLend Pool (AAVE V3 fork — reuse AAVE Pool ABI) | Mainnet | | **Superfluid** | CFAv1Forwarder + setFlowrate/createFlow ABI | Mainnet, Base, **BNB** | -| **Uniswap V3** | SwapRouter02, QuoterV2, Permit2, Factory, NFT Position Manager, Universal Router + ABIs | Mainnet, Sepolia, **Optimism**, Base, Base Sepolia, **BNB**, **Arbitrum**, **Unichain** | -| **Wrapped Ether** | Canonical wrapper of native gas + WETH9 ABI (WBNB on BNB) | Mainnet, Sepolia, **Optimism**, Base, Base Sepolia, **BNB**, **Arbitrum**, **Unichain** | +| **Uniswap V3** | SwapRouter02, QuoterV2, Permit2, Factory, NFT Position Manager, Universal Router + ABIs | Mainnet, Sepolia, **Optimism**, Base, Base Sepolia, **BNB**, **Arbitrum**, **Unichain**, **Robinhood** | +| **Wrapped Ether** | Canonical wrapper of native gas + WETH9 ABI (WBNB on BNB) | Mainnet, Sepolia, **Optimism**, Base, Base Sepolia, **BNB**, **Arbitrum**, **Unichain**, **Robinhood** | | **ERC-20** | Standard `approve` ABI fragment | n/a | Shared ABIs (consumed by multiple protocol modules): diff --git a/src/chains.ts b/src/chains.ts index f3238c3..bf174f3 100644 --- a/src/chains.ts +++ b/src/chains.ts @@ -17,6 +17,7 @@ export const Chains = Object.freeze({ BaseSepolia: 84_532 as const, BnbMainnet: 56 as const, ArbitrumOne: 42_161 as const, + RobinhoodMainnet: 4_663 as const, }); export type ChainId = (typeof Chains)[keyof typeof Chains] | number; diff --git a/src/protocols/uniswap-v3.ts b/src/protocols/uniswap-v3.ts index 0cbfd4d..45c9a76 100644 --- a/src/protocols/uniswap-v3.ts +++ b/src/protocols/uniswap-v3.ts @@ -28,6 +28,8 @@ const swapRouter02: AddressByChain = { [Chains.ArbitrumOne]: "0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45", // https://developers.uniswap.org/docs/protocols/v3/deployments/v3-unichain-deployments [Chains.UnichainMainnet]: "0x73855d06DE49d0fe4A9c42636Ba96c62da12FF9C", + // https://developers.uniswap.org/docs/protocols/v3/deployments/v3-robinhood-chain-deployments + [Chains.RobinhoodMainnet]: "0xCaf681a66D020601342297493863E78C959E5cb2", }; /** QuoterV2 — off-chain quote helper for swap previews. */ @@ -40,6 +42,7 @@ const quoterV2: AddressByChain = { [Chains.BnbMainnet]: "0x78D78E420Da98ad378D7799bE8f4AF69033EB077", [Chains.ArbitrumOne]: "0x61fFE014bA17989E743c5F6cB21bF9697530B21e", [Chains.UnichainMainnet]: "0x385A5cf5F83e99f7BB2852b6A19C3538b9FA7658", + [Chains.RobinhoodMainnet]: "0x33e885eD0Ec9bF04EcfB19341582aADCb4c8A9E7", }; /** @@ -55,6 +58,7 @@ const permit2: AddressByChain = { [Chains.BnbMainnet]: "0x000000000022d473030F116dDEE9F6B43aC78BA3", [Chains.ArbitrumOne]: "0x000000000022d473030F116dDEE9F6B43aC78BA3", [Chains.UnichainMainnet]: "0x000000000022d473030F116dDEE9F6B43aC78BA3", + [Chains.RobinhoodMainnet]: "0x000000000022d473030F116dDEE9F6B43aC78BA3", }; /** Uniswap V3 Factory — derives the deterministic pool address per token-pair+fee. */ @@ -67,6 +71,7 @@ const factory: AddressByChain = { [Chains.BnbMainnet]: "0xdB1d10011AD0Ff90774D0C6Bb92e5C5c8b4461F7", [Chains.ArbitrumOne]: "0x1F98431c8aD98523631AE4a59f267346ea31F984", [Chains.UnichainMainnet]: "0x1F98400000000000000000000000000000000003", + [Chains.RobinhoodMainnet]: "0x1f7d7550B1b028f7571E69A784071F0205FD2EfA", }; /** NonfungiblePositionManager — LP NFT mint/burn/collect. */ @@ -79,6 +84,7 @@ const nonfungiblePositionManager: AddressByChain = { [Chains.BnbMainnet]: "0x7b8A01B39D58278b5DE7e48c8449c9f4F5170613", [Chains.ArbitrumOne]: "0xC36442b4a4522E871399CD717aBDD847Ab11FE88", [Chains.UnichainMainnet]: "0x943e6e07a7E8E791dAFC44083e54041D743C46E9", + [Chains.RobinhoodMainnet]: "0x73991a25C818Bf1f1128dEAaB1492D45638DE0D3", }; /** UniversalRouter — Uniswap's multi-step routing entrypoint (Permit2-aware). */ @@ -91,6 +97,7 @@ const universalRouter: AddressByChain = { [Chains.BnbMainnet]: "0x4Dae2f939ACf50408e13d58534Ff8c2776d45265", [Chains.ArbitrumOne]: "0xa51afafe0263b40edaef0df8781ea9aa03e381a3", [Chains.UnichainMainnet]: "0xe6039aE5B44f90d56c6B029354Fb22999861A9A0", + [Chains.RobinhoodMainnet]: "0x8876789976decbfcbbbe364623c63652db8c0904", }; /** @@ -225,6 +232,8 @@ const tokens = Object.freeze({ [Chains.BnbMainnet]: "0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c", [Chains.ArbitrumOne]: "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1", [Chains.UnichainMainnet]: "0x4200000000000000000000000000000000000006", + // https://docs.robinhood.com/chain/contracts/ + [Chains.RobinhoodMainnet]: "0x0Bd7D308f8E1639FAb988df18A8011f41EAcAD73", } satisfies AddressByChain, USDC: { [Chains.Sepolia]: "0x1c7D4B196Cb0C7B01d743Fbc6116a902379C7238", diff --git a/src/protocols/wrapped.ts b/src/protocols/wrapped.ts index 66393cd..12dcb46 100644 --- a/src/protocols/wrapped.ts +++ b/src/protocols/wrapped.ts @@ -25,6 +25,8 @@ const weth: AddressByChain = { [Chains.BnbMainnet]: "0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c", [Chains.ArbitrumOne]: "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1", [Chains.UnichainMainnet]: "0x4200000000000000000000000000000000000006", + // https://docs.robinhood.com/chain/contracts/ + [Chains.RobinhoodMainnet]: "0x0Bd7D308f8E1639FAb988df18A8011f41EAcAD73", }; /** diff --git a/tests/catalog.test.ts b/tests/catalog.test.ts index 68d597e..db18087 100644 --- a/tests/catalog.test.ts +++ b/tests/catalog.test.ts @@ -333,6 +333,15 @@ describe("Uniswap V3 catalog", () => { expect(Protocols.wrapped.weth[Chains.UnichainMainnet]).toBe( "0x4200000000000000000000000000000000000006", ); + expect(Protocols.uniswapV3.swapRouter02[Chains.RobinhoodMainnet]).toBe( + "0xCaf681a66D020601342297493863E78C959E5cb2", + ); + expect(Protocols.uniswapV3.factory[Chains.RobinhoodMainnet]).toBe( + "0x1f7d7550B1b028f7571E69A784071F0205FD2EfA", + ); + expect(Protocols.wrapped.weth[Chains.RobinhoodMainnet]).toBe( + "0x0Bd7D308f8E1639FAb988df18A8011f41EAcAD73", + ); }); it("ships exactInputSingle in the SwapRouter02 ABI", () => { @@ -352,6 +361,7 @@ describe("Uniswap V3 catalog", () => { Chains.BnbMainnet, Chains.ArbitrumOne, Chains.UnichainMainnet, + Chains.RobinhoodMainnet, ]) { expect(Protocols.uniswapV3.permit2[chainId]?.toLowerCase()).toBe(expected.toLowerCase()); }