Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .changeset/robinhood-uniswap-weth.md
Original file line number Diff line number Diff line change
@@ -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).
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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):
Expand Down
1 change: 1 addition & 0 deletions src/chains.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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;
9 changes: 9 additions & 0 deletions src/protocols/uniswap-v3.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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. */
Expand All @@ -40,6 +42,7 @@ const quoterV2: AddressByChain = {
[Chains.BnbMainnet]: "0x78D78E420Da98ad378D7799bE8f4AF69033EB077",
[Chains.ArbitrumOne]: "0x61fFE014bA17989E743c5F6cB21bF9697530B21e",
[Chains.UnichainMainnet]: "0x385A5cf5F83e99f7BB2852b6A19C3538b9FA7658",
[Chains.RobinhoodMainnet]: "0x33e885eD0Ec9bF04EcfB19341582aADCb4c8A9E7",
};

/**
Expand All @@ -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. */
Expand All @@ -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. */
Expand All @@ -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). */
Expand All @@ -91,6 +97,7 @@ const universalRouter: AddressByChain = {
[Chains.BnbMainnet]: "0x4Dae2f939ACf50408e13d58534Ff8c2776d45265",
[Chains.ArbitrumOne]: "0xa51afafe0263b40edaef0df8781ea9aa03e381a3",
[Chains.UnichainMainnet]: "0xe6039aE5B44f90d56c6B029354Fb22999861A9A0",
[Chains.RobinhoodMainnet]: "0x8876789976decbfcbbbe364623c63652db8c0904",
};

/**
Expand Down Expand Up @@ -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",
Expand Down
2 changes: 2 additions & 0 deletions src/protocols/wrapped.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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",
};

/**
Expand Down
10 changes: 10 additions & 0 deletions tests/catalog.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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", () => {
Expand All @@ -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());
}
Expand Down
Loading