From bd833b38b7d286ecf768ab32c5907d4a1820538d Mon Sep 17 00:00:00 2001 From: shawnxin89 Date: Thu, 30 Sep 2021 11:24:04 -0700 Subject: [PATCH 1/2] ftm deployment --- .../utils/market_operation_utils/constants.ts | 26 ++++++++++++ packages/contract-addresses/addresses.json | 42 +++++++++++++++++++ packages/contract-addresses/src/index.ts | 1 + 3 files changed, 69 insertions(+) diff --git a/packages/asset-swapper/src/utils/market_operation_utils/constants.ts b/packages/asset-swapper/src/utils/market_operation_utils/constants.ts index 3927386cff..f939994dfc 100644 --- a/packages/asset-swapper/src/utils/market_operation_utils/constants.ts +++ b/packages/asset-swapper/src/utils/market_operation_utils/constants.ts @@ -57,6 +57,7 @@ function valueByChainId(rest: Partial<{ [key in ChainId]: T }>, defaultValue: [ChainId.Polygon]: defaultValue, [ChainId.PolygonMumbai]: defaultValue, [ChainId.Avalanche]: defaultValue, + [ChainId.Fantom]: defaultValue, ...(rest || {}), }; } @@ -164,6 +165,9 @@ export const SELL_SOURCE_FILTER_BY_CHAIN_ID = valueByChainId( ERC20BridgeSource.TraderJoe, ERC20BridgeSource.SushiSwap, ]), + [ChainId.Fantom]: new SourceFilters([ + ERC20BridgeSource.SushiSwap, + ]), }, new SourceFilters([]), ); @@ -271,6 +275,9 @@ export const BUY_SOURCE_FILTER_BY_CHAIN_ID = valueByChainId( ERC20BridgeSource.TraderJoe, ERC20BridgeSource.SushiSwap, ]), + [ChainId.Fantom]: new SourceFilters([ + ERC20BridgeSource.SushiSwap, + ]), }, new SourceFilters([]), ); @@ -290,6 +297,7 @@ export const FEE_QUOTE_SOURCES_BY_CHAIN_ID = valueByChainId [ChainId.Ropsten]: [ERC20BridgeSource.UniswapV2, ERC20BridgeSource.SushiSwap], [ChainId.Polygon]: [ERC20BridgeSource.QuickSwap, ERC20BridgeSource.SushiSwap], [ChainId.Avalanche]: [ERC20BridgeSource.Pangolin, ERC20BridgeSource.TraderJoe, ERC20BridgeSource.SushiSwap], + [ChainId.Fantom]: [ERC20BridgeSource.SushiSwap], }, [], ); @@ -437,6 +445,13 @@ export const AVALANCHE_TOKENS = { DAI: '0xd586e7f844cea2f87f50152665bcbc2c279d8d70', }; +export const FANTOM_TOKENS = { + WFTM: '0x21be370d5312f44cb42ce377bc9b8a0cef1a4c83', + WETH: '0x74b23882a30290451A17c44f4F05243b6b58C76d', + USDC: '0x04068DA6C83AFCFA0e13ba15A6696662335D5B75', + DAI: '0x8d11ec38a3eb5e956b052f67da8bdc9bef8abf3e', +}; + export const CURVE_POOLS = { compound: '0xa2b47e3d5c44877cca798226b7b8118f9bfb7a56', // 0.Compound // 1.USDT is dead @@ -596,6 +611,12 @@ export const DEFAULT_INTERMEDIATE_TOKENS_BY_CHAIN_ID = valueByChainId( AVALANCHE_TOKENS.DAI, AVALANCHE_TOKENS.USDT, ], + [ChainId.Fantom]: [ + FANTOM_TOKENS.WFTM, + FANTOM_TOKENS.WETH, + FANTOM_TOKENS.DAI, + FANTOM_TOKENS.USDC, + ], }, [], ); @@ -624,6 +645,9 @@ export const DEFAULT_TOKEN_ADJACENCY_GRAPH_BY_CHAIN_ID = valueByChainId( [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, ); @@ -1251,6 +1276,7 @@ export const SUSHISWAP_ROUTER_BY_CHAIN_ID = valueByChainId( [ChainId.Ropsten]: '0x1b02da8cb0d097eb8d57a175b88c7d8b47997506', [ChainId.Polygon]: '0x1b02da8cb0d097eb8d57a175b88c7d8b47997506', [ChainId.Avalanche]: '0x1b02da8cb0d097eb8d57a175b88c7d8b47997506', + [ChainId.Fantom]: '0x1b02dA8Cb0d097eB8D57A175b88c7D8b47997506', }, NULL_ADDRESS, ); diff --git a/packages/contract-addresses/addresses.json b/packages/contract-addresses/addresses.json index b6aee4f82f..d6e379af1d 100644 --- a/packages/contract-addresses/addresses.json +++ b/packages/contract-addresses/addresses.json @@ -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": "0xdef1c0ded9bec7f1a1670819833240f027b25eff", + "exchangeProxyTransformerDeployer": "0xa60b57833dce6260f4f2411c811755dd980bc0a7", + "exchangeProxyFlashWallet": "0xdb6f1920a889355780af7570773609bd8cb1f498", + "exchangeProxyLiquidityProviderSandbox": "0x8953c63d0858d286cc407cd6f8e26b9cbd02a511", + "zrxTreasury": "0x0000000000000000000000000000000000000000", + "transformers": { + "wethTransformer": "0x9b8b52391071d71cd4ad1e61d7f273268fa34c6c", + "payTakerTransformer": "0x898c6fde239d646c73f0a57e3570b6f86a3d62a3", + "affiliateFeeTransformer": "0x34617b855411e52fbc05899435f44cbd0503022c", + "fillQuoteTransformer": "0x8a5417dd7ffde61ec61e11b45797e16686e1d6b9", + "positiveSlippageFeeTransformer": "0x470ba89da18a6db6e8a0567b3c9214b960861857" + } } } diff --git a/packages/contract-addresses/src/index.ts b/packages/contract-addresses/src/index.ts index 4c97057461..f5ab2c419b 100644 --- a/packages/contract-addresses/src/index.ts +++ b/packages/contract-addresses/src/index.ts @@ -53,6 +53,7 @@ export enum ChainId { Polygon = 137, PolygonMumbai = 80001, Avalanche = 43114, + Fantom = 250, } /** From 64110cfb964d5737edb7b0fc9c2cbcb74dab7310 Mon Sep 17 00:00:00 2001 From: shawnxin89 Date: Fri, 1 Oct 2021 12:47:25 -0700 Subject: [PATCH 2/2] add Fantom Curve --- .../bridge_source_utils.ts | 20 +++++++++ .../utils/market_operation_utils/constants.ts | 44 +++++++++++++++++++ 2 files changed, 64 insertions(+) diff --git a/packages/asset-swapper/src/utils/market_operation_utils/bridge_source_utils.ts b/packages/asset-swapper/src/utils/market_operation_utils/bridge_source_utils.ts index 0b930845b1..590927a3a8 100644 --- a/packages/asset-swapper/src/utils/market_operation_utils/bridge_source_utils.ts +++ b/packages/asset-swapper/src/utils/market_operation_utils/bridge_source_utils.ts @@ -13,8 +13,10 @@ import { CRYPTO_COM_ROUTER_BY_CHAIN_ID, CURVE_MAINNET_INFOS, CURVE_POLYGON_INFOS, + CURVE_FANTOM_INFOS, CURVE_V2_MAINNET_INFOS, CURVE_V2_POLYGON_INFOS, + CURVE_V2_FANTOM_INFOS, DFYN_ROUTER_BY_CHAIN_ID, ELLIPSIS_BSC_INFOS, FIREBIRDONESWAP_BSC_INFOS, @@ -133,6 +135,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 +170,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 []; } diff --git a/packages/asset-swapper/src/utils/market_operation_utils/constants.ts b/packages/asset-swapper/src/utils/market_operation_utils/constants.ts index f939994dfc..8ee726ea47 100644 --- a/packages/asset-swapper/src/utils/market_operation_utils/constants.ts +++ b/packages/asset-swapper/src/utils/market_operation_utils/constants.ts @@ -166,6 +166,8 @@ export const SELL_SOURCE_FILTER_BY_CHAIN_ID = valueByChainId( ERC20BridgeSource.SushiSwap, ]), [ChainId.Fantom]: new SourceFilters([ + ERC20BridgeSource.Curve, + ERC20BridgeSource.CurveV2, ERC20BridgeSource.SushiSwap, ]), }, @@ -276,6 +278,8 @@ export const BUY_SOURCE_FILTER_BY_CHAIN_ID = valueByChainId( ERC20BridgeSource.SushiSwap, ]), [ChainId.Fantom]: new SourceFilters([ + ERC20BridgeSource.Curve, + ERC20BridgeSource.CurveV2, ERC20BridgeSource.SushiSwap, ]), }, @@ -450,6 +454,9 @@ export const FANTOM_TOKENS = { WETH: '0x74b23882a30290451A17c44f4F05243b6b58C76d', USDC: '0x04068DA6C83AFCFA0e13ba15A6696662335D5B75', DAI: '0x8d11ec38a3eb5e956b052f67da8bdc9bef8abf3e', + fUSDT: '0x049d68029688eabf473097a2fc38ef61633a3c7a', + WBTC: '0x321162Cd933E2Be498Cd2267a90534A804051b11', + renBTC: '0xDBf31dF14B66535aF65AaC99C32e9eA844e14501', }; export const CURVE_POOLS = { @@ -513,6 +520,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', }; @@ -983,6 +1000,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.renBTC, FANTOM_TOKENS.WBTC], + pool: CURVE_FANTOM_POOLS.ren, + gasSchedule: 171e3, + }), + [CURVE_FANTOM_POOLS.twoPool]: createCurveExchangeUnderlyingPool({ + tokens: [FANTOM_TOKENS.DAI, FANTOM_TOKENS.USDC], + pool: CURVE_FANTOM_POOLS.twoPool, + gasSchedule: 587e3, + }), + [CURVE_FANTOM_POOLS.fUSDT]: createCurveExchangePool({ + tokens: [FANTOM_TOKENS.DAI, FANTOM_TOKENS.USDC, FANTOM_TOKENS.fUSDT], + pool: CURVE_FANTOM_POOLS.fUSDT, + gasSchedule: 176e3, + }), +} + +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],