From b50d4aee6d75cfd8c069fb2f3f2f188b7f89f7a9 Mon Sep 17 00:00:00 2001 From: Romain Butteaud Date: Mon, 3 May 2021 19:50:26 -0700 Subject: [PATCH] Chore: adding xSigma liquidity source [TKR-59] (#201) * Chore: adding xSigma liquidity source * fix: prettier --- .../bridge_source_utils.ts | 19 ++++++++++++++++++- .../utils/market_operation_utils/constants.ts | 15 +++++++++++++++ .../utils/market_operation_utils/orders.ts | 4 ++++ .../sampler_operations.ts | 2 ++ .../src/utils/market_operation_utils/types.ts | 1 + 5 files changed, 40 insertions(+), 1 deletion(-) 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 b4473a3634..8e12fc9ba7 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 @@ -29,6 +29,7 @@ import { SUSHISWAP_ROUTER_BY_CHAIN_ID, SWERVE_MAINNET_INFOS, UNISWAPV2_ROUTER_BY_CHAIN_ID, + XSIGMA_MAINNET_INFOS, } from './constants'; import { CurveInfo, ERC20BridgeSource } from './types'; @@ -203,6 +204,19 @@ export function getSaddleInfosForPair(chainId: ChainId, takerToken: string, make ); } +export function getXSigmaInfosForPair(chainId: ChainId, takerToken: string, makerToken: string): CurveInfo[] { + if (chainId !== ChainId.Mainnet) { + return []; + } + return Object.values(XSIGMA_MAINNET_INFOS).filter(c => + [makerToken, takerToken].every( + t => + (c.tokens.includes(t) && c.metaToken === undefined) || + (c.tokens.includes(t) && c.metaToken !== undefined && [makerToken, takerToken].includes(c.metaToken)), + ), + ); +} + export function getShellLikeInfosForPair( chainId: ChainId, takerToken: string, @@ -231,7 +245,8 @@ export function getCurveLikeInfosForPair( | ERC20BridgeSource.Belt | ERC20BridgeSource.Ellipsis | ERC20BridgeSource.Smoothy - | ERC20BridgeSource.Saddle, + | ERC20BridgeSource.Saddle + | ERC20BridgeSource.XSigma, ): CurveInfo[] { switch (source) { case ERC20BridgeSource.Curve: @@ -250,6 +265,8 @@ export function getCurveLikeInfosForPair( return getSmoothyInfosForPair(chainId, takerToken, makerToken); case ERC20BridgeSource.Saddle: return getSaddleInfosForPair(chainId, takerToken, makerToken); + case ERC20BridgeSource.XSigma: + return getXSigmaInfosForPair(chainId, takerToken, makerToken); 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 5b8defce48..4afb29d95c 100644 --- a/packages/asset-swapper/src/utils/market_operation_utils/constants.ts +++ b/packages/asset-swapper/src/utils/market_operation_utils/constants.ts @@ -86,6 +86,7 @@ export const SELL_SOURCE_FILTER_BY_CHAIN_ID = valueByChainId( ERC20BridgeSource.Smoothy, ERC20BridgeSource.Component, ERC20BridgeSource.Saddle, + ERC20BridgeSource.XSigma, ]), [ChainId.Ropsten]: new SourceFilters([ ERC20BridgeSource.Kyber, @@ -152,6 +153,7 @@ export const BUY_SOURCE_FILTER_BY_CHAIN_ID = valueByChainId( ERC20BridgeSource.Smoothy, ERC20BridgeSource.Component, ERC20BridgeSource.Saddle, + ERC20BridgeSource.XSigma, ]), [ChainId.Ropsten]: new SourceFilters([ ERC20BridgeSource.Kyber, @@ -377,6 +379,10 @@ export const ELLIPSIS_POOLS = { threePool: '0x160caed03795365f3a589f10c379ffa7d75d4e76', }; +export const XSIGMA_POOLS = { + stable: '0x3333333ACdEdBbC9Ad7bda0876e60714195681c5', +}; + export const DEFAULT_INTERMEDIATE_TOKENS_BY_CHAIN_ID = valueByChainId( { [ChainId.Mainnet]: [ @@ -684,6 +690,14 @@ export const ELLIPSIS_BSC_INFOS: { [name: string]: CurveInfo } = { }), }; +export const XSIGMA_MAINNET_INFOS: { [name: string]: CurveInfo } = { + [XSIGMA_POOLS.stable]: createCurveExchangePool({ + tokens: [MAINNET_TOKENS.DAI, MAINNET_TOKENS.USDC, MAINNET_TOKENS.USDT], + pool: XSIGMA_POOLS.stable, + gasSchedule: 150e3, + }), +}; + // Curve pools like using custom selectors export const SADDLE_MAINNET_INFOS: { [name: string]: CurveInfo } = { [SADDLE_POOLS.stables]: { @@ -1080,6 +1094,7 @@ export const DEFAULT_GAS_SCHEDULE: Required = { [ERC20BridgeSource.Ellipsis]: fillData => (fillData as CurveFillData).pool.gasSchedule, [ERC20BridgeSource.Smoothy]: fillData => (fillData as CurveFillData).pool.gasSchedule, [ERC20BridgeSource.Saddle]: fillData => (fillData as CurveFillData).pool.gasSchedule, + [ERC20BridgeSource.XSigma]: fillData => (fillData as CurveFillData).pool.gasSchedule, [ERC20BridgeSource.MultiBridge]: () => 350e3, [ERC20BridgeSource.UniswapV2]: (fillData?: FillData) => { // TODO: Different base cost if to/from ETH. 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 fe9049b161..d14438bcd0 100644 --- a/packages/asset-swapper/src/utils/market_operation_utils/orders.ts +++ b/packages/asset-swapper/src/utils/market_operation_utils/orders.ts @@ -136,6 +136,8 @@ export function getErc20BridgeSourceToBridgeSource(source: ERC20BridgeSource): s return encodeBridgeSourceId(BridgeProtocol.Curve, 'Smoothy'); case ERC20BridgeSource.Saddle: return encodeBridgeSourceId(BridgeProtocol.Nerve, 'Saddle'); + case ERC20BridgeSource.XSigma: + return encodeBridgeSourceId(BridgeProtocol.Curve, 'xSigma'); case ERC20BridgeSource.ApeSwap: return encodeBridgeSourceId(BridgeProtocol.UniswapV2, 'ApeSwap'); case ERC20BridgeSource.CafeSwap: @@ -173,6 +175,7 @@ export function createBridgeDataForBridgeOrder(order: OptimizedMarketBridgeOrder case ERC20BridgeSource.Ellipsis: case ERC20BridgeSource.Smoothy: case ERC20BridgeSource.Saddle: + case ERC20BridgeSource.XSigma: const curveFillData = (order as OptimizedMarketBridgeOrder).fillData; bridgeData = encoder.encode([ curveFillData.pool.poolAddress, @@ -328,6 +331,7 @@ export const BRIDGE_ENCODERS: { [ERC20BridgeSource.Ellipsis]: curveEncoder, [ERC20BridgeSource.Smoothy]: curveEncoder, [ERC20BridgeSource.Saddle]: curveEncoder, + [ERC20BridgeSource.XSigma]: 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 efd25e8edf..2ca0754a44 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 @@ -1132,6 +1132,7 @@ export class SamplerOperations { case ERC20BridgeSource.Belt: case ERC20BridgeSource.Ellipsis: case ERC20BridgeSource.Saddle: + case ERC20BridgeSource.XSigma: return getCurveLikeInfosForPair(this.chainId, takerToken, makerToken, source).map(pool => this.getCurveSellQuotes( pool, @@ -1346,6 +1347,7 @@ export class SamplerOperations { case ERC20BridgeSource.Belt: case ERC20BridgeSource.Ellipsis: case ERC20BridgeSource.Saddle: + case ERC20BridgeSource.XSigma: 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 e9e2f30599..4bc1814faa 100644 --- a/packages/asset-swapper/src/utils/market_operation_utils/types.ts +++ b/packages/asset-swapper/src/utils/market_operation_utils/types.ts @@ -63,6 +63,7 @@ export enum ERC20BridgeSource { Smoothy = 'Smoothy', Component = 'Component', Saddle = 'Saddle', + XSigma = 'xSigma', // BSC only PancakeSwap = 'PancakeSwap', PancakeSwapV2 = 'PancakeSwap_V2',