From 41b08995d57c23e784578c0324c6e33c3895022f Mon Sep 17 00:00:00 2001 From: Andrew Date: Fri, 4 Oct 2024 15:10:50 +0300 Subject: [PATCH 1/2] add gmx on-chain provider --- .../on-chain-manager-aggregators-types.ts | 4 +- .../open-ocean/open-ocean-api-service.ts | 30 +++++++ .../aggregators/gmx/gmx-on-chain-provider.ts | 46 ++++++++++ .../aggregators/gmx/gmx-on-chain-trade.ts | 47 +++++++++++ .../gmx/models/gmx-quote-request.ts | 13 +++ .../open-ocean/constants/api-key.ts | 1 + .../constants/get-open-ocean-api-url.ts | 4 +- .../models/open-cean-swap-quote-response.ts | 7 ++ .../models/open-ocean-quote-response.ts | 10 +++ .../open-ocean/open-ocean-provider.ts | 75 +++++++++++------ .../open-ocean/open-ocean-trade.ts | 84 +++++++++++-------- .../common/models/on-chain-trade-type.ts | 2 + 12 files changed, 261 insertions(+), 62 deletions(-) create mode 100644 src/features/on-chain/calculation-manager/providers/aggregators/common/open-ocean/open-ocean-api-service.ts create mode 100644 src/features/on-chain/calculation-manager/providers/aggregators/gmx/gmx-on-chain-provider.ts create mode 100644 src/features/on-chain/calculation-manager/providers/aggregators/gmx/gmx-on-chain-trade.ts create mode 100644 src/features/on-chain/calculation-manager/providers/aggregators/gmx/models/gmx-quote-request.ts create mode 100644 src/features/on-chain/calculation-manager/providers/aggregators/open-ocean/constants/api-key.ts diff --git a/src/features/on-chain/calculation-manager/models/on-chain-manager-aggregators-types.ts b/src/features/on-chain/calculation-manager/models/on-chain-manager-aggregators-types.ts index c7573d0ff3c..e95b6998723 100644 --- a/src/features/on-chain/calculation-manager/models/on-chain-manager-aggregators-types.ts +++ b/src/features/on-chain/calculation-manager/models/on-chain-manager-aggregators-types.ts @@ -5,6 +5,7 @@ import { PiteasProvider } from 'src/features/on-chain/calculation-manager/provid import { XyDexProvider } from 'src/features/on-chain/calculation-manager/providers/aggregators/xy-dex/xy-dex-provider'; import { ZrxProvider } from 'src/features/on-chain/calculation-manager/providers/aggregators/zrx/zrx-provider'; +import { GMXOnChainProvider } from '../providers/aggregators/gmx/gmx-on-chain-provider'; import { NativeRouterProvider } from '../providers/aggregators/native-router/native-router-provider'; import { OdosOnChainProvider } from '../providers/aggregators/odos/odos-on-chain-provider'; import { OkuSwapOnChainProvider } from '../providers/aggregators/okuswap/okuswap-on-chain-provider'; @@ -26,6 +27,7 @@ export const AGGREGATORS_ON_CHAIN = { ONE_INCH: OneInchProvider, ZETA_SWAP: ZetaSwapProvider, NATIVE_ROUTER: NativeRouterProvider, - SQUIDROUTER: SquidRouterOnChainProvider + SQUIDROUTER: SquidRouterOnChainProvider, + GMX: GMXOnChainProvider // SYMBIOSIS: SymbiosisOnChainProvider } as const; diff --git a/src/features/on-chain/calculation-manager/providers/aggregators/common/open-ocean/open-ocean-api-service.ts b/src/features/on-chain/calculation-manager/providers/aggregators/common/open-ocean/open-ocean-api-service.ts new file mode 100644 index 00000000000..d63d2f2edb3 --- /dev/null +++ b/src/features/on-chain/calculation-manager/providers/aggregators/common/open-ocean/open-ocean-api-service.ts @@ -0,0 +1,30 @@ +import { Injector } from 'src/core/injector/injector'; + +type HttpParam = { + [param: string]: string | number | boolean | readonly (string | number | boolean)[]; +}; + +export class OpenOceanApiService { + public static getQuote( + params: T, + url: string, + apiKey?: string + ): Promise { + return Injector.httpClient.get(url, { + params: { + ...params + }, + headers: { + ...(apiKey && { apiKey: apiKey }) + } + }); + } + + public static getSupportedTokenList(url: string, apiKey?: string): Promise { + return Injector.httpClient.get(url, { + headers: { + ...(apiKey && { apiKey: apiKey }) + } + }); + } +} diff --git a/src/features/on-chain/calculation-manager/providers/aggregators/gmx/gmx-on-chain-provider.ts b/src/features/on-chain/calculation-manager/providers/aggregators/gmx/gmx-on-chain-provider.ts new file mode 100644 index 00000000000..4fee6629408 --- /dev/null +++ b/src/features/on-chain/calculation-manager/providers/aggregators/gmx/gmx-on-chain-provider.ts @@ -0,0 +1,46 @@ +import { PriceToken, PriceTokenAmount } from 'src/common/tokens'; +import { nativeTokensList } from 'src/common/tokens/constants/native-tokens'; +import { Web3Pure } from 'src/core/blockchain/web3-pure/web3-pure'; + +import { ON_CHAIN_TRADE_TYPE } from '../../common/models/on-chain-trade-type'; +import { OpenOceanApiService } from '../common/open-ocean/open-ocean-api-service'; +import { X_API_KEY } from '../open-ocean/constants/api-key'; +import { ARBITRUM_GAS_PRICE } from '../open-ocean/constants/arbitrum-gas-price'; +import { openOceanApiUrl } from '../open-ocean/constants/get-open-ocean-api-url'; +import { openOceanBlockchainName } from '../open-ocean/constants/open-ocean-blockchain'; +import { OpenoceanOnChainSupportedBlockchain } from '../open-ocean/constants/open-ocean-on-chain-supported-blockchain'; +import { OpenOceanQuoteResponse } from '../open-ocean/models/open-ocean-quote-response'; +import { OpenOceanProvider } from '../open-ocean/open-ocean-provider'; +import { GMXQuoteRequest } from './models/gmx-quote-request'; + +export class GMXOnChainProvider extends OpenOceanProvider { + public override readonly tradeType = ON_CHAIN_TRADE_TYPE.GMX; + + protected override async getQuote( + from: PriceTokenAmount, + toToken: PriceToken, + _slippage: number, + isArbitrum: boolean, + gasPrice: string + ): Promise { + const blockchain = from.blockchain as OpenoceanOnChainSupportedBlockchain; + const apiUrl = openOceanApiUrl.gmxQuote(openOceanBlockchainName[blockchain]); + + const quoteRequestParams: GMXQuoteRequest = { + inTokenAddress: this.getTokenAddress(from), + outTokenAddress: this.getTokenAddress(toToken), + amount: from.tokenAmount.toString(), + gasPrice: isArbitrum + ? ARBITRUM_GAS_PRICE + : Web3Pure.fromWei(gasPrice, nativeTokensList[from.blockchain].decimals) + .multipliedBy(10 ** 9) + .toString() + }; + + return OpenOceanApiService.getQuote( + quoteRequestParams, + apiUrl, + X_API_KEY + ); + } +} diff --git a/src/features/on-chain/calculation-manager/providers/aggregators/gmx/gmx-on-chain-trade.ts b/src/features/on-chain/calculation-manager/providers/aggregators/gmx/gmx-on-chain-trade.ts new file mode 100644 index 00000000000..a9ee74dfb57 --- /dev/null +++ b/src/features/on-chain/calculation-manager/providers/aggregators/gmx/gmx-on-chain-trade.ts @@ -0,0 +1,47 @@ +import { nativeTokensList } from 'src/common/tokens/constants/native-tokens'; +import { Web3Pure } from 'src/core/blockchain/web3-pure/web3-pure'; + +import { ON_CHAIN_TRADE_TYPE } from '../../common/models/on-chain-trade-type'; +import { OpenOceanApiService } from '../common/open-ocean/open-ocean-api-service'; +import { X_API_KEY } from '../open-ocean/constants/api-key'; +import { ARBITRUM_GAS_PRICE } from '../open-ocean/constants/arbitrum-gas-price'; +import { openOceanApiUrl } from '../open-ocean/constants/get-open-ocean-api-url'; +import { openOceanBlockchainName } from '../open-ocean/constants/open-ocean-blockchain'; +import { OpenoceanOnChainSupportedBlockchain } from '../open-ocean/constants/open-ocean-on-chain-supported-blockchain'; +import { OpenoceanSwapQuoteResponse } from '../open-ocean/models/open-cean-swap-quote-response'; +import { OpenOceanTrade } from '../open-ocean/open-ocean-trade'; +import { GMXSwapQuoteRequest } from './models/gmx-quote-request'; + +export class GMXOnChainTrade extends OpenOceanTrade { + public override readonly type = ON_CHAIN_TRADE_TYPE.GMX; + + protected override getSwapQuote( + isArbitrum: boolean, + gasPrice: string, + account: string + ): Promise { + const swapQuoteParams: GMXSwapQuoteRequest = { + inTokenAddress: this.getTokenAddress(this.from), + outTokenAddress: this.getTokenAddress(this.to), + amount: this.fromWithoutFee.tokenAmount.toString(), + gasPrice: isArbitrum + ? ARBITRUM_GAS_PRICE + : Web3Pure.fromWei(gasPrice, nativeTokensList[this.from.blockchain].decimals) + .multipliedBy(10 ** 9) + .toString(), + slippage: this.slippageTolerance * 100, + account, + referrer: '0x429A3A1a2623DFb520f1D93F64F38c0738418F1f' + }; + + const apiUrl = openOceanApiUrl.gmxSwapQuote( + openOceanBlockchainName[this.from.blockchain as OpenoceanOnChainSupportedBlockchain] + ); + + return OpenOceanApiService.getQuote( + swapQuoteParams, + apiUrl, + X_API_KEY + ); + } +} diff --git a/src/features/on-chain/calculation-manager/providers/aggregators/gmx/models/gmx-quote-request.ts b/src/features/on-chain/calculation-manager/providers/aggregators/gmx/models/gmx-quote-request.ts new file mode 100644 index 00000000000..2c692d48377 --- /dev/null +++ b/src/features/on-chain/calculation-manager/providers/aggregators/gmx/models/gmx-quote-request.ts @@ -0,0 +1,13 @@ +export interface GMXQuoteRequest { + amount: string; + inTokenAddress: string; + outTokenAddress: string; + gasPrice: string; + [key: string]: string | number; +} + +export type GMXSwapQuoteRequest = GMXQuoteRequest & { + slippage: number; + account: string; + referrer: string; +}; diff --git a/src/features/on-chain/calculation-manager/providers/aggregators/open-ocean/constants/api-key.ts b/src/features/on-chain/calculation-manager/providers/aggregators/open-ocean/constants/api-key.ts new file mode 100644 index 00000000000..8049aff3275 --- /dev/null +++ b/src/features/on-chain/calculation-manager/providers/aggregators/open-ocean/constants/api-key.ts @@ -0,0 +1 @@ +export const X_API_KEY = 'sndfje3u4b3fnNSDNFUSDNVSunw345842hrnfd3b4nt4'; diff --git a/src/features/on-chain/calculation-manager/providers/aggregators/open-ocean/constants/get-open-ocean-api-url.ts b/src/features/on-chain/calculation-manager/providers/aggregators/open-ocean/constants/get-open-ocean-api-url.ts index 6edff921359..f16c78a7622 100644 --- a/src/features/on-chain/calculation-manager/providers/aggregators/open-ocean/constants/get-open-ocean-api-url.ts +++ b/src/features/on-chain/calculation-manager/providers/aggregators/open-ocean/constants/get-open-ocean-api-url.ts @@ -1,5 +1,7 @@ export const openOceanApiUrl = { tokenList: (chain: string) => `https://x-api.rubic.exchange/oo/api/token_list/${chain}`, quote: (chain: string) => `https://x-api.rubic.exchange/oo/api/v3/${chain}/quote`, - swapQuote: (chain: string) => `https://x-api.rubic.exchange/oo/api/v3/${chain}/swap_quote` + swapQuote: (chain: string) => `https://x-api.rubic.exchange/oo/api/v3/${chain}/swap_quote`, + gmxQuote: (chain: string) => `https://open-api.openocean.finance/v3/${chain}/gmx_quote`, + gmxSwapQuote: (chain: string) => `https://open-api.openocean.finance/v3/${chain}/gmx_swap_quote` }; diff --git a/src/features/on-chain/calculation-manager/providers/aggregators/open-ocean/models/open-cean-swap-quote-response.ts b/src/features/on-chain/calculation-manager/providers/aggregators/open-ocean/models/open-cean-swap-quote-response.ts index 30426b3df16..c8c177ea252 100644 --- a/src/features/on-chain/calculation-manager/providers/aggregators/open-ocean/models/open-cean-swap-quote-response.ts +++ b/src/features/on-chain/calculation-manager/providers/aggregators/open-ocean/models/open-cean-swap-quote-response.ts @@ -1,3 +1,5 @@ +import { OpenOceanQuoteRequest } from './open-ocean-quote-response'; + export interface OpenoceanSwapQuoteResponse { code: number; data: { @@ -8,3 +10,8 @@ export interface OpenoceanSwapQuoteResponse { }; error?: string; } + +export type OpenOceanSwapQuoteRequest = OpenOceanQuoteRequest & { + account: string; + referrer: string; +}; diff --git a/src/features/on-chain/calculation-manager/providers/aggregators/open-ocean/models/open-ocean-quote-response.ts b/src/features/on-chain/calculation-manager/providers/aggregators/open-ocean/models/open-ocean-quote-response.ts index 37a5fdccfcf..17e5074a2f3 100644 --- a/src/features/on-chain/calculation-manager/providers/aggregators/open-ocean/models/open-ocean-quote-response.ts +++ b/src/features/on-chain/calculation-manager/providers/aggregators/open-ocean/models/open-ocean-quote-response.ts @@ -6,3 +6,13 @@ export interface OpenOceanQuoteResponse { estimatedGas: number; }; } + +export interface OpenOceanQuoteRequest { + chain: string; + inTokenAddress: string; + outTokenAddress: string; + amount: string; + slippage: number; + gasPrice: string; + [key: string]: string | number; +} diff --git a/src/features/on-chain/calculation-manager/providers/aggregators/open-ocean/open-ocean-provider.ts b/src/features/on-chain/calculation-manager/providers/aggregators/open-ocean/open-ocean-provider.ts index 2065b40203a..9cdc228bb87 100644 --- a/src/features/on-chain/calculation-manager/providers/aggregators/open-ocean/open-ocean-provider.ts +++ b/src/features/on-chain/calculation-manager/providers/aggregators/open-ocean/open-ocean-provider.ts @@ -17,22 +17,30 @@ import { OpenoceanOnChainSupportedBlockchain, openoceanOnChainSupportedBlockchains } from 'src/features/on-chain/calculation-manager/providers/aggregators/open-ocean/constants/open-ocean-on-chain-supported-blockchain'; -import { OpenOceanQuoteResponse } from 'src/features/on-chain/calculation-manager/providers/aggregators/open-ocean/models/open-ocean-quote-response'; +import { + OpenOceanQuoteRequest, + OpenOceanQuoteResponse +} from 'src/features/on-chain/calculation-manager/providers/aggregators/open-ocean/models/open-ocean-quote-response'; import { OpenOceanTokenListResponse } from 'src/features/on-chain/calculation-manager/providers/aggregators/open-ocean/models/open-ocean-token-list-response'; import { OpenOceanTradeStruct } from 'src/features/on-chain/calculation-manager/providers/aggregators/open-ocean/models/open-ocean-trade-struct'; import { OpenOceanTrade } from 'src/features/on-chain/calculation-manager/providers/aggregators/open-ocean/open-ocean-trade'; import { RequiredOnChainCalculationOptions } from 'src/features/on-chain/calculation-manager/providers/common/models/on-chain-calculation-options'; -import { ON_CHAIN_TRADE_TYPE } from 'src/features/on-chain/calculation-manager/providers/common/models/on-chain-trade-type'; +import { + ON_CHAIN_TRADE_TYPE, + OnChainTradeType +} from 'src/features/on-chain/calculation-manager/providers/common/models/on-chain-trade-type'; import { GasFeeInfo } from 'src/features/on-chain/calculation-manager/providers/common/on-chain-trade/evm-on-chain-trade/models/gas-fee-info'; import { OnChainTrade } from 'src/features/on-chain/calculation-manager/providers/common/on-chain-trade/on-chain-trade'; import { getGasFeeInfo } from 'src/features/on-chain/calculation-manager/providers/common/utils/get-gas-fee-info'; import { getGasPriceInfo } from 'src/features/on-chain/calculation-manager/providers/common/utils/get-gas-price-info'; import { AggregatorOnChainProvider } from '../../common/on-chain-aggregator/aggregator-on-chain-provider-abstract'; +import { OpenOceanApiService } from '../common/open-ocean/open-ocean-api-service'; +import { X_API_KEY } from './constants/api-key'; import { ARBITRUM_GAS_PRICE } from './constants/arbitrum-gas-price'; export class OpenOceanProvider extends AggregatorOnChainProvider { - public readonly tradeType = ON_CHAIN_TRADE_TYPE.OPEN_OCEAN; + public readonly tradeType: OnChainTradeType = ON_CHAIN_TRADE_TYPE.OPEN_OCEAN; public static readonly nativeAddress = '0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE'; @@ -57,23 +65,9 @@ export class OpenOceanProvider extends AggregatorOnChainProvider { .getWeb3Public(blockchain) .getGasPrice(); const isArbitrum = blockchain === BLOCKCHAIN_NAME.ARBITRUM; - const apiUrl = openOceanApiUrl.quote(openOceanBlockchainName[blockchain]); + const quoteResponse = await pTimeout( - Injector.httpClient.get(apiUrl, { - headers: { apikey: 'sndfje3u4b3fnNSDNFUSDNVSunw345842hrnfd3b4nt4' }, - params: { - chain: openOceanBlockchainName[blockchain], - inTokenAddress: this.getTokenAddress(fromWithoutFee), - outTokenAddress: this.getTokenAddress(toToken), - amount: fromWithoutFee.tokenAmount.toString(), - slippage: options.slippageTolerance! * 100, - gasPrice: isArbitrum - ? ARBITRUM_GAS_PRICE - : Web3Pure.fromWei(gasPrice, nativeTokensList[from.blockchain].decimals) - .multipliedBy(10 ** 9) - .toString() - } - }), + this.getQuote(from, toToken, options.slippageTolerance, isArbitrum, gasPrice), 7_000 ); @@ -125,7 +119,7 @@ export class OpenOceanProvider extends AggregatorOnChainProvider { } } - private getTokenAddress(token: PriceToken): string { + protected getTokenAddress(token: PriceToken): string { if (token.isNative) { if (token.blockchain === BLOCKCHAIN_NAME.METIS) { return '0xdeaddeaddeaddeaddeaddeaddeaddeaddead0000'; @@ -148,14 +142,47 @@ export class OpenOceanProvider extends AggregatorOnChainProvider { } } + protected async getQuote( + from: PriceTokenAmount, + toToken: PriceToken, + slippage: number, + isArbitrum: boolean, + gasPrice: string + ): Promise { + const blockchain = from.blockchain as OpenoceanOnChainSupportedBlockchain; + const apiUrl = openOceanApiUrl.quote(openOceanBlockchainName[blockchain]); + + const quoteRequestParams: OpenOceanQuoteRequest = { + chain: openOceanBlockchainName[blockchain], + inTokenAddress: this.getTokenAddress(from), + outTokenAddress: this.getTokenAddress(toToken), + amount: from.tokenAmount.toString(), + slippage: slippage * 100, + gasPrice: isArbitrum + ? ARBITRUM_GAS_PRICE + : Web3Pure.fromWei(gasPrice, nativeTokensList[from.blockchain].decimals) + .multipliedBy(10 ** 9) + .toString() + }; + + return OpenOceanApiService.getQuote( + quoteRequestParams, + apiUrl, + X_API_KEY + ); + } + private async checkIsSupportedTokens(from: PriceTokenAmount, to: PriceToken): Promise { const apiUrl = openOceanApiUrl.tokenList( openOceanBlockchainName[from.blockchain as OpenoceanOnChainSupportedBlockchain] ); - const tokenListResponse = await Injector.httpClient.get( - apiUrl, - { headers: { apikey: 'sndfje3u4b3fnNSDNFUSDNVSunw345842hrnfd3b4nt4' } } - ); + + const tokenListResponse = + await OpenOceanApiService.getSupportedTokenList( + apiUrl, + X_API_KEY + ); + const tokens = tokenListResponse?.data?.map(token => token.address.toLocaleLowerCase()); const isSupportedTokens = Boolean(tokens.length) && diff --git a/src/features/on-chain/calculation-manager/providers/aggregators/open-ocean/open-ocean-trade.ts b/src/features/on-chain/calculation-manager/providers/aggregators/open-ocean/open-ocean-trade.ts index 0e7dd5a8746..32eb67c8877 100644 --- a/src/features/on-chain/calculation-manager/providers/aggregators/open-ocean/open-ocean-trade.ts +++ b/src/features/on-chain/calculation-manager/providers/aggregators/open-ocean/open-ocean-trade.ts @@ -4,8 +4,6 @@ import { PriceToken } from 'src/common/tokens'; import { nativeTokensList } from 'src/common/tokens/constants/native-tokens'; import { PriceTokenAmount } from 'src/common/tokens/price-token-amount'; import { BLOCKCHAIN_NAME } from 'src/core/blockchain/models/blockchain-name'; -import { CHAIN_TYPE } from 'src/core/blockchain/models/chain-type'; -import { EvmWeb3Private } from 'src/core/blockchain/web3-private-service/web3-private/evm-web3-private/evm-web3-private'; import { EvmWeb3Pure } from 'src/core/blockchain/web3-pure/typed-web3-pure/evm-web3-pure/evm-web3-pure'; import { Web3Pure } from 'src/core/blockchain/web3-pure/web3-pure'; import { Injector } from 'src/core/injector/injector'; @@ -16,13 +14,21 @@ import { ProxyCrossChainEvmTrade } from 'src/features/cross-chain/calculation-ma import { openOceanApiUrl } from 'src/features/on-chain/calculation-manager/providers/aggregators/open-ocean/constants/get-open-ocean-api-url'; import { openOceanBlockchainName } from 'src/features/on-chain/calculation-manager/providers/aggregators/open-ocean/constants/open-ocean-blockchain'; import { OpenoceanOnChainSupportedBlockchain } from 'src/features/on-chain/calculation-manager/providers/aggregators/open-ocean/constants/open-ocean-on-chain-supported-blockchain'; -import { OpenoceanSwapQuoteResponse } from 'src/features/on-chain/calculation-manager/providers/aggregators/open-ocean/models/open-cean-swap-quote-response'; +import { + OpenOceanSwapQuoteRequest, + OpenoceanSwapQuoteResponse +} from 'src/features/on-chain/calculation-manager/providers/aggregators/open-ocean/models/open-cean-swap-quote-response'; import { OpenOceanTradeStruct } from 'src/features/on-chain/calculation-manager/providers/aggregators/open-ocean/models/open-ocean-trade-struct'; -import { ON_CHAIN_TRADE_TYPE } from 'src/features/on-chain/calculation-manager/providers/common/models/on-chain-trade-type'; +import { + ON_CHAIN_TRADE_TYPE, + OnChainTradeType +} from 'src/features/on-chain/calculation-manager/providers/common/models/on-chain-trade-type'; import { getOnChainGasData } from 'src/features/on-chain/calculation-manager/utils/get-on-chain-gas-data'; import { AggregatorEvmOnChainTrade } from '../../common/on-chain-aggregator/aggregator-evm-on-chain-trade-abstract'; import { GetToAmountAndTxDataResponse } from '../../common/on-chain-aggregator/models/aggregator-on-chain-types'; +import { OpenOceanApiService } from '../common/open-ocean/open-ocean-api-service'; +import { X_API_KEY } from './constants/api-key'; import { ARBITRUM_GAS_PRICE } from './constants/arbitrum-gas-price'; export class OpenOceanTrade extends AggregatorEvmOnChainTrade { @@ -34,7 +40,7 @@ export class OpenOceanTrade extends AggregatorEvmOnChainTrade { return getOnChainGasData(openOceanTrade); } - public readonly type = ON_CHAIN_TRADE_TYPE.OPEN_OCEAN; + public readonly type: OnChainTradeType = ON_CHAIN_TRADE_TYPE.OPEN_OCEAN; private readonly _toTokenAmountMin: PriceTokenAmount; @@ -74,38 +80,15 @@ export class OpenOceanTrade extends AggregatorEvmOnChainTrade { const gasPrice = await Injector.web3PublicService .getWeb3Public(this.from.blockchain) .getGasPrice(); - const walletAddress = ( - Injector.web3PrivateService.getWeb3Private(CHAIN_TYPE.EVM) as EvmWeb3Private - ).address; - const apiUrl = openOceanApiUrl.swapQuote( - openOceanBlockchainName[this.from.blockchain as OpenoceanOnChainSupportedBlockchain] - ); + const isArbitrum = this.from.blockchain === BLOCKCHAIN_NAME.ARBITRUM; - const swapQuoteResponse = await Injector.httpClient.get( - apiUrl, - { - headers: { apikey: 'sndfje3u4b3fnNSDNFUSDNVSunw345842hrnfd3b4nt4' }, - params: { - chain: openOceanBlockchainName[ - this.from.blockchain as OpenoceanOnChainSupportedBlockchain - ], - inTokenAddress: this.getTokenAddress(this.from), - outTokenAddress: this.getTokenAddress(this.to), - amount: this.fromWithoutFee.tokenAmount.toString(), - gasPrice: isArbitrum - ? ARBITRUM_GAS_PRICE - : Web3Pure.fromWei( - gasPrice, - nativeTokensList[this.from.blockchain].decimals - ) - .multipliedBy(10 ** 9) - .toString(), - slippage: this.slippageTolerance * 100, - account: options.receiverAddress || walletAddress, - referrer: '0x429A3A1a2623DFb520f1D93F64F38c0738418F1f' - } - } + + const swapQuoteResponse = await this.getSwapQuote( + isArbitrum, + gasPrice, + options?.receiverAddress || this.walletAddress ); + const { data, to, value, outAmount: toAmount } = swapQuoteResponse.data; return { @@ -118,7 +101,36 @@ export class OpenOceanTrade extends AggregatorEvmOnChainTrade { }; } - private getTokenAddress(token: PriceToken): string { + protected getSwapQuote(isArbitrum: boolean, gasPrice: string, account: string) { + const swapQuoteParams: OpenOceanSwapQuoteRequest = { + chain: openOceanBlockchainName[ + this.from.blockchain as OpenoceanOnChainSupportedBlockchain + ], + inTokenAddress: this.getTokenAddress(this.from), + outTokenAddress: this.getTokenAddress(this.to), + amount: this.fromWithoutFee.tokenAmount.toString(), + gasPrice: isArbitrum + ? ARBITRUM_GAS_PRICE + : Web3Pure.fromWei(gasPrice, nativeTokensList[this.from.blockchain].decimals) + .multipliedBy(10 ** 9) + .toString(), + slippage: this.slippageTolerance * 100, + account, + referrer: '0x429A3A1a2623DFb520f1D93F64F38c0738418F1f' + }; + + const apiUrl = openOceanApiUrl.swapQuote( + openOceanBlockchainName[this.from.blockchain as OpenoceanOnChainSupportedBlockchain] + ); + + return OpenOceanApiService.getQuote( + swapQuoteParams, + apiUrl, + X_API_KEY + ); + } + + protected getTokenAddress(token: PriceToken): string { if (token.isNative) { if (token.blockchain === BLOCKCHAIN_NAME.METIS) { return '0xdeaddeaddeaddeaddeaddeaddeaddeaddead0000'; diff --git a/src/features/on-chain/calculation-manager/providers/common/models/on-chain-trade-type.ts b/src/features/on-chain/calculation-manager/providers/common/models/on-chain-trade-type.ts index 56fb3bb0ddc..748df262457 100644 --- a/src/features/on-chain/calculation-manager/providers/common/models/on-chain-trade-type.ts +++ b/src/features/on-chain/calculation-manager/providers/common/models/on-chain-trade-type.ts @@ -52,6 +52,8 @@ export const ON_CHAIN_TRADE_TYPE = { FINKUJIRA: 'FINKUJIRA', FUSIONX: 'FUSIONX', + GMX: 'GMX', + HONEY_SWAP: 'HONEY_SWAP', HORIZONDEX: 'HORIZONDEX', From 130d85de2b2275e6e16cb86c487a0fd8efd9ec50 Mon Sep 17 00:00:00 2001 From: Andrew Date: Fri, 4 Oct 2024 15:52:44 +0300 Subject: [PATCH 2/2] fix swaps --- .../aggregators/gmx/gmx-on-chain-provider.ts | 17 ++++++++++++++ .../open-ocean/open-ocean-provider.ts | 22 ++++++++++++++----- .../open-ocean/open-ocean-trade.ts | 6 ++++- 3 files changed, 39 insertions(+), 6 deletions(-) diff --git a/src/features/on-chain/calculation-manager/providers/aggregators/gmx/gmx-on-chain-provider.ts b/src/features/on-chain/calculation-manager/providers/aggregators/gmx/gmx-on-chain-provider.ts index 4fee6629408..c8c8f68f6c8 100644 --- a/src/features/on-chain/calculation-manager/providers/aggregators/gmx/gmx-on-chain-provider.ts +++ b/src/features/on-chain/calculation-manager/providers/aggregators/gmx/gmx-on-chain-provider.ts @@ -3,6 +3,7 @@ import { nativeTokensList } from 'src/common/tokens/constants/native-tokens'; import { Web3Pure } from 'src/core/blockchain/web3-pure/web3-pure'; import { ON_CHAIN_TRADE_TYPE } from '../../common/models/on-chain-trade-type'; +import { GasFeeInfo } from '../../common/on-chain-trade/evm-on-chain-trade/models/gas-fee-info'; import { OpenOceanApiService } from '../common/open-ocean/open-ocean-api-service'; import { X_API_KEY } from '../open-ocean/constants/api-key'; import { ARBITRUM_GAS_PRICE } from '../open-ocean/constants/arbitrum-gas-price'; @@ -10,12 +11,28 @@ import { openOceanApiUrl } from '../open-ocean/constants/get-open-ocean-api-url' import { openOceanBlockchainName } from '../open-ocean/constants/open-ocean-blockchain'; import { OpenoceanOnChainSupportedBlockchain } from '../open-ocean/constants/open-ocean-on-chain-supported-blockchain'; import { OpenOceanQuoteResponse } from '../open-ocean/models/open-ocean-quote-response'; +import { OpenOceanTradeStruct } from '../open-ocean/models/open-ocean-trade-struct'; import { OpenOceanProvider } from '../open-ocean/open-ocean-provider'; +import { GMXOnChainTrade } from './gmx-on-chain-trade'; import { GMXQuoteRequest } from './models/gmx-quote-request'; export class GMXOnChainProvider extends OpenOceanProvider { public override readonly tradeType = ON_CHAIN_TRADE_TYPE.GMX; + protected createTradeInstance( + openOceanTradeStruct: OpenOceanTradeStruct, + gasFeeInfo: GasFeeInfo | null, + providerAddress: string + ): GMXOnChainTrade { + return new GMXOnChainTrade( + { + ...openOceanTradeStruct, + gasFeeInfo + }, + providerAddress + ); + } + protected override async getQuote( from: PriceTokenAmount, toToken: PriceToken, diff --git a/src/features/on-chain/calculation-manager/providers/aggregators/open-ocean/open-ocean-provider.ts b/src/features/on-chain/calculation-manager/providers/aggregators/open-ocean/open-ocean-provider.ts index 9cdc228bb87..a27bf8c63b4 100644 --- a/src/features/on-chain/calculation-manager/providers/aggregators/open-ocean/open-ocean-provider.ts +++ b/src/features/on-chain/calculation-manager/providers/aggregators/open-ocean/open-ocean-provider.ts @@ -48,6 +48,20 @@ export class OpenOceanProvider extends AggregatorOnChainProvider { return openoceanOnChainSupportedBlockchains.some(item => item === blockchain); } + protected createTradeInstance( + openOceanTradeStruct: OpenOceanTradeStruct, + gasFeeInfo: GasFeeInfo | null, + providerAddress: string + ): OpenOceanTrade { + return new OpenOceanTrade( + { + ...openOceanTradeStruct, + gasFeeInfo + }, + providerAddress + ); + } + public async calculate( from: PriceTokenAmount, toToken: PriceToken, @@ -104,11 +118,9 @@ export class OpenOceanProvider extends AggregatorOnChainProvider { ? await this.getGasFeeInfo(openOceanTradeStruct) : null; - return new OpenOceanTrade( - { - ...openOceanTradeStruct, - gasFeeInfo - }, + return this.createTradeInstance( + openOceanTradeStruct, + gasFeeInfo, options.providerAddress ); } catch (error) { diff --git a/src/features/on-chain/calculation-manager/providers/aggregators/open-ocean/open-ocean-trade.ts b/src/features/on-chain/calculation-manager/providers/aggregators/open-ocean/open-ocean-trade.ts index 32eb67c8877..a83362d5473 100644 --- a/src/features/on-chain/calculation-manager/providers/aggregators/open-ocean/open-ocean-trade.ts +++ b/src/features/on-chain/calculation-manager/providers/aggregators/open-ocean/open-ocean-trade.ts @@ -101,7 +101,11 @@ export class OpenOceanTrade extends AggregatorEvmOnChainTrade { }; } - protected getSwapQuote(isArbitrum: boolean, gasPrice: string, account: string) { + protected getSwapQuote( + isArbitrum: boolean, + gasPrice: string, + account: string + ): Promise { const swapQuoteParams: OpenOceanSwapQuoteRequest = { chain: openOceanBlockchainName[ this.from.blockchain as OpenoceanOnChainSupportedBlockchain