Compare commits

...

20 Commits

Author SHA1 Message Date
shawnxin89
238fe28bd7 Merge branch 'shawn/ftm' of github.com:0xProject/protocol into ftm 2021-10-15 10:43:53 -07:00
shawnxin89
1f0e518de0 prettier codes 2021-10-15 10:17:19 -07:00
shawnxin89
3362be3e11 lint 2021-10-15 10:17:19 -07:00
shawnxin89
0e48886797 clean up codes 2021-10-15 10:17:19 -07:00
shawnxin89
a97641901f add more Fantom liquidity sources 2021-10-15 10:17:19 -07:00
shawnxin89
466df9fee7 add support for ftm 2021-10-15 10:17:19 -07:00
shawnxin89
543a3dd8a4 add Fantom Curve 2021-10-15 10:17:19 -07:00
shawnxin89
6b1cdd9bd1 ftm deployment 2021-10-15 10:17:19 -07:00
shawnxin89
dbf899b20d Merge branch 'development' of github.com:0xProject/protocol into development 2021-10-15 10:15:00 -07:00
shawnxin89
341e1162e0 prettier codes 2021-10-14 16:04:34 -07:00
shawnxin89
126b3c2079 lint 2021-10-14 15:35:44 -07:00
shawnxin89
9b9ed535c7 clean up codes 2021-10-14 15:17:28 -07:00
shawnxin89
17f81d8609 add more Fantom liquidity sources 2021-10-14 14:59:17 -07:00
shawnxin89
225907b359 Merge branch 'testftm' into ftm 2021-10-08 11:30:55 -07:00
shawnxin89
eb464f0cef add support for ftm 2021-10-08 11:30:36 -07:00
shawnxin89
23571a0b84 Merge branch 'testftm' into ftm 2021-10-08 11:26:50 -07:00
shawnxin89
c6a138a158 Merge branch 'development' of github.com:0xProject/protocol into development 2021-10-08 11:15:29 -07:00
shawnxin89
64110cfb96 add Fantom Curve 2021-10-01 12:47:25 -07:00
shawnxin89
bd833b38b7 ftm deployment 2021-09-30 11:24:04 -07:00
Romain Butteaud
f3b3ab05ea WIP Clipper new weth router test 2021-09-23 11:41:49 -07:00
7 changed files with 199 additions and 11 deletions

View File

