From 602290925c4c5ddff933d4e863554742f2ae11b6 Mon Sep 17 00:00:00 2001 From: Lawrence Forman Date: Tue, 16 Nov 2021 14:51:04 -0500 Subject: [PATCH] fix celo rebase --- .../exchange_proxy_swap_quote_consumer.ts | 14 ++--- .../bridge_source_utils.ts | 4 ++ .../utils/market_operation_utils/constants.ts | 51 +++++++++++++++++++ .../utils/market_operation_utils/orders.ts | 5 ++ .../sampler_operations.ts | 2 + .../src/utils/market_operation_utils/types.ts | 2 + packages/contract-addresses/addresses.json | 42 +++++++++++++++ packages/contract-addresses/src/index.ts | 1 + 8 files changed, 115 insertions(+), 6 deletions(-) diff --git a/packages/asset-swapper/src/quote_consumers/exchange_proxy_swap_quote_consumer.ts b/packages/asset-swapper/src/quote_consumers/exchange_proxy_swap_quote_consumer.ts index 04601caf96..9a8188640b 100644 --- a/packages/asset-swapper/src/quote_consumers/exchange_proxy_swap_quote_consumer.ts +++ b/packages/asset-swapper/src/quote_consumers/exchange_proxy_swap_quote_consumer.ts @@ -360,8 +360,9 @@ export class ExchangeProxySwapQuoteConsumer implements SwapQuoteConsumerBase { // Build up the transforms. const transforms = []; - if (isFromETH) { - // Create a WETH wrapper if coming from ETH. + // Create a WETH wrapper if coming from ETH. + // Dont add the wethTransformer to CELO. There is no wrap/unwrap logic for CELO. + if (isFromETH && this.chainId !== ChainId.Celo) { transforms.push({ deploymentNonce: this.transformerNonces.wethTransformer, data: encodeWethTransformerData({ @@ -413,9 +414,9 @@ export class ExchangeProxySwapQuoteConsumer implements SwapQuoteConsumerBase { }), }); } - - if (isToETH) { - // Create a WETH unwrapper if going to ETH. + // Create a WETH unwrapper if going to ETH. + // Dont add the wethTransformer on CELO. There is no wrap/unwrap logic for CELO. + if (isToETH && this.chainId !== ChainId.Celo) { transforms.push({ deploymentNonce: this.transformerNonces.wethTransformer, data: encodeWethTransformerData({ @@ -492,10 +493,11 @@ export class ExchangeProxySwapQuoteConsumer implements SwapQuoteConsumerBase { amounts: [], }), }); + const TO_ETH_ADDRESS = this.chainId === ChainId.Celo ? this.contractAddresses.etherToken : ETH_TOKEN_ADDRESS; const calldataHexString = this._exchangeProxy .transformERC20( isFromETH ? ETH_TOKEN_ADDRESS : sellToken, - isToETH ? ETH_TOKEN_ADDRESS : buyToken, + isToETH ? TO_ETH_ADDRESS : buyToken, shouldSellEntireBalance ? MAX_UINT256 : sellAmount, minBuyAmount, transforms, 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 9f64846b38..1ebbbfa32e 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 @@ -49,6 +49,7 @@ import { SUSHISWAP_ROUTER_BY_CHAIN_ID, SWERVE_MAINNET_INFOS, TRADER_JOE_ROUTER_BY_CHAIN_ID, + UBESWAP_ROUTER_BY_CHAIN_ID, UNISWAPV2_ROUTER_BY_CHAIN_ID, WAULTSWAP_ROUTER_BY_CHAIN_ID, XSIGMA_MAINNET_INFOS, @@ -486,6 +487,7 @@ export function uniswapV2LikeRouterAddress( | ERC20BridgeSource.JetSwap | ERC20BridgeSource.TraderJoe | ERC20BridgeSource.Pangolin + | ERC20BridgeSource.UbeSwap | ERC20BridgeSource.SpookySwap | ERC20BridgeSource.SpiritSwap, ): string { @@ -528,6 +530,8 @@ export function uniswapV2LikeRouterAddress( return PANGOLIN_ROUTER_BY_CHAIN_ID[chainId]; case ERC20BridgeSource.TraderJoe: return TRADER_JOE_ROUTER_BY_CHAIN_ID[chainId]; + case ERC20BridgeSource.UbeSwap: + return UBESWAP_ROUTER_BY_CHAIN_ID[chainId]; case ERC20BridgeSource.SpookySwap: return SPOOKYSWAP_ROUTER_BY_CHAIN_ID[chainId]; case ERC20BridgeSource.SpiritSwap: 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 d41d9934d8..4cfca506e0 100644 --- a/packages/asset-swapper/src/utils/market_operation_utils/constants.ts +++ b/packages/asset-swapper/src/utils/market_operation_utils/constants.ts @@ -57,7 +57,9 @@ function valueByChainId(rest: Partial<{ [key in ChainId]: T }>, defaultValue: [ChainId.Polygon]: defaultValue, [ChainId.PolygonMumbai]: defaultValue, [ChainId.Avalanche]: defaultValue, + [ChainId.Celo]: defaultValue, [ChainId.Fantom]: defaultValue, + [ChainId.Celo]: defaultValue, ...(rest || {}), }; } @@ -176,6 +178,11 @@ export const SELL_SOURCE_FILTER_BY_CHAIN_ID = valueByChainId( ERC20BridgeSource.SpookySwap, ERC20BridgeSource.SushiSwap, ]), + [ChainId.Celo]: new SourceFilters([ + ERC20BridgeSource.UbeSwap, + ERC20BridgeSource.SushiSwap, + ERC20BridgeSource.MultiHop, + ]), }, new SourceFilters([]), ); @@ -286,6 +293,12 @@ export const BUY_SOURCE_FILTER_BY_CHAIN_ID = valueByChainId( ERC20BridgeSource.CurveV2, ERC20BridgeSource.KyberDmm, ]), + + [ChainId.Celo]: new SourceFilters([ + ERC20BridgeSource.UbeSwap, + ERC20BridgeSource.MultiHop, + ERC20BridgeSource.SushiSwap, + ]), [ChainId.Fantom]: new SourceFilters([ ERC20BridgeSource.MultiHop, ERC20BridgeSource.Curve, @@ -294,6 +307,11 @@ export const BUY_SOURCE_FILTER_BY_CHAIN_ID = valueByChainId( ERC20BridgeSource.SpookySwap, ERC20BridgeSource.SushiSwap, ]), + [ChainId.Celo]: new SourceFilters([ + ERC20BridgeSource.UbeSwap, + ERC20BridgeSource.SushiSwap, + ERC20BridgeSource.MultiHop, + ]), }, new SourceFilters([]), ); @@ -313,7 +331,9 @@ 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.Celo]: [ERC20BridgeSource.UbeSwap, ERC20BridgeSource.SushiSwap], [ChainId.Fantom]: [ERC20BridgeSource.SpiritSwap, ERC20BridgeSource.SpookySwap, ERC20BridgeSource.SushiSwap], + [ChainId.Celo]: [ERC20BridgeSource.UbeSwap, ERC20BridgeSource.SushiSwap], }, [], ); @@ -466,6 +486,12 @@ export const AVALANCHE_TOKENS = { aUSDT: '0x532e6537fea298397212f09a61e03311686f548e', }; +export const CELO_TOKENS = { + WETH: '0xe919f65739c26a42616b7b8eedc6b5524d1e3ac4', + CELO: '0x471ece3750da237f93b8e339c536989b8978a438', + mCUSD: '0x64defa3544c695db8c535d289d843a189aa26b98', +}; + export const FANTOM_TOKENS = { WFTM: '0x21be370d5312f44cb42ce377bc9b8a0cef1a4c83', WETH: '0x74b23882a30290451a17c44f4f05243b6b58c76d', @@ -654,7 +680,9 @@ export const DEFAULT_INTERMEDIATE_TOKENS_BY_CHAIN_ID = valueByChainId( AVALANCHE_TOKENS.USDT, AVALANCHE_TOKENS.USDC, ], + [ChainId.Celo]: [CELO_TOKENS.mCUSD, CELO_TOKENS.CELO, CELO_TOKENS.WETH], [ChainId.Fantom]: [FANTOM_TOKENS.WFTM, FANTOM_TOKENS.WETH, FANTOM_TOKENS.DAI, FANTOM_TOKENS.USDC], + [ChainId.Celo]: [CELO_TOKENS.mCUSD, CELO_TOKENS.WETH, CELO_TOKENS.CELO], }, [], ); @@ -683,9 +711,16 @@ 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.Celo]: getContractAddressesForChainOrThrow(ChainId.Celo).etherToken, [ChainId.Fantom]: getContractAddressesForChainOrThrow(ChainId.Fantom).etherToken, + [ChainId.Celo]: getContractAddressesForChainOrThrow(ChainId.Celo).etherToken, }, NULL_ADDRESS, ); @@ -1372,7 +1409,9 @@ export const SUSHISWAP_ROUTER_BY_CHAIN_ID = valueByChainId( [ChainId.Ropsten]: '0x1b02da8cb0d097eb8d57a175b88c7d8b47997506', [ChainId.Polygon]: '0x1b02da8cb0d097eb8d57a175b88c7d8b47997506', [ChainId.Avalanche]: '0x1b02da8cb0d097eb8d57a175b88c7d8b47997506', + [ChainId.Celo]: '0x1b02da8cb0d097eb8d57a175b88c7d8b47997506', [ChainId.Fantom]: '0x1b02da8cb0d097eb8d57a175b88c7d8b47997506', + [ChainId.Celo]: '0x1b02da8cb0d097eb8d57a175b88c7d8b47997506', }, NULL_ADDRESS, ); @@ -1746,6 +1785,13 @@ export const TRADER_JOE_ROUTER_BY_CHAIN_ID = valueByChainId( NULL_ADDRESS, ); +export const UBESWAP_ROUTER_BY_CHAIN_ID = valueByChainId( + { + [ChainId.Celo]: '0x7d28570135a2b1930f331c507f65039d4937f66c', + }, + NULL_ADDRESS, +); + export const SPIRITSWAP_ROUTER_BY_CHAIN_ID = valueByChainId( { [ChainId.Fantom]: '0x16327e3fbdaca3bcf7e38f5af2599d2ddc33ae52', @@ -1911,6 +1957,11 @@ export const DEFAULT_GAS_SCHEDULE: Required = { [ERC20BridgeSource.Pangolin]: uniswapV2CloneGasSchedule, [ERC20BridgeSource.TraderJoe]: uniswapV2CloneGasSchedule, + // + // Celo + // + [ERC20BridgeSource.UbeSwap]: uniswapV2CloneGasSchedule, + // // Fantom // diff --git a/packages/asset-swapper/src/utils/market_operation_utils/orders.ts b/packages/asset-swapper/src/utils/market_operation_utils/orders.ts index d6818ed96f..7eb0d888e7 100644 --- a/packages/asset-swapper/src/utils/market_operation_utils/orders.ts +++ b/packages/asset-swapper/src/utils/market_operation_utils/orders.ts @@ -184,6 +184,8 @@ export function getErc20BridgeSourceToBridgeSource(source: ERC20BridgeSource): s return encodeBridgeSourceId(BridgeProtocol.UniswapV2, 'Pangolin'); case ERC20BridgeSource.TraderJoe: return encodeBridgeSourceId(BridgeProtocol.UniswapV2, 'TraderJoe'); + case ERC20BridgeSource.UbeSwap: + return encodeBridgeSourceId(BridgeProtocol.UniswapV2, 'UbeSwap'); case ERC20BridgeSource.SpiritSwap: return encodeBridgeSourceId(BridgeProtocol.UniswapV2, 'SpiritSwap'); case ERC20BridgeSource.SpookySwap: @@ -264,6 +266,7 @@ export function createBridgeDataForBridgeOrder(order: OptimizedMarketBridgeOrder case ERC20BridgeSource.JetSwap: case ERC20BridgeSource.Pangolin: case ERC20BridgeSource.TraderJoe: + case ERC20BridgeSource.UbeSwap: case ERC20BridgeSource.SpiritSwap: case ERC20BridgeSource.SpookySwap: const uniswapV2FillData = (order as OptimizedMarketBridgeOrder).fillData; @@ -458,6 +461,8 @@ export const BRIDGE_ENCODERS: { [ERC20BridgeSource.TraderJoe]: routerAddressPathEncoder, [ERC20BridgeSource.SpiritSwap]: routerAddressPathEncoder, [ERC20BridgeSource.SpookySwap]: routerAddressPathEncoder, + // Celo + [ERC20BridgeSource.UbeSwap]: routerAddressPathEncoder, // BSC [ERC20BridgeSource.PancakeSwap]: routerAddressPathEncoder, [ERC20BridgeSource.PancakeSwapV2]: routerAddressPathEncoder, diff --git a/packages/asset-swapper/src/utils/market_operation_utils/sampler_operations.ts b/packages/asset-swapper/src/utils/market_operation_utils/sampler_operations.ts index a35183a0db..3a468070fc 100644 --- a/packages/asset-swapper/src/utils/market_operation_utils/sampler_operations.ts +++ b/packages/asset-swapper/src/utils/market_operation_utils/sampler_operations.ts @@ -1197,6 +1197,7 @@ export class SamplerOperations { case ERC20BridgeSource.JetSwap: case ERC20BridgeSource.Pangolin: case ERC20BridgeSource.TraderJoe: + case ERC20BridgeSource.UbeSwap: case ERC20BridgeSource.SpiritSwap: case ERC20BridgeSource.SpookySwap: const uniLikeRouter = uniswapV2LikeRouterAddress(this.chainId, source); @@ -1468,6 +1469,7 @@ export class SamplerOperations { case ERC20BridgeSource.JetSwap: case ERC20BridgeSource.Pangolin: case ERC20BridgeSource.TraderJoe: + case ERC20BridgeSource.UbeSwap: case ERC20BridgeSource.SpiritSwap: case ERC20BridgeSource.SpookySwap: const uniLikeRouter = uniswapV2LikeRouterAddress(this.chainId, source); diff --git a/packages/asset-swapper/src/utils/market_operation_utils/types.ts b/packages/asset-swapper/src/utils/market_operation_utils/types.ts index adb2a275f6..f3e0f50be2 100644 --- a/packages/asset-swapper/src/utils/market_operation_utils/types.ts +++ b/packages/asset-swapper/src/utils/market_operation_utils/types.ts @@ -92,6 +92,8 @@ export enum ERC20BridgeSource { // Avalanche Pangolin = 'Pangolin', TraderJoe = 'TraderJoe', + // Celo only + UbeSwap = 'UbeSwap', // Fantom SpiritSwap = 'SpiritSwap', SpookySwap = 'SpookySwap', diff --git a/packages/contract-addresses/addresses.json b/packages/contract-addresses/addresses.json index 4f3b7e217a..e6bd076e8f 100644 --- a/packages/contract-addresses/addresses.json +++ b/packages/contract-addresses/addresses.json @@ -418,5 +418,47 @@ "fillQuoteTransformer": "0x71de60a1b160094a3f6c7e1b883ff9337d639131", "positiveSlippageFeeTransformer": "0xe87d69b285005cc82b53b844322652c49ed64600" } + }, + "42220": { + "erc20Proxy": "0x0000000000000000000000000000000000000000", + "erc721Proxy": "0x0000000000000000000000000000000000000000", + "zrxToken": "0x0000000000000000000000000000000000000000", + "etherToken": "0x471ece3750da237f93b8e339c536989b8978a438", + "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": "0x92115010fd9b170d4918b102efc86b1b7bebdc7f", + "exchangeProxy": "0xdef1c0ded9bec7f1a1670819833240f027b25eff", + "exchangeProxyTransformerDeployer": "0x1fe80d5ad9464dba2d60b88e449305f184823f8a", + "exchangeProxyFlashWallet": "0xdb6f1920a889355780af7570773609bd8cb1f498", + "exchangeProxyLiquidityProviderSandbox": "0x0000000000000000000000000000000000000000", + "zrxTreasury": "0x0000000000000000000000000000000000000000", + "transformers": { + "wethTransformer": "0x948e03e708b4c62c63f89157a3aa76b986c110ed", + "payTakerTransformer": "0x90fb6c638ece8f3e4bfda1c6d6425626b53148b0", + "affiliateFeeTransformer": "0xc93913692ed073cb0cb37d4a760afd7916e9cb01", + "fillQuoteTransformer": "0xa825d4d3c4d2820c52da69fcccf269b4081871f2", + "positiveSlippageFeeTransformer": "0x9ffc7a79133ed5242777e40764777a6d5aab282c" + } } } diff --git a/packages/contract-addresses/src/index.ts b/packages/contract-addresses/src/index.ts index f5ab2c419b..d0a1fb2359 100644 --- a/packages/contract-addresses/src/index.ts +++ b/packages/contract-addresses/src/index.ts @@ -54,6 +54,7 @@ export enum ChainId { PolygonMumbai = 80001, Avalanche = 43114, Fantom = 250, + Celo = 42220, } /**