From 89f603ce1e00a6f8f87c8e1c433b8bf29159468b Mon Sep 17 00:00:00 2001 From: "Siyu Jiang (See-You John)" <91580504+jsy1218@users.noreply.github.com> Date: Wed, 2 Oct 2024 07:07:57 -0700 Subject: [PATCH] feat: support routing on worldchain and astrochain (#733) - **What kind of change does this PR introduce?** (Bug fix, feature, docs update, ...) feature - **What is the current behavior?** (You can also link to an open issue here) no routing on worldchain and astrochain - **What is the new behavior (if this is a feature change)?** support routing on worldchain and astrochain - **Other information**: --- .github/workflows/tests.yml | 44 +++++++- README.md | 11 ++ package-lock.json | 106 +++++++++--------- package.json | 10 +- src/providers/caching-subgraph-provider.ts | 14 +++ src/providers/caching-token-provider.ts | 13 +++ src/providers/tenderly-simulation-provider.ts | 1 + src/providers/token-provider.ts | 36 ++++++ src/providers/v2/static-subgraph-provider.ts | 14 +++ src/providers/v3/static-subgraph-provider.ts | 14 +++ src/routers/alpha-router/alpha-router.ts | 2 + src/routers/alpha-router/config.ts | 2 + .../functions/get-candidate-pools.ts | 2 + .../alpha-router/gas-models/gas-costs.ts | 6 + .../alpha-router/gas-models/gas-model.ts | 4 + src/routers/legacy-router/bases.ts | 14 +++ src/util/addresses.ts | 30 +++++ src/util/chains.ts | 43 +++++++ src/util/l2FeeChains.ts | 2 + src/util/onchainQuoteProviderConfigs.ts | 6 +- .../alpha-router.integration.test.ts | 27 +++-- test/test-util/whales.ts | 17 +++ 22 files changed, 347 insertions(+), 71 deletions(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 44ce3ee54..af0dd766e 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -747,6 +747,48 @@ jobs: TENDERLY_ACCESS_KEY: ${{ secrets.TENDERLY_ACCESS_KEY }} TENDERLY_NODE_API_KEY: ${{ secrets.TENDERLY_NODE_API_KEY }} + integration-tests-quote-for-other-networks-worldchain: + name: Integration Tests - Quote For Other Networks WorldChain + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v1 + - uses: actions/setup-node@v1 + with: + node-version: 18.x + registry-url: https://registry.npmjs.org + + - uses: actions/cache@v2 + with: + path: ~/.npm + key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }} + restore-keys: | + ${{ runner.os }}-node- + - name: Install dependencies + run: npm install + + # This is required separately from yarn test because it generates the typechain definitions + - name: Compile + run: npm run build + + - name: Run Integration tests + run: npm run integ-test -- -t 'quote for other networks * worldchain' + env: + JSON_RPC_PROVIDER_WORLDCHAIN: ${{ secrets.JSON_RPC_PROVIDER_WORLDCHAIN }} + TENDERLY_BASE_URL: ${{ secrets.TENDERLY_BASE_URL }} + TENDERLY_USER: ${{ secrets.TENDERLY_USER }} + TENDERLY_PROJECT: ${{ secrets.TENDERLY_PROJECT }} + TENDERLY_ACCESS_KEY: ${{ secrets.TENDERLY_ACCESS_KEY }} + + - name: Run Integration tests + run: npm run integ-test -- -t 'quote for other networks * astrochain-sepolia' + env: + JSON_RPC_PROVIDER_ASTROCHAIN_SEPOLIA: ${{ secrets.JSON_RPC_PROVIDER_ASTROCHAIN_SEPOLIA }} + TENDERLY_BASE_URL: ${{ secrets.TENDERLY_BASE_URL }} + TENDERLY_USER: ${{ secrets.TENDERLY_USER }} + TENDERLY_PROJECT: ${{ secrets.TENDERLY_PROJECT }} + TENDERLY_ACCESS_KEY: ${{ secrets.TENDERLY_ACCESS_KEY }} + integration-tests-quote-for-other-networks-remaining-networks: name: Integration Tests - Quote For Other Networks Remaining Networks runs-on: ubuntu-latest @@ -774,7 +816,7 @@ jobs: # This is to capture any new networks added into the integ-test suite - name: Run Integration tests - run: npm run integ-test -- -t 'quote for other networks * (?!(mainnet|optimism|arbitrum|polygon|sepolia|celo|bnb|avalanche|base|blast|zora|zksync))' + run: npm run integ-test -- -t 'quote for other networks * (?!(mainnet|optimism|arbitrum|polygon|sepolia|celo|bnb|avalanche|base|blast|zora|zksync|worldchain|astrochain-sepolia))' env: # We don't know which new networks will be added, so we have no way to provider RPC URL ahead of time # This will make remaining networks integ-test suite to fail, and dev is expected to manually add RPC URL for the new network diff --git a/README.md b/README.md index c674f95c1..7b94eb478 100644 --- a/README.md +++ b/README.md @@ -235,6 +235,17 @@ Total ticks crossed: 7 ./bin/cli quote --tokenIn 0x5aea5775959fbc2557cc8789bc1bf90a239d9a91 --tokenOut 0x1d17cbcf0d6d143135ae902365d2e5e2a16538d4 --amount 10 --exactIn --minSplits 1 --protocols v3 --router alpha --chainId 324 ``` +## WorldChain Mainnet + +``` +./bin/cli quote --tokenIn 0x4200000000000000000000000000000000000006 --tokenOut 0x79A02482A880bCE3F13e09Da970dC34db4CD24d1 --amount 0.1 --exactIn --minSplits 1 --protocols v3 --router alpha --chainId 480 +``` + +## AstroChain Sepolia + +``` +./bin/cli quote --tokenIn 0x4200000000000000000000000000000000000006 --tokenOut 0x31d0220469e10c4E71834a79b1f276d740d3768F --amount 0.1 --exactIn --minSplits 1 --protocols v3 --router alpha --chainId 1301 +``` ## Adding a new Chain diff --git a/package-lock.json b/package-lock.json index d78a86c25..8bea84987 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,14 +13,14 @@ "@types/brotli": "^1.3.4", "@uniswap/default-token-list": "^11.13.0", "@uniswap/permit2-sdk": "^1.3.0", - "@uniswap/router-sdk": "^1.12.1", - "@uniswap/sdk-core": "^5.4.0", + "@uniswap/router-sdk": "^1.14.0", + "@uniswap/sdk-core": "^5.8.0", "@uniswap/swap-router-contracts": "^1.3.1", "@uniswap/token-lists": "^1.0.0-beta.31", "@uniswap/universal-router": "^1.6.0", - "@uniswap/universal-router-sdk": "^3.1.2", - "@uniswap/v2-sdk": "^4.3.2", - "@uniswap/v3-sdk": "^3.13.0", + "@uniswap/universal-router-sdk": "^3.3.0", + "@uniswap/v2-sdk": "^4.6.0", + "@uniswap/v3-sdk": "^3.17.0", "@uniswap/v4-sdk": "^1.6.3", "async-retry": "^1.3.1", "await-timeout": "^1.1.1", @@ -3297,22 +3297,22 @@ } }, "node_modules/@uniswap/router-sdk": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@uniswap/router-sdk/-/router-sdk-1.12.1.tgz", - "integrity": "sha512-n6ugqB54z/b24Wr6wKU39FlFHTj4KNSpksp3CAFNVOIN8l6PmVOIq3lkABcRyewUHGxgu5WCKGd36bU4UiHqaQ==", + "version": "1.14.0", + "resolved": "https://registry.npmjs.org/@uniswap/router-sdk/-/router-sdk-1.14.0.tgz", + "integrity": "sha512-5Lt3jv2fSpy67xlRAaYHfRbQYiYMivIaq1bpKyNXSjkoPWmPSZE0Hz4F/Jm/jLWX/sx6U3QbgAlg1VGSf8FuRA==", "dependencies": { "@ethersproject/abi": "^5.5.0", - "@uniswap/sdk-core": "^5.3.1", + "@uniswap/sdk-core": "^5.8.0", "@uniswap/swap-router-contracts": "^1.3.0", - "@uniswap/v2-sdk": "^4.3.2", - "@uniswap/v3-sdk": "^3.11.2", + "@uniswap/v2-sdk": "^4.6.0", + "@uniswap/v3-sdk": "^3.17.0", "@uniswap/v4-sdk": "^1.6.0" } }, "node_modules/@uniswap/sdk-core": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/@uniswap/sdk-core/-/sdk-core-5.4.0.tgz", - "integrity": "sha512-L8wxC2aC+kIo4Xq1vXWYOiql3CmC/jrXTYpqqCBAI0/ODUomrBY76jSajzqWEEqnTGC67nI8+Hl7aEhA5/UVBg==", + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@uniswap/sdk-core/-/sdk-core-5.8.0.tgz", + "integrity": "sha512-TiG8P3BOHph0JuwvfBSnkSjLYPDqGNR/iScUDr8ZCo1dqIEzasrw9yFgpirTveVfW85aQ6It/daZIvz2bght9A==", "dependencies": { "@ethersproject/address": "^5.0.2", "@ethersproject/bytes": "^5.7.0", @@ -3379,19 +3379,19 @@ } }, "node_modules/@uniswap/universal-router-sdk": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@uniswap/universal-router-sdk/-/universal-router-sdk-3.1.2.tgz", - "integrity": "sha512-nLfN/xGyDc8aS9kcVpf9i0POFWnb4pieHsRiOdjxVuing1KyPbKyXZIjxFQjBKfjG3BmTOiYfL9hT+q71f/FtA==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@uniswap/universal-router-sdk/-/universal-router-sdk-3.3.0.tgz", + "integrity": "sha512-9QYfcfS+ZKZ0Lbk+ToAZ0MBBEyXlfNnaPMCJz8J1sIbPTTHL5nVWmHmxl+KnM6nLT6sQMf+ecsgZ+UOZDNRuiQ==", "dependencies": { "@openzeppelin/contracts": "4.7.0", "@uniswap/permit2-sdk": "^1.3.0", - "@uniswap/router-sdk": "^1.12.1", - "@uniswap/sdk-core": "^5.3.1", + "@uniswap/router-sdk": "^1.14.0", + "@uniswap/sdk-core": "^5.8.0", "@uniswap/universal-router": "2.0.0-beta.1", "@uniswap/v2-core": "^1.0.1", - "@uniswap/v2-sdk": "^4.4.1", + "@uniswap/v2-sdk": "^4.6.0", "@uniswap/v3-core": "1.0.0", - "@uniswap/v3-sdk": "^3.13.1", + "@uniswap/v3-sdk": "^3.17.0", "@uniswap/v4-sdk": "^1.6.3", "bignumber.js": "^9.0.2", "ethers": "^5.7.0" @@ -3475,13 +3475,13 @@ } }, "node_modules/@uniswap/v2-sdk": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/@uniswap/v2-sdk/-/v2-sdk-4.4.1.tgz", - "integrity": "sha512-mU0YNgpm7Nmh3RSlcltluYVECdBcfQQIIQIDCM49Rog8ZnW4wp5QqEYkVjgAuqdu1mwLkMDMQUhzhtC0Z2Df6g==", + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/@uniswap/v2-sdk/-/v2-sdk-4.6.0.tgz", + "integrity": "sha512-eXx5kpuSJB21pRe8cUuoBADpfTww/Ifadp7Ue50yugMBPDzIZ8896d1DSQ/bTIfZYhx5tKmM9Zg2sAMh53dNkg==", "dependencies": { "@ethersproject/address": "^5.0.2", "@ethersproject/solidity": "^5.0.9", - "@uniswap/sdk-core": "^5.3.1", + "@uniswap/sdk-core": "^5.8.0", "tiny-invariant": "^1.1.0", "tiny-warning": "^1.0.3" }, @@ -3526,13 +3526,13 @@ } }, "node_modules/@uniswap/v3-sdk": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/@uniswap/v3-sdk/-/v3-sdk-3.14.0.tgz", - "integrity": "sha512-/fnHYnCpzp8Ruwn9/Tm2Xv2oSykNajwCRwgfdD0K/2euwdlKaNCMpGqCP1XZsugLbEEemCNjFpc3i6YAk2IdYg==", + "version": "3.17.0", + "resolved": "https://registry.npmjs.org/@uniswap/v3-sdk/-/v3-sdk-3.17.0.tgz", + "integrity": "sha512-5j8UyAQoLVghVphqjkOoIVmpvtOuTJuV5yDAygNGYU3BGl3RJzvd2P9s0heuEA2hjty7k3ucqt8j1+buUKUlNg==", "dependencies": { "@ethersproject/abi": "^5.5.0", "@ethersproject/solidity": "^5.0.9", - "@uniswap/sdk-core": "^5.3.1", + "@uniswap/sdk-core": "^5.8.0", "@uniswap/swap-router-contracts": "^1.3.0", "@uniswap/v3-periphery": "^1.1.1", "@uniswap/v3-staker": "1.0.0", @@ -14699,22 +14699,22 @@ } }, "@uniswap/router-sdk": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@uniswap/router-sdk/-/router-sdk-1.12.1.tgz", - "integrity": "sha512-n6ugqB54z/b24Wr6wKU39FlFHTj4KNSpksp3CAFNVOIN8l6PmVOIq3lkABcRyewUHGxgu5WCKGd36bU4UiHqaQ==", + "version": "1.14.0", + "resolved": "https://registry.npmjs.org/@uniswap/router-sdk/-/router-sdk-1.14.0.tgz", + "integrity": "sha512-5Lt3jv2fSpy67xlRAaYHfRbQYiYMivIaq1bpKyNXSjkoPWmPSZE0Hz4F/Jm/jLWX/sx6U3QbgAlg1VGSf8FuRA==", "requires": { "@ethersproject/abi": "^5.5.0", - "@uniswap/sdk-core": "^5.3.1", + "@uniswap/sdk-core": "^5.8.0", "@uniswap/swap-router-contracts": "^1.3.0", - "@uniswap/v2-sdk": "^4.3.2", - "@uniswap/v3-sdk": "^3.11.2", + "@uniswap/v2-sdk": "^4.6.0", + "@uniswap/v3-sdk": "^3.17.0", "@uniswap/v4-sdk": "^1.6.0" } }, "@uniswap/sdk-core": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/@uniswap/sdk-core/-/sdk-core-5.4.0.tgz", - "integrity": "sha512-L8wxC2aC+kIo4Xq1vXWYOiql3CmC/jrXTYpqqCBAI0/ODUomrBY76jSajzqWEEqnTGC67nI8+Hl7aEhA5/UVBg==", + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@uniswap/sdk-core/-/sdk-core-5.8.0.tgz", + "integrity": "sha512-TiG8P3BOHph0JuwvfBSnkSjLYPDqGNR/iScUDr8ZCo1dqIEzasrw9yFgpirTveVfW85aQ6It/daZIvz2bght9A==", "requires": { "@ethersproject/address": "^5.0.2", "@ethersproject/bytes": "^5.7.0", @@ -14780,19 +14780,19 @@ } }, "@uniswap/universal-router-sdk": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@uniswap/universal-router-sdk/-/universal-router-sdk-3.1.2.tgz", - "integrity": "sha512-nLfN/xGyDc8aS9kcVpf9i0POFWnb4pieHsRiOdjxVuing1KyPbKyXZIjxFQjBKfjG3BmTOiYfL9hT+q71f/FtA==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@uniswap/universal-router-sdk/-/universal-router-sdk-3.3.0.tgz", + "integrity": "sha512-9QYfcfS+ZKZ0Lbk+ToAZ0MBBEyXlfNnaPMCJz8J1sIbPTTHL5nVWmHmxl+KnM6nLT6sQMf+ecsgZ+UOZDNRuiQ==", "requires": { "@openzeppelin/contracts": "4.7.0", "@uniswap/permit2-sdk": "^1.3.0", - "@uniswap/router-sdk": "^1.12.1", - "@uniswap/sdk-core": "^5.3.1", + "@uniswap/router-sdk": "^1.14.0", + "@uniswap/sdk-core": "^5.8.0", "@uniswap/universal-router": "2.0.0-beta.1", "@uniswap/v2-core": "^1.0.1", - "@uniswap/v2-sdk": "^4.4.1", + "@uniswap/v2-sdk": "^4.6.0", "@uniswap/v3-core": "1.0.0", - "@uniswap/v3-sdk": "^3.13.1", + "@uniswap/v3-sdk": "^3.17.0", "@uniswap/v4-sdk": "^1.6.3", "bignumber.js": "^9.0.2", "ethers": "^5.7.0" @@ -14851,13 +14851,13 @@ } }, "@uniswap/v2-sdk": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/@uniswap/v2-sdk/-/v2-sdk-4.4.1.tgz", - "integrity": "sha512-mU0YNgpm7Nmh3RSlcltluYVECdBcfQQIIQIDCM49Rog8ZnW4wp5QqEYkVjgAuqdu1mwLkMDMQUhzhtC0Z2Df6g==", + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/@uniswap/v2-sdk/-/v2-sdk-4.6.0.tgz", + "integrity": "sha512-eXx5kpuSJB21pRe8cUuoBADpfTww/Ifadp7Ue50yugMBPDzIZ8896d1DSQ/bTIfZYhx5tKmM9Zg2sAMh53dNkg==", "requires": { "@ethersproject/address": "^5.0.2", "@ethersproject/solidity": "^5.0.9", - "@uniswap/sdk-core": "^5.3.1", + "@uniswap/sdk-core": "^5.8.0", "tiny-invariant": "^1.1.0", "tiny-warning": "^1.0.3" } @@ -14892,13 +14892,13 @@ } }, "@uniswap/v3-sdk": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/@uniswap/v3-sdk/-/v3-sdk-3.14.0.tgz", - "integrity": "sha512-/fnHYnCpzp8Ruwn9/Tm2Xv2oSykNajwCRwgfdD0K/2euwdlKaNCMpGqCP1XZsugLbEEemCNjFpc3i6YAk2IdYg==", + "version": "3.17.0", + "resolved": "https://registry.npmjs.org/@uniswap/v3-sdk/-/v3-sdk-3.17.0.tgz", + "integrity": "sha512-5j8UyAQoLVghVphqjkOoIVmpvtOuTJuV5yDAygNGYU3BGl3RJzvd2P9s0heuEA2hjty7k3ucqt8j1+buUKUlNg==", "requires": { "@ethersproject/abi": "^5.5.0", "@ethersproject/solidity": "^5.0.9", - "@uniswap/sdk-core": "^5.3.1", + "@uniswap/sdk-core": "^5.8.0", "@uniswap/swap-router-contracts": "^1.3.0", "@uniswap/v3-periphery": "^1.1.1", "@uniswap/v3-staker": "1.0.0", diff --git a/package.json b/package.json index 2374169b9..b2c4e4886 100644 --- a/package.json +++ b/package.json @@ -37,14 +37,14 @@ "@types/brotli": "^1.3.4", "@uniswap/default-token-list": "^11.13.0", "@uniswap/permit2-sdk": "^1.3.0", - "@uniswap/router-sdk": "^1.12.1", - "@uniswap/sdk-core": "^5.4.0", + "@uniswap/router-sdk": "^1.14.0", + "@uniswap/sdk-core": "^5.8.0", "@uniswap/swap-router-contracts": "^1.3.1", "@uniswap/token-lists": "^1.0.0-beta.31", "@uniswap/universal-router": "^1.6.0", - "@uniswap/universal-router-sdk": "^3.1.2", - "@uniswap/v2-sdk": "^4.3.2", - "@uniswap/v3-sdk": "^3.13.0", + "@uniswap/universal-router-sdk": "^3.3.0", + "@uniswap/v2-sdk": "^4.6.0", + "@uniswap/v3-sdk": "^3.17.0", "@uniswap/v4-sdk": "^1.6.3", "async-retry": "^1.3.1", "await-timeout": "^1.1.1", diff --git a/src/providers/caching-subgraph-provider.ts b/src/providers/caching-subgraph-provider.ts index c942e6974..768b05e17 100644 --- a/src/providers/caching-subgraph-provider.ts +++ b/src/providers/caching-subgraph-provider.ts @@ -25,6 +25,7 @@ import { USDB_BLAST, USDCE_ZKSYNC, USDC_ARBITRUM, + USDC_ASTROCHAIN_SEPOLIA, USDC_AVAX, USDC_BASE, USDC_BNB, @@ -33,6 +34,7 @@ import { USDC_NATIVE_ARBITRUM, USDC_OPTIMISM, USDC_POLYGON, + USDC_WORLDCHAIN, USDC_ZKSYNC, USDT_ARBITRUM, USDT_BNB, @@ -42,7 +44,9 @@ import { WBTC_MAINNET, WBTC_MOONBEAM, WBTC_OPTIMISM, + WBTC_WORLDCHAIN, WETH_POLYGON, + WLD_WORLDCHAIN, WMATIC_POLYGON, WSTETH_MAINNET, } from './token-provider'; @@ -121,6 +125,16 @@ export const BASES_TO_CHECK_TRADES_AGAINST: ChainTokenList = { USDCE_ZKSYNC, USDC_ZKSYNC, ], + [ChainId.WORLDCHAIN]: [ + WRAPPED_NATIVE_CURRENCY[ChainId.WORLDCHAIN]!, + USDC_WORLDCHAIN, + WLD_WORLDCHAIN, + WBTC_WORLDCHAIN, + ], + [ChainId.ASTROCHAIN_SEPOLIA]: [ + WRAPPED_NATIVE_CURRENCY[ChainId.ASTROCHAIN_SEPOLIA]!, + USDC_ASTROCHAIN_SEPOLIA, + ], }; export interface IV3SubgraphProvider { diff --git a/src/providers/caching-token-provider.ts b/src/providers/caching-token-provider.ts index 0a50fb92e..bc170a994 100644 --- a/src/providers/caching-token-provider.ts +++ b/src/providers/caching-token-provider.ts @@ -42,6 +42,7 @@ import { USDC_OPTIMISM_SEPOLIA, USDC_POLYGON, USDC_SEPOLIA, + USDC_WORLDCHAIN, USDT_ARBITRUM, USDT_BNB, USDT_MAINNET, @@ -54,6 +55,8 @@ import { WBTC_OPTIMISM, WBTC_OPTIMISM_GOERLI, WBTC_OPTIMISM_SEPOLIA, + WBTC_WORLDCHAIN, + WLD_WORLDCHAIN, WMATIC_POLYGON, WMATIC_POLYGON_MUMBAI, } from './token-provider'; @@ -171,6 +174,16 @@ export const CACHE_SEED_TOKENS: { [ChainId.ZKSYNC]: { WETH: WRAPPED_NATIVE_CURRENCY[ChainId.ZKSYNC], }, + [ChainId.WORLDCHAIN]: { + USDC: USDC_WORLDCHAIN, + WLD: WLD_WORLDCHAIN, + WBTC: WBTC_WORLDCHAIN, + WETH: WRAPPED_NATIVE_CURRENCY[ChainId.WORLDCHAIN], + }, + [ChainId.ASTROCHAIN_SEPOLIA]: { + USDC: USDC_SEPOLIA, + WETH: WRAPPED_NATIVE_CURRENCY[ChainId.ASTROCHAIN_SEPOLIA], + }, // Currently we do not have providers for Moonbeam mainnet or Gnosis testnet }; diff --git a/src/providers/tenderly-simulation-provider.ts b/src/providers/tenderly-simulation-provider.ts index 63eea56ef..d084684ce 100644 --- a/src/providers/tenderly-simulation-provider.ts +++ b/src/providers/tenderly-simulation-provider.ts @@ -147,6 +147,7 @@ export const TENDERLY_NOT_SUPPORTED_CHAINS = [ ChainId.CELO, ChainId.CELO_ALFAJORES, ChainId.ZKSYNC, + ChainId.ASTROCHAIN_SEPOLIA, ]; // We multiply tenderly gas limit by this to overestimate gas limit diff --git a/src/providers/token-provider.ts b/src/providers/token-provider.ts index 6fc89bc26..e46987d03 100644 --- a/src/providers/token-provider.ts +++ b/src/providers/token-provider.ts @@ -703,6 +703,38 @@ export const DAI_ZKSYNC = new Token( 'Dai Stablecoin' ); +export const USDC_WORLDCHAIN = new Token( + ChainId.WORLDCHAIN, + '0x79A02482A880bCE3F13e09Da970dC34db4CD24d1', + 6, + 'USDC.e', + 'Bridged USDC (world-chain-mainnet)' +); + +export const WLD_WORLDCHAIN = new Token( + ChainId.WORLDCHAIN, + '0x2cFc85d8E48F8EAB294be644d9E25C3030863003', + 18, + 'WLD', + 'Worldcoin' +); + +export const WBTC_WORLDCHAIN = new Token( + ChainId.WORLDCHAIN, + '0x03C7054BCB39f7b2e5B2c7AcB37583e32D70Cfa3', + 8, + 'WBTC', + 'Wrapped BTC' +); + +export const USDC_ASTROCHAIN_SEPOLIA = new Token( + ChainId.ASTROCHAIN_SEPOLIA, + '0x31d0220469e10c4E71834a79b1f276d740d3768F', + 6, + 'USDC', + 'USDC Token' +); + export class TokenProvider implements ITokenProvider { constructor( private chainId: ChainId, @@ -976,6 +1008,10 @@ export const USDC_ON = (chainId: ChainId): Token => { return USDC_ZORA; case ChainId.ZKSYNC: return USDCE_ZKSYNC; + case ChainId.WORLDCHAIN: + return USDC_WORLDCHAIN; + case ChainId.ASTROCHAIN_SEPOLIA: + return USDC_ASTROCHAIN_SEPOLIA; default: throw new Error(`Chain id: ${chainId} not supported`); } diff --git a/src/providers/v2/static-subgraph-provider.ts b/src/providers/v2/static-subgraph-provider.ts index 79cd50d13..3ac439ac8 100644 --- a/src/providers/v2/static-subgraph-provider.ts +++ b/src/providers/v2/static-subgraph-provider.ts @@ -23,6 +23,7 @@ import { USDB_BLAST, USDCE_ZKSYNC, USDC_ARBITRUM, + USDC_ASTROCHAIN_SEPOLIA, USDC_AVAX, USDC_BASE, USDC_BNB, @@ -31,6 +32,7 @@ import { USDC_NATIVE_ARBITRUM, USDC_OPTIMISM, USDC_POLYGON, + USDC_WORLDCHAIN, USDC_ZKSYNC, USDT_ARBITRUM, USDT_BNB, @@ -40,7 +42,9 @@ import { WBTC_MAINNET, WBTC_MOONBEAM, WBTC_OPTIMISM, + WBTC_WORLDCHAIN, WETH_POLYGON, + WLD_WORLDCHAIN, WMATIC_POLYGON, WSTETH_MAINNET, } from '../token-provider'; @@ -120,6 +124,16 @@ const BASES_TO_CHECK_TRADES_AGAINST: ChainTokenList = { USDCE_ZKSYNC, USDC_ZKSYNC, ], + [ChainId.WORLDCHAIN]: [ + WRAPPED_NATIVE_CURRENCY[ChainId.WORLDCHAIN]!, + USDC_WORLDCHAIN, + WLD_WORLDCHAIN, + WBTC_WORLDCHAIN, + ], + [ChainId.ASTROCHAIN_SEPOLIA]: [ + WRAPPED_NATIVE_CURRENCY[ChainId.ASTROCHAIN_SEPOLIA]!, + USDC_ASTROCHAIN_SEPOLIA, + ], }; /** diff --git a/src/providers/v3/static-subgraph-provider.ts b/src/providers/v3/static-subgraph-provider.ts index 183f9d63a..8d9c89adb 100644 --- a/src/providers/v3/static-subgraph-provider.ts +++ b/src/providers/v3/static-subgraph-provider.ts @@ -35,6 +35,7 @@ import { USDCE_ZKSYNC, USDC_ARBITRUM, USDC_ARBITRUM_GOERLI, + USDC_ASTROCHAIN_SEPOLIA, USDC_AVAX, USDC_BASE, USDC_BNB, @@ -46,6 +47,7 @@ import { USDC_OPTIMISM_GOERLI, USDC_POLYGON, USDC_SEPOLIA, + USDC_WORLDCHAIN, USDC_ZKSYNC, USDT_ARBITRUM, USDT_BNB, @@ -60,7 +62,9 @@ import { WBTC_MOONBEAM, WBTC_OPTIMISM, WBTC_OPTIMISM_GOERLI, + WBTC_WORLDCHAIN, WETH_POLYGON, + WLD_WORLDCHAIN, WMATIC_POLYGON, WMATIC_POLYGON_MUMBAI, WSTETH_MAINNET, @@ -175,6 +179,16 @@ const BASES_TO_CHECK_TRADES_AGAINST: ChainTokenList = { USDCE_ZKSYNC, USDC_ZKSYNC, ], + [ChainId.WORLDCHAIN]: [ + WRAPPED_NATIVE_CURRENCY[ChainId.WORLDCHAIN]!, + USDC_WORLDCHAIN, + WLD_WORLDCHAIN, + WBTC_WORLDCHAIN, + ], + [ChainId.ASTROCHAIN_SEPOLIA]: [ + WRAPPED_NATIVE_CURRENCY[ChainId.ASTROCHAIN_SEPOLIA]!, + USDC_ASTROCHAIN_SEPOLIA, + ], }; /** diff --git a/src/routers/alpha-router/alpha-router.ts b/src/routers/alpha-router/alpha-router.ts index baa6f2254..0b1484420 100644 --- a/src/routers/alpha-router/alpha-router.ts +++ b/src/routers/alpha-router/alpha-router.ts @@ -634,6 +634,8 @@ export class AlphaRouter case ChainId.BASE: case ChainId.BLAST: case ChainId.ZORA: + case ChainId.WORLDCHAIN: + case ChainId.ASTROCHAIN_SEPOLIA: case ChainId.BASE_GOERLI: this.onChainQuoteProvider = new OnChainQuoteProvider( chainId, diff --git a/src/routers/alpha-router/config.ts b/src/routers/alpha-router/config.ts index 56d0ef5ff..9b2d3f086 100644 --- a/src/routers/alpha-router/config.ts +++ b/src/routers/alpha-router/config.ts @@ -13,6 +13,8 @@ export const DEFAULT_ROUTING_CONFIG_BY_CHAIN = ( case ChainId.BASE: case ChainId.BASE_GOERLI: case ChainId.BLAST: + case ChainId.WORLDCHAIN: + case ChainId.ASTROCHAIN_SEPOLIA: return { v2PoolSelection: { topN: 3, diff --git a/src/routers/alpha-router/functions/get-candidate-pools.ts b/src/routers/alpha-router/functions/get-candidate-pools.ts index 70af937b6..0dd9329ab 100644 --- a/src/routers/alpha-router/functions/get-candidate-pools.ts +++ b/src/routers/alpha-router/functions/get-candidate-pools.ts @@ -233,6 +233,8 @@ const baseTokensByChain: { [chainId in ChainId]?: Token[] } = { [ChainId.BLAST]: [WRAPPED_NATIVE_CURRENCY[ChainId.BLAST]!, USDB_BLAST], [ChainId.ZORA]: [WRAPPED_NATIVE_CURRENCY[ChainId.ZORA]!], [ChainId.ZKSYNC]: [WRAPPED_NATIVE_CURRENCY[ChainId.ZKSYNC]!], + [ChainId.WORLDCHAIN]: [WRAPPED_NATIVE_CURRENCY[ChainId.WORLDCHAIN]!], + [ChainId.ASTROCHAIN_SEPOLIA]: [WRAPPED_NATIVE_CURRENCY[ChainId.WORLDCHAIN]!], }; class SubcategorySelectionPools { diff --git a/src/routers/alpha-router/gas-models/gas-costs.ts b/src/routers/alpha-router/gas-models/gas-costs.ts index e10cd456c..d9078acee 100644 --- a/src/routers/alpha-router/gas-models/gas-costs.ts +++ b/src/routers/alpha-router/gas-models/gas-costs.ts @@ -26,6 +26,8 @@ export const BASE_SWAP_COST = (id: ChainId): BigNumber => { case ChainId.ROOTSTOCK: case ChainId.BLAST: case ChainId.ZKSYNC: + case ChainId.WORLDCHAIN: + case ChainId.ASTROCHAIN_SEPOLIA: return BigNumber.from(2000); case ChainId.ARBITRUM_ONE: case ChainId.ARBITRUM_GOERLI: @@ -64,6 +66,8 @@ export const COST_PER_INIT_TICK = (id: ChainId): BigNumber => { case ChainId.ROOTSTOCK: case ChainId.BLAST: case ChainId.ZKSYNC: + case ChainId.WORLDCHAIN: + case ChainId.ASTROCHAIN_SEPOLIA: return BigNumber.from(31000); case ChainId.ARBITRUM_ONE: case ChainId.ARBITRUM_GOERLI: @@ -99,6 +103,8 @@ export const COST_PER_HOP = (id: ChainId): BigNumber => { case ChainId.ROOTSTOCK: case ChainId.BLAST: case ChainId.ZKSYNC: + case ChainId.WORLDCHAIN: + case ChainId.ASTROCHAIN_SEPOLIA: return BigNumber.from(80000); case ChainId.ARBITRUM_ONE: case ChainId.ARBITRUM_GOERLI: diff --git a/src/routers/alpha-router/gas-models/gas-model.ts b/src/routers/alpha-router/gas-models/gas-model.ts index 622704f5a..e31b17375 100644 --- a/src/routers/alpha-router/gas-models/gas-model.ts +++ b/src/routers/alpha-router/gas-models/gas-model.ts @@ -27,6 +27,7 @@ import { USDC_ARBITRUM, USDC_ARBITRUM_GOERLI, USDC_ARBITRUM_SEPOLIA, + USDC_ASTROCHAIN_SEPOLIA, USDC_AVAX, USDC_BASE, USDC_BNB, @@ -47,6 +48,7 @@ import { USDC_OPTIMISM_SEPOLIA, USDC_POLYGON, USDC_SEPOLIA, + USDC_WORLDCHAIN, USDC_WORMHOLE_CELO, USDC_ZKSYNC, USDC_ZORA, @@ -122,6 +124,8 @@ export const usdGasTokensByChain: { [chainId in ChainId]?: Token[] } = { [ChainId.BLAST]: [USDB_BLAST], [ChainId.ZORA]: [USDC_ZORA], [ChainId.ZKSYNC]: [DAI_ZKSYNC, USDCE_ZKSYNC, USDC_ZKSYNC], + [ChainId.WORLDCHAIN]: [USDC_WORLDCHAIN], + [ChainId.ASTROCHAIN_SEPOLIA]: [USDC_ASTROCHAIN_SEPOLIA], }; export type L1ToL2GasCosts = { diff --git a/src/routers/legacy-router/bases.ts b/src/routers/legacy-router/bases.ts index 41b31c024..288dee803 100644 --- a/src/routers/legacy-router/bases.ts +++ b/src/routers/legacy-router/bases.ts @@ -10,14 +10,18 @@ import { ITokenProvider, USDB_BLAST, USDCE_ZKSYNC, + USDC_ASTROCHAIN_SEPOLIA, USDC_AVAX, USDC_BASE, USDC_BNB, USDC_MAINNET, + USDC_WORLDCHAIN, USDC_ZKSYNC, USDT_BNB, USDT_MAINNET, WBTC_MAINNET, + WBTC_WORLDCHAIN, + WLD_WORLDCHAIN, WMATIC_POLYGON, WMATIC_POLYGON_MUMBAI, } from '../../providers/token-provider'; @@ -84,6 +88,16 @@ export const BASES_TO_CHECK_TRADES_AGAINST = ( USDCE_ZKSYNC, USDC_ZKSYNC, ], + [ChainId.WORLDCHAIN]: [ + WRAPPED_NATIVE_CURRENCY[ChainId.WORLDCHAIN]!, + USDC_WORLDCHAIN, + WLD_WORLDCHAIN, + WBTC_WORLDCHAIN, + ], + [ChainId.ASTROCHAIN_SEPOLIA]: [ + WRAPPED_NATIVE_CURRENCY[ChainId.ASTROCHAIN_SEPOLIA]!, + USDC_ASTROCHAIN_SEPOLIA, + ], }; }; diff --git a/src/util/addresses.ts b/src/util/addresses.ts index 5b3275ed2..6373f2cdc 100644 --- a/src/util/addresses.ts +++ b/src/util/addresses.ts @@ -43,6 +43,10 @@ export const V3_CORE_FACTORY_ADDRESSES: AddressMap = { [ChainId.BLAST]: CHAIN_TO_ADDRESSES_MAP[ChainId.BLAST].v3CoreFactoryAddress, [ChainId.ZORA]: CHAIN_TO_ADDRESSES_MAP[ChainId.ZORA].v3CoreFactoryAddress, [ChainId.ZKSYNC]: CHAIN_TO_ADDRESSES_MAP[ChainId.ZKSYNC].v3CoreFactoryAddress, + [ChainId.WORLDCHAIN]: + CHAIN_TO_ADDRESSES_MAP[ChainId.WORLDCHAIN].v3CoreFactoryAddress, + [ChainId.ASTROCHAIN_SEPOLIA]: + CHAIN_TO_ADDRESSES_MAP[ChainId.ASTROCHAIN_SEPOLIA].v3CoreFactoryAddress, // TODO: Gnosis + Moonbeam contracts to be deployed }; @@ -68,6 +72,10 @@ export const QUOTER_V2_ADDRESSES: AddressMap = { [ChainId.BLAST]: CHAIN_TO_ADDRESSES_MAP[ChainId.BLAST].quoterAddress, [ChainId.ZORA]: CHAIN_TO_ADDRESSES_MAP[ChainId.ZORA].quoterAddress, [ChainId.ZKSYNC]: CHAIN_TO_ADDRESSES_MAP[ChainId.ZKSYNC].quoterAddress, + [ChainId.WORLDCHAIN]: + CHAIN_TO_ADDRESSES_MAP[ChainId.WORLDCHAIN].quoterAddress, + [ChainId.ASTROCHAIN_SEPOLIA]: + CHAIN_TO_ADDRESSES_MAP[ChainId.ASTROCHAIN_SEPOLIA].quoterAddress, // TODO: Gnosis + Moonbeam contracts to be deployed }; @@ -85,6 +93,10 @@ export const NEW_QUOTER_V2_ADDRESSES: AddressMap = { [ChainId.BLAST]: '0x9D0F15f2cf58655fDDcD1EE6129C547fDaeD01b1', [ChainId.ZORA]: '0x9D0F15f2cf58655fDDcD1EE6129C547fDaeD01b1', [ChainId.ZKSYNC]: '0x071Bd2063dF031EDd110E27C6F4CDe50A3DeF2d4', + [ChainId.WORLDCHAIN]: + CHAIN_TO_ADDRESSES_MAP[ChainId.WORLDCHAIN].quoterAddress, // TODO: deploy view-only-quoter to worldchain + [ChainId.ASTROCHAIN_SEPOLIA]: + CHAIN_TO_ADDRESSES_MAP[ChainId.WORLDCHAIN].quoterAddress, // TODO: deploy view-only-quoter to astrochain }; export const PROTOCOL_V4_QUOTER_ADDRESSES: AddressMap = { @@ -127,6 +139,10 @@ export const UNISWAP_MULTICALL_ADDRESSES: AddressMap = { [ChainId.BLAST]: CHAIN_TO_ADDRESSES_MAP[ChainId.BLAST].multicallAddress, [ChainId.ZORA]: CHAIN_TO_ADDRESSES_MAP[ChainId.ZORA].multicallAddress, [ChainId.ZKSYNC]: CHAIN_TO_ADDRESSES_MAP[ChainId.ZKSYNC].multicallAddress, + [ChainId.WORLDCHAIN]: + CHAIN_TO_ADDRESSES_MAP[ChainId.WORLDCHAIN].multicallAddress, + [ChainId.ASTROCHAIN_SEPOLIA]: + CHAIN_TO_ADDRESSES_MAP[ChainId.ASTROCHAIN_SEPOLIA].multicallAddress, // TODO: Gnosis + Moonbeam contracts to be deployed }; @@ -289,6 +305,20 @@ export const WETH9: { 'WETH', 'Wrapped Ether' ), + [ChainId.WORLDCHAIN]: new Token( + ChainId.WORLDCHAIN, + '0x4200000000000000000000000000000000000006', + 18, + 'WETH', + 'Wrapped Ether' + ), + [ChainId.ASTROCHAIN_SEPOLIA]: new Token( + ChainId.ASTROCHAIN_SEPOLIA, + '0x4200000000000000000000000000000000000006', + 18, + 'WETH', + 'Wrapped Ether' + ), }; export const BEACON_CHAIN_DEPOSIT_ADDRESS = diff --git a/src/util/chains.ts b/src/util/chains.ts index ad2856d40..fe07540ff 100644 --- a/src/util/chains.ts +++ b/src/util/chains.ts @@ -26,6 +26,7 @@ export const SUPPORTED_CHAINS: ChainId[] = [ ChainId.BLAST, ChainId.ZORA, ChainId.ZKSYNC, + ChainId.WORLDCHAIN, // Gnosis and Moonbeam don't yet have contracts deployed yet ]; @@ -53,6 +54,8 @@ export const HAS_L1_FEE = [ ChainId.BASE_GOERLI, ChainId.BLAST, ChainId.ZORA, + ChainId.WORLDCHAIN, + ChainId.ASTROCHAIN_SEPOLIA, ]; export const NETWORKS_WITH_SAME_UNISWAP_ADDRESSES = [ @@ -110,6 +113,10 @@ export const ID_TO_CHAIN_ID = (id: number): ChainId => { return ChainId.ZORA; case 324: return ChainId.ZKSYNC; + case 480: + return ChainId.WORLDCHAIN; + case 1301: + return ChainId.ASTROCHAIN_SEPOLIA; default: throw new Error(`Unknown chain id: ${id}`); } @@ -138,6 +145,8 @@ export enum ChainName { BLAST = 'blast-mainnet', ZORA = 'zora-mainnet', ZKSYNC = 'zksync-mainnet', + WORLDCHAIN = 'worldchain-mainnet', + ASTROCHAIN_SEPOLIA = 'astrochain-sepolia', } export enum NativeCurrencyName { @@ -232,6 +241,16 @@ export const NATIVE_NAMES_BY_ID: { [chainId: number]: string[] } = { 'ETHER', '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee', ], + [ChainId.WORLDCHAIN]: [ + 'ETH', + 'ETHER', + '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee', + ], + [ChainId.ASTROCHAIN_SEPOLIA]: [ + 'ETH', + 'ETHER', + '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee', + ], }; export const NATIVE_CURRENCY: { [chainId: number]: NativeCurrencyName } = { @@ -256,6 +275,8 @@ export const NATIVE_CURRENCY: { [chainId: number]: NativeCurrencyName } = { [ChainId.BLAST]: NativeCurrencyName.ETHER, [ChainId.ZORA]: NativeCurrencyName.ETHER, [ChainId.ZKSYNC]: NativeCurrencyName.ETHER, + [ChainId.WORLDCHAIN]: NativeCurrencyName.ETHER, + [ChainId.ASTROCHAIN_SEPOLIA]: NativeCurrencyName.ETHER, }; export const ID_TO_NETWORK_NAME = (id: number): ChainName => { @@ -304,6 +325,10 @@ export const ID_TO_NETWORK_NAME = (id: number): ChainName => { return ChainName.ZORA; case 324: return ChainName.ZKSYNC; + case 480: + return ChainName.WORLDCHAIN; + case 1301: + return ChainName.ASTROCHAIN_SEPOLIA; default: throw new Error(`Unknown chain id: ${id}`); } @@ -353,6 +378,10 @@ export const ID_TO_PROVIDER = (id: ChainId): string => { return process.env.JSON_RPC_PROVIDER_ZORA!; case ChainId.ZKSYNC: return process.env.JSON_RPC_PROVIDER_ZKSYNC!; + case ChainId.WORLDCHAIN: + return process.env.JSON_RPC_PROVIDER_WORLDCHAIN!; + case ChainId.ASTROCHAIN_SEPOLIA: + return process.env.JSON_RPC_PROVIDER_ASTROCHAIN_SEPOLIA!; default: throw new Error(`Chain id: ${id} not supported`); } @@ -529,6 +558,20 @@ export const WRAPPED_NATIVE_CURRENCY: { [chainId in ChainId]: Token } = { 'WETH', 'Wrapped Ether' ), + [ChainId.WORLDCHAIN]: new Token( + ChainId.WORLDCHAIN, + '0x4200000000000000000000000000000000000006', + 18, + 'WETH', + 'Wrapped Ether' + ), + [ChainId.ASTROCHAIN_SEPOLIA]: new Token( + ChainId.ASTROCHAIN_SEPOLIA, + '0x4200000000000000000000000000000000000006', + 18, + 'WETH', + 'Wrapped Ether' + ), }; function isMatic( diff --git a/src/util/l2FeeChains.ts b/src/util/l2FeeChains.ts index a14c24f12..6d95452c7 100644 --- a/src/util/l2FeeChains.ts +++ b/src/util/l2FeeChains.ts @@ -8,4 +8,6 @@ export const opStackChains = [ ChainId.BASE_GOERLI, ChainId.BLAST, ChainId.ZORA, + ChainId.WORLDCHAIN, + ChainId.ASTROCHAIN_SEPOLIA, ]; diff --git a/src/util/onchainQuoteProviderConfigs.ts b/src/util/onchainQuoteProviderConfigs.ts index a40987e78..f2f79b297 100644 --- a/src/util/onchainQuoteProviderConfigs.ts +++ b/src/util/onchainQuoteProviderConfigs.ts @@ -90,9 +90,9 @@ export const GAS_ERROR_FAILURE_OVERRIDES = { ), }; -export const NETWORKS_WITH_SAME_SUCCESS_RATE_FAILURE_OVERRIDES = [ - ChainId.POLYGON, -]; +export const NETWORKS_WITH_SAME_SUCCESS_RATE_FAILURE_OVERRIDES = Object.values( + ChainId +) as ChainId[]; export function constructSameSuccessRateFailureOverridesMap< T extends FailureOverrides diff --git a/test/integ/routers/alpha-router/alpha-router.integration.test.ts b/test/integ/routers/alpha-router/alpha-router.integration.test.ts index 73c85bf84..6fcf6ff22 100644 --- a/test/integ/routers/alpha-router/alpha-router.integration.test.ts +++ b/test/integ/routers/alpha-router/alpha-router.integration.test.ts @@ -95,6 +95,7 @@ import { WBTC_GNOSIS, WBTC_MOONBEAM, WETH9, + WLD_WORLDCHAIN, WNATIVE_ON, WRAPPED_NATIVE_CURRENCY } from '../../../../src'; @@ -152,6 +153,8 @@ const GAS_ESTIMATE_DEVIATION_PERCENT: { [chainId in ChainId]: number } = { [ChainId.ROOTSTOCK]: 30, [ChainId.BLAST]: 34, [ChainId.ZKSYNC]: 40, + [ChainId.WORLDCHAIN]: 50, + [ChainId.ASTROCHAIN_SEPOLIA]: 50, }; const V2_SUPPORTED_PAIRS = [ @@ -3458,6 +3461,8 @@ describe('quote for other networks', () => { [ChainId.ROOTSTOCK]: () => USDC_ON(ChainId.ROOTSTOCK), [ChainId.BLAST]: () => USDB_BLAST, [ChainId.ZKSYNC]: () => USDC_ON(ChainId.ZKSYNC), + [ChainId.WORLDCHAIN]: () => USDC_ON(ChainId.WORLDCHAIN), + [ChainId.ASTROCHAIN_SEPOLIA]: () => USDC_ON(ChainId.ASTROCHAIN_SEPOLIA), }; const TEST_ERC20_2: { [chainId in ChainId]: () => Token } = { [ChainId.MAINNET]: () => DAI_ON(1), @@ -3485,6 +3490,8 @@ describe('quote for other networks', () => { [ChainId.ROOTSTOCK]: () => WNATIVE_ON(ChainId.ROOTSTOCK), [ChainId.BLAST]: () => WNATIVE_ON(ChainId.BLAST), [ChainId.ZKSYNC]: () => WNATIVE_ON(ChainId.ZKSYNC), + [ChainId.WORLDCHAIN]: () => WLD_WORLDCHAIN, + [ChainId.ASTROCHAIN_SEPOLIA]: () => WNATIVE_ON(ChainId.ASTROCHAIN_SEPOLIA), }; // TODO: Find valid pools/tokens on optimistic kovan and polygon mumbai. We skip those tests for now. @@ -3499,7 +3506,8 @@ describe('quote for other networks', () => { // Tests are failing https://github.com/Uniswap/smart-order-router/issues/104 c != ChainId.CELO_ALFAJORES && c != ChainId.ZORA_SEPOLIA && - c != ChainId.ROOTSTOCK + c != ChainId.ROOTSTOCK && + c != ChainId.ASTROCHAIN_SEPOLIA )) { for (const tradeType of [TradeType.EXACT_INPUT, TradeType.EXACT_OUTPUT]) { const erc1 = TEST_ERC20_1[chain](); @@ -3731,10 +3739,11 @@ describe('quote for other networks', () => { const native = NATIVE_CURRENCY[chain]; it(`${native} -> erc20`, async () => { - if (chain === ChainId.BLAST || chain === ChainId.ZORA || chain === ChainId.ZKSYNC) { + if (chain === ChainId.BLAST || chain === ChainId.ZORA || chain === ChainId.ZKSYNC || chain === ChainId.ASTROCHAIN_SEPOLIA) { // Blast doesn't have DAI or USDC yet // Zora doesn't have DAI // Zksync doesn't have liquid USDC/DAI pool yet + // astrochain sepolia doesn't have liquid USDC/DAI pool yet return; } @@ -3922,7 +3931,7 @@ describe('quote for other networks', () => { const tokenOut = erc1; const amount = tradeType == TradeType.EXACT_INPUT - ? parseAmount(chain === ChainId.ZORA ? '0.1' : '10', tokenIn) + ? parseAmount(chain === ChainId.ZORA || chain === ChainId.WORLDCHAIN || chain === ChainId.ASTROCHAIN_SEPOLIA ? '0.1' : '10', tokenIn) : parseAmount('10', tokenOut); // Universal Router is not deployed on Gorli. @@ -3995,7 +4004,7 @@ describe('quote for other networks', () => { // due to gas cost per compressed calldata byte dropping from 16 to 3. // Relying on Tenderly gas estimate is the only way our github CI can auto catch this. const percentDiff = gasEstimateDiff.mul(BigNumber.from(100)).div(swapWithSimulation!.estimatedGasUsed); - console.log(`chain ${chain} GAS_ESTIMATE_DEVIATION_PERCENT ${percentDiff.toNumber()} expected ${GAS_ESTIMATE_DEVIATION_PERCENT[chain]}`); + console.log(`chain ${chain} GAS_ESTIMATE_DEVIATION_PERCENT ${percentDiff.toNumber()} expected ${GAS_ESTIMATE_DEVIATION_PERCENT[chain]} ${swapWithSimulation!.estimatedGasUsed.toNumber()} ${swap!.estimatedGasUsed.toNumber()}`); expect(percentDiff.lte(BigNumber.from(GAS_ESTIMATE_DEVIATION_PERCENT[chain]))).toBe(true); if (swapWithSimulation) { @@ -4105,7 +4114,7 @@ describe('quote for other networks', () => { // due to gas cost per compressed calldata byte dropping from 16 to 3. // Relying on Tenderly gas estimate is the only way our github CI can auto catch this. const percentDiff = gasEstimateDiff.mul(BigNumber.from(100)).div(swapWithSimulation!.estimatedGasUsed); - console.log(`chain ${chain} GAS_ESTIMATE_DEVIATION_PERCENT ${percentDiff.toNumber()}`); + console.log(`chain ${chain} GAS_ESTIMATE_DEVIATION_PERCENT ${percentDiff.toNumber()} expected ${GAS_ESTIMATE_DEVIATION_PERCENT[chain]} ${swapWithSimulation!.estimatedGasUsed.toNumber()} ${swap!.estimatedGasUsed.toNumber()}`); expect(percentDiff.lte(BigNumber.from(GAS_ESTIMATE_DEVIATION_PERCENT[chain]))).toBe(true); if (swapWithSimulation) { @@ -4129,8 +4138,8 @@ describe('quote for other networks', () => { const tokenOut = erc2; const amount = tradeType === TradeType.EXACT_INPUT - ? parseAmount(chain === ChainId.ZORA ? '0.1' : '1', tokenIn) - : parseAmount(chain === ChainId.ZORA ? '0.01' : '1', tokenOut); + ? parseAmount(chain === ChainId.ZORA || chain === ChainId.ASTROCHAIN_SEPOLIA ? '0.1' : '1', tokenIn) + : parseAmount(chain === ChainId.ZORA || chain === ChainId.ASTROCHAIN_SEPOLIA ? '0.01' : '1', tokenOut); // Universal Router is not deployed on Gorli. const swapWithSimulationOptions: SwapOptions = @@ -4234,7 +4243,7 @@ describe('quote for other networks', () => { const tokenOut = chain == ChainId.BASE || chain == ChainId.ZORA ? USDC_ON(chain) : erc2; const amount = tradeType == TradeType.EXACT_INPUT - ? parseAmount('1', tokenIn) + ? parseAmount(chain === ChainId.WORLDCHAIN || chain === ChainId.ASTROCHAIN_SEPOLIA ? '0.01' : '1', tokenIn) : parseAmount('1', tokenOut); // Universal Router is not deployed on Gorli. @@ -4307,7 +4316,7 @@ describe('quote for other networks', () => { // due to gas cost per compressed calldata byte dropping from 16 to 3. // Relying on Tenderly gas estimate is the only way our github CI can auto catch this. const percentDiff = gasEstimateDiff.mul(BigNumber.from(100)).div(swapWithSimulation!.estimatedGasUsed); - console.log(`chain ${chain} GAS_ESTIMATE_DEVIATION_PERCENT ${percentDiff.toNumber()}`); + console.log(`chain ${chain} GAS_ESTIMATE_DEVIATION_PERCENT ${percentDiff.toNumber()} expected ${GAS_ESTIMATE_DEVIATION_PERCENT[chain]} ${swapWithSimulation!.estimatedGasUsed} ${swap!.estimatedGasUsed}`); expect(percentDiff.lte(BigNumber.from(GAS_ESTIMATE_DEVIATION_PERCENT[chain]))).toBe(true); diff --git a/test/test-util/whales.ts b/test/test-util/whales.ts index 94836dd78..3243144d3 100644 --- a/test/test-util/whales.ts +++ b/test/test-util/whales.ts @@ -16,14 +16,17 @@ import { USDC_NATIVE_OPTIMISM, USDC_NATIVE_POLYGON, USDC_ON, + USDC_WORLDCHAIN, USDC_ZORA, USDT_MAINNET, V4_SEPOLIA_TEST_A, WETH9, + WLD_WORLDCHAIN, WNATIVE_ON } from '../../src'; import { BULLET, BULLET_WITHOUT_TAX } from './mock-data'; export const WHALES = (token: Currency): string => { + let USDC_ASTROCHAIN_SEPOLIA; switch (token) { case Ether.onChain(ChainId.MAINNET) as Currency: return '0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045'; @@ -131,6 +134,20 @@ export const WHALES = (token: Currency): string => { return '0x171d311eAcd2206d21Cb462d661C33F0eddadC03'; case V4_SEPOLIA_TEST_A: return '0xB7a249bdeFf39727B5Eb4C7AD458f682BAe6aDAD'; + case WLD_WORLDCHAIN: + return '0x6348A4a4dF173F68eB28A452Ca6c13493e447aF1'; + case USDC_WORLDCHAIN: + return '0x45CED21E1d5eFB631997F2Fa1727d5577427d350'; + case nativeOnChain(ChainId.WORLDCHAIN): + return '0x6348A4a4dF173F68eB28A452Ca6c13493e447aF1'; + case WNATIVE_ON(ChainId.WORLDCHAIN): + return '0x6348A4a4dF173F68eB28A452Ca6c13493e447aF1'; + case USDC_ASTROCHAIN_SEPOLIA: + return '0xE49ACc3B16c097ec88Dc9352CE4Cd57aB7e35B95'; + case nativeOnChain(ChainId.ASTROCHAIN_SEPOLIA): + return '0xE49ACc3B16c097ec88Dc9352CE4Cd57aB7e35B95'; + case WNATIVE_ON(ChainId.ASTROCHAIN_SEPOLIA): + return '0xE49ACc3B16c097ec88Dc9352CE4Cd57aB7e35B95'; default: return '0xf04a5cc80b1e94c69b48f5ee68a08cd2f09a7c3e'; }