@@ -11,8 +11,10 @@ import {
COMETHSWAP_ROUTER_BY_CHAIN_ID,
COMPONENT_POOLS_BY_CHAIN_ID,
CRYPTO_COM_ROUTER_BY_CHAIN_ID,
CURVE_FANTOM_INFOS,
CURVE_MAINNET_INFOS,
CURVE_POLYGON_INFOS,
CURVE_V2_FANTOM_INFOS,
CURVE_V2_MAINNET_INFOS,
CURVE_V2_POLYGON_INFOS,
DFYN_ROUTER_BY_CHAIN_ID,
@@ -40,6 +42,8 @@ import {
SMOOTHY_BSC_INFOS,
SMOOTHY_MAINNET_INFOS,
SNOWSWAP_MAINNET_INFOS,
SPIRITSWAP_ROUTER_BY_CHAIN_ID,
SPOOKYSWAP_ROUTER_BY_CHAIN_ID,
SUSHISWAP_ROUTER_BY_CHAIN_ID,
SWERVE_MAINNET_INFOS,
TRADER_JOE_ROUTER_BY_CHAIN_ID,
@@ -133,6 +137,15 @@ export function getCurveInfosForPair(chainId: ChainId, takerToken: string, maker
[makerToken, takerToken].filter(v => c.metaTokens?.includes(v)).length > 0),
),
);
case ChainId.Fantom:
return Object.values(CURVE_FANTOM_INFOS).filter(c =>
[makerToken, takerToken].every(
t =>
(c.tokens.includes(t) && c.metaTokens === undefined) ||
(c.tokens.includes(t) &&
[makerToken, takerToken].filter(v => c.metaTokens?.includes(v)).length > 0),
),
);
default:
return [];
}
@@ -159,6 +172,15 @@ export function getCurveV2InfosForPair(chainId: ChainId, takerToken: string, mak
[makerToken, takerToken].filter(v => c.metaTokens?.includes(v)).length > 0),
),
);
case ChainId.Fantom:
return Object.values(CURVE_V2_FANTOM_INFOS).filter(c =>
[makerToken, takerToken].every(
t =>
(c.tokens.includes(t) && c.metaTokens === undefined) ||
(c.tokens.includes(t) &&
[makerToken, takerToken].filter(v => c.metaTokens?.includes(v)).length > 0),
),
);
default:
return [];
}
@@ -443,7 +465,9 @@ export function uniswapV2LikeRouterAddress(
| ERC20BridgeSource.ShibaSwap
| ERC20BridgeSource.JetSwap
| ERC20BridgeSource.TraderJoe
| ERC20BridgeSource.Pangolin,
| ERC20BridgeSource.Pangolin
| ERC20BridgeSource.SpookySwap
| ERC20BridgeSource.SpiritSwap,
): string {
switch (source) {
case ERC20BridgeSource.UniswapV2:
@@ -484,6 +508,10 @@ export function uniswapV2LikeRouterAddress(
return PANGOLIN_ROUTER_BY_CHAIN_ID[chainId];
case ERC20BridgeSource.TraderJoe:
return TRADER_JOE_ROUTER_BY_CHAIN_ID[chainId];
case ERC20BridgeSource.SpookySwap:
return SPOOKYSWAP_ROUTER_BY_CHAIN_ID[chainId];
case ERC20BridgeSource.SpiritSwap:
return SPIRITSWAP_ROUTER_BY_CHAIN_ID[chainId];
default:
throw new Error(`Unknown UniswapV2 like source ${source}`);
}

View File

@@ -57,6 +57,7 @@ function valueByChainId<T>(rest: Partial<{ [key in ChainId]: T }>, defaultValue:
[ChainId.Polygon]: defaultValue,
[ChainId.PolygonMumbai]: defaultValue,
[ChainId.Avalanche]: defaultValue,
[ChainId.Fantom]: defaultValue,
...(rest || {}),
};
}
@@ -163,6 +164,13 @@ export const SELL_SOURCE_FILTER_BY_CHAIN_ID = valueByChainId<SourceFilters>(
ERC20BridgeSource.TraderJoe,
ERC20BridgeSource.SushiSwap,
]),
[ChainId.Fantom]: new SourceFilters([
ERC20BridgeSource.Curve,
ERC20BridgeSource.CurveV2,
ERC20BridgeSource.SpiritSwap,
ERC20BridgeSource.SpookySwap,
ERC20BridgeSource.SushiSwap,
]),
},
new SourceFilters([]),
);
@@ -269,6 +277,13 @@ export const BUY_SOURCE_FILTER_BY_CHAIN_ID = valueByChainId<SourceFilters>(
ERC20BridgeSource.TraderJoe,
ERC20BridgeSource.SushiSwap,
]),
[ChainId.Fantom]: new SourceFilters([
ERC20BridgeSource.Curve,
ERC20BridgeSource.CurveV2,
ERC20BridgeSource.SpiritSwap,
ERC20BridgeSource.SpookySwap,
ERC20BridgeSource.SushiSwap,
]),
},
new SourceFilters([]),
);
@@ -288,6 +303,7 @@ export const FEE_QUOTE_SOURCES_BY_CHAIN_ID = valueByChainId<ERC20BridgeSource[]>
[ChainId.Ropsten]: [ERC20BridgeSource.UniswapV2, ERC20BridgeSource.SushiSwap],
[ChainId.Polygon]: [ERC20BridgeSource.QuickSwap, ERC20BridgeSource.SushiSwap],
[ChainId.Avalanche]: [ERC20BridgeSource.Pangolin, ERC20BridgeSource.TraderJoe, ERC20BridgeSource.SushiSwap],
[ChainId.Fantom]: [ERC20BridgeSource.SpiritSwap, ERC20BridgeSource.SpookySwap, ERC20BridgeSource.SushiSwap],
},
[],
);
@@ -324,6 +340,7 @@ const MIRROR_WRAPPED_TOKENS = {
// Mainnet tokens
// Not an exhaustive list, just enough so we don't repeat ourselves
export const MAINNET_TOKENS = {
ETH: '0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE',
WETH: '0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2',
// Stable Coins
DAI: '0x6b175474e89094c44da98b954eedeac495271d0f',
@@ -435,6 +452,16 @@ export const AVALANCHE_TOKENS = {
DAI: '0xd586e7f844cea2f87f50152665bcbc2c279d8d70',
};
export const FANTOM_TOKENS = {
WFTM: '0x21be370d5312f44cb42ce377bc9b8a0cef1a4c83',
WETH: '0x74b23882a30290451a17c44f4f05243b6b58c76d',
USDC: '0x04068da6c83afcfa0e13ba15a6696662335d5b75',
DAI: '0x8d11ec38a3eb5e956b052f67da8bdc9bef8abf3e',
fUSDT: '0x049d68029688eabf473097a2fc38ef61633a3c7a',
WBTC: '0x321162cd933e2be498cd2267a90534a804051b11',
renBTC: '0xdbf31df14b66535af65aac99c32e9ea844e14501',
};
export const CURVE_POOLS = {
compound: '0xa2b47e3d5c44877cca798226b7b8118f9bfb7a56', // 0.Compound
// 1.USDT is dead
@@ -496,6 +523,16 @@ export const CURVE_V2_POLYGON_POOLS = {
atricrypto3: '0x1d8b86e3d88cdb2d34688e87e72f388cb541b7c8',
};
export const CURVE_FANTOM_POOLS = {
fUSDT: '0x92D5ebF3593a92888C25C0AbEF126583d4b5312E',
twoPool: '0x27E611FD27b276ACbd5Ffd632E5eAEBEC9761E40',
ren: '0x3eF6A01A0f81D6046290f3e2A8c5b843e738E604',
};
export const CURVE_V2_FANTOM_POOLS = {
tricrypto: '0x3a1659Ddcf2339Be3aeA159cA010979FB49155FF',
};
export const SWERVE_POOLS = {
y: '0x329239599afb305da0a2ec69c58f8a6697f9f88d',
};
@@ -594,6 +631,7 @@ export const DEFAULT_INTERMEDIATE_TOKENS_BY_CHAIN_ID = valueByChainId<string[]>(
AVALANCHE_TOKENS.DAI,
AVALANCHE_TOKENS.USDT,
],
[ChainId.Fantom]: [FANTOM_TOKENS.WFTM, FANTOM_TOKENS.WETH, FANTOM_TOKENS.DAI, FANTOM_TOKENS.USDC],
},
[],
);
@@ -622,6 +660,9 @@ export const DEFAULT_TOKEN_ADJACENCY_GRAPH_BY_CHAIN_ID = valueByChainId<TokenAdj
[ChainId.Avalanche]: new TokenAdjacencyGraphBuilder({
default: DEFAULT_INTERMEDIATE_TOKENS_BY_CHAIN_ID[ChainId.Avalanche],
}).build(),
[ChainId.Fantom]: new TokenAdjacencyGraphBuilder({
default: DEFAULT_INTERMEDIATE_TOKENS_BY_CHAIN_ID[ChainId.Fantom],
}).build(),
},
new TokenAdjacencyGraphBuilder({ default: [] }).build(),
);
@@ -636,6 +677,7 @@ export const NATIVE_FEE_TOKEN_BY_CHAIN_ID = valueByChainId<string>(
[ChainId.Kovan]: getContractAddressesForChainOrThrow(ChainId.Kovan).etherToken,
[ChainId.Polygon]: getContractAddressesForChainOrThrow(ChainId.Polygon).etherToken,
[ChainId.Avalanche]: getContractAddressesForChainOrThrow(ChainId.Avalanche).etherToken,
[ChainId.Fantom]: getContractAddressesForChainOrThrow(ChainId.Fantom).etherToken,
},
NULL_ADDRESS,
);
@@ -956,6 +998,33 @@ export const CURVE_V2_POLYGON_INFOS: { [name: string]: CurveInfo } = {
}),
};
// TODO: modify gasSchedule
export const CURVE_FANTOM_INFOS: { [name: string]: CurveInfo } = {
[CURVE_FANTOM_POOLS.ren]: createCurveExchangePool({
tokens: [FANTOM_TOKENS.WBTC, FANTOM_TOKENS.renBTC],
pool: CURVE_FANTOM_POOLS.ren,
gasSchedule: 171e3,
}),
[CURVE_FANTOM_POOLS.twoPool]: createCurveExchangePool({
tokens: [FANTOM_TOKENS.DAI, FANTOM_TOKENS.USDC],
pool: CURVE_FANTOM_POOLS.twoPool,
gasSchedule: 176e3,
}),
[CURVE_FANTOM_POOLS.fUSDT]: createCurveExchangeUnderlyingPool({
tokens: [FANTOM_TOKENS.fUSDT, FANTOM_TOKENS.DAI, FANTOM_TOKENS.USDC],
pool: CURVE_FANTOM_POOLS.fUSDT,
gasSchedule: 587e3,
}),
};
export const CURVE_V2_FANTOM_INFOS: { [name: string]: CurveInfo } = {
[CURVE_V2_FANTOM_POOLS.tricrypto]: createCurveExchangeV2Pool({
tokens: [FANTOM_TOKENS.fUSDT, FANTOM_TOKENS.WBTC, FANTOM_TOKENS.WETH],
pool: CURVE_V2_FANTOM_POOLS.tricrypto,
gasSchedule: 300e3,
}),
};
export const SWERVE_MAINNET_INFOS: { [name: string]: CurveInfo } = {
[SWERVE_POOLS.y]: createCurveExchangePool({
tokens: [MAINNET_TOKENS.DAI, MAINNET_TOKENS.USDC, MAINNET_TOKENS.USDT, MAINNET_TOKENS.TUSD],
@@ -1203,20 +1272,32 @@ export const KYBER_CONFIG_BY_CHAIN_ID = valueByChainId<KyberSamplerOpts>(
export const LIQUIDITY_PROVIDER_REGISTRY_BY_CHAIN_ID = valueByChainId<LiquidityProviderRegistry>(
{
[ChainId.Mainnet]: {
['0x1d0d407c5af8c86f0a6494de86e56ae21e46a951']: {
// ['0x1d0d407c5af8c86f0a6494de86e56ae21e46a951']: {
// tokens: [
// MAINNET_TOKENS.WETH,
// MAINNET_TOKENS.USDC,
// MAINNET_TOKENS.USDT,
// MAINNET_TOKENS.WBTC,
// MAINNET_TOKENS.PAX,
// MAINNET_TOKENS.LINK,
// MAINNET_TOKENS.KNC,
// MAINNET_TOKENS.MANA,
// MAINNET_TOKENS.DAI,
// MAINNET_TOKENS.BUSD,
// MAINNET_TOKENS.AAVE,
// MAINNET_TOKENS.HT,
// ],
// gasCost: (takerToken: string, makerToken: string) =>
// [takerToken, makerToken].includes(MAINNET_TOKENS.WETH) ? 160e3 : 280e3,
// },
['0xe82906b6b1b04f631d126c974af57a3a7b6a99d9']: {
tokens: [
MAINNET_TOKENS.WETH,
// MAINNET_TOKENS.WETH, // technically ETH but our sampler and mixin handle this
MAINNET_TOKENS.ETH,
MAINNET_TOKENS.WBTC,
MAINNET_TOKENS.USDC,
MAINNET_TOKENS.USDT,
MAINNET_TOKENS.WBTC,
MAINNET_TOKENS.PAX,
MAINNET_TOKENS.LINK,
MAINNET_TOKENS.KNC,
MAINNET_TOKENS.MANA,
MAINNET_TOKENS.DAI,
MAINNET_TOKENS.BUSD,
MAINNET_TOKENS.AAVE,
MAINNET_TOKENS.HT,
],
gasCost: (takerToken: string, makerToken: string) =>
[takerToken, makerToken].includes(MAINNET_TOKENS.WETH) ? 160e3 : 280e3,
@@ -1249,6 +1330,7 @@ export const SUSHISWAP_ROUTER_BY_CHAIN_ID = valueByChainId<string>(
[ChainId.Ropsten]: '0x1b02da8cb0d097eb8d57a175b88c7d8b47997506',
[ChainId.Polygon]: '0x1b02da8cb0d097eb8d57a175b88c7d8b47997506',
[ChainId.Avalanche]: '0x1b02da8cb0d097eb8d57a175b88c7d8b47997506',
[ChainId.Fantom]: '0x1b02dA8Cb0d097eB8D57A175b88c7D8b47997506',
},
NULL_ADDRESS,
);
@@ -1619,6 +1701,20 @@ export const TRADER_JOE_ROUTER_BY_CHAIN_ID = valueByChainId<string>(
NULL_ADDRESS,
);
export const SPIRITSWAP_ROUTER_BY_CHAIN_ID = valueByChainId<string>(
{
[ChainId.Fantom]: '0x16327e3fbdaca3bcf7e38f5af2599d2ddc33ae52',
},
NULL_ADDRESS,
);
export const SPOOKYSWAP_ROUTER_BY_CHAIN_ID = valueByChainId<string>(
{
[ChainId.Fantom]: '0xf491e7b69e4244ad4002bc14e878a34207e38c29',
},
NULL_ADDRESS,
);
export const VIP_ERC20_BRIDGE_SOURCES_BY_CHAIN_ID = valueByChainId<ERC20BridgeSource[]>(
{
[ChainId.Mainnet]: [ERC20BridgeSource.UniswapV2, ERC20BridgeSource.SushiSwap, ERC20BridgeSource.UniswapV3],
@@ -1769,6 +1865,12 @@ export const DEFAULT_GAS_SCHEDULE: Required<FeeSchedule> = {
//
[ERC20BridgeSource.Pangolin]: uniswapV2CloneGasSchedule,
[ERC20BridgeSource.TraderJoe]: uniswapV2CloneGasSchedule,
//
// Fantom
//
[ERC20BridgeSource.SpiritSwap]: uniswapV2CloneGasSchedule,
[ERC20BridgeSource.SpookySwap]: uniswapV2CloneGasSchedule,
};
export const DEFAULT_FEE_SCHEDULE: Required<FeeSchedule> = { ...DEFAULT_GAS_SCHEDULE };

View File

@@ -184,6 +184,10 @@ export function getErc20BridgeSourceToBridgeSource(source: ERC20BridgeSource): s
return encodeBridgeSourceId(BridgeProtocol.UniswapV2, 'Pangolin');
case ERC20BridgeSource.TraderJoe:
return encodeBridgeSourceId(BridgeProtocol.UniswapV2, 'TraderJoe');
case ERC20BridgeSource.SpiritSwap:
return encodeBridgeSourceId(BridgeProtocol.UniswapV2, 'SpiritSwap');
case ERC20BridgeSource.SpookySwap:
return encodeBridgeSourceId(BridgeProtocol.UniswapV2, 'SpookySwap');
default:
throw new Error(AggregationError.NoBridgeForSource);
}
@@ -260,6 +264,8 @@ export function createBridgeDataForBridgeOrder(order: OptimizedMarketBridgeOrder
case ERC20BridgeSource.JetSwap:
case ERC20BridgeSource.Pangolin:
case ERC20BridgeSource.TraderJoe:
case ERC20BridgeSource.SpiritSwap:
case ERC20BridgeSource.SpookySwap:
const uniswapV2FillData = (order as OptimizedMarketBridgeOrder<UniswapV2FillData>).fillData;
bridgeData = encoder.encode([uniswapV2FillData.router, uniswapV2FillData.tokenAddressPath]);
break;
@@ -450,6 +456,8 @@ export const BRIDGE_ENCODERS: {
[ERC20BridgeSource.ShibaSwap]: routerAddressPathEncoder,
[ERC20BridgeSource.Pangolin]: routerAddressPathEncoder,
[ERC20BridgeSource.TraderJoe]: routerAddressPathEncoder,
[ERC20BridgeSource.SpiritSwap]: routerAddressPathEncoder,
[ERC20BridgeSource.SpookySwap]: routerAddressPathEncoder,
// BSC
[ERC20BridgeSource.PancakeSwap]: routerAddressPathEncoder,
[ERC20BridgeSource.PancakeSwapV2]: routerAddressPathEncoder,

View File

@@ -1197,6 +1197,8 @@ export class SamplerOperations {
case ERC20BridgeSource.JetSwap:
case ERC20BridgeSource.Pangolin:
case ERC20BridgeSource.TraderJoe:
case ERC20BridgeSource.SpiritSwap:
case ERC20BridgeSource.SpookySwap:
const uniLikeRouter = uniswapV2LikeRouterAddress(this.chainId, source);
if (!isValidAddress(uniLikeRouter)) {
return [];
@@ -1466,6 +1468,8 @@ export class SamplerOperations {
case ERC20BridgeSource.JetSwap:
case ERC20BridgeSource.Pangolin:
case ERC20BridgeSource.TraderJoe:
case ERC20BridgeSource.SpiritSwap:
case ERC20BridgeSource.SpookySwap:
const uniLikeRouter = uniswapV2LikeRouterAddress(this.chainId, source);
if (!isValidAddress(uniLikeRouter)) {
return [];

View File

@@ -93,6 +93,9 @@ export enum ERC20BridgeSource {
// Avalanche
Pangolin = 'Pangolin',
TraderJoe = 'TraderJoe',
// Fantom
SpiritSwap = 'SpiritSwap',
SpookySwap = 'SpookySwap',
}
export type SourcesWithPoolsCache = ERC20BridgeSource.Balancer | ERC20BridgeSource.BalancerV2 | ERC20BridgeSource.Cream;

View File

@@ -376,5 +376,47 @@
"fillQuoteTransformer": "0x8a5417dd7ffde61ec61e11b45797e16686e1d6b9",
"positiveSlippageFeeTransformer": "0x470ba89da18a6db6e8a0567b3c9214b960861857"
}
},
"250": {
"erc20Proxy": "0x0000000000000000000000000000000000000000",
"erc721Proxy": "0x0000000000000000000000000000000000000000",
"zrxToken": "0x0000000000000000000000000000000000000000",
"etherToken": "0xb31f66aa3c1e785363f0875a1b74e27b85fd66c7",
"exchangeV2": "0x0000000000000000000000000000000000000000",
"exchange": "0x0000000000000000000000000000000000000000",
"assetProxyOwner": "0x0000000000000000000000000000000000000000",
"zeroExGovernor": "0x0000000000000000000000000000000000000000",
"forwarder": "0x0000000000000000000000000000000000000000",
"coordinatorRegistry": "0x0000000000000000000000000000000000000000",
"coordinator": "0x0000000000000000000000000000000000000000",
"multiAssetProxy": "0x0000000000000000000000000000000000000000",
"staticCallProxy": "0x0000000000000000000000000000000000000000",
"erc1155Proxy": "0x0000000000000000000000000000000000000000",
"devUtils": "0x0000000000000000000000000000000000000000",
"zrxVault": "0x0000000000000000000000000000000000000000",
"staking": "0x0000000000000000000000000000000000000000",
"stakingProxy": "0x0000000000000000000000000000000000000000",
"erc20BridgeProxy": "0x0000000000000000000000000000000000000000",
"erc20BridgeSampler": "0x0000000000000000000000000000000000000000",
"chaiBridge": "0x0000000000000000000000000000000000000000",
"dydxBridge": "0x0000000000000000000000000000000000000000",
"godsUnchainedValidator": "0x0000000000000000000000000000000000000000",
"broker": "0x0000000000000000000000000000000000000000",
"chainlinkStopLimit": "0x0000000000000000000000000000000000000000",
"maximumGasPrice": "0x0000000000000000000000000000000000000000",
"dexForwarderBridge": "0x0000000000000000000000000000000000000000",
"exchangeProxyGovernor": "0xca7bab1b2d1ec7d81710b7f9e2ab4e6788930588",
"exchangeProxy": "0xDEF189DeAEF76E379df891899eb5A00a94cBC250",
"exchangeProxyTransformerDeployer": "0x47F01db18a38261E4cB153bAe6db7d3743AcB33c",
"exchangeProxyFlashWallet": "0xdb6f1920a889355780af7570773609bd8cb1f498",
"exchangeProxyLiquidityProviderSandbox": "0xcA64D4225804F2Ae069760CB5fF2F1D8BaC1C2f9",
"zrxTreasury": "0x0000000000000000000000000000000000000000",
"transformers": {
"wethTransformer": "0x9b6aA8f26A92108e7d1F66373d757Bb955112703",
"payTakerTransformer": "0x32dF54951D33D7460e15Fa59B1fCc262183ce4C2",
"affiliateFeeTransformer": "0x67EfA679a4b56C38713d478e649C88247F4F8E88",
"fillQuoteTransformer": "0x71de60a1B160094a3f6C7E1b883FF9337d639131",
"positiveSlippageFeeTransformer": "0xe87D69b285005CC82b53B844322652C49ED64600"
}
}
}

View File

@@ -53,6 +53,7 @@ export enum ChainId {
Polygon = 137,
PolygonMumbai = 80001,
Avalanche = 43114,
Fantom = 250,
}
/**