From 77a592e8918b6d649deb0bce7174bc3581e257e7 Mon Sep 17 00:00:00 2001 From: Noah Khamliche Date: Fri, 11 Feb 2022 14:37:06 -0500 Subject: [PATCH] added mobius config for celo and some inital test pools --- .../bridge_source_utils.ts | 19 +++++- .../utils/market_operation_utils/constants.ts | 67 ++++++++++++++++++- .../utils/market_operation_utils/orders.ts | 4 ++ .../sampler_operations.ts | 2 + .../src/utils/market_operation_utils/types.ts | 1 + 5 files changed, 89 insertions(+), 4 deletions(-) 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 5f87cc3675..c67c11e5a7 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 @@ -61,6 +61,7 @@ import { UNISWAPV2_ROUTER_BY_CHAIN_ID, WAULTSWAP_ROUTER_BY_CHAIN_ID, XSIGMA_MAINNET_INFOS, + MOBIUSMONEY_CELO_INFOS, } from './constants'; import { CurveInfo, ERC20BridgeSource } from './types'; @@ -449,6 +450,18 @@ export function getAcryptosInfosForPair(chainId: ChainId, takerToken: string, ma ), ); } +export function getMobiusMoneyInfoForPair(chainId: ChainId, takerToken: string, makerToken: string): CurveInfo[] { + if (chainId !== ChainId.Celo) { + return []; + } + return Object.values(MOBIUSMONEY_CELO_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), + ), + ); +} export function getShellLikeInfosForPair( chainId: ChainId, @@ -491,7 +504,8 @@ export function getCurveLikeInfosForPair( | ERC20BridgeSource.IronSwap | ERC20BridgeSource.XSigma | ERC20BridgeSource.FirebirdOneSwap - | ERC20BridgeSource.ACryptos, + | ERC20BridgeSource.ACryptos + | ERC20BridgeSource.MobiusMoney, ): CurveDetailedInfo[] { let pools: CurveInfo[] = []; switch (source) { @@ -537,6 +551,9 @@ export function getCurveLikeInfosForPair( case ERC20BridgeSource.ACryptos: pools = getAcryptosInfosForPair(chainId, takerToken, makerToken); break; + case ERC20BridgeSource.MobiusMoney: + pools = getMobiusMoneyInfoForPair(chainId, takerToken, makerToken); + break; default: throw new Error(`Unknown Curve like source ${source}`); } 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 6062e66308..c3696a6d39 100644 --- a/packages/asset-swapper/src/utils/market_operation_utils/constants.ts +++ b/packages/asset-swapper/src/utils/market_operation_utils/constants.ts @@ -202,6 +202,7 @@ export const SELL_SOURCE_FILTER_BY_CHAIN_ID = valueByChainId( ERC20BridgeSource.UbeSwap, ERC20BridgeSource.SushiSwap, ERC20BridgeSource.MultiHop, + ERC20BridgeSource.MobiusMoney, ]), [ChainId.Optimism]: new SourceFilters([ ERC20BridgeSource.UniswapV3, @@ -347,6 +348,7 @@ export const BUY_SOURCE_FILTER_BY_CHAIN_ID = valueByChainId( ERC20BridgeSource.UbeSwap, ERC20BridgeSource.SushiSwap, ERC20BridgeSource.MultiHop, + ERC20BridgeSource.MobiusMoney, ]), [ChainId.Optimism]: new SourceFilters([ ERC20BridgeSource.UniswapV3, @@ -562,11 +564,11 @@ export const CELO_TOKENS = { // Some of these tokens are Optics bridge? tokens which // had an issue and migrated from v1 to v2 WETHv1: '0xe919f65739c26a42616b7b8eedc6b5524d1e3ac4', - WETH: '0x122013fd7df1c6f636a5bb8f03108e876548b455', + oWETH: '0x122013fd7df1c6f636a5bb8f03108e876548b455', WBTC: '0xbaab46e28388d2779e6e31fd00cf0e5ad95e327b', cUSD: '0x765de816845861e75a25fca122bb6898b8b1282a', // ?? - WBTCv1: '0xd629eb00deced2a080b7ec630ef6ac117e614f1b', + cBTC: '0xd629eb00deced2a080b7ec630ef6ac117e614f1b', cETH: '0x2def4285787d58a2f811af24755a8150622f4361', UBE: '0x00be915b9dcf56a3cbe739d9b9c202ca692409ec', // Moolah @@ -575,6 +577,21 @@ export const CELO_TOKENS = { mCEUR: '0xe273ad7ee11dcfaa87383ad5977ee1504ac07568', amCUSD: '0x64defa3544c695db8c535d289d843a189aa26b98', MOO: '0x17700282592d6917f6a73d0bf8accf4d578c131e', + + // + wBTC: '0x2260fac5e5542a773aa44fbcfedf7c193bc2c599', + wETH: '0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2', + wBTCO: '0xbe50a3013a1c94768a1abb78c3cb79ab28fc1ace', + pUSDC: '0xcc82628f6a8defa1e2b0ad7ed448bef3647f7941', + cUSDC: '0x2a3684e9dc20b857375ea04235f2f7edbe818fa7', + cUSDC_V2: '0xef4229c8c3250c675f21bcefa42f58efbff6002a', + pUSDC_V2: '0x1bfc26ce035c368503fae319cc2596716428ca44', + pUSD: '0xeadf4a7168a82d30ba0619e64d5bcf5b30b45226', + pCELO: '0x301a61d01a63c8d670c2b8a43f37d12ef181f997', + aaUSDC: '0xb70e0a782b058bfdb0d109a3599bec1f19328e36', + asUSDC: '0xcd7d7ff64746c1909e44db8e95331f9316478817', + mcUSDT: '0xcfffe0c89a779c09df3df5624f54cdf7ef5fdd5d', + mcUSDC: '0x93db49be12b864019da9cb147ba75cdc0506190e', }; export const FANTOM_TOKENS = { @@ -798,6 +815,13 @@ export const FIREBIRDONESWAP_BSC_POOLS = { export const FIREBIRDONESWAP_POLYGON_POOLS = { oneswap: '0x01c9475dbd36e46d1961572c8de24b74616bae9e', }; +export const MOBIUSMONEY_CELO_POOLS = { + poof_cusd_v2: '0xa2f0e57d4ceacf025e81c76f28b9ad6e9fbe8735', + poof_celo_v2: '0xfc9e2c63370d8deb3521922a7b2b60f4cff7e75a', + usdc_optics_v2: '0x9906589ea8fd27504974b7e8201df5bbde986b03', + dai_optics_v2: '0xf3f65dfe0c8c8f2986da0fec159abe6fd4e700b4', + weth_optics_v2: '0x74ef28d635c6c5800dd3cd62d4c4f8752daacb09', +}; export const ACRYPTOS_POOLS = { acs4usd: '0xb3f0c9ea1f05e312093fdb031e789a756659b0ac', @@ -857,7 +881,13 @@ export const DEFAULT_INTERMEDIATE_TOKENS_BY_CHAIN_ID = valueByChainId( FANTOM_TOKENS.nETH, FANTOM_TOKENS.MIM, ], - [ChainId.Celo]: [CELO_TOKENS.WCELO, CELO_TOKENS.mCUSD, CELO_TOKENS.WETH, CELO_TOKENS.amCUSD, CELO_TOKENS.WBTC], + [ChainId.Celo]: [ + CELO_TOKENS.WCELO, + CELO_TOKENS.mCUSD, + CELO_TOKENS.WETHv1, + CELO_TOKENS.amCUSD, + CELO_TOKENS.WBTC, + ], [ChainId.Optimism]: [ OPTIMISM_TOKENS.WETH, OPTIMISM_TOKENS.DAI, @@ -1703,6 +1733,36 @@ export const FIREBIRDONESWAP_POLYGON_INFOS: { [name: string]: CurveInfo } = { }, }; +export const MOBIUSMONEY_CELO_INFOS: { [name: string]: CurveInfo } = { + [MOBIUSMONEY_CELO_POOLS.poof_cusd_v2]: { + exchangeFunctionSelector: CurveFunctionSelectors.swap, + sellQuoteFunctionSelector: CurveFunctionSelectors.calculateSwap, + buyQuoteFunctionSelector: CurveFunctionSelectors.None, + poolAddress: MOBIUSMONEY_CELO_POOLS.poof_cusd_v2, + tokens: [CELO_TOKENS.cUSD, CELO_TOKENS.pUSD], + metaTokens: undefined, + gasSchedule: 100e3, + }, + [MOBIUSMONEY_CELO_POOLS.poof_celo_v2]: { + exchangeFunctionSelector: CurveFunctionSelectors.swap, + sellQuoteFunctionSelector: CurveFunctionSelectors.calculateSwap, + buyQuoteFunctionSelector: CurveFunctionSelectors.None, + poolAddress: MOBIUSMONEY_CELO_POOLS.poof_celo_v2, + tokens: [CELO_TOKENS.WCELO, CELO_TOKENS.pCELO], + metaTokens: undefined, + gasSchedule: 100e3, + }, + [MOBIUSMONEY_CELO_POOLS.usdc_optics_v2]: { + exchangeFunctionSelector: CurveFunctionSelectors.swap, + sellQuoteFunctionSelector: CurveFunctionSelectors.calculateSwap, + buyQuoteFunctionSelector: CurveFunctionSelectors.None, + poolAddress: MOBIUSMONEY_CELO_POOLS.usdc_optics_v2, + tokens: [CELO_TOKENS.cUSD, CELO_TOKENS.cUSDC_V2], + metaTokens: undefined, + gasSchedule: 100e3, + }, +}; + const ACRYPTOS_ACS4USD_POOL_BSC_TOKENS = [BSC_TOKENS.BUSD, BSC_TOKENS.USDT, BSC_TOKENS.DAI, BSC_TOKENS.USDC]; const createAcryptosMetaUsdPool = (info: { tokens: string[]; pool: string; gasSchedule: number }) => ({ @@ -2342,6 +2402,7 @@ export const DEFAULT_GAS_SCHEDULE: Required = { [ERC20BridgeSource.IronSwap]: fillData => (fillData as CurveFillData).pool.gasSchedule, [ERC20BridgeSource.XSigma]: fillData => (fillData as CurveFillData).pool.gasSchedule, [ERC20BridgeSource.FirebirdOneSwap]: fillData => (fillData as CurveFillData).pool.gasSchedule, + [ERC20BridgeSource.MobiusMoney]: fillData => (fillData as CurveFillData).pool.gasSchedule, [ERC20BridgeSource.MultiBridge]: () => 350e3, [ERC20BridgeSource.UniswapV2]: uniswapV2CloneGasSchedule, [ERC20BridgeSource.SushiSwap]: uniswapV2CloneGasSchedule, 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 8fe6d98188..2914decb1e 100644 --- a/packages/asset-swapper/src/utils/market_operation_utils/orders.ts +++ b/packages/asset-swapper/src/utils/market_operation_utils/orders.ts @@ -206,6 +206,8 @@ export function getErc20BridgeSourceToBridgeSource(source: ERC20BridgeSource): s return encodeBridgeSourceId(BridgeProtocol.Compound, 'Compound'); case ERC20BridgeSource.Geist: return encodeBridgeSourceId(BridgeProtocol.AaveV2, 'Geist'); + case ERC20BridgeSource.MobiusMoney: + return encodeBridgeSourceId(BridgeProtocol.Nerve, 'MobiusMoney'); default: throw new Error(AggregationError.NoBridgeForSource); } @@ -241,6 +243,7 @@ export function createBridgeDataForBridgeOrder(order: OptimizedMarketBridgeOrder case ERC20BridgeSource.FirebirdOneSwap: case ERC20BridgeSource.IronSwap: case ERC20BridgeSource.ACryptos: + case ERC20BridgeSource.MobiusMoney: const curveFillData = (order as OptimizedMarketBridgeOrder).fillData; bridgeData = encoder.encode([ curveFillData.pool.poolAddress, @@ -489,6 +492,7 @@ export const BRIDGE_ENCODERS: { [ERC20BridgeSource.FirebirdOneSwap]: curveEncoder, [ERC20BridgeSource.IronSwap]: curveEncoder, [ERC20BridgeSource.ACryptos]: curveEncoder, + [ERC20BridgeSource.MobiusMoney]: curveEncoder, // UniswapV2 like, (router, address[]) [ERC20BridgeSource.Bancor]: routerAddressPathEncoder, [ERC20BridgeSource.UniswapV2]: 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 5ea5d73920..f59ac4b738 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 @@ -1383,6 +1383,7 @@ export class SamplerOperations { case ERC20BridgeSource.FirebirdOneSwap: case ERC20BridgeSource.IronSwap: case ERC20BridgeSource.ACryptos: + case ERC20BridgeSource.MobiusMoney: return getCurveLikeInfosForPair(this.chainId, takerToken, makerToken, source).map(pool => this.getCurveSellQuotes( pool, @@ -1696,6 +1697,7 @@ export class SamplerOperations { case ERC20BridgeSource.FirebirdOneSwap: case ERC20BridgeSource.IronSwap: case ERC20BridgeSource.ACryptos: + case ERC20BridgeSource.MobiusMoney: return getCurveLikeInfosForPair(this.chainId, takerToken, makerToken, source).map(pool => this.getCurveBuyQuotes( pool, 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 0bc7c945b5..ef8d49f48e 100644 --- a/packages/asset-swapper/src/utils/market_operation_utils/types.ts +++ b/packages/asset-swapper/src/utils/market_operation_utils/types.ts @@ -96,6 +96,7 @@ export enum ERC20BridgeSource { TraderJoe = 'TraderJoe', // Celo only UbeSwap = 'UbeSwap', + MobiusMoney = 'MobiusMoney', // Fantom SpiritSwap = 'SpiritSwap', SpookySwap = 'SpookySwap',