From f8a9a4fdf4b26d32ce01041b91173ec68631b9ae Mon Sep 17 00:00:00 2001 From: Diogo Ferreira Date: Thu, 7 Dec 2023 17:24:23 +0000 Subject: [PATCH] add SwaprV3 liquidity integration --- src/assets/images/swapr-v3-logo.svg | 4 +++ src/constants/index.tsx | 8 ++++++ src/hooks/useSwapCallback.ts | 8 +++++- src/lib/eco-router/api.ts | 29 ++++++++++++++++++++++ src/lib/eco-router/platforms.ts | 9 ++++--- src/pages/Swap/Components/TradeDetails.tsx | 1 + src/utils/prices.ts | 8 +++++- 7 files changed, 61 insertions(+), 6 deletions(-) create mode 100644 src/assets/images/swapr-v3-logo.svg diff --git a/src/assets/images/swapr-v3-logo.svg b/src/assets/images/swapr-v3-logo.svg new file mode 100644 index 0000000000..3cd7a7832e --- /dev/null +++ b/src/assets/images/swapr-v3-logo.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/constants/index.tsx b/src/constants/index.tsx index c49e115400..1df9009758 100644 --- a/src/constants/index.tsx +++ b/src/constants/index.tsx @@ -43,6 +43,7 @@ import ZeroXLogo from '../assets/images/logos/ZeroX.svg' import Metamask from '../assets/images/metamask.png' import QuickswapLogo from '../assets/images/quickswap-logo.png' import SushiswapNewLogo from '../assets/images/sushiswap-new-logo.svg' +import SwaprV3Logo from '../assets/images/swapr-v3-logo.svg' import UniswapLogo from '../assets/images/uniswap-logo.svg' import VelodromeLogo from '../assets/images/velodrome-logo.svg' import WalletConnect from '../assets/images/wallet-connect.svg' @@ -818,6 +819,12 @@ export const ROUTABLE_PLATFORM_STYLE: { gradientColor: '#FB52A1', name: RoutablePlatform.VELODROME.name, }, + [RoutablePlatform.SWAPR_V3.name]: { + logo: SwaprV3Logo, + alt: RoutablePlatform.SWAPR_V3.name, + gradientColor: '#9185F7', + name: RoutablePlatform.SWAPR_V3.name, + }, } export const ROUTABLE_PLATFORM_LOGO: { @@ -839,6 +846,7 @@ export const ROUTABLE_PLATFORM_LOGO: { [RoutablePlatform.UNISWAP.name]: Uniswap Unicorn, [UniswapV2RoutablePlatform.UNISWAP.name]: uniswap, [RoutablePlatform.VELODROME.name]: Velodrome, + [RoutablePlatform.SWAPR_V3.name]: Swapr v3, } export const ChainLabel: any = { diff --git a/src/hooks/useSwapCallback.ts b/src/hooks/useSwapCallback.ts index 03ebb01603..203d53fdc1 100644 --- a/src/hooks/useSwapCallback.ts +++ b/src/hooks/useSwapCallback.ts @@ -11,6 +11,7 @@ import { UniswapV2RoutablePlatform, UniswapV2Trade, VelodromeTrade, + SwaprV3Trade, ZeroXTrade, } from '@swapr/sdk' @@ -83,7 +84,12 @@ export function useSwapsCallArguments( const swapMethods = [] // Curve, Uniswap v3, ZeroX - if (trade instanceof CurveTrade || trade instanceof UniswapTrade || trade instanceof ZeroXTrade) { + if ( + trade instanceof CurveTrade || + trade instanceof UniswapTrade || + trade instanceof ZeroXTrade || + trade instanceof SwaprV3Trade + ) { return [ { transactionParameters: trade.swapTransaction({ recipient }), diff --git a/src/lib/eco-router/api.ts b/src/lib/eco-router/api.ts index 2a114fb4ad..00b532ebb9 100644 --- a/src/lib/eco-router/api.ts +++ b/src/lib/eco-router/api.ts @@ -15,6 +15,7 @@ import { UniswapV2Trade, VelodromeTrade, ZeroXTrade, + SwaprV3Trade, } from '@swapr/sdk' // Low-level API for Uniswap V2 @@ -114,6 +115,20 @@ export async function getExactIn( tradeType: TradeType.EXACT_INPUT, }) } + // Swapr v3 + if (platform.name === RoutablePlatform.SWAPR_V3.name) { + // console.log('--- Exact input ---') + // console.log('currencyOut-quoteCurrency:', currencyOut) + // console.log('currencyAmountIn-amount:', currencyAmountIn) + + return SwaprV3Trade.getQuote({ + quoteCurrency: currencyOut, + amount: currencyAmountIn, + maximumSlippage, + recipient: receiver, + tradeType: TradeType.EXACT_INPUT, + }) + } // Curve if (platform.name === RoutablePlatform.CURVE.name) { return CurveTrade.bestTradeExactIn({ @@ -147,6 +162,7 @@ export async function getExactIn( tradeType: TradeType.EXACT_INPUT, }) } + if (platform.name === RoutablePlatform.ONE_INCH.name) { return OneInchTrade.getQuote({ quoteCurrency: currencyOut, @@ -264,6 +280,19 @@ export async function getExactOut( tradeType: TradeType.EXACT_OUTPUT, }) } + if (platform.name === RoutablePlatform.SWAPR_V3.name) { + // console.log('--- EXACT_OUTPUT ---') + // console.log('currencyIn-quoteCurrency:', currencyIn) + // console.log('currencyAmountOut-amount:', currencyAmountOut) + + return SwaprV3Trade.getQuote({ + quoteCurrency: currencyIn, + amount: currencyAmountOut, + maximumSlippage, + recipient: receiver, + tradeType: TradeType.EXACT_OUTPUT, + }) + } // Trade out doesn't yet work on OneInch /* if (platform.name === RoutablePlatform.ONE_INCH.name) { return OneInchTrade.getQuote({ diff --git a/src/lib/eco-router/platforms.ts b/src/lib/eco-router/platforms.ts index 86fe915a9e..18c84f2160 100644 --- a/src/lib/eco-router/platforms.ts +++ b/src/lib/eco-router/platforms.ts @@ -23,11 +23,7 @@ export function getUniswapV2PlatformList(chainId: ChainId): UniswapV2RoutablePla */ export function getSupportedPlatformsByChainId(chainId: ChainId) { return [ - RoutablePlatform.ZEROX, - RoutablePlatform.ONE_INCH, UniswapV2RoutablePlatform.BISWAP, - RoutablePlatform.COW, - RoutablePlatform.CURVE, UniswapV2RoutablePlatform.DFYN, UniswapV2RoutablePlatform.HONEYSWAP, UniswapV2RoutablePlatform.LEVINSWAP, @@ -35,7 +31,12 @@ export function getSupportedPlatformsByChainId(chainId: ChainId) { UniswapV2RoutablePlatform.QUICKSWAP, UniswapV2RoutablePlatform.SUSHISWAP, UniswapV2RoutablePlatform.SWAPR, + RoutablePlatform.ZEROX, + RoutablePlatform.ONE_INCH, + RoutablePlatform.COW, + RoutablePlatform.CURVE, RoutablePlatform.UNISWAP, RoutablePlatform.VELODROME, + RoutablePlatform.SWAPR_V3, ].filter(platform => platform.supportsChain(chainId)) } diff --git a/src/pages/Swap/Components/TradeDetails.tsx b/src/pages/Swap/Components/TradeDetails.tsx index 80c9ac46f4..4e79c71e8a 100644 --- a/src/pages/Swap/Components/TradeDetails.tsx +++ b/src/pages/Swap/Components/TradeDetails.tsx @@ -35,6 +35,7 @@ export function TradeDetails({ const [showAddRecipient, setShowAddRecipient] = useState(false) // errors const [showInverted, setShowInverted] = useState(false) + console.log('trade details:', trade) if (loading) { return ( diff --git a/src/utils/prices.ts b/src/utils/prices.ts index 5c4f883ad1..c6c8d38cb7 100644 --- a/src/utils/prices.ts +++ b/src/utils/prices.ts @@ -19,6 +19,7 @@ import { VelodromeTrade, ZERO, ZeroXTrade, + SwaprV3Trade, } from '@swapr/sdk' import _Decimal from 'decimal.js-light' @@ -70,7 +71,12 @@ export function computeTradePriceBreakdown(trade?: Trade): TradePriceBreakdown { ONE_HUNDRED_PERCENT ) return ONE_HUNDRED_PERCENT.subtract(totalRoutesFee) - } else if (trade instanceof CoWTrade || trade instanceof UniswapTrade || trade instanceof ZeroXTrade) { + } else if ( + trade instanceof CoWTrade || + trade instanceof UniswapTrade || + trade instanceof ZeroXTrade || + trade instanceof SwaprV3Trade + ) { return trade.fee } else if (trade instanceof CurveTrade || trade instanceof VelodromeTrade || trade instanceof OneInchTrade) { return ONE_HUNDRED_PERCENT.subtract(ONE_HUNDRED_PERCENT.subtract(trade.fee))