From 234f37d45781230679954cb46d3c3ebbef40a1aa Mon Sep 17 00:00:00 2001 From: axtezy Date: Tue, 2 May 2023 15:43:45 +0200 Subject: [PATCH 01/15] Add testnets and providers --- src/common/tokens/constants/native-tokens.ts | 38 ++++- .../tokens/constants/wrapped-native-tokens.ts | 21 +++ src/core/blockchain/models/blockchain-name.ts | 10 ++ .../constants/blockchain-id.ts | 5 + ...default-cross-chain-calculation-options.ts | 3 +- .../models/cross-chain-options.ts | 6 + .../cbridge-cross-chain-api-service.ts | 59 ++++++-- .../cbridge/cbridge-cross-chain-provider.ts | 71 ++------- .../constants/cbridge-contract-address.ts | 20 +++ .../cbridge/constants/cbridge-proxy-abi.ts | 138 ------------------ .../cbridge-supported-blockchains.ts | 6 +- .../cbridge/constants/celer-transit-tokens.ts | 108 -------------- .../models/supported-blockchain.ts | 6 +- .../constants/contract-address-v2.ts | 16 ++ ...biosis-cross-chain-supported-blockchain.ts | 7 +- .../constants/symbiosis-transit-tokens.ts | 28 ++++ .../cross-chain-cbridge-manager.ts | 24 ++- .../cross-chain-status-manager.ts | 10 +- .../uniswap-v2-trade-providers.ts | 18 ++- .../providers/dexes/bsct/default-constants.ts | 19 +++ .../bsct/pancake-swap-testnet/constants.ts | 5 + .../pancake-swap-testnet-provider.ts | 12 ++ .../pancake-swap-testnet-trade.ts | 14 ++ .../dexes/bsct/trader-joe-bsct/constants.ts | 5 + .../trader-joe-bsct-provider.ts | 12 ++ .../trader-joe-bsct/trader-joe-bsct-trade.ts | 20 +++ .../providers/dexes/fuji/default-constants.ts | 20 +++ .../dexes/fuji/joe-fuji/constants.ts | 4 + .../dexes/fuji/joe-fuji/joe-fuji-provider.ts | 12 ++ .../dexes/fuji/joe-fuji/joe-fuji-trade.ts | 20 +++ .../dexes/fuji/pangolin-fuji/constants.ts | 5 + .../pangolin-fuji/pangolin-fuji-provider.ts | 12 ++ .../fuji/pangolin-fuji/pangolin-fuji-trade.ts | 20 +++ .../dexes/goerli/default-constants.ts | 19 +++ .../goerli/uni-swap-v2-goerli/constants.ts | 9 ++ .../uni-swap-v2-goerli-provider.ts | 12 ++ .../uni-swap-v2-goerli-trade.ts | 14 ++ .../dexes/mumbai/default-constants.ts | 20 +++ .../mumbai/quick-swap-mumbai/constants.ts | 5 + .../quick-swap-mumbai-provider.ts | 12 ++ .../quick-swap-mumbai-trade.ts | 14 ++ 41 files changed, 534 insertions(+), 345 deletions(-) delete mode 100644 src/features/cross-chain/calculation-manager/providers/cbridge/constants/cbridge-proxy-abi.ts delete mode 100644 src/features/cross-chain/calculation-manager/providers/cbridge/constants/celer-transit-tokens.ts create mode 100644 src/features/on-chain/calculation-manager/providers/dexes/bsct/default-constants.ts create mode 100644 src/features/on-chain/calculation-manager/providers/dexes/bsct/pancake-swap-testnet/constants.ts create mode 100644 src/features/on-chain/calculation-manager/providers/dexes/bsct/pancake-swap-testnet/pancake-swap-testnet-provider.ts create mode 100644 src/features/on-chain/calculation-manager/providers/dexes/bsct/pancake-swap-testnet/pancake-swap-testnet-trade.ts create mode 100644 src/features/on-chain/calculation-manager/providers/dexes/bsct/trader-joe-bsct/constants.ts create mode 100644 src/features/on-chain/calculation-manager/providers/dexes/bsct/trader-joe-bsct/trader-joe-bsct-provider.ts create mode 100644 src/features/on-chain/calculation-manager/providers/dexes/bsct/trader-joe-bsct/trader-joe-bsct-trade.ts create mode 100644 src/features/on-chain/calculation-manager/providers/dexes/fuji/default-constants.ts create mode 100644 src/features/on-chain/calculation-manager/providers/dexes/fuji/joe-fuji/constants.ts create mode 100644 src/features/on-chain/calculation-manager/providers/dexes/fuji/joe-fuji/joe-fuji-provider.ts create mode 100644 src/features/on-chain/calculation-manager/providers/dexes/fuji/joe-fuji/joe-fuji-trade.ts create mode 100644 src/features/on-chain/calculation-manager/providers/dexes/fuji/pangolin-fuji/constants.ts create mode 100644 src/features/on-chain/calculation-manager/providers/dexes/fuji/pangolin-fuji/pangolin-fuji-provider.ts create mode 100644 src/features/on-chain/calculation-manager/providers/dexes/fuji/pangolin-fuji/pangolin-fuji-trade.ts create mode 100644 src/features/on-chain/calculation-manager/providers/dexes/goerli/default-constants.ts create mode 100644 src/features/on-chain/calculation-manager/providers/dexes/goerli/uni-swap-v2-goerli/constants.ts create mode 100644 src/features/on-chain/calculation-manager/providers/dexes/goerli/uni-swap-v2-goerli/uni-swap-v2-goerli-provider.ts create mode 100644 src/features/on-chain/calculation-manager/providers/dexes/goerli/uni-swap-v2-goerli/uni-swap-v2-goerli-trade.ts create mode 100644 src/features/on-chain/calculation-manager/providers/dexes/mumbai/default-constants.ts create mode 100644 src/features/on-chain/calculation-manager/providers/dexes/mumbai/quick-swap-mumbai/constants.ts create mode 100644 src/features/on-chain/calculation-manager/providers/dexes/mumbai/quick-swap-mumbai/quick-swap-mumbai-provider.ts create mode 100644 src/features/on-chain/calculation-manager/providers/dexes/mumbai/quick-swap-mumbai/quick-swap-mumbai-trade.ts diff --git a/src/common/tokens/constants/native-tokens.ts b/src/common/tokens/constants/native-tokens.ts index ed1b861a51..d8d6ec2e97 100644 --- a/src/common/tokens/constants/native-tokens.ts +++ b/src/common/tokens/constants/native-tokens.ts @@ -1,16 +1,52 @@ import { Token } from 'src/common/tokens/token'; -import { BLOCKCHAIN_NAME, BlockchainName } from 'src/core/blockchain/models/blockchain-name'; +import { + BLOCKCHAIN_NAME, + BlockchainName, + TestnetEvmBlockchain +} from 'src/core/blockchain/models/blockchain-name'; import { BitcoinWeb3Pure } from 'src/core/blockchain/web3-pure/typed-web3-pure/bitcoin-web3-pure'; import { EvmWeb3Pure } from 'src/core/blockchain/web3-pure/typed-web3-pure/evm-web3-pure/evm-web3-pure'; import { IcpWeb3Pure } from 'src/core/blockchain/web3-pure/typed-web3-pure/icp-web3-pure'; import { KavaCosmosWeb3Pure } from 'src/core/blockchain/web3-pure/typed-web3-pure/non-evm-web3-pure/kava-cosmos-web3-pure'; import { TronWeb3Pure } from 'src/core/blockchain/web3-pure/typed-web3-pure/tron-web3-pure/tron-web3-pure'; +const testnetNativeTokens: Record = { + [BLOCKCHAIN_NAME.FUJI]: new Token({ + blockchain: BLOCKCHAIN_NAME.FUJI, + address: EvmWeb3Pure.nativeTokenAddress, + name: 'AVAX', + symbol: 'AVAX', + decimals: 18 + }), + [BLOCKCHAIN_NAME.MUMBAI]: new Token({ + blockchain: BLOCKCHAIN_NAME.MUMBAI, + address: EvmWeb3Pure.nativeTokenAddress, + name: 'Matic Network', + symbol: 'MATIC', + decimals: 18 + }), + [BLOCKCHAIN_NAME.GOERLI]: new Token({ + blockchain: BLOCKCHAIN_NAME.GOERLI, + address: EvmWeb3Pure.nativeTokenAddress, + name: 'Ethereum', + symbol: 'ETH', + decimals: 18 + }), + [BLOCKCHAIN_NAME.BINANCE_SMART_CHAIN_TESTNET]: new Token({ + blockchain: BLOCKCHAIN_NAME.BINANCE_SMART_CHAIN_TESTNET, + address: EvmWeb3Pure.nativeTokenAddress, + name: 'Test Binance Coin', + symbol: 'tBNB', + decimals: 18 + }) +}; + export const nativeTokensList: Record = { ...Object.values(BLOCKCHAIN_NAME).reduce( (acc, blockchain) => ({ ...acc, [blockchain]: null }), {} as Record ), + ...testnetNativeTokens, [BLOCKCHAIN_NAME.ETHEREUM]: new Token({ blockchain: BLOCKCHAIN_NAME.ETHEREUM, address: EvmWeb3Pure.nativeTokenAddress, diff --git a/src/common/tokens/constants/wrapped-native-tokens.ts b/src/common/tokens/constants/wrapped-native-tokens.ts index 5efb1b32af..d72504d438 100644 --- a/src/common/tokens/constants/wrapped-native-tokens.ts +++ b/src/common/tokens/constants/wrapped-native-tokens.ts @@ -218,5 +218,26 @@ export const wrappedNativeTokensList: Partial> name: 'Wrapped Ether', symbol: 'Weth', decimals: 18 + }), + [BLOCKCHAIN_NAME.BINANCE_SMART_CHAIN_TESTNET]: new Token({ + blockchain: BLOCKCHAIN_NAME.BINANCE_SMART_CHAIN_TESTNET, + address: '0xb4fbf271143f4fbf7b91a5ded31805e42b2208d6', + name: 'Wrapped Ether', + symbol: 'WETH', + decimals: 18 + }), + [BLOCKCHAIN_NAME.MUMBAI]: new Token({ + blockchain: BLOCKCHAIN_NAME.MUMBAI, + address: '0x9c3c9283d3e44854697cd22d3faa240cfb032889', + name: 'Wrapped Matic', + symbol: 'WMATIC', + decimals: 18 + }), + [BLOCKCHAIN_NAME.FUJI]: new Token({ + blockchain: BLOCKCHAIN_NAME.FUJI, + address: '0x1d308089a2d1ced3f1ce36b1fcaf815b07217be3', + name: 'Wrapped Avax', + symbol: 'WAVAX', + decimals: 18 }) }; diff --git a/src/core/blockchain/models/blockchain-name.ts b/src/core/blockchain/models/blockchain-name.ts index 380c44899a..79708ca819 100644 --- a/src/core/blockchain/models/blockchain-name.ts +++ b/src/core/blockchain/models/blockchain-name.ts @@ -1,4 +1,12 @@ +export const TEST_EVM_BLOCKCHAIN_NAME = { + MUMBAI: 'MUMBAI', + BINANCE_SMART_CHAIN_TESTNET: 'BSCT', + GOERLI: 'GOERLI', + FUJI: 'FUJI' +} as const; + export const EVM_BLOCKCHAIN_NAME = { + ...TEST_EVM_BLOCKCHAIN_NAME, ETHEREUM: 'ETH', BINANCE_SMART_CHAIN: 'BSC', POLYGON: 'POLYGON', @@ -119,6 +127,8 @@ export const BLOCKCHAIN_NAME = { export type BlockchainName = (typeof BLOCKCHAIN_NAME)[keyof typeof BLOCKCHAIN_NAME]; +export type TestnetEvmBlockchain = + (typeof TEST_EVM_BLOCKCHAIN_NAME)[keyof typeof TEST_EVM_BLOCKCHAIN_NAME]; export type EvmBlockchainName = (typeof EVM_BLOCKCHAIN_NAME)[keyof typeof EVM_BLOCKCHAIN_NAME]; export type SolanaBlockchainName = typeof BLOCKCHAIN_NAME.SOLANA; export type NearBlockchainName = typeof BLOCKCHAIN_NAME.NEAR; diff --git a/src/core/blockchain/utils/blockchains-info/constants/blockchain-id.ts b/src/core/blockchain/utils/blockchains-info/constants/blockchain-id.ts index 1169a8d89d..699313aa6e 100644 --- a/src/core/blockchain/utils/blockchains-info/constants/blockchain-id.ts +++ b/src/core/blockchain/utils/blockchains-info/constants/blockchain-id.ts @@ -48,6 +48,11 @@ export const blockchainId: Record = { [BLOCKCHAIN_NAME.XDC]: 50, [BLOCKCHAIN_NAME.BITCOIN_CASH]: 10000, [BLOCKCHAIN_NAME.ZK_SYNC]: 324, + // Tesnents + [BLOCKCHAIN_NAME.GOERLI]: 5, + [BLOCKCHAIN_NAME.BINANCE_SMART_CHAIN_TESTNET]: 87, + [BLOCKCHAIN_NAME.MUMBAI]: 80001, + [BLOCKCHAIN_NAME.FUJI]: 43113, // Non EVN blockchains [BLOCKCHAIN_NAME.BITCOIN]: 5555, [BLOCKCHAIN_NAME.FILECOIN]: 314 diff --git a/src/features/cross-chain/calculation-manager/constants/default-cross-chain-calculation-options.ts b/src/features/cross-chain/calculation-manager/constants/default-cross-chain-calculation-options.ts index 4573d87b5f..edf8d82014 100644 --- a/src/features/cross-chain/calculation-manager/constants/default-cross-chain-calculation-options.ts +++ b/src/features/cross-chain/calculation-manager/constants/default-cross-chain-calculation-options.ts @@ -11,5 +11,6 @@ export const defaultCrossChainCalculationOptions: Omit< timeout: 25_000, slippageTolerance: 0.04, deadline: 20, - changenowFullyEnabled: false + changenowFullyEnabled: false, + enableTestnets: false }; diff --git a/src/features/cross-chain/calculation-manager/models/cross-chain-options.ts b/src/features/cross-chain/calculation-manager/models/cross-chain-options.ts index 908853ef99..6ccc69e712 100644 --- a/src/features/cross-chain/calculation-manager/models/cross-chain-options.ts +++ b/src/features/cross-chain/calculation-manager/models/cross-chain-options.ts @@ -63,6 +63,11 @@ export interface CrossChainOptions { changenowFullyEnabled?: boolean; useProxy?: Record; + + /** + * True if test networks are enabled. + */ + enableTestnets?: boolean; } export type RequiredCrossChainOptions = MarkRequired< @@ -75,4 +80,5 @@ export type RequiredCrossChainOptions = MarkRequired< | 'providerAddress' | 'timeout' | 'changenowFullyEnabled' + | 'enableTestnets' >; diff --git a/src/features/cross-chain/calculation-manager/providers/cbridge/cbridge-cross-chain-api-service.ts b/src/features/cross-chain/calculation-manager/providers/cbridge/cbridge-cross-chain-api-service.ts index 16cafb0ad4..cedf021ca7 100644 --- a/src/features/cross-chain/calculation-manager/providers/cbridge/cbridge-cross-chain-api-service.ts +++ b/src/features/cross-chain/calculation-manager/providers/cbridge/cbridge-cross-chain-api-service.ts @@ -1,3 +1,5 @@ +// @ts-ignore +import { getRequestOptions } from 'cbridge-revert-manager'; import { Injector } from 'src/core/injector/injector'; import { CbridgeEstimateAmountRequest } from 'src/features/cross-chain/calculation-manager/providers/cbridge/models/cbridge-estimate-amount-request'; import { CbridgeEstimateAmountResponse } from 'src/features/cross-chain/calculation-manager/providers/cbridge/models/cbridge-estimate-amount-response'; @@ -5,27 +7,58 @@ import { CbridgeStatusResponse } from 'src/features/cross-chain/calculation-mana import { CbridgeTransferConfigsResponse } from 'src/features/cross-chain/calculation-manager/providers/cbridge/models/cbridge-transfer-configs-response'; export class CbridgeCrossChainApiService { - public static readonly apiEndpoint = 'https://cbridge-prod2.celer.app/v2/'; + private static readonly apiEndpoint = 'https://cbridge-prod2.celer.app/v2/'; - public static async getTransferConfigs(): Promise { + private static readonly testnetApiEndpoint = 'https://cbridge-v2-test.celer.network/v2/'; + + public static async getTransferConfigs(options: { + useTestnet: boolean; + }): Promise { + const apiUrl = options.useTestnet + ? CbridgeCrossChainApiService.testnetApiEndpoint + : CbridgeCrossChainApiService.apiEndpoint; return Injector.httpClient.get( - `${CbridgeCrossChainApiService.apiEndpoint}getTransferConfigs` + `${apiUrl}}getTransferConfigs` ); } public static async fetchEstimateAmount( - requestParams: CbridgeEstimateAmountRequest + requestParams: CbridgeEstimateAmountRequest, + options: { useTestnet: boolean } ): Promise { - return Injector.httpClient.get( - `${CbridgeCrossChainApiService.apiEndpoint}estimateAmt`, - { params: { ...requestParams } } - ); + const apiUrl = options.useTestnet + ? CbridgeCrossChainApiService.testnetApiEndpoint + : CbridgeCrossChainApiService.apiEndpoint; + return Injector.httpClient.get(`${apiUrl}estimateAmt`, { + params: { ...requestParams } + }); } - public static async fetchTradeStatus(transferId: string): Promise { - return Injector.httpClient.post( - `${CbridgeCrossChainApiService.apiEndpoint}getTransferStatus`, - { transfer_id: transferId } - ); + public static async fetchTradeStatus( + transferId: string, + options: { + useTestnet: boolean; + } + ): Promise { + const apiUrl = options.useTestnet + ? CbridgeCrossChainApiService.testnetApiEndpoint + : CbridgeCrossChainApiService.apiEndpoint; + return Injector.httpClient.post(`${apiUrl}getTransferStatus`, { + transfer_id: transferId + }); + } + + public static async withdrawLiquidity( + transferId: string, + estimatedReceivedAmt: string, + options: { + useTestnet: boolean; + } + ): Promise { + const apiUrl = options.useTestnet + ? CbridgeCrossChainApiService.testnetApiEndpoint + : CbridgeCrossChainApiService.apiEndpoint; + const body: object = await getRequestOptions(transferId, estimatedReceivedAmt); + return Injector.httpClient.post(`${apiUrl}withdrawLiquidity`, body); } } diff --git a/src/features/cross-chain/calculation-manager/providers/cbridge/cbridge-cross-chain-provider.ts b/src/features/cross-chain/calculation-manager/providers/cbridge/cbridge-cross-chain-provider.ts index b9bff3b93d..c8d9eff6c9 100644 --- a/src/features/cross-chain/calculation-manager/providers/cbridge/cbridge-cross-chain-provider.ts +++ b/src/features/cross-chain/calculation-manager/providers/cbridge/cbridge-cross-chain-provider.ts @@ -9,7 +9,11 @@ import { PriceToken, PriceTokenAmount, wrappedNativeTokensList } from 'src/commo import { nativeTokensList } from 'src/common/tokens/constants/native-tokens'; import { PriceTokenAmountStruct } from 'src/common/tokens/price-token-amount'; import { compareAddresses } from 'src/common/utils/blockchain'; -import { BlockchainName, EvmBlockchainName } from 'src/core/blockchain/models/blockchain-name'; +import { + BlockchainName, + EvmBlockchainName, + TEST_EVM_BLOCKCHAIN_NAME +} from 'src/core/blockchain/models/blockchain-name'; import { blockchainId } from 'src/core/blockchain/utils/blockchains-info/constants/blockchain-id'; import { Web3Pure } from 'src/core/blockchain/web3-pure/web3-pure'; import { Injector } from 'src/core/injector/injector'; @@ -24,7 +28,6 @@ import { CbridgeCrossChainSupportedBlockchain, cbridgeSupportedBlockchains } from 'src/features/cross-chain/calculation-manager/providers/cbridge/constants/cbridge-supported-blockchains'; -import { celerTransitTokens } from 'src/features/cross-chain/calculation-manager/providers/cbridge/constants/celer-transit-tokens'; import { TokenInfo } from 'src/features/cross-chain/calculation-manager/providers/cbridge/models/cbridge-chain-token-info'; import { CbridgeEstimateAmountRequest } from 'src/features/cross-chain/calculation-manager/providers/cbridge/models/cbridge-estimate-amount-request'; import { CrossChainProvider } from 'src/features/cross-chain/calculation-manager/providers/common/cross-chain-provider'; @@ -202,6 +205,7 @@ export class CbridgeCrossChainProvider extends CrossChainProvider { toTokenOrNative: PriceToken ): Promise { let fromToken = fromTokenOrNative; + const useTestnet = fromToken.blockchain in TEST_EVM_BLOCKCHAIN_NAME; if (fromToken.isNative) { const wrappedFrom = wrappedNativeTokensList[fromTokenOrNative.blockchain]!; const token = await PriceTokenAmount.createToken({ @@ -217,7 +221,7 @@ export class CbridgeCrossChainProvider extends CrossChainProvider { toToken = token as PriceToken; } - const config = await CbridgeCrossChainApiService.getTransferConfigs(); + const config = await CbridgeCrossChainApiService.getTransferConfigs({ useTestnet }); const fromChainId = blockchainId[fromToken.blockchain]; const toChainId = blockchainId[toToken.blockchain]; if ( @@ -255,6 +259,7 @@ export class CbridgeCrossChainProvider extends CrossChainProvider { config: CelerConfig ): Promise<{ amount: string; maxSlippage: number; fee: string }> { let tokenSymbol = fromToken.symbol; + const useTestnet = fromToken.blockchain in TEST_EVM_BLOCKCHAIN_NAME; if (config.isBridge) { tokenSymbol = config.supportedFromToken?.token.symbol || tokenSymbol; } @@ -267,7 +272,7 @@ export class CbridgeCrossChainProvider extends CrossChainProvider { amt: fromToken.stringWeiAmount }; const { estimated_receive_amt, max_slippage, base_fee } = - await CbridgeCrossChainApiService.fetchEstimateAmount(requestParams); + await CbridgeCrossChainApiService.fetchEstimateAmount(requestParams, { useTestnet }); return { amount: estimated_receive_amt, maxSlippage: max_slippage, fee: base_fee }; } @@ -307,64 +312,6 @@ export class CbridgeCrossChainProvider extends CrossChainProvider { return onChainTrades[0]!; } - private async getBestOnChainTrade( - from: PriceTokenAmount, - _availableDexes: string[], - slippageTolerance: number - ): Promise { - const fromBlockchain = from.blockchain as CbridgeCrossChainSupportedBlockchain; - - const dexes = Object.values(typedTradeProviders[fromBlockchain]).filter( - dex => dex.supportReceiverAddress - ); - const transitTokens = await Promise.all( - celerTransitTokens[fromBlockchain].map(token => - PriceToken.createToken({ - address: token.address, - blockchain: fromBlockchain - }) - ) - ); - - const onChainTrades = ( - await Promise.all( - transitTokens.map(to => - Promise.allSettled( - dexes.map(dex => - dex.calculate(from, to, { - slippageTolerance, - gasCalculation: 'disabled', - useProxy: false - }) - ) - ).then(settledTrades => - settledTrades - .filter(value => value.status === 'fulfilled') - .map(value => (value as PromiseFulfilledResult).value) - .sort((a, b) => { - const tradeAAmount = a.to.price.multipliedBy( - a.toTokenAmountMin.tokenAmount - ); - const tradeBAmount = b.to.price.multipliedBy( - b.toTokenAmountMin.tokenAmount - ); - return tradeBAmount.comparedTo(tradeAAmount); - }) - ) - ) - ) - ) - .flat() - .sort((tradeA, tradeB) => - tradeB.toTokenAmountMin.tokenAmount.comparedTo(tradeA.toTokenAmountMin.tokenAmount) - ); - - if (!onChainTrades.length) { - return null; - } - return onChainTrades[0]!; - } - private async getMinMaxAmountsErrors( fromToken: PriceTokenAmount, _feeInfo: FeeInfo diff --git a/src/features/cross-chain/calculation-manager/providers/cbridge/constants/cbridge-contract-address.ts b/src/features/cross-chain/calculation-manager/providers/cbridge/constants/cbridge-contract-address.ts index 617de7525a..116861094f 100644 --- a/src/features/cross-chain/calculation-manager/providers/cbridge/constants/cbridge-contract-address.ts +++ b/src/features/cross-chain/calculation-manager/providers/cbridge/constants/cbridge-contract-address.ts @@ -50,5 +50,25 @@ export const cbridgeContractAddress: Record< providerGateway: '0x841ce48F9446C8E281D3F1444cB859b4A6D0738C', providerRouter: '0x841ce48F9446C8E281D3F1444cB859b4A6D0738C', rubicRouter: '0x841ce48F9446C8E281D3F1444cB859b4A6D0738C' + }, + [BLOCKCHAIN_NAME.FUJI]: { + providerGateway: '0xe95E3a9f1a45B5EDa71781448F6047d7B7e31cbF', + providerRouter: '0xe95E3a9f1a45B5EDa71781448F6047d7B7e31cbF', + rubicRouter: '0x841ce48F9446C8E281D3F1444cB859b4A6D0738C' + }, + [BLOCKCHAIN_NAME.MUMBAI]: { + providerGateway: '0x841ce48F9446C8E281D3F1444cB859b4A6D0738C', + providerRouter: '0x841ce48F9446C8E281D3F1444cB859b4A6D0738C', + rubicRouter: '0x841ce48F9446C8E281D3F1444cB859b4A6D0738C' + }, + [BLOCKCHAIN_NAME.BINANCE_SMART_CHAIN_TESTNET]: { + providerGateway: '0xf89354F314faF344Abd754924438bA798E306DF2', + providerRouter: '0xf89354F314faF344Abd754924438bA798E306DF2', + rubicRouter: '0x841ce48F9446C8E281D3F1444cB859b4A6D0738C' + }, + [BLOCKCHAIN_NAME.GOERLI]: { + providerGateway: '0x358234B325EF9eA8115291A8b81b7d33A2Fa762D', + providerRouter: '0x358234B325EF9eA8115291A8b81b7d33A2Fa762D', + rubicRouter: '0x841ce48F9446C8E281D3F1444cB859b4A6D0738C' } }; diff --git a/src/features/cross-chain/calculation-manager/providers/cbridge/constants/cbridge-proxy-abi.ts b/src/features/cross-chain/calculation-manager/providers/cbridge/constants/cbridge-proxy-abi.ts deleted file mode 100644 index fbdd2f20e5..0000000000 --- a/src/features/cross-chain/calculation-manager/providers/cbridge/constants/cbridge-proxy-abi.ts +++ /dev/null @@ -1,138 +0,0 @@ -import { AbiItem } from 'web3-utils'; - -export const cbridgeProxyAbi: AbiItem[] = [ - { - inputs: [ - { internalType: 'address', name: '_tokenOut', type: 'address' }, - { internalType: 'bytes', name: '_swapData', type: 'bytes' }, - { internalType: 'uint32', name: '_maxSlippage', type: 'uint32' }, - { - components: [ - { internalType: 'address', name: 'srcInputToken', type: 'address' }, - { internalType: 'uint256', name: 'srcInputAmount', type: 'uint256' }, - { internalType: 'uint256', name: 'dstChainID', type: 'uint256' }, - { internalType: 'address', name: 'dstOutputToken', type: 'address' }, - { internalType: 'uint256', name: 'dstMinOutputAmount', type: 'uint256' }, - { internalType: 'address', name: 'recipient', type: 'address' }, - { internalType: 'address', name: 'integrator', type: 'address' }, - { internalType: 'address', name: 'router', type: 'address' } - ], - internalType: 'struct BridgeBase.BaseCrossChainParams', - name: '_params', - type: 'tuple' - } - ], - name: 'swapAndBridge', - outputs: [], - stateMutability: 'payable', - type: 'function' - }, - { - inputs: [ - { internalType: 'address', name: '_tokenOut', type: 'address' }, - { internalType: 'bytes', name: '_swapData', type: 'bytes' }, - { internalType: 'uint32', name: '_maxSlippage', type: 'uint32' }, - { - components: [ - { internalType: 'address', name: 'srcInputToken', type: 'address' }, - { internalType: 'uint256', name: 'srcInputAmount', type: 'uint256' }, - { internalType: 'uint256', name: 'dstChainID', type: 'uint256' }, - { internalType: 'address', name: 'dstOutputToken', type: 'address' }, - { internalType: 'uint256', name: 'dstMinOutputAmount', type: 'uint256' }, - { internalType: 'address', name: 'recipient', type: 'address' }, - { internalType: 'address', name: 'integrator', type: 'address' }, - { internalType: 'address', name: 'router', type: 'address' } - ], - internalType: 'struct BridgeBase.BaseCrossChainParams', - name: '_params', - type: 'tuple' - } - ], - name: 'swapNativeAndBridge', - outputs: [], - stateMutability: 'payable', - type: 'function' - }, - { - inputs: [ - { internalType: 'uint32', name: '_maxSlippage', type: 'uint32' }, - { - components: [ - { internalType: 'address', name: 'srcInputToken', type: 'address' }, - { internalType: 'uint256', name: 'srcInputAmount', type: 'uint256' }, - { internalType: 'uint256', name: 'dstChainID', type: 'uint256' }, - { internalType: 'address', name: 'dstOutputToken', type: 'address' }, - { internalType: 'uint256', name: 'dstMinOutputAmount', type: 'uint256' }, - { internalType: 'address', name: 'recipient', type: 'address' }, - { internalType: 'address', name: 'integrator', type: 'address' }, - { internalType: 'address', name: 'router', type: 'address' } - ], - internalType: 'struct BridgeBase.BaseCrossChainParams', - name: '_params', - type: 'tuple' - } - ], - name: 'bridge', - outputs: [], - stateMutability: 'payable', - type: 'function' - }, - { - inputs: [ - { internalType: 'uint32', name: '_maxSlippage', type: 'uint32' }, - { - components: [ - { internalType: 'address', name: 'srcInputToken', type: 'address' }, - { internalType: 'uint256', name: 'srcInputAmount', type: 'uint256' }, - { internalType: 'uint256', name: 'dstChainID', type: 'uint256' }, - { internalType: 'address', name: 'dstOutputToken', type: 'address' }, - { internalType: 'uint256', name: 'dstMinOutputAmount', type: 'uint256' }, - { internalType: 'address', name: 'recipient', type: 'address' }, - { internalType: 'address', name: 'integrator', type: 'address' }, - { internalType: 'address', name: 'router', type: 'address' } - ], - internalType: 'struct BridgeBase.BaseCrossChainParams', - name: '_params', - type: 'tuple' - } - ], - name: 'bridgeNative', - outputs: [], - stateMutability: 'payable', - type: 'function' - }, - { - inputs: [], - name: 'fixedCryptoFee', - outputs: [{ internalType: 'uint256', name: '', type: 'uint256' }], - stateMutability: 'view', - type: 'function' - }, - { - inputs: [{ internalType: 'address', name: '', type: 'address' }], - name: 'integratorToFeeInfo', - outputs: [ - { internalType: 'bool', name: 'isIntegrator', type: 'bool' }, - { internalType: 'uint32', name: 'tokenFee', type: 'uint32' }, - { internalType: 'uint32', name: 'RubicTokenShare', type: 'uint32' }, - { internalType: 'uint32', name: 'RubicFixedCryptoShare', type: 'uint32' }, - { internalType: 'uint128', name: 'fixedFeeAmount', type: 'uint128' } - ], - stateMutability: 'view', - type: 'function' - }, - { - inputs: [], - name: 'RubicPlatformFee', - outputs: [{ internalType: 'uint256', name: '', type: 'uint256' }], - stateMutability: 'view', - type: 'function' - }, - { - inputs: [], - name: 'paused', - outputs: [{ internalType: 'bool', name: '', type: 'bool' }], - stateMutability: 'view', - type: 'function' - } -]; diff --git a/src/features/cross-chain/calculation-manager/providers/cbridge/constants/cbridge-supported-blockchains.ts b/src/features/cross-chain/calculation-manager/providers/cbridge/constants/cbridge-supported-blockchains.ts index 1e561ef819..c575d26a3d 100644 --- a/src/features/cross-chain/calculation-manager/providers/cbridge/constants/cbridge-supported-blockchains.ts +++ b/src/features/cross-chain/calculation-manager/providers/cbridge/constants/cbridge-supported-blockchains.ts @@ -9,7 +9,11 @@ export const cbridgeSupportedBlockchains = [ BLOCKCHAIN_NAME.ARBITRUM, BLOCKCHAIN_NAME.AURORA, BLOCKCHAIN_NAME.OPTIMISM, - BLOCKCHAIN_NAME.ASTAR_EVM + BLOCKCHAIN_NAME.ASTAR_EVM, + BLOCKCHAIN_NAME.GOERLI, + BLOCKCHAIN_NAME.BINANCE_SMART_CHAIN_TESTNET, + BLOCKCHAIN_NAME.MUMBAI, + BLOCKCHAIN_NAME.FUJI ] as const; export type CbridgeCrossChainSupportedBlockchain = (typeof cbridgeSupportedBlockchains)[number]; diff --git a/src/features/cross-chain/calculation-manager/providers/cbridge/constants/celer-transit-tokens.ts b/src/features/cross-chain/calculation-manager/providers/cbridge/constants/celer-transit-tokens.ts deleted file mode 100644 index 0bb814ab8f..0000000000 --- a/src/features/cross-chain/calculation-manager/providers/cbridge/constants/celer-transit-tokens.ts +++ /dev/null @@ -1,108 +0,0 @@ -import { TokenStruct } from 'src/common/tokens/token'; -import { BLOCKCHAIN_NAME } from 'src/core/blockchain/models/blockchain-name'; -import { CbridgeCrossChainSupportedBlockchain } from 'src/features/cross-chain/calculation-manager/providers/cbridge/constants/cbridge-supported-blockchains'; - -export const celerTransitTokens: Record = { - [BLOCKCHAIN_NAME.ETHEREUM]: [ - { - blockchain: BLOCKCHAIN_NAME.ETHEREUM, - address: '0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48', - name: 'USDC', - symbol: 'USDC', - decimals: 6 - } - ], - [BLOCKCHAIN_NAME.BINANCE_SMART_CHAIN]: [ - { - blockchain: BLOCKCHAIN_NAME.BINANCE_SMART_CHAIN, - address: '0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d', - name: 'USDC', - symbol: 'USDC', - decimals: 18 - }, - { - blockchain: BLOCKCHAIN_NAME.BINANCE_SMART_CHAIN, - address: '0x55d398326f99059ff775485246999027b3197955', - name: 'USDC', - symbol: 'USDC', - decimals: 18 - }, - { - blockchain: BLOCKCHAIN_NAME.BINANCE_SMART_CHAIN, - address: '0xB5102CeE1528Ce2C760893034A4603663495fD72', - name: 'dForce USD', - symbol: 'USX', - decimals: 18 - }, - { - blockchain: BLOCKCHAIN_NAME.BINANCE_SMART_CHAIN, - address: '0x2170ed0880ac9a755fd29b2688956bd959f933f8', - name: 'Binance-Peg Ethereum Token', - symbol: 'WETH', - decimals: 18 - } - ], - [BLOCKCHAIN_NAME.POLYGON]: [ - { - blockchain: BLOCKCHAIN_NAME.POLYGON, - address: '0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174', - name: 'USDC', - symbol: 'USDC', - decimals: 6 - } - ], - [BLOCKCHAIN_NAME.AVALANCHE]: [ - { - blockchain: BLOCKCHAIN_NAME.AVALANCHE, - address: '0xA7D7079b0FEaD91F3e65f86E8915Cb59c1a4C664', - name: 'USDC', - symbol: 'USDC.e', - decimals: 6 - } - ], - [BLOCKCHAIN_NAME.FANTOM]: [ - { - blockchain: BLOCKCHAIN_NAME.FANTOM, - address: '0x04068DA6C83AFCFA0e13ba15A6696662335D5B75', - name: 'USDC', - symbol: 'USDC', - decimals: 6 - } - ], - [BLOCKCHAIN_NAME.ARBITRUM]: [ - { - blockchain: BLOCKCHAIN_NAME.ARBITRUM, - address: '0xff970a61a04b1ca14834a43f5de4533ebddb5cc8', - name: 'USDC', - symbol: 'USDC', - decimals: 6 - } - ], - [BLOCKCHAIN_NAME.AURORA]: [ - { - blockchain: BLOCKCHAIN_NAME.AURORA, - address: '0xb12bfca5a55806aaf64e99521918a4bf0fc40802', - name: 'USDC', - symbol: 'USDC', - decimals: 6 - } - ], - [BLOCKCHAIN_NAME.OPTIMISM]: [ - { - blockchain: BLOCKCHAIN_NAME.OPTIMISM, - address: '0x7f5c764cbc14f9669b88837ca1490cca17c31607', - name: 'USDC', - symbol: 'USDC', - decimals: 6 - } - ], - [BLOCKCHAIN_NAME.ASTAR_EVM]: [ - { - blockchain: BLOCKCHAIN_NAME.ASTAR_EVM, - address: '0x6a2d262D56735DbA19Dd70682B39F6bE9a931D98', - name: 'USDC', - symbol: 'USDC', - decimals: 6 - } - ] -}; diff --git a/src/features/cross-chain/calculation-manager/providers/multichain-provider/models/supported-blockchain.ts b/src/features/cross-chain/calculation-manager/providers/multichain-provider/models/supported-blockchain.ts index bc2c12127b..927315cce7 100644 --- a/src/features/cross-chain/calculation-manager/providers/multichain-provider/models/supported-blockchain.ts +++ b/src/features/cross-chain/calculation-manager/providers/multichain-provider/models/supported-blockchain.ts @@ -28,7 +28,11 @@ export const multichainCrossChainSupportedBlockchains = [ BLOCKCHAIN_NAME.VELAS, BLOCKCHAIN_NAME.SYSCOIN, BLOCKCHAIN_NAME.ASTAR_EVM, - BLOCKCHAIN_NAME.ZK_SYNC + BLOCKCHAIN_NAME.ZK_SYNC, + BLOCKCHAIN_NAME.MUMBAI, + BLOCKCHAIN_NAME.GOERLI, + BLOCKCHAIN_NAME.FUJI, + BLOCKCHAIN_NAME.BINANCE_SMART_CHAIN_TESTNET ] as const; export type MultichainCrossChainSupportedBlockchain = diff --git a/src/features/cross-chain/calculation-manager/providers/symbiosis-provider/constants/contract-address-v2.ts b/src/features/cross-chain/calculation-manager/providers/symbiosis-provider/constants/contract-address-v2.ts index 8ed83daa90..3fc40df9a8 100644 --- a/src/features/cross-chain/calculation-manager/providers/symbiosis-provider/constants/contract-address-v2.ts +++ b/src/features/cross-chain/calculation-manager/providers/symbiosis-provider/constants/contract-address-v2.ts @@ -45,6 +45,22 @@ export const SYMBIOSIS_CONTRACT_ADDRESS_V2: Record< [BLOCKCHAIN_NAME.ARBITRUM]: { providerRouter: '0x0000000000000000000000000000000000000000', providerGateway: '0xAdB2d3b711Bb8d8Ea92ff70292c466140432c278' + }, + [BLOCKCHAIN_NAME.GOERLI]: { + providerRouter: '0x5302358dCFbF2881e5b5E537316786d8Ea242008', + providerGateway: '0x438D14b1Fd3C20C33Fa7EF6331AA3fC36bc0347E' + }, + [BLOCKCHAIN_NAME.MUMBAI]: { + providerRouter: '0x2636F6A85aB7bD438631a03e6E7cC6d6ae712642', + providerGateway: '0x85aDa6757f383577A8AB2a3492ac3E721CcFEAbb' + }, + [BLOCKCHAIN_NAME.FUJI]: { + providerRouter: '0x8eC5387A2CdFA5315c05Fd7296C11406AeC2559e', + providerGateway: '0x80cD2d214ccBdcB214DEA5bC040c8c2002Dc9380' + }, + [BLOCKCHAIN_NAME.BINANCE_SMART_CHAIN_TESTNET]: { + providerRouter: '0xd3F98c243374D79Bfd9a8ac03964623221D53F0f', + providerGateway: '0x4Ee7B1e8Ad6E1682318f1c47F83634dAa1197eEf' } // [BLOCKCHAIN_NAME.BITCOIN]: { // providerRouter: '', diff --git a/src/features/cross-chain/calculation-manager/providers/symbiosis-provider/constants/symbiosis-cross-chain-supported-blockchain.ts b/src/features/cross-chain/calculation-manager/providers/symbiosis-provider/constants/symbiosis-cross-chain-supported-blockchain.ts index ccca4e3796..da8d160c95 100644 --- a/src/features/cross-chain/calculation-manager/providers/symbiosis-provider/constants/symbiosis-cross-chain-supported-blockchain.ts +++ b/src/features/cross-chain/calculation-manager/providers/symbiosis-provider/constants/symbiosis-cross-chain-supported-blockchain.ts @@ -10,8 +10,11 @@ export const symbiosisCrossChainSupportedBlockchains = [ BLOCKCHAIN_NAME.BOBA_AVALANCHE, BLOCKCHAIN_NAME.TELOS, BLOCKCHAIN_NAME.ZK_SYNC, - BLOCKCHAIN_NAME.ARBITRUM - // BLOCKCHAIN_NAME.BITCOIN + BLOCKCHAIN_NAME.ARBITRUM, + BLOCKCHAIN_NAME.GOERLI, + BLOCKCHAIN_NAME.BINANCE_SMART_CHAIN_TESTNET, + BLOCKCHAIN_NAME.FUJI, + BLOCKCHAIN_NAME.MUMBAI ] as const; export type SymbiosisCrossChainSupportedBlockchain = diff --git a/src/features/cross-chain/calculation-manager/providers/symbiosis-provider/constants/symbiosis-transit-tokens.ts b/src/features/cross-chain/calculation-manager/providers/symbiosis-provider/constants/symbiosis-transit-tokens.ts index 7dcf1d90ac..aed05bd1af 100644 --- a/src/features/cross-chain/calculation-manager/providers/symbiosis-provider/constants/symbiosis-transit-tokens.ts +++ b/src/features/cross-chain/calculation-manager/providers/symbiosis-provider/constants/symbiosis-transit-tokens.ts @@ -72,6 +72,34 @@ export const symbiosisTransitTokens: Record { - const body: object = await getRequestOptions(transferId, estimatedReceivedAmt); - return Injector.httpClient.post( - `${CbridgeCrossChainApiService.apiEndpoint}withdrawLiquidity`, - body - ); - } - public static async getTransferId( sourceTransaction: string, fromBlockchain: CbridgeCrossChainSupportedBlockchain @@ -59,13 +47,19 @@ export class CrossChainCbridgeManager { onTransactionHash: (hash: string) => void ): Promise { try { + const useTestnet = fromBlockchain in TEST_EVM_BLOCKCHAIN_NAME; + const transferId = await CrossChainCbridgeManager.getTransferId( sourceTransaction, fromBlockchain ); - const statusResponse = await CbridgeCrossChainApiService.fetchTradeStatus(transferId); + const statusResponse = await CbridgeCrossChainApiService.fetchTradeStatus(transferId, { + useTestnet + }); if (statusResponse.status === TransferHistoryStatus.TRANSFER_TO_BE_REFUNDED) { - await CrossChainCbridgeManager.withdrawLiquidity(transferId, estimateAmount); + await CbridgeCrossChainApiService.withdrawLiquidity(transferId, estimateAmount, { + useTestnet + }); await new Promise(resolve => setTimeout(resolve, 10_000)); return CrossChainCbridgeManager.transferRefund( fromBlockchain, diff --git a/src/features/cross-chain/status-manager/cross-chain-status-manager.ts b/src/features/cross-chain/status-manager/cross-chain-status-manager.ts index 48c37ecf78..6d04a6a7b3 100644 --- a/src/features/cross-chain/status-manager/cross-chain-status-manager.ts +++ b/src/features/cross-chain/status-manager/cross-chain-status-manager.ts @@ -2,7 +2,10 @@ import { createClient } from '@layerzerolabs/scan-client'; import { Via } from '@viaprotocol/router-sdk'; import { StatusResponse, TransactionStatus } from 'rango-sdk-basic'; import { RubicSdkError } from 'src/common/errors'; -import { BLOCKCHAIN_NAME } from 'src/core/blockchain/models/blockchain-name'; +import { + BLOCKCHAIN_NAME, + TEST_EVM_BLOCKCHAIN_NAME +} from 'src/core/blockchain/models/blockchain-name'; import { blockchainId } from 'src/core/blockchain/utils/blockchains-info/constants/blockchain-id'; import { TxStatus } from 'src/core/blockchain/web3-public-service/web3-public/models/tx-status'; import { Injector } from 'src/core/injector/injector'; @@ -571,7 +574,10 @@ export class CrossChainStatusManager { data.srcTxHash, data.fromBlockchain as CbridgeCrossChainSupportedBlockchain ); - const swapData = await CbridgeCrossChainApiService.fetchTradeStatus(transferId); + const useTestnet = data.fromBlockchain in TEST_EVM_BLOCKCHAIN_NAME; + const swapData = await CbridgeCrossChainApiService.fetchTradeStatus(transferId, { + useTestnet + }); switch (swapData.status) { case TransferHistoryStatus.TRANSFER_UNKNOWN: diff --git a/src/features/on-chain/calculation-manager/constants/trade-providers/uniswap-v2-trade-providers.ts b/src/features/on-chain/calculation-manager/constants/trade-providers/uniswap-v2-trade-providers.ts index 57087923b3..fa086300d7 100644 --- a/src/features/on-chain/calculation-manager/constants/trade-providers/uniswap-v2-trade-providers.ts +++ b/src/features/on-chain/calculation-manager/constants/trade-providers/uniswap-v2-trade-providers.ts @@ -8,6 +8,8 @@ import { SushiSwapAvalancheProvider } from 'src/features/on-chain/calculation-ma import { OolongSwapProvider } from 'src/features/on-chain/calculation-manager/providers/dexes/boba/oolong-swap/oolong-swap-provider'; import { PancakeSwapProvider } from 'src/features/on-chain/calculation-manager/providers/dexes/bsc/pancake-swap/pancake-swap-provider'; import { SushiSwapBscProvider } from 'src/features/on-chain/calculation-manager/providers/dexes/bsc/sushi-swap-bsc/sushi-swap-bsc-provider'; +import { PancakeSwapTestnetProvider } from 'src/features/on-chain/calculation-manager/providers/dexes/bsct/pancake-swap-testnet/pancake-swap-testnet-provider'; +import { TraderJoeBsctProvider } from 'src/features/on-chain/calculation-manager/providers/dexes/bsct/trader-joe-bsct/trader-joe-bsct-provider'; import { CroSwapProvider } from 'src/features/on-chain/calculation-manager/providers/dexes/cronos/cro-swap/cro-swap-provider'; import { CrodexProvider } from 'src/features/on-chain/calculation-manager/providers/dexes/cronos/crodex/crodex-provider'; import { CronaSwapProvider } from 'src/features/on-chain/calculation-manager/providers/dexes/cronos/crona-swap/crona-swap-provider'; @@ -20,6 +22,9 @@ import { SoulSwapProvider } from 'src/features/on-chain/calculation-manager/prov import { SpiritSwapProvider } from 'src/features/on-chain/calculation-manager/providers/dexes/fantom/spirit-swap/spirit-swap-provider'; import { SpookySwapProvider } from 'src/features/on-chain/calculation-manager/providers/dexes/fantom/spooky-swap/spooky-swap-provider'; import { SushiSwapFantomProvider } from 'src/features/on-chain/calculation-manager/providers/dexes/fantom/sushi-swap-fantom/sushi-swap-fantom-provider'; +import { JoeFujiProvider } from 'src/features/on-chain/calculation-manager/providers/dexes/fuji/joe-fuji/joe-fuji-provider'; +import { PangolinFujiProvider } from 'src/features/on-chain/calculation-manager/providers/dexes/fuji/pangolin-fuji/pangolin-fuji-provider'; +import { UniSwapV2GoerliProvider } from 'src/features/on-chain/calculation-manager/providers/dexes/goerli/uni-swap-v2-goerli/uni-swap-v2-goerli-provider'; import { SushiSwapHarmonyProvider } from 'src/features/on-chain/calculation-manager/providers/dexes/harmony/sushi-swap-harmony/sushi-swap-harmony-provider'; import { TradeHarmonySwapProvider } from 'src/features/on-chain/calculation-manager/providers/dexes/harmony/trader-harmony/trader-harmony-provider'; import { ViperSwapHarmonyProvider } from 'src/features/on-chain/calculation-manager/providers/dexes/harmony/viper-swap-harmony/viper-swap-harmony-provider'; @@ -31,6 +36,7 @@ import { ClaimSwapProvider } from 'src/features/on-chain/calculation-manager/pro import { NetSwapProvider } from 'src/features/on-chain/calculation-manager/providers/dexes/metis/net-swap/net-swap-provider'; import { SolarbeamProvider } from 'src/features/on-chain/calculation-manager/providers/dexes/moonriver/solarbeam/solarbeam-provider'; import { SushiSwapMoonriverProvider } from 'src/features/on-chain/calculation-manager/providers/dexes/moonriver/sushi-swap-moonriver/sushi-swap-moonriver-provider'; +import { QuickSwapMumbaiProvider } from 'src/features/on-chain/calculation-manager/providers/dexes/mumbai/quick-swap-mumbai/quick-swap-mumbai-provider'; import { YuzuSwapProvider } from 'src/features/on-chain/calculation-manager/providers/dexes/oasis/yuzu-swap/yuzu-swap-provider'; import { QuickSwapProvider } from 'src/features/on-chain/calculation-manager/providers/dexes/polygon/quick-swap/quick-swap-provider'; import { SushiSwapPolygonProvider } from 'src/features/on-chain/calculation-manager/providers/dexes/polygon/sushi-swap-polygon/sushi-swap-polygon-provider'; @@ -108,5 +114,15 @@ export const UniswapV2TradeProviders = [ // Astar EVM ArthSwapProvider, // ZkSync - MuteSwapProvider + MuteSwapProvider, + // BSC Testnet + PancakeSwapTestnetProvider, + TraderJoeBsctProvider, + // Goerli + UniSwapV2GoerliProvider, + // Mumbai + QuickSwapMumbaiProvider, + // Fuji + JoeFujiProvider, + PangolinFujiProvider ] as const; diff --git a/src/features/on-chain/calculation-manager/providers/dexes/bsct/default-constants.ts b/src/features/on-chain/calculation-manager/providers/dexes/bsct/default-constants.ts new file mode 100644 index 0000000000..8210157c55 --- /dev/null +++ b/src/features/on-chain/calculation-manager/providers/dexes/bsct/default-constants.ts @@ -0,0 +1,19 @@ +import { wrappedNativeTokensList } from 'src/common/tokens'; +import { BLOCKCHAIN_NAME } from 'src/core/blockchain/models/blockchain-name'; +import { UniswapV2ProviderConfiguration } from 'src/features/on-chain/calculation-manager/providers/dexes/common/uniswap-v2-abstract/models/uniswap-v2-provider-configuration'; + +const defaultBscWethAddress = wrappedNativeTokensList[BLOCKCHAIN_NAME.BINANCE_SMART_CHAIN]!.address; + +const defaultBscRoutingProvidersAddresses = [ + defaultBscWethAddress, // WBNB + '0x855fC87f7F14Db747ef27603b02bAe579ba947B6', // USDC + '0x7d43AABC515C356145049227CeE54B608342c0ad', // USDT + '0xC826C23327098cd8A37f140114F2173A8F62DD29', // WUSDT + '0x9a01bf917477dd9f5d715d188618fc8b7350cd22' // BUSD +]; + +export const defaultBscTestnetProviderConfiguration: UniswapV2ProviderConfiguration = { + maxTransitTokens: 3, + routingProvidersAddresses: defaultBscRoutingProvidersAddresses, + wethAddress: defaultBscWethAddress +}; diff --git a/src/features/on-chain/calculation-manager/providers/dexes/bsct/pancake-swap-testnet/constants.ts b/src/features/on-chain/calculation-manager/providers/dexes/bsct/pancake-swap-testnet/constants.ts new file mode 100644 index 0000000000..28536b81ba --- /dev/null +++ b/src/features/on-chain/calculation-manager/providers/dexes/bsct/pancake-swap-testnet/constants.ts @@ -0,0 +1,5 @@ +import { defaultBscTestnetProviderConfiguration } from 'src/features/on-chain/calculation-manager/providers/dexes/bsct/default-constants'; + +export const PANCAKE_SWAP_TESTNET_CONTRACT_ADDRESS = '0x10ED43C718714eb63d5aA57B78B54704E256024E'; + +export const PANCAKE_SWAP_TESTNET_PROVIDER_CONFIGURATION = defaultBscTestnetProviderConfiguration; diff --git a/src/features/on-chain/calculation-manager/providers/dexes/bsct/pancake-swap-testnet/pancake-swap-testnet-provider.ts b/src/features/on-chain/calculation-manager/providers/dexes/bsct/pancake-swap-testnet/pancake-swap-testnet-provider.ts new file mode 100644 index 0000000000..e1812d97e7 --- /dev/null +++ b/src/features/on-chain/calculation-manager/providers/dexes/bsct/pancake-swap-testnet/pancake-swap-testnet-provider.ts @@ -0,0 +1,12 @@ +import { BLOCKCHAIN_NAME } from 'src/core/blockchain/models/blockchain-name'; +import { PANCAKE_SWAP_TESTNET_PROVIDER_CONFIGURATION } from 'src/features/on-chain/calculation-manager/providers/dexes/bsct/pancake-swap-testnet/constants'; +import { PancakeSwapTestnetTrade } from 'src/features/on-chain/calculation-manager/providers/dexes/bsct/pancake-swap-testnet/pancake-swap-testnet-trade'; +import { UniswapV2AbstractProvider } from 'src/features/on-chain/calculation-manager/providers/dexes/common/uniswap-v2-abstract/uniswap-v2-abstract-provider'; + +export class PancakeSwapTestnetProvider extends UniswapV2AbstractProvider { + public readonly blockchain = BLOCKCHAIN_NAME.BINANCE_SMART_CHAIN_TESTNET; + + public readonly UniswapV2TradeClass = PancakeSwapTestnetTrade; + + public readonly providerSettings = PANCAKE_SWAP_TESTNET_PROVIDER_CONFIGURATION; +} diff --git a/src/features/on-chain/calculation-manager/providers/dexes/bsct/pancake-swap-testnet/pancake-swap-testnet-trade.ts b/src/features/on-chain/calculation-manager/providers/dexes/bsct/pancake-swap-testnet/pancake-swap-testnet-trade.ts new file mode 100644 index 0000000000..55bdd95de2 --- /dev/null +++ b/src/features/on-chain/calculation-manager/providers/dexes/bsct/pancake-swap-testnet/pancake-swap-testnet-trade.ts @@ -0,0 +1,14 @@ +import { + ON_CHAIN_TRADE_TYPE, + OnChainTradeType +} from 'src/features/on-chain/calculation-manager/providers/common/models/on-chain-trade-type'; +import { PANCAKE_SWAP_TESTNET_CONTRACT_ADDRESS } from 'src/features/on-chain/calculation-manager/providers/dexes/bsct/pancake-swap-testnet/constants'; +import { UniswapV2AbstractTrade } from 'src/features/on-chain/calculation-manager/providers/dexes/common/uniswap-v2-abstract/uniswap-v2-abstract-trade'; + +export class PancakeSwapTestnetTrade extends UniswapV2AbstractTrade { + public static get type(): OnChainTradeType { + return ON_CHAIN_TRADE_TYPE.PANCAKE_SWAP; + } + + public readonly dexContractAddress = PANCAKE_SWAP_TESTNET_CONTRACT_ADDRESS; +} diff --git a/src/features/on-chain/calculation-manager/providers/dexes/bsct/trader-joe-bsct/constants.ts b/src/features/on-chain/calculation-manager/providers/dexes/bsct/trader-joe-bsct/constants.ts new file mode 100644 index 0000000000..7bdd890696 --- /dev/null +++ b/src/features/on-chain/calculation-manager/providers/dexes/bsct/trader-joe-bsct/constants.ts @@ -0,0 +1,5 @@ +import { defaultBscTestnetProviderConfiguration } from 'src/features/on-chain/calculation-manager/providers/dexes/bsct/default-constants'; + +export const TRADER_JOE_BSCT_CONTRACT_ADDRESS = '0xf7C6d73336f333b63144644944176072D94128F5'; + +export const TRADER_JOE_BSCT_PROVIDER_CONFIGURATION = defaultBscTestnetProviderConfiguration; diff --git a/src/features/on-chain/calculation-manager/providers/dexes/bsct/trader-joe-bsct/trader-joe-bsct-provider.ts b/src/features/on-chain/calculation-manager/providers/dexes/bsct/trader-joe-bsct/trader-joe-bsct-provider.ts new file mode 100644 index 0000000000..5d8c95e73e --- /dev/null +++ b/src/features/on-chain/calculation-manager/providers/dexes/bsct/trader-joe-bsct/trader-joe-bsct-provider.ts @@ -0,0 +1,12 @@ +import { BLOCKCHAIN_NAME } from 'src/core/blockchain/models/blockchain-name'; +import { TRADER_JOE_BSCT_PROVIDER_CONFIGURATION } from 'src/features/on-chain/calculation-manager/providers/dexes/bsct/trader-joe-bsct/constants'; +import { TraderJoeBsctTrade } from 'src/features/on-chain/calculation-manager/providers/dexes/bsct/trader-joe-bsct/trader-joe-bsct-trade'; +import { UniswapV2AbstractProvider } from 'src/features/on-chain/calculation-manager/providers/dexes/common/uniswap-v2-abstract/uniswap-v2-abstract-provider'; + +export class TraderJoeBsctProvider extends UniswapV2AbstractProvider { + public readonly blockchain = BLOCKCHAIN_NAME.BINANCE_SMART_CHAIN_TESTNET; + + public readonly UniswapV2TradeClass = TraderJoeBsctTrade; + + public readonly providerSettings = TRADER_JOE_BSCT_PROVIDER_CONFIGURATION; +} diff --git a/src/features/on-chain/calculation-manager/providers/dexes/bsct/trader-joe-bsct/trader-joe-bsct-trade.ts b/src/features/on-chain/calculation-manager/providers/dexes/bsct/trader-joe-bsct/trader-joe-bsct-trade.ts new file mode 100644 index 0000000000..5d0e4c896d --- /dev/null +++ b/src/features/on-chain/calculation-manager/providers/dexes/bsct/trader-joe-bsct/trader-joe-bsct-trade.ts @@ -0,0 +1,20 @@ +import { + ON_CHAIN_TRADE_TYPE, + OnChainTradeType +} from 'src/features/on-chain/calculation-manager/providers/common/models/on-chain-trade-type'; +import { AVAX_ABI } from 'src/features/on-chain/calculation-manager/providers/dexes/avalanche/avax-abi'; +import { AVALANCHE_SWAP_METHOD } from 'src/features/on-chain/calculation-manager/providers/dexes/avalanche/swap-methods'; +import { TRADER_JOE_BSCT_CONTRACT_ADDRESS } from 'src/features/on-chain/calculation-manager/providers/dexes/bsct/trader-joe-bsct/constants'; +import { UniswapV2AbstractTrade } from 'src/features/on-chain/calculation-manager/providers/dexes/common/uniswap-v2-abstract/uniswap-v2-abstract-trade'; + +export class TraderJoeBsctTrade extends UniswapV2AbstractTrade { + public static get type(): OnChainTradeType { + return ON_CHAIN_TRADE_TYPE.PANCAKE_SWAP; + } + + public readonly dexContractAddress = TRADER_JOE_BSCT_CONTRACT_ADDRESS; + + public static readonly contractAbi = AVAX_ABI; + + public static readonly swapMethods = AVALANCHE_SWAP_METHOD; +} diff --git a/src/features/on-chain/calculation-manager/providers/dexes/fuji/default-constants.ts b/src/features/on-chain/calculation-manager/providers/dexes/fuji/default-constants.ts new file mode 100644 index 0000000000..44455a7b86 --- /dev/null +++ b/src/features/on-chain/calculation-manager/providers/dexes/fuji/default-constants.ts @@ -0,0 +1,20 @@ +import { wrappedNativeTokensList } from 'src/common/tokens'; +import { BLOCKCHAIN_NAME } from 'src/core/blockchain/models/blockchain-name'; +import { UniswapV2ProviderConfiguration } from 'src/features/on-chain/calculation-manager/providers/dexes/common/uniswap-v2-abstract/models/uniswap-v2-provider-configuration'; + +const wethAddress = wrappedNativeTokensList[BLOCKCHAIN_NAME.AVALANCHE]!.address; + +const routingProvidersAddresses = [ + wrappedNativeTokensList[BLOCKCHAIN_NAME.AVALANCHE]!.address, // WAVAX + '0x231401dc8b53338d78c08f83cc4ebc74148196d0', // USDC + '0x5425890298aed601595a70ab815c96711a31bc65', // USDC2 + '0x0b9d5d9136855f6fec3c0993fee6e9ce8a297846', // LINK + '0x49D5c2BdFfac6CE2BFdB6640F4F80f226bc10bAB', // WETH + '0xd1c3f94DE7e5B45fa4eDBBA472491a9f4B166FC4' // XAVA +]; + +export const defaultFujiProviderConfiguration: UniswapV2ProviderConfiguration = { + maxTransitTokens: 3, + routingProvidersAddresses, + wethAddress +}; diff --git a/src/features/on-chain/calculation-manager/providers/dexes/fuji/joe-fuji/constants.ts b/src/features/on-chain/calculation-manager/providers/dexes/fuji/joe-fuji/constants.ts new file mode 100644 index 0000000000..d8f51aef4a --- /dev/null +++ b/src/features/on-chain/calculation-manager/providers/dexes/fuji/joe-fuji/constants.ts @@ -0,0 +1,4 @@ +import { defaultFujiProviderConfiguration } from 'src/features/on-chain/calculation-manager/providers/dexes/fuji/default-constants'; + +export const JOE_FUJI_CONTRACT_ADDRESS = '0x7b50046cEC8252ca835b148b1eDD997319120a12'; +export const JOE_FUJI_PROVIDER_CONFIGURATION = defaultFujiProviderConfiguration; diff --git a/src/features/on-chain/calculation-manager/providers/dexes/fuji/joe-fuji/joe-fuji-provider.ts b/src/features/on-chain/calculation-manager/providers/dexes/fuji/joe-fuji/joe-fuji-provider.ts new file mode 100644 index 0000000000..22bdb89309 --- /dev/null +++ b/src/features/on-chain/calculation-manager/providers/dexes/fuji/joe-fuji/joe-fuji-provider.ts @@ -0,0 +1,12 @@ +import { BLOCKCHAIN_NAME } from 'src/core/blockchain/models/blockchain-name'; +import { UniswapV2AbstractProvider } from 'src/features/on-chain/calculation-manager/providers/dexes/common/uniswap-v2-abstract/uniswap-v2-abstract-provider'; +import { JOE_FUJI_PROVIDER_CONFIGURATION } from 'src/features/on-chain/calculation-manager/providers/dexes/fuji/joe-fuji/constants'; +import { JoeFujiTrade } from 'src/features/on-chain/calculation-manager/providers/dexes/fuji/joe-fuji/joe-fuji-trade'; + +export class JoeFujiProvider extends UniswapV2AbstractProvider { + public readonly blockchain = BLOCKCHAIN_NAME.FUJI; + + public readonly UniswapV2TradeClass = JoeFujiTrade; + + public readonly providerSettings = JOE_FUJI_PROVIDER_CONFIGURATION; +} diff --git a/src/features/on-chain/calculation-manager/providers/dexes/fuji/joe-fuji/joe-fuji-trade.ts b/src/features/on-chain/calculation-manager/providers/dexes/fuji/joe-fuji/joe-fuji-trade.ts new file mode 100644 index 0000000000..363dcad124 --- /dev/null +++ b/src/features/on-chain/calculation-manager/providers/dexes/fuji/joe-fuji/joe-fuji-trade.ts @@ -0,0 +1,20 @@ +import { + ON_CHAIN_TRADE_TYPE, + OnChainTradeType +} from 'src/features/on-chain/calculation-manager/providers/common/models/on-chain-trade-type'; +import { AVAX_ABI } from 'src/features/on-chain/calculation-manager/providers/dexes/avalanche/avax-abi'; +import { AVALANCHE_SWAP_METHOD } from 'src/features/on-chain/calculation-manager/providers/dexes/avalanche/swap-methods'; +import { UniswapV2AbstractTrade } from 'src/features/on-chain/calculation-manager/providers/dexes/common/uniswap-v2-abstract/uniswap-v2-abstract-trade'; +import { JOE_FUJI_CONTRACT_ADDRESS } from 'src/features/on-chain/calculation-manager/providers/dexes/fuji/joe-fuji/constants'; + +export class JoeFujiTrade extends UniswapV2AbstractTrade { + public static readonly contractAbi = AVAX_ABI; + + public static readonly swapMethods = AVALANCHE_SWAP_METHOD; + + public static get type(): OnChainTradeType { + return ON_CHAIN_TRADE_TYPE.JOE; + } + + public readonly dexContractAddress = JOE_FUJI_CONTRACT_ADDRESS; +} diff --git a/src/features/on-chain/calculation-manager/providers/dexes/fuji/pangolin-fuji/constants.ts b/src/features/on-chain/calculation-manager/providers/dexes/fuji/pangolin-fuji/constants.ts new file mode 100644 index 0000000000..21d5bd10b7 --- /dev/null +++ b/src/features/on-chain/calculation-manager/providers/dexes/fuji/pangolin-fuji/constants.ts @@ -0,0 +1,5 @@ +import { defaultFujiProviderConfiguration } from 'src/features/on-chain/calculation-manager/providers/dexes/fuji/default-constants'; + +export const PANGOLIN_FUJI_CONTRACT_ADDRESS = '0x2D99ABD9008Dc933ff5c0CD271B88309593aB921'; + +export const PANGOLIN_FUJI_PROVIDER_CONFIGURATION = defaultFujiProviderConfiguration; diff --git a/src/features/on-chain/calculation-manager/providers/dexes/fuji/pangolin-fuji/pangolin-fuji-provider.ts b/src/features/on-chain/calculation-manager/providers/dexes/fuji/pangolin-fuji/pangolin-fuji-provider.ts new file mode 100644 index 0000000000..43adc0ddab --- /dev/null +++ b/src/features/on-chain/calculation-manager/providers/dexes/fuji/pangolin-fuji/pangolin-fuji-provider.ts @@ -0,0 +1,12 @@ +import { BLOCKCHAIN_NAME } from 'src/core/blockchain/models/blockchain-name'; +import { UniswapV2AbstractProvider } from 'src/features/on-chain/calculation-manager/providers/dexes/common/uniswap-v2-abstract/uniswap-v2-abstract-provider'; +import { PANGOLIN_FUJI_PROVIDER_CONFIGURATION } from 'src/features/on-chain/calculation-manager/providers/dexes/fuji/pangolin-fuji/constants'; +import { PangolinFujiTrade } from 'src/features/on-chain/calculation-manager/providers/dexes/fuji/pangolin-fuji/pangolin-fuji-trade'; + +export class PangolinFujiProvider extends UniswapV2AbstractProvider { + public readonly blockchain = BLOCKCHAIN_NAME.FUJI; + + public readonly UniswapV2TradeClass = PangolinFujiTrade; + + public readonly providerSettings = PANGOLIN_FUJI_PROVIDER_CONFIGURATION; +} diff --git a/src/features/on-chain/calculation-manager/providers/dexes/fuji/pangolin-fuji/pangolin-fuji-trade.ts b/src/features/on-chain/calculation-manager/providers/dexes/fuji/pangolin-fuji/pangolin-fuji-trade.ts new file mode 100644 index 0000000000..8e08111b07 --- /dev/null +++ b/src/features/on-chain/calculation-manager/providers/dexes/fuji/pangolin-fuji/pangolin-fuji-trade.ts @@ -0,0 +1,20 @@ +import { + ON_CHAIN_TRADE_TYPE, + OnChainTradeType +} from 'src/features/on-chain/calculation-manager/providers/common/models/on-chain-trade-type'; +import { AVAX_ABI } from 'src/features/on-chain/calculation-manager/providers/dexes/avalanche/avax-abi'; +import { AVALANCHE_SWAP_METHOD } from 'src/features/on-chain/calculation-manager/providers/dexes/avalanche/swap-methods'; +import { UniswapV2AbstractTrade } from 'src/features/on-chain/calculation-manager/providers/dexes/common/uniswap-v2-abstract/uniswap-v2-abstract-trade'; +import { PANGOLIN_FUJI_CONTRACT_ADDRESS } from 'src/features/on-chain/calculation-manager/providers/dexes/fuji/pangolin-fuji/constants'; + +export class PangolinFujiTrade extends UniswapV2AbstractTrade { + public static readonly contractAbi = AVAX_ABI; + + public static readonly swapMethods = AVALANCHE_SWAP_METHOD; + + public static get type(): OnChainTradeType { + return ON_CHAIN_TRADE_TYPE.PANGOLIN; + } + + public readonly dexContractAddress = PANGOLIN_FUJI_CONTRACT_ADDRESS; +} diff --git a/src/features/on-chain/calculation-manager/providers/dexes/goerli/default-constants.ts b/src/features/on-chain/calculation-manager/providers/dexes/goerli/default-constants.ts new file mode 100644 index 0000000000..d599f5147a --- /dev/null +++ b/src/features/on-chain/calculation-manager/providers/dexes/goerli/default-constants.ts @@ -0,0 +1,19 @@ +import { wrappedNativeTokensList } from 'src/common/tokens'; +import { BLOCKCHAIN_NAME } from 'src/core/blockchain/models/blockchain-name'; +import { UniswapV2ProviderConfiguration } from 'src/features/on-chain/calculation-manager/providers/dexes/common/uniswap-v2-abstract/models/uniswap-v2-provider-configuration'; + +const wethAddress = wrappedNativeTokensList[BLOCKCHAIN_NAME.GOERLI]!.address; + +const defaultGoerliRoutingProvidersAddresses = [ + wethAddress, // WETH + '0xCbE56b00d173A26a5978cE90Db2E33622fD95A28', // USDC + '0xf4B2cbc3bA04c478F0dC824f4806aC39982Dce73', // USDT + '0xb93cba7013f4557cdfb590fd152d24ef4063485f', // DAI + '0xcc7bb2d219a0fc08033e130629c2b854b7ba9195' // ZETA +]; + +export const defaultGoerliProviderConfiguration: UniswapV2ProviderConfiguration = { + maxTransitTokens: 1, + routingProvidersAddresses: defaultGoerliRoutingProvidersAddresses, + wethAddress +}; diff --git a/src/features/on-chain/calculation-manager/providers/dexes/goerli/uni-swap-v2-goerli/constants.ts b/src/features/on-chain/calculation-manager/providers/dexes/goerli/uni-swap-v2-goerli/constants.ts new file mode 100644 index 0000000000..949797e9da --- /dev/null +++ b/src/features/on-chain/calculation-manager/providers/dexes/goerli/uni-swap-v2-goerli/constants.ts @@ -0,0 +1,9 @@ +import { UniswapV2ProviderConfiguration } from 'src/features/on-chain/calculation-manager/providers/dexes/common/uniswap-v2-abstract/models/uniswap-v2-provider-configuration'; +import { defaultGoerliProviderConfiguration } from 'src/features/on-chain/calculation-manager/providers/dexes/goerli/default-constants'; + +export const UNISWAP_V2_GOERLI_CONTRACT_ADDRESS = '0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D'; + +export const UNISWAP_V2_GOERLI_PROVIDER_CONFIGURATION: UniswapV2ProviderConfiguration = { + ...defaultGoerliProviderConfiguration, + maxTransitTokens: 2 +}; diff --git a/src/features/on-chain/calculation-manager/providers/dexes/goerli/uni-swap-v2-goerli/uni-swap-v2-goerli-provider.ts b/src/features/on-chain/calculation-manager/providers/dexes/goerli/uni-swap-v2-goerli/uni-swap-v2-goerli-provider.ts new file mode 100644 index 0000000000..25373aa80e --- /dev/null +++ b/src/features/on-chain/calculation-manager/providers/dexes/goerli/uni-swap-v2-goerli/uni-swap-v2-goerli-provider.ts @@ -0,0 +1,12 @@ +import { BLOCKCHAIN_NAME } from 'src/core/blockchain/models/blockchain-name'; +import { UniswapV2AbstractProvider } from 'src/features/on-chain/calculation-manager/providers/dexes/common/uniswap-v2-abstract/uniswap-v2-abstract-provider'; +import { UNISWAP_V2_GOERLI_PROVIDER_CONFIGURATION } from 'src/features/on-chain/calculation-manager/providers/dexes/goerli/uni-swap-v2-goerli/constants'; +import { UniSwapV2GoerliTrade } from 'src/features/on-chain/calculation-manager/providers/dexes/goerli/uni-swap-v2-goerli/uni-swap-v2-goerli-trade'; + +export class UniSwapV2GoerliProvider extends UniswapV2AbstractProvider { + public readonly blockchain = BLOCKCHAIN_NAME.GOERLI; + + public readonly UniswapV2TradeClass = UniSwapV2GoerliTrade; + + public readonly providerSettings = UNISWAP_V2_GOERLI_PROVIDER_CONFIGURATION; +} diff --git a/src/features/on-chain/calculation-manager/providers/dexes/goerli/uni-swap-v2-goerli/uni-swap-v2-goerli-trade.ts b/src/features/on-chain/calculation-manager/providers/dexes/goerli/uni-swap-v2-goerli/uni-swap-v2-goerli-trade.ts new file mode 100644 index 0000000000..bdffa7b903 --- /dev/null +++ b/src/features/on-chain/calculation-manager/providers/dexes/goerli/uni-swap-v2-goerli/uni-swap-v2-goerli-trade.ts @@ -0,0 +1,14 @@ +import { + ON_CHAIN_TRADE_TYPE, + OnChainTradeType +} from 'src/features/on-chain/calculation-manager/providers/common/models/on-chain-trade-type'; +import { UniswapV2AbstractTrade } from 'src/features/on-chain/calculation-manager/providers/dexes/common/uniswap-v2-abstract/uniswap-v2-abstract-trade'; +import { UNISWAP_V2_GOERLI_CONTRACT_ADDRESS } from 'src/features/on-chain/calculation-manager/providers/dexes/goerli/uni-swap-v2-goerli/constants'; + +export class UniSwapV2GoerliTrade extends UniswapV2AbstractTrade { + public static get type(): OnChainTradeType { + return ON_CHAIN_TRADE_TYPE.UNISWAP_V2; + } + + public readonly dexContractAddress = UNISWAP_V2_GOERLI_CONTRACT_ADDRESS; +} diff --git a/src/features/on-chain/calculation-manager/providers/dexes/mumbai/default-constants.ts b/src/features/on-chain/calculation-manager/providers/dexes/mumbai/default-constants.ts new file mode 100644 index 0000000000..6e2a4a060c --- /dev/null +++ b/src/features/on-chain/calculation-manager/providers/dexes/mumbai/default-constants.ts @@ -0,0 +1,20 @@ +import { wrappedNativeTokensList } from 'src/common/tokens'; +import { BLOCKCHAIN_NAME } from 'src/core/blockchain/models/blockchain-name'; +import { UniswapV2ProviderConfiguration } from 'src/features/on-chain/calculation-manager/providers/dexes/common/uniswap-v2-abstract/models/uniswap-v2-provider-configuration'; + +const wethAddress = wrappedNativeTokensList[BLOCKCHAIN_NAME.MUMBAI]!.address; + +const routingProvidersAddresses = [ + wethAddress, // WMATIC + '0x6De33698e9e9b787e09d3Bd7771ef63557E148bb', // USDC + '0xD9d1034ef3d21221F008C7e96346CA999966752C', // WUSDC + '0x19d66abd20fb2a0fc046c139d5af1e97f09a695e', // USDC2 + '0x2a655231e814e71015ff991d90c5790b5de82b94', // WETH + '0x6d8873f56a56f0af376091bedddd149f3592e854' // DAI +]; + +export const defaultMumbaiProviderConfiguration: UniswapV2ProviderConfiguration = { + maxTransitTokens: 3, + routingProvidersAddresses, + wethAddress +}; diff --git a/src/features/on-chain/calculation-manager/providers/dexes/mumbai/quick-swap-mumbai/constants.ts b/src/features/on-chain/calculation-manager/providers/dexes/mumbai/quick-swap-mumbai/constants.ts new file mode 100644 index 0000000000..1d3128fa8b --- /dev/null +++ b/src/features/on-chain/calculation-manager/providers/dexes/mumbai/quick-swap-mumbai/constants.ts @@ -0,0 +1,5 @@ +import { defaultMumbaiProviderConfiguration } from 'src/features/on-chain/calculation-manager/providers/dexes/mumbai/default-constants'; + +export const QUICK_SWAP_MUMBAI_CONTRACT_ADDRESS = '0xa5E0829CaCEd8fFDD4De3c43696c57F7D7A678ff'; + +export const QUICK_SWAP_MUMBAI_PROVIDER_CONFIGURATION = defaultMumbaiProviderConfiguration; diff --git a/src/features/on-chain/calculation-manager/providers/dexes/mumbai/quick-swap-mumbai/quick-swap-mumbai-provider.ts b/src/features/on-chain/calculation-manager/providers/dexes/mumbai/quick-swap-mumbai/quick-swap-mumbai-provider.ts new file mode 100644 index 0000000000..758bf6a86e --- /dev/null +++ b/src/features/on-chain/calculation-manager/providers/dexes/mumbai/quick-swap-mumbai/quick-swap-mumbai-provider.ts @@ -0,0 +1,12 @@ +import { BLOCKCHAIN_NAME } from 'src/core/blockchain/models/blockchain-name'; +import { UniswapV2AbstractProvider } from 'src/features/on-chain/calculation-manager/providers/dexes/common/uniswap-v2-abstract/uniswap-v2-abstract-provider'; +import { QUICK_SWAP_MUMBAI_PROVIDER_CONFIGURATION } from 'src/features/on-chain/calculation-manager/providers/dexes/mumbai/quick-swap-mumbai/constants'; +import { QuickSwapMumbaiTrade } from 'src/features/on-chain/calculation-manager/providers/dexes/mumbai/quick-swap-mumbai/quick-swap-mumbai-trade'; + +export class QuickSwapMumbaiProvider extends UniswapV2AbstractProvider { + public readonly blockchain = BLOCKCHAIN_NAME.MUMBAI; + + public readonly UniswapV2TradeClass = QuickSwapMumbaiTrade; + + public readonly providerSettings = QUICK_SWAP_MUMBAI_PROVIDER_CONFIGURATION; +} diff --git a/src/features/on-chain/calculation-manager/providers/dexes/mumbai/quick-swap-mumbai/quick-swap-mumbai-trade.ts b/src/features/on-chain/calculation-manager/providers/dexes/mumbai/quick-swap-mumbai/quick-swap-mumbai-trade.ts new file mode 100644 index 0000000000..32a20ae127 --- /dev/null +++ b/src/features/on-chain/calculation-manager/providers/dexes/mumbai/quick-swap-mumbai/quick-swap-mumbai-trade.ts @@ -0,0 +1,14 @@ +import { + ON_CHAIN_TRADE_TYPE, + OnChainTradeType +} from 'src/features/on-chain/calculation-manager/providers/common/models/on-chain-trade-type'; +import { UniswapV2AbstractTrade } from 'src/features/on-chain/calculation-manager/providers/dexes/common/uniswap-v2-abstract/uniswap-v2-abstract-trade'; +import { QUICK_SWAP_MUMBAI_CONTRACT_ADDRESS } from 'src/features/on-chain/calculation-manager/providers/dexes/mumbai/quick-swap-mumbai/constants'; + +export class QuickSwapMumbaiTrade extends UniswapV2AbstractTrade { + public static get type(): OnChainTradeType { + return ON_CHAIN_TRADE_TYPE.QUICK_SWAP; + } + + public readonly dexContractAddress = QUICK_SWAP_MUMBAI_CONTRACT_ADDRESS; +} From 746ef3f0215d70d0d7f37ac931d50bed86b1e752 Mon Sep 17 00:00:00 2001 From: axtezy Date: Wed, 3 May 2023 13:31:25 +0200 Subject: [PATCH 02/15] Add Goerli wrap token --- package.json | 2 +- src/common/tokens/constants/wrapped-native-tokens.ts | 7 +++++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index e7ce0967f6..03c2895f49 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "rubic-sdk", - "version": "4.0.15", + "version": "4.0.15qw", "description": "Simplify dApp creation", "main": "lib/index.js", "types": "lib/index.d.ts", diff --git a/src/common/tokens/constants/wrapped-native-tokens.ts b/src/common/tokens/constants/wrapped-native-tokens.ts index d72504d438..003376b341 100644 --- a/src/common/tokens/constants/wrapped-native-tokens.ts +++ b/src/common/tokens/constants/wrapped-native-tokens.ts @@ -239,5 +239,12 @@ export const wrappedNativeTokensList: Partial> name: 'Wrapped Avax', symbol: 'WAVAX', decimals: 18 + }), + [BLOCKCHAIN_NAME.GOERLI]: new Token({ + blockchain: BLOCKCHAIN_NAME.GOERLI, + address: '0xb4fbf271143f4fbf7b91a5ded31805e42b2208d6', + name: 'Wrapped Ether', + symbol: 'WETH', + decimals: 18 }) }; From 9214e7164050c52c4502834d545f8c0f1ebcb35e Mon Sep 17 00:00:00 2001 From: axtezy Date: Tue, 18 Jul 2023 09:52:46 +0200 Subject: [PATCH 03/15] Add scroll and uni v 3 --- package.json | 2 +- src/common/tokens/constants/native-tokens.ts | 7 ++ .../tokens/constants/wrapped-native-tokens.ts | 51 +++++++++++++- src/core/blockchain/models/blockchain-name.ts | 3 +- .../constants/blockchain-id.ts | 1 + .../constants/multicall-addresses.ts | 4 +- .../constants/cbridge-contract-address.ts | 5 ++ .../cbridge-supported-blockchains.ts | 3 +- .../uniswap-v3-trade-providers.ts | 4 +- .../algebra/algebra-quoter-controller.ts | 19 ++++-- .../uniswap-v3-algebra-abstract-provider.ts | 4 +- .../quick-swap-v3/quick-swap-v3-provider.ts | 7 +- .../constants/provider-configuration.ts | 9 +++ .../constants/router-configuration.ts | 28 ++++++++ .../uni-swap-v3-scroll-testnet-provider.ts | 60 +++++++++++++++++ .../uni-swap-v3-scroll-testnet-trade.ts | 66 +++++++++++++++++++ 16 files changed, 259 insertions(+), 14 deletions(-) create mode 100644 src/features/on-chain/calculation-manager/providers/dexes/scroll-testnet/uni-swap-v3-scroll-testnet/constants/provider-configuration.ts create mode 100644 src/features/on-chain/calculation-manager/providers/dexes/scroll-testnet/uni-swap-v3-scroll-testnet/constants/router-configuration.ts create mode 100644 src/features/on-chain/calculation-manager/providers/dexes/scroll-testnet/uni-swap-v3-scroll-testnet/uni-swap-v3-scroll-testnet-provider.ts create mode 100644 src/features/on-chain/calculation-manager/providers/dexes/scroll-testnet/uni-swap-v3-scroll-testnet/uni-swap-v3-scroll-testnet-trade.ts diff --git a/package.json b/package.json index 7eeaac394a..a91d3a205b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "rubic-sdk", - "version": "4.7.2", + "version": "4.8.0-alpha-testnets.0qwertyuio", "description": "Simplify dApp creation", "main": "lib/index.js", "types": "lib/index.d.ts", diff --git a/src/common/tokens/constants/native-tokens.ts b/src/common/tokens/constants/native-tokens.ts index bff51d45f0..20fb0cece4 100644 --- a/src/common/tokens/constants/native-tokens.ts +++ b/src/common/tokens/constants/native-tokens.ts @@ -38,6 +38,13 @@ const testnetNativeTokens: Record = { name: 'Test Binance Coin', symbol: 'tBNB', decimals: 18 + }), + [BLOCKCHAIN_NAME.SCROLL_TESTNET]: new Token({ + blockchain: BLOCKCHAIN_NAME.SCROLL_TESTNET, + address: EvmWeb3Pure.nativeTokenAddress, + name: 'ETH', + symbol: 'ETH', + decimals: 18 }) }; diff --git a/src/common/tokens/constants/wrapped-native-tokens.ts b/src/common/tokens/constants/wrapped-native-tokens.ts index a3eb22fd65..e0c5569249 100644 --- a/src/common/tokens/constants/wrapped-native-tokens.ts +++ b/src/common/tokens/constants/wrapped-native-tokens.ts @@ -1,7 +1,7 @@ import { Token } from 'src/common/tokens/token'; import { BLOCKCHAIN_NAME, EvmBlockchainName } from 'src/core/blockchain/models/blockchain-name'; -export const wrappedNativeTokensList: Partial> = { +export const wrappedNativeTokensList: Record = { [BLOCKCHAIN_NAME.ETHEREUM]: new Token({ blockchain: BLOCKCHAIN_NAME.ETHEREUM, address: '0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2', @@ -253,5 +253,54 @@ export const wrappedNativeTokensList: Partial> name: 'Wrapped Ether', symbol: 'WETH', decimals: 18 + }), + [BLOCKCHAIN_NAME.GOERLI]: new Token({ + blockchain: BLOCKCHAIN_NAME.GOERLI, + address: '0xb4fbf271143f4fbf7b91a5ded31805e42b2208d6', + name: 'Wrapped Ether', + symbol: 'WETH', + decimals: 18 + }), + [BLOCKCHAIN_NAME.SCROLL_TESTNET]: new Token({ + blockchain: BLOCKCHAIN_NAME.SCROLL_TESTNET, + address: '0xa1ea0b2354f5a344110af2b6ad68e75545009a03', + name: 'Wrapped Ether', + symbol: 'WETH', + decimals: 18 + }), + [BLOCKCHAIN_NAME.ETHEREUM_CLASSIC]: new Token({ + blockchain: BLOCKCHAIN_NAME.ETHEREUM_CLASSIC, + address: '0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2', + name: 'Wrapped Ether', + symbol: 'WETH', + decimals: 18 + }), + [BLOCKCHAIN_NAME.FLARE]: new Token({ + blockchain: BLOCKCHAIN_NAME.FLARE, + address: '0x1D80c49BbBCd1C0911346656B529DF9E5c2F783d', + name: 'Wrapper Flare', + symbol: 'WFLR', + decimals: 18 + }), + [BLOCKCHAIN_NAME.IOTEX]: new Token({ + blockchain: BLOCKCHAIN_NAME.IOTEX, + address: '0xa00744882684c3e4747faefd68d283ea44099d03', + name: 'Wrapped IoTeX', + symbol: 'WIOTX', + decimals: 18 + }), + [BLOCKCHAIN_NAME.THETA]: new Token({ + blockchain: BLOCKCHAIN_NAME.THETA, + address: '0xaf537fb7e4c77c97403de94ce141b7edb9f7fcf0', + name: 'Wrapped Theta', + symbol: 'wTHETA', + decimals: 18 + }), + [BLOCKCHAIN_NAME.BITCOIN_CASH]: new Token({ + blockchain: BLOCKCHAIN_NAME.BITCOIN_CASH, + address: '0x3743eC0673453E5009310C727Ba4eaF7b3a1cc04', + name: 'Wrapped BCH', + symbol: 'WBCH', + decimals: 18 }) }; diff --git a/src/core/blockchain/models/blockchain-name.ts b/src/core/blockchain/models/blockchain-name.ts index cf792715bd..077e535e6e 100644 --- a/src/core/blockchain/models/blockchain-name.ts +++ b/src/core/blockchain/models/blockchain-name.ts @@ -2,7 +2,8 @@ export const TEST_EVM_BLOCKCHAIN_NAME = { MUMBAI: 'MUMBAI', BINANCE_SMART_CHAIN_TESTNET: 'BSCT', GOERLI: 'GOERLI', - FUJI: 'FUJI' + FUJI: 'FUJI', + SCROLL_TESTNET: 'SCROLL_TESTNET' } as const; export const EVM_BLOCKCHAIN_NAME = { diff --git a/src/core/blockchain/utils/blockchains-info/constants/blockchain-id.ts b/src/core/blockchain/utils/blockchains-info/constants/blockchain-id.ts index a63ac96c64..fa6660f6b7 100644 --- a/src/core/blockchain/utils/blockchains-info/constants/blockchain-id.ts +++ b/src/core/blockchain/utils/blockchains-info/constants/blockchain-id.ts @@ -54,6 +54,7 @@ export const blockchainId: Record = { [BLOCKCHAIN_NAME.BINANCE_SMART_CHAIN_TESTNET]: 87, [BLOCKCHAIN_NAME.MUMBAI]: 80001, [BLOCKCHAIN_NAME.FUJI]: 43113, + [BLOCKCHAIN_NAME.SCROLL_TESTNET]: 534353, // Non EVN blockchains [BLOCKCHAIN_NAME.BITCOIN]: 5555, [BLOCKCHAIN_NAME.FILECOIN]: 314 diff --git a/src/core/blockchain/web3-public-service/web3-public/constants/multicall-addresses.ts b/src/core/blockchain/web3-public-service/web3-public/constants/multicall-addresses.ts index 3aa19e3736..bb028f7ae4 100644 --- a/src/core/blockchain/web3-public-service/web3-public/constants/multicall-addresses.ts +++ b/src/core/blockchain/web3-public-service/web3-public/constants/multicall-addresses.ts @@ -41,5 +41,7 @@ export const MULTICALL_ADDRESSES: Record [BLOCKCHAIN_NAME.VELAS]: '0x0747CFe82D3Bee998f634569FE2B0005dF9d8EDE', [BLOCKCHAIN_NAME.SYSCOIN]: '0x0c50a45401fA051F5F38e98d0E323f08eFa3bb0b', [BLOCKCHAIN_NAME.ZK_SYNC]: '0xDBA7ab3Ed22044417380E9358aAabCF85683f3c8', - [BLOCKCHAIN_NAME.PULSECHAIN]: '0x5ba1e12693dc8f9c48aad8770482f4739beed696' + [BLOCKCHAIN_NAME.PULSECHAIN]: '0x5ba1e12693dc8f9c48aad8770482f4739beed696', + [BLOCKCHAIN_NAME.SCROLL_TESTNET]: '0xcA11bde05977b3631167028862bE2a173976CA11', + [BLOCKCHAIN_NAME.GOERLI]: '0x5ba1e12693dc8f9c48aad8770482f4739beed696' }; diff --git a/src/features/cross-chain/calculation-manager/providers/cbridge/constants/cbridge-contract-address.ts b/src/features/cross-chain/calculation-manager/providers/cbridge/constants/cbridge-contract-address.ts index 116861094f..8a529812e6 100644 --- a/src/features/cross-chain/calculation-manager/providers/cbridge/constants/cbridge-contract-address.ts +++ b/src/features/cross-chain/calculation-manager/providers/cbridge/constants/cbridge-contract-address.ts @@ -70,5 +70,10 @@ export const cbridgeContractAddress: Record< providerGateway: '0x358234B325EF9eA8115291A8b81b7d33A2Fa762D', providerRouter: '0x358234B325EF9eA8115291A8b81b7d33A2Fa762D', rubicRouter: '0x841ce48F9446C8E281D3F1444cB859b4A6D0738C' + }, + [BLOCKCHAIN_NAME.SCROLL_TESTNET]: { + providerGateway: '0x9B36f165baB9ebe611d491180418d8De4b8f3a1f', + providerRouter: '0x9B36f165baB9ebe611d491180418d8De4b8f3a1f', + rubicRouter: '0x841ce48F9446C8E281D3F1444cB859b4A6D0738C' } }; diff --git a/src/features/cross-chain/calculation-manager/providers/cbridge/constants/cbridge-supported-blockchains.ts b/src/features/cross-chain/calculation-manager/providers/cbridge/constants/cbridge-supported-blockchains.ts index c575d26a3d..c716100ac6 100644 --- a/src/features/cross-chain/calculation-manager/providers/cbridge/constants/cbridge-supported-blockchains.ts +++ b/src/features/cross-chain/calculation-manager/providers/cbridge/constants/cbridge-supported-blockchains.ts @@ -13,7 +13,8 @@ export const cbridgeSupportedBlockchains = [ BLOCKCHAIN_NAME.GOERLI, BLOCKCHAIN_NAME.BINANCE_SMART_CHAIN_TESTNET, BLOCKCHAIN_NAME.MUMBAI, - BLOCKCHAIN_NAME.FUJI + BLOCKCHAIN_NAME.FUJI, + BLOCKCHAIN_NAME.SCROLL_TESTNET ] as const; export type CbridgeCrossChainSupportedBlockchain = (typeof cbridgeSupportedBlockchains)[number]; diff --git a/src/features/on-chain/calculation-manager/constants/trade-providers/uniswap-v3-trade-providers.ts b/src/features/on-chain/calculation-manager/constants/trade-providers/uniswap-v3-trade-providers.ts index 9b2a2829c7..6eb16801f4 100644 --- a/src/features/on-chain/calculation-manager/constants/trade-providers/uniswap-v3-trade-providers.ts +++ b/src/features/on-chain/calculation-manager/constants/trade-providers/uniswap-v3-trade-providers.ts @@ -3,11 +3,13 @@ import { UniSwapV3EthereumProvider } from 'src/features/on-chain/calculation-man import { UniSwapV3EthereumPowProvider } from 'src/features/on-chain/calculation-manager/providers/dexes/ethereum-pow/uni-swap-v3-ethereum-pow/uni-swap-v3-ethereum-pow-provider'; import { UniSwapV3PolygonProvider } from 'src/features/on-chain/calculation-manager/providers/dexes/polygon/uni-swap-v3-polygon/uni-swap-v3-polygon-provider'; import { UniSwapV3PulsechainProvider } from 'src/features/on-chain/calculation-manager/providers/dexes/pulsechain/uni-swap-v3-pulsechain/uni-swap-v3-ethereum-provider'; +import { UniSwapV3ScrollTestnetProvider } from 'src/features/on-chain/calculation-manager/providers/dexes/scroll-testnet/uni-swap-v3-scroll-testnet/uni-swap-v3-scroll-testnet-provider'; export const UniswapV3TradeProviders = [ UniSwapV3EthereumProvider, UniSwapV3PolygonProvider, UniSwapV3ArbitrumProvider, UniSwapV3EthereumPowProvider, - UniSwapV3PulsechainProvider + UniSwapV3PulsechainProvider, + UniSwapV3ScrollTestnetProvider ] as const; diff --git a/src/features/on-chain/calculation-manager/providers/dexes/common/algebra/algebra-quoter-controller.ts b/src/features/on-chain/calculation-manager/providers/dexes/common/algebra/algebra-quoter-controller.ts index caea357a9b..94cfa1931b 100644 --- a/src/features/on-chain/calculation-manager/providers/dexes/common/algebra/algebra-quoter-controller.ts +++ b/src/features/on-chain/calculation-manager/providers/dexes/common/algebra/algebra-quoter-controller.ts @@ -2,7 +2,7 @@ import BigNumber from 'bignumber.js'; import { RubicSdkError } from 'src/common/errors'; import { PriceToken, Token } from 'src/common/tokens'; import { notNull } from 'src/common/utils/object'; -import { BLOCKCHAIN_NAME } from 'src/core/blockchain/models/blockchain-name'; +import { BLOCKCHAIN_NAME, EvmBlockchainName } from 'src/core/blockchain/models/blockchain-name'; import { EvmWeb3Public } from 'src/core/blockchain/web3-public-service/web3-public/evm-web3-public/evm-web3-public'; import { ContractMulticallResponse } from 'src/core/blockchain/web3-public-service/web3-public/models/contract-multicall-response'; import { MethodData } from 'src/core/blockchain/web3-public-service/web3-public/models/method-data'; @@ -35,12 +35,20 @@ export class AlgebraQuoterController implements UniswapV3AlgebraQuoterController private readonly quoterContractAddress: string; + private readonly blockchain: EvmBlockchainName; + + private readonly routerTokensAddresses: string[]; + constructor( quoterContractABI: AbiItem[] = ALGEBRA_QUOTER_CONTRACT_ABI, - quoterContractAddress: string = ALGEBRA_QUOTER_CONTRACT_ADDRESS + quoterContractAddress: string = ALGEBRA_QUOTER_CONTRACT_ADDRESS, + blockchain: EvmBlockchainName = BLOCKCHAIN_NAME.POLYGON, + routerTokensAddresses: string[] = ROUTER_TOKENS ) { this.quoterContractABI = quoterContractABI; this.quoterContractAddress = quoterContractAddress; + this.blockchain = blockchain; + this.routerTokensAddresses = routerTokensAddresses; } /** @@ -96,12 +104,15 @@ export class AlgebraQuoterController implements UniswapV3AlgebraQuoterController } private get web3Public(): EvmWeb3Public { - return Injector.web3PublicService.getWeb3Public(BLOCKCHAIN_NAME.POLYGON); + return Injector.web3PublicService.getWeb3Public(this.blockchain); } private async getOrCreateRouterTokens(): Promise { if (!this.routerTokens) { - this.routerTokens = await Token.createTokens(ROUTER_TOKENS, BLOCKCHAIN_NAME.POLYGON); + this.routerTokens = await Token.createTokens( + this.routerTokensAddresses, + this.blockchain + ); } return this.routerTokens; diff --git a/src/features/on-chain/calculation-manager/providers/dexes/common/uniswap-v3-algebra-abstract/uniswap-v3-algebra-abstract-provider.ts b/src/features/on-chain/calculation-manager/providers/dexes/common/uniswap-v3-algebra-abstract/uniswap-v3-algebra-abstract-provider.ts index afe69d9229..70fa420cd4 100644 --- a/src/features/on-chain/calculation-manager/providers/dexes/common/uniswap-v3-algebra-abstract/uniswap-v3-algebra-abstract-provider.ts +++ b/src/features/on-chain/calculation-manager/providers/dexes/common/uniswap-v3-algebra-abstract/uniswap-v3-algebra-abstract-provider.ts @@ -26,6 +26,7 @@ import { UniswapV3AlgebraAbstractTrade } from 'src/features/on-chain/calculation import { getFromToTokensAmountsByExact } from 'src/features/on-chain/calculation-manager/providers/dexes/common/utils/get-from-to-tokens-amounts-by-exact'; import { AlgebraTrade } from 'src/features/on-chain/calculation-manager/providers/dexes/polygon/algebra/algebra-trade'; import { QuickSwapV3Trade } from 'src/features/on-chain/calculation-manager/providers/dexes/polygon/quick-swap-v3/quick-swap-v3-trade'; +import { UniSwapV3ScrollTestnetTrade } from 'src/features/on-chain/calculation-manager/providers/dexes/scroll-testnet/uni-swap-v3-scroll-testnet/uni-swap-v3-scroll-testnet-trade'; import { AbiItem } from 'web3-utils'; export abstract class UniswapV3AlgebraAbstractProvider< @@ -38,7 +39,8 @@ export abstract class UniswapV3AlgebraAbstractProvider< protected abstract readonly OnChainTradeClass: | UniswapV3TradeClass | typeof AlgebraTrade - | typeof QuickSwapV3Trade; + | typeof QuickSwapV3Trade + | typeof UniSwapV3ScrollTestnetTrade; protected abstract readonly quoterController: UniswapV3AlgebraQuoterController; diff --git a/src/features/on-chain/calculation-manager/providers/dexes/polygon/quick-swap-v3/quick-swap-v3-provider.ts b/src/features/on-chain/calculation-manager/providers/dexes/polygon/quick-swap-v3/quick-swap-v3-provider.ts index be8a4eb009..c6e73df9a4 100644 --- a/src/features/on-chain/calculation-manager/providers/dexes/polygon/quick-swap-v3/quick-swap-v3-provider.ts +++ b/src/features/on-chain/calculation-manager/providers/dexes/polygon/quick-swap-v3/quick-swap-v3-provider.ts @@ -29,13 +29,14 @@ export class QuickSwapV3Provider extends UniswapV3AlgebraAbstractProvider = { + WETH: wrappedNativeTokensList[BLOCKCHAIN_NAME.SCROLL_TESTNET]!.address, + USDC: '0x67aE69Fd63b4fc8809ADc224A9b82Be976039509', + DAI: '0x4702E5AEb70BdC05B11F8d8E701ad000dc85bD44', + UNI: '0x0CDEA04b370C1FA4bC2032b4ef23dB3EBCbA258a' +}; + +const routerLiquidityPools: UniswapV3RouterLiquidityPool[] = []; + +export const UNI_SWAP_V3_SCROLL_TESTNET_ROUTER_CONFIGURATION: UniswapV3RouterConfiguration = + { + tokens: routerTokens, + liquidityPools: routerLiquidityPools + }; diff --git a/src/features/on-chain/calculation-manager/providers/dexes/scroll-testnet/uni-swap-v3-scroll-testnet/uni-swap-v3-scroll-testnet-provider.ts b/src/features/on-chain/calculation-manager/providers/dexes/scroll-testnet/uni-swap-v3-scroll-testnet/uni-swap-v3-scroll-testnet-provider.ts new file mode 100644 index 0000000000..f21cc36b5b --- /dev/null +++ b/src/features/on-chain/calculation-manager/providers/dexes/scroll-testnet/uni-swap-v3-scroll-testnet/uni-swap-v3-scroll-testnet-provider.ts @@ -0,0 +1,60 @@ +import { BLOCKCHAIN_NAME } from 'src/core/blockchain/models/blockchain-name'; +import { EvmWeb3Pure } from 'src/core/blockchain/web3-pure/typed-web3-pure/evm-web3-pure/evm-web3-pure'; +import { createTokenNativeAddressProxyInPathStartAndEnd } from 'src/features/common/utils/token-native-address-proxy'; +import { + ON_CHAIN_TRADE_TYPE, + OnChainTradeType +} from 'src/features/on-chain/calculation-manager/providers/common/models/on-chain-trade-type'; +import { AlgebraQuoterController } from 'src/features/on-chain/calculation-manager/providers/dexes/common/algebra/algebra-quoter-controller'; +import { UniswapV3AlgebraTradeStructOmitPath } from 'src/features/on-chain/calculation-manager/providers/dexes/common/uniswap-v3-algebra-abstract/models/uniswap-v3-algebra-trade-struct'; +import { UniswapV3AlgebraAbstractProvider } from 'src/features/on-chain/calculation-manager/providers/dexes/common/uniswap-v3-algebra-abstract/uniswap-v3-algebra-abstract-provider'; +import { ALGEBRA_SWAP_ROUTER_CONTRACT_ABI } from 'src/features/on-chain/calculation-manager/providers/dexes/polygon/algebra/constants/swap-router-contract-data'; +import { AlgebraRoute } from 'src/features/on-chain/calculation-manager/providers/dexes/polygon/algebra/models/algebra-route'; +import { QUICK_SWAP_V3_QUOTER_CONTRACT_ABI } from 'src/features/on-chain/calculation-manager/providers/dexes/polygon/quick-swap-v3/utils/quoter-controller/constants/quoter-contract-data'; +import { UNI_SWAP_V3_SCROLL_TESTNET_PROVIDER_CONFIGURATION } from 'src/features/on-chain/calculation-manager/providers/dexes/scroll-testnet/uni-swap-v3-scroll-testnet/constants/provider-configuration'; +import { UNI_SWAP_V3_SCROLL_TESTNET_ROUTER_CONFIGURATION } from 'src/features/on-chain/calculation-manager/providers/dexes/scroll-testnet/uni-swap-v3-scroll-testnet/constants/router-configuration'; +import { UniSwapV3ScrollTestnetTrade } from 'src/features/on-chain/calculation-manager/providers/dexes/scroll-testnet/uni-swap-v3-scroll-testnet/uni-swap-v3-scroll-testnet-trade'; + +export class UniSwapV3ScrollTestnetProvider extends UniswapV3AlgebraAbstractProvider { + public readonly contractAddress = '0xD9880690bd717189cC3Fbe7B9020F27fae7Ac76F'; + + protected readonly contractAbi = ALGEBRA_SWAP_ROUTER_CONTRACT_ABI; + + public readonly blockchain = BLOCKCHAIN_NAME.SCROLL_TESTNET; + + public readonly OnChainTradeClass = UniSwapV3ScrollTestnetTrade; + + public readonly providerConfiguration = UNI_SWAP_V3_SCROLL_TESTNET_PROVIDER_CONFIGURATION; + + public readonly routerConfiguration = UNI_SWAP_V3_SCROLL_TESTNET_ROUTER_CONFIGURATION; + + protected readonly quoterController = new AlgebraQuoterController( + QUICK_SWAP_V3_QUOTER_CONTRACT_ABI, + '0xbf1c1FE1e9e900aFd5ba2Eb67480c44266D5eD84', + BLOCKCHAIN_NAME.SCROLL_TESTNET, + Object.values(this.routerConfiguration.tokens) + ); + + public get type(): OnChainTradeType { + return ON_CHAIN_TRADE_TYPE.UNI_SWAP_V3; + } + + protected createTradeInstance( + tradeStruct: UniswapV3AlgebraTradeStructOmitPath, + route: AlgebraRoute, + providerAddress: string + ): UniSwapV3ScrollTestnetTrade { + const path = createTokenNativeAddressProxyInPathStartAndEnd( + route.path, + EvmWeb3Pure.nativeTokenAddress + ); + return new UniSwapV3ScrollTestnetTrade( + { + ...tradeStruct, + path, + route + }, + providerAddress + ); + } +} diff --git a/src/features/on-chain/calculation-manager/providers/dexes/scroll-testnet/uni-swap-v3-scroll-testnet/uni-swap-v3-scroll-testnet-trade.ts b/src/features/on-chain/calculation-manager/providers/dexes/scroll-testnet/uni-swap-v3-scroll-testnet/uni-swap-v3-scroll-testnet-trade.ts new file mode 100644 index 0000000000..ffb2ba2918 --- /dev/null +++ b/src/features/on-chain/calculation-manager/providers/dexes/scroll-testnet/uni-swap-v3-scroll-testnet/uni-swap-v3-scroll-testnet-trade.ts @@ -0,0 +1,66 @@ +import { Token } from 'src/common/tokens'; +import { MethodData } from 'src/core/blockchain/web3-public-service/web3-public/models/method-data'; +import { AlgebraQuoterController } from 'src/features/on-chain/calculation-manager/providers/dexes/common/algebra/algebra-quoter-controller'; +import { UniswapV3AlgebraAbstractTrade } from 'src/features/on-chain/calculation-manager/providers/dexes/common/uniswap-v3-algebra-abstract/uniswap-v3-algebra-abstract-trade'; +import { ALGEBRA_SWAP_ROUTER_CONTRACT_ABI } from 'src/features/on-chain/calculation-manager/providers/dexes/polygon/algebra/constants/swap-router-contract-data'; +import { AlgebraRoute } from 'src/features/on-chain/calculation-manager/providers/dexes/polygon/algebra/models/algebra-route'; +import { AlgebraTradeStruct } from 'src/features/on-chain/calculation-manager/providers/dexes/polygon/algebra/models/algebra-trade-struct'; + +export class UniSwapV3ScrollTestnetTrade extends UniswapV3AlgebraAbstractTrade { + public readonly dexContractAddress = '0xD9880690bd717189cC3Fbe7B9020F27fae7Ac76F'; + + protected readonly contractAbi = ALGEBRA_SWAP_ROUTER_CONTRACT_ABI; + + protected readonly unwrapWethMethodName = 'unwrapWNativeToken'; + + private readonly route: AlgebraRoute; + + public readonly wrappedPath: ReadonlyArray; + + constructor(tradeStruct: AlgebraTradeStruct, providerAddress: string) { + super(tradeStruct, providerAddress); + + this.route = tradeStruct.route; + + this.wrappedPath = this.route.path; + } + + /** + * Returns swap `exactInput` method's name and arguments to use in Swap contract. + */ + protected getSwapRouterExactInputMethodData(walletAddress: string): MethodData { + const amountParams = this.getAmountParams(); + + if (this.route.path.length === 2 && this.route?.path?.[0] && this.route?.path?.[1]) { + const methodName = this.exact === 'input' ? 'exactInputSingle' : 'exactOutputSingle'; + + return { + methodName, + methodArguments: [ + [ + this.route.path[0].address, + this.route.path[1].address, + walletAddress, + this.deadlineMinutesTimestamp, + ...amountParams, + 0 + ] + ] + }; + } + + const methodName = this.exact === 'input' ? 'exactInput' : 'exactOutput'; + + return { + methodName, + methodArguments: [ + [ + AlgebraQuoterController.getEncodedPath(this.route.path), + walletAddress, + this.deadlineMinutesTimestamp, + ...amountParams + ] + ] + }; + } +} From 141d1531c09181701c52b4d64152242c52cdd81f Mon Sep 17 00:00:00 2001 From: axtezy Date: Tue, 18 Jul 2023 17:31:33 +0200 Subject: [PATCH 04/15] Fix uni v2 v3 for scrolls --- package.json | 2 +- .../cbridge-cross-chain-api-service.ts | 2 +- .../debridge-cross-chain-trade.ts | 2 +- .../constants/symbiosis-v2-config.ts | 241 +++++++++++++++++- .../symbiosis-cross-chain-provider.ts | 70 +++-- .../cross-chain-symbiosis-manager.ts | 5 +- .../uniswap-v2-trade-providers.ts | 5 +- .../uniswap-v3-quoter-controller.ts | 8 +- .../uni-swap-v2-scroll-testnet/constants.ts | 20 ++ .../uni-swap-v2-scroll-testnet-provider.ts | 12 + .../uni-swap-v2-scroll-testnet-trade.ts | 14 + .../constants/router-configuration.ts | 40 ++- .../uni-swap-v3-scroll-testnet-provider.ts | 54 +++- .../uni-swap-v3-scroll-testnet-trade.ts | 54 ++-- 14 files changed, 460 insertions(+), 69 deletions(-) create mode 100644 src/features/on-chain/calculation-manager/providers/dexes/scroll-testnet/uni-swap-v2-scroll-testnet/constants.ts create mode 100644 src/features/on-chain/calculation-manager/providers/dexes/scroll-testnet/uni-swap-v2-scroll-testnet/uni-swap-v2-scroll-testnet-provider.ts create mode 100644 src/features/on-chain/calculation-manager/providers/dexes/scroll-testnet/uni-swap-v2-scroll-testnet/uni-swap-v2-scroll-testnet-trade.ts diff --git a/package.json b/package.json index a91d3a205b..98a05cbb69 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "rubic-sdk", - "version": "4.8.0-alpha-testnets.0qwertyuio", + "version": "4.8.0-alpha-testnets.1", "description": "Simplify dApp creation", "main": "lib/index.js", "types": "lib/index.d.ts", diff --git a/src/features/cross-chain/calculation-manager/providers/cbridge/cbridge-cross-chain-api-service.ts b/src/features/cross-chain/calculation-manager/providers/cbridge/cbridge-cross-chain-api-service.ts index cedf021ca7..c88d5efce1 100644 --- a/src/features/cross-chain/calculation-manager/providers/cbridge/cbridge-cross-chain-api-service.ts +++ b/src/features/cross-chain/calculation-manager/providers/cbridge/cbridge-cross-chain-api-service.ts @@ -18,7 +18,7 @@ export class CbridgeCrossChainApiService { ? CbridgeCrossChainApiService.testnetApiEndpoint : CbridgeCrossChainApiService.apiEndpoint; return Injector.httpClient.get( - `${apiUrl}}getTransferConfigs` + `${apiUrl}getTransferConfigs` ); } diff --git a/src/features/cross-chain/calculation-manager/providers/debridge-provider/debridge-cross-chain-trade.ts b/src/features/cross-chain/calculation-manager/providers/debridge-provider/debridge-cross-chain-trade.ts index 7a5222fe7a..59bca4b5ee 100644 --- a/src/features/cross-chain/calculation-manager/providers/debridge-provider/debridge-cross-chain-trade.ts +++ b/src/features/cross-chain/calculation-manager/providers/debridge-provider/debridge-cross-chain-trade.ts @@ -336,7 +336,7 @@ export class DebridgeCrossChainTrade extends EvmCrossChainTrade { protected getProviderData(sourceData: BytesLike): unknown[] { const targetCallData = this.decodeCallData(sourceData); const fromChainId = blockchainId[this.from.blockchain]; - const portalAddress = getSymbiosisV2Config().chains.find( + const portalAddress = getSymbiosisV2Config(this.from.blockchain).chains.find( chain => chain.id === fromChainId )!.portal; diff --git a/src/features/cross-chain/calculation-manager/providers/symbiosis-provider/constants/symbiosis-v2-config.ts b/src/features/cross-chain/calculation-manager/providers/symbiosis-provider/constants/symbiosis-v2-config.ts index 89df9b8d4f..4cb3aea41d 100644 --- a/src/features/cross-chain/calculation-manager/providers/symbiosis-provider/constants/symbiosis-v2-config.ts +++ b/src/features/cross-chain/calculation-manager/providers/symbiosis-provider/constants/symbiosis-v2-config.ts @@ -1,6 +1,245 @@ +import { + BlockchainName, + TEST_EVM_BLOCKCHAIN_NAME +} from 'src/core/blockchain/models/blockchain-name'; import { Config } from 'symbiosis-js-sdk'; -export function getSymbiosisV2Config(): Config { +const testnetConfig = { + minSwapAmountInUsd: 10, + maxSwapAmountInUsd: 10000, + advisor: { + url: 'https://api.testnet.symbiosis.finance/calculations' + }, + omniPool: { + chainId: 97, + address: '0x569D2a232F5f2a462673fAf184ED9640e8A9F4D8', + oracle: '0xcE29b84160fe8B6Fc1c6E5aD66F1F43279F2F1C9' + }, + chains: [ + { + id: 5, + rpc: 'https://rpc.ankr.com/eth_goerli', + filterBlockOffset: 3000, + waitForBlocksCount: 5, + stables: [ + { + name: 'USD Coin', + address: '0x07865c6E87B9F70255377e024ace6630C1Eaa37F', + symbol: 'USDC', + isStable: true, + decimals: 6, + chainId: 5, + icons: { + large: 'https://s2.coinmarketcap.com/static/img/coins/64x64/3408.png', + small: 'https://s2.coinmarketcap.com/static/img/coins/64x64/3408.png' + } + } + ], + nerves: [], + router: '0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D', + dexFee: 30, + metaRouter: '0x5302358dCFbF2881e5b5E537316786d8Ea242008', + metaRouterGateway: '0x438D14b1Fd3C20C33Fa7EF6331AA3fC36bc0347E', + bridge: '0x9f81fAcae42a7312f49A3E27098fC4d39e2c550d', + synthesis: '0x0000000000000000000000000000000000000000', + portal: '0x7d8B7b5f663E93D7F8970d0A61081Af03c63bB86', + fabric: '0x0000000000000000000000000000000000000000', + multicallRouter: '0xd655C2c9D558Bf8E3382f98eDADb84e866665139', + aavePool: '0x0000000000000000000000000000000000000000', + creamComptroller: '0x0000000000000000000000000000000000000000', + renGatewayRegistry: '0x0000000000000000000000000000000000000000' + }, + { + id: 97, + rpc: 'https://rpc.ankr.com/bsc_testnet_chapel', + filterBlockOffset: 3000, + waitForBlocksCount: 20, + stables: [ + { + name: 'Binance USD', + address: '0x9a01bf917477dd9f5d715d188618fc8b7350cd22', + symbol: 'BUSD', + isStable: true, + decimals: 18, + chainId: 97, + icons: { + large: 'https://s2.coinmarketcap.com/static/img/coins/64x64/4687.png', + small: 'https://s2.coinmarketcap.com/static/img/coins/64x64/4687.png' + } + }, + { + name: 'Synthetic USDC', + symbol: 'sUSDC', + address: '0x32Ac07C5D3D6002B853836a48EE8538C9CF29ad4', + chainId: 97, + chainFromId: 5, + decimals: 6, + isStable: true, + icons: { + large: 'https://s2.coinmarketcap.com/static/img/coins/64x64/3408.png', + small: 'https://s2.coinmarketcap.com/static/img/coins/64x64/3408.png' + } + }, + { + name: 'Synthetic USDT', + symbol: 'sUSDT', + address: '0x9505A4F9108aE474c8fAeC17a22e68566c6C12C8', + chainId: 97, + chainFromId: 43113, + decimals: 6, + isStable: true, + icons: { + large: 'https://s2.coinmarketcap.com/static/img/coins/64x64/825.png', + small: 'https://s2.coinmarketcap.com/static/img/coins/64x64/825.png' + } + }, + { + name: 'Synthetic USDC', + symbol: 'sUSDC', + address: '0xA4bd5C28114341c53e347b17b67d551AFd455516', + chainId: 97, + chainFromId: 80001, + decimals: 6, + isStable: true, + icons: { + large: 'https://s2.coinmarketcap.com/static/img/coins/64x64/3408.png', + small: 'https://s2.coinmarketcap.com/static/img/coins/64x64/3408.png' + } + }, + { + name: 'Synthetic USDT', + symbol: 'sUSDT', + address: '0x8341Bc741cd653dC0BEb39D2C57562419B0A2C6E', + chainId: 97, + chainFromId: 8081, + decimals: 6, + isStable: true, + icons: { + large: 'https://s2.coinmarketcap.com/static/img/coins/64x64/825.png', + small: 'https://s2.coinmarketcap.com/static/img/coins/64x64/825.png' + } + } + ], + nerves: [], + router: '0xD99D1c33F9fC3444f8101754aBC46c52416550D1', + dexFee: 30, + metaRouter: '0xd3F98c243374D79Bfd9a8ac03964623221D53F0f', + metaRouterGateway: '0x4Ee7B1e8Ad6E1682318f1c47F83634dAa1197eEf', + bridge: '0xB299eee0Ed46b7a34C01F2a01fc83a0B45aA88AF', + synthesis: '0x08f5c28ff0622FeF758c2C3c2a5EAEeb63D60D4c', + portal: '0x0000000000000000000000000000000000000000', + fabric: '0x9B8D0e0765cDa999910ff31A2204080E1192EfC7', + multicallRouter: '0x086D8d30822086941729DF294f0e52E42EdC17F9', + aavePool: '0x0000000000000000000000000000000000000000', + creamComptroller: '0x0000000000000000000000000000000000000000', + renGatewayRegistry: '0x0000000000000000000000000000000000000000' + }, + { + id: 43113, + rpc: 'https://rpc.ankr.com/avalanche_fuji', + filterBlockOffset: 3000, + waitForBlocksCount: 20, + stables: [ + { + name: 'USDT', + symbol: 'USDT', + address: '0x9a01bf917477dd9f5d715d188618fc8b7350cd22', + chainId: 43113, + decimals: 6, + isStable: true, + icons: { + large: 'https://s2.coinmarketcap.com/static/img/coins/64x64/825.png', + small: 'https://s2.coinmarketcap.com/static/img/coins/64x64/825.png' + } + } + ], + nerves: [], + router: '0x4F86a87985a2eD1E843c0b93755Ac06A3DbCc55E', + dexFee: 30, + metaRouter: '0x8eC5387A2CdFA5315c05Fd7296C11406AeC2559e', + metaRouterGateway: '0x80cD2d214ccBdcB214DEA5bC040c8c2002Dc9380', + bridge: '0xcC0DB081360Eb259bdf6911976c51cAF1B72e845', + synthesis: '0x0000000000000000000000000000000000000000', + portal: '0x78Bb4D4872121f162BB3e938F0d10cf34E999648', + fabric: '0x0000000000000000000000000000000000000000', + multicallRouter: '0x8C9D3CE1D59d73259018dBC9859F6eBe62Bbf862', + aavePool: '0x0000000000000000000000000000000000000000', + creamComptroller: '0x0000000000000000000000000000000000000000', + renGatewayRegistry: '0x0000000000000000000000000000000000000000' + }, + { + id: 80001, + rpc: 'https://rpc.ankr.com/polygon_mumbai', + filterBlockOffset: 3000, + waitForBlocksCount: 60, + stables: [ + { + name: 'USDT', + symbol: 'USDT', + address: '0x9a01bf917477dd9f5d715d188618fc8b7350cd22', + chainId: 80001, + decimals: 6, + isStable: true, + icons: { + large: 'https://s2.coinmarketcap.com/static/img/coins/64x64/825.png', + small: 'https://s2.coinmarketcap.com/static/img/coins/64x64/825.png' + } + } + ], + nerves: [], + router: '0xca33f6D096BDD7FcB28d708f631cD76E73Ecfc2d', + dexFee: 30, + metaRouter: '0x2636F6A85aB7bD438631a03e6E7cC6d6ae712642', + metaRouterGateway: '0x85aDa6757f383577A8AB2a3492ac3E721CcFEAbb', + bridge: '0x2578412aECCcc32f270A03cfBa25f6557aF4017b', + synthesis: '0x0000000000000000000000000000000000000000', + portal: '0x9ad7e9A0D18cC56303277dC5bF77D1910570509a', + fabric: '0x0000000000000000000000000000000000000000', + multicallRouter: '0xEc36ED7f5Be3006CF04F85d4851DbDB85b60C19E', + aavePool: '0x0000000000000000000000000000000000000000', + creamComptroller: '0x0000000000000000000000000000000000000000', + renGatewayRegistry: '0x0000000000000000000000000000000000000000' + }, + { + id: 8081, + rpc: 'https://liberty20.shardeum.org', + filterBlockOffset: 3000, + waitForBlocksCount: 1, + stables: [ + { + name: 'USDT', + symbol: 'USDT', + address: '0xAED47A51AeFa6f95A388aDA3c459d94FF46fC4BB', + chainId: 8081, + decimals: 6, + isStable: true, + icons: { + large: 'https://s2.coinmarketcap.com/static/img/coins/64x64/825.png', + small: 'https://s2.coinmarketcap.com/static/img/coins/64x64/825.png' + } + } + ], + nerves: [], + router: '0xdeF8D4dc7fB633a0d944EABf8932BF729D61f011', + dexFee: 30, + metaRouter: '0xE52e3c838CC91C60a701E78B5043ba9eeEeb55db', + metaRouterGateway: '0x13fF611B06bEb2A29a49cc3c825cD0eE74967bE3', + bridge: '0x9D15297f42fEf485f2d061a012cfE699Cc49132B', + synthesis: '0x0000000000000000000000000000000000000000', + portal: '0xBC4454Ee01EC5B6517333bD716f5135042ca1e38', + fabric: '0x0000000000000000000000000000000000000000', + multicallRouter: '0x7dc13B605508F91Fcd3bf7803C2b96B43941B4E8', + aavePool: '0x0000000000000000000000000000000000000000', + creamComptroller: '0x0000000000000000000000000000000000000000', + renGatewayRegistry: '0x0000000000000000000000000000000000000000' + } + ] +}; + +export function getSymbiosisV2Config(blockchain: BlockchainName): Config { + if (blockchain in TEST_EVM_BLOCKCHAIN_NAME) { + return testnetConfig; + } return { minSwapAmountInUsd: 10, maxSwapAmountInUsd: 5000000, diff --git a/src/features/cross-chain/calculation-manager/providers/symbiosis-provider/symbiosis-cross-chain-provider.ts b/src/features/cross-chain/calculation-manager/providers/symbiosis-provider/symbiosis-cross-chain-provider.ts index db718d34d2..b3ef19d3a3 100644 --- a/src/features/cross-chain/calculation-manager/providers/symbiosis-provider/symbiosis-cross-chain-provider.ts +++ b/src/features/cross-chain/calculation-manager/providers/symbiosis-provider/symbiosis-cross-chain-provider.ts @@ -47,8 +47,6 @@ import { Error, ErrorCode, Symbiosis, Token, TokenAmount } from 'symbiosis-js-sd export class SymbiosisCrossChainProvider extends CrossChainProvider { public readonly type = CROSS_CHAIN_TRADE_TYPE.SYMBIOSIS; - private readonly symbiosis = new Symbiosis(getSymbiosisV2Config(), 'rubic'); - private readonly onChainProxyProviders: Partial< Record > = { @@ -89,6 +87,9 @@ export class SymbiosisCrossChainProvider extends CrossChainProvider { const fromBlockchain = from.blockchain as SymbiosisCrossChainSupportedBlockchain; const toBlockchain = toToken.blockchain as SymbiosisCrossChainSupportedBlockchain; const useProxy = options?.useProxy?.[this.type] ?? true; + + const symbiosis = new Symbiosis(getSymbiosisV2Config(from.blockchain), 'rubic'); + if (!this.areSupportedBlockchains(fromBlockchain, toBlockchain)) { return { trade: null, @@ -139,15 +140,20 @@ export class SymbiosisCrossChainProvider extends CrossChainProvider { const deadline = Math.floor(Date.now() / 1000) + 60 * options.deadline; const slippageTolerance = options.slippageTolerance * 10000; - const trade = await this.getTrade(fromBlockchain, toBlockchain, { - tokenAmountIn, - tokenOut, - fromAddress, - receiverAddress, - refundAddress: fromAddress, - slippage: slippageTolerance, - deadline - }); + const trade = await this.getTrade( + fromBlockchain, + toBlockchain, + { + tokenAmountIn, + tokenOut, + fromAddress, + receiverAddress, + refundAddress: fromAddress, + slippage: slippageTolerance, + deadline + }, + symbiosis + ); const { tokenAmountOut, fee: transitTokenFee, @@ -191,15 +197,20 @@ export class SymbiosisCrossChainProvider extends CrossChainProvider { Web3Pure.toWei(amountIn, from.decimals) ); - return this.getTrade(fromBlockchain, toBlockchain, { - tokenAmountIn, - tokenOut, - fromAddress: fromUserAddress, - receiverAddress, - refundAddress, - slippage: slippageTolerance, - deadline - }); + return this.getTrade( + fromBlockchain, + toBlockchain, + { + tokenAmountIn, + tokenOut, + fromAddress: fromUserAddress, + receiverAddress, + refundAddress, + slippage: slippageTolerance, + deadline + }, + symbiosis + ); }; const to = new PriceTokenAmount({ ...toToken.asStruct, @@ -371,7 +382,8 @@ export class SymbiosisCrossChainProvider extends CrossChainProvider { refundAddress: string; slippage: number; deadline: number; - } + }, + symbiosis: Symbiosis ): Promise { if (toBlockchain !== BLOCKCHAIN_NAME.BITCOIN && swapParams.tokenOut) { const swappingParams: SwappingParams = [ @@ -384,7 +396,7 @@ export class SymbiosisCrossChainProvider extends CrossChainProvider { swapParams.deadline, true ]; - return this.getBestSwappingSwapResult(swappingParams); + return this.getBestSwappingSwapResult(swappingParams, symbiosis); } const poolId = @@ -403,7 +415,7 @@ export class SymbiosisCrossChainProvider extends CrossChainProvider { ]; try { - return await this.getBestZappingSwapResult(zappingParams); + return await this.getBestZappingSwapResult(zappingParams, symbiosis); } catch (err) { if ( err.code === ErrorCode.AMOUNT_TOO_LOW || @@ -412,21 +424,23 @@ export class SymbiosisCrossChainProvider extends CrossChainProvider { throw err; } - return this.getBestZappingSwapResult(zappingParams); + return this.getBestZappingSwapResult(zappingParams, symbiosis); } } private async getBestSwappingSwapResult( - swappingParams: SwappingParams + swappingParams: SwappingParams, + symbiosis: Symbiosis ): Promise { - const swapping = this.symbiosis.newSwapping(); + const swapping = symbiosis.newSwapping(); return swapping.exactIn(...swappingParams); } private async getBestZappingSwapResult( - zappingParams: ZappingParams + zappingParams: ZappingParams, + symbiosis: Symbiosis ): Promise { - const zapping = this.symbiosis.newZappingRenBTC(); + const zapping = symbiosis.newZappingRenBTC(); return zapping.exactIn(...zappingParams); } diff --git a/src/features/cross-chain/symbiosis-manager/cross-chain-symbiosis-manager.ts b/src/features/cross-chain/symbiosis-manager/cross-chain-symbiosis-manager.ts index 50ed5218b0..c5c9801c5c 100644 --- a/src/features/cross-chain/symbiosis-manager/cross-chain-symbiosis-manager.ts +++ b/src/features/cross-chain/symbiosis-manager/cross-chain-symbiosis-manager.ts @@ -19,8 +19,6 @@ import { ChainId } from 'symbiosis-js-sdk/dist/constants'; import { TransactionReceipt } from 'web3-eth'; export class CrossChainSymbiosisManager { - private readonly symbiosis = new Symbiosis(getSymbiosisV2Config(), 'rubic'); - private get web3Private(): EvmWeb3Private { return Injector.web3PrivateService.getWeb3Private(CHAIN_TYPE.EVM); } @@ -113,10 +111,11 @@ export class CrossChainSymbiosisManager { ): Promise { const fromChainId = blockchainId[fromBlockchain] as ChainId; const toChainId = blockchainId[toBlockchain] as ChainId; + const symbiosis = new Symbiosis(getSymbiosisV2Config(fromBlockchain), 'rubic'); return await new WaitForComplete({ direction: this.getDirection(fromChainId, toChainId), - symbiosis: this.symbiosis, + symbiosis, revertableAddress: this.walletAddress, chainIdOut: toChainId, chainIdIn: fromChainId diff --git a/src/features/on-chain/calculation-manager/constants/trade-providers/uniswap-v2-trade-providers.ts b/src/features/on-chain/calculation-manager/constants/trade-providers/uniswap-v2-trade-providers.ts index 81fe9c0ddb..8fda3256b8 100644 --- a/src/features/on-chain/calculation-manager/constants/trade-providers/uniswap-v2-trade-providers.ts +++ b/src/features/on-chain/calculation-manager/constants/trade-providers/uniswap-v2-trade-providers.ts @@ -44,6 +44,7 @@ import { PulseXV1Provider } from 'src/features/on-chain/calculation-manager/prov import { PulseXV2Provider } from 'src/features/on-chain/calculation-manager/providers/dexes/pulsechain/pulsex-v2/pulsex-v2-provider'; import { SushiSwapPulsechainProvider } from 'src/features/on-chain/calculation-manager/providers/dexes/pulsechain/sushi-swap-pulsechain/sushi-swap-pulsechain-provider'; import { UniSwapV2PulsechainProvider } from 'src/features/on-chain/calculation-manager/providers/dexes/pulsechain/uni-swap-v2-pulsechain/uni-swap-v2-pulsechain-provider'; +import { UniSwapV2ScrollTestnetProvider } from 'src/features/on-chain/calculation-manager/providers/dexes/scroll-testnet/uni-swap-v2-scroll-testnet/uni-swap-v2-scroll-testnet-provider'; import { PegasysProvider } from 'src/features/on-chain/calculation-manager/providers/dexes/syscoin/pegasys/pegasys-provider'; import { ApeSwapTelosProvider } from 'src/features/on-chain/calculation-manager/providers/dexes/telos/ape-swap/ape-swap-telos-provider'; import { OmnidexProvider } from 'src/features/on-chain/calculation-manager/providers/dexes/telos/omnidex/omnidex-provider'; @@ -133,5 +134,7 @@ export const UniswapV2TradeProviders = [ QuickSwapMumbaiProvider, // Fuji JoeFujiProvider, - PangolinFujiProvider + PangolinFujiProvider, + // Scroll + UniSwapV2ScrollTestnetProvider ] as const; diff --git a/src/features/on-chain/calculation-manager/providers/dexes/common/uniswap-v3-abstract/utils/quoter-controller/uniswap-v3-quoter-controller.ts b/src/features/on-chain/calculation-manager/providers/dexes/common/uniswap-v3-abstract/utils/quoter-controller/uniswap-v3-quoter-controller.ts index 7303512154..ecf3fca4b1 100644 --- a/src/features/on-chain/calculation-manager/providers/dexes/common/uniswap-v3-abstract/utils/quoter-controller/uniswap-v3-quoter-controller.ts +++ b/src/features/on-chain/calculation-manager/providers/dexes/common/uniswap-v3-abstract/utils/quoter-controller/uniswap-v3-quoter-controller.ts @@ -127,7 +127,9 @@ export class UniswapV3QuoterController implements UniswapV3AlgebraQuoterControll constructor( private readonly blockchain: EvmBlockchainName, - private readonly routerConfiguration: UniswapV3RouterConfiguration + private readonly routerConfiguration: UniswapV3RouterConfiguration, + private readonly factoryAddress = FACTORY_CONTRACT_ADDRESS, + private readonly quoterAddress = UNISWAP_V3_QUOTER_CONTRACT_ADDRESS ) {} private async getOrCreateRouterTokensAndLiquidityPools(): Promise<{ @@ -213,7 +215,7 @@ export class UniswapV3QuoterController implements UniswapV3AlgebraQuoterControll const poolsAddresses = ( await this.web3Public.multicallContractMethod( - FACTORY_CONTRACT_ADDRESS, + this.factoryAddress, FACTORY_CONTRACT_ABI, 'getPool', getPoolsMethodArguments.map(methodArguments => [ @@ -274,7 +276,7 @@ export class UniswapV3QuoterController implements UniswapV3AlgebraQuoterControll return this.web3Public .multicallContractMethods( - UNISWAP_V3_QUOTER_CONTRACT_ADDRESS, + this.quoterAddress, UNISWAP_V3_QUOTER_CONTRACT_ABI, quoterMethodsData.map(quoterMethodData => quoterMethodData.methodData) ) diff --git a/src/features/on-chain/calculation-manager/providers/dexes/scroll-testnet/uni-swap-v2-scroll-testnet/constants.ts b/src/features/on-chain/calculation-manager/providers/dexes/scroll-testnet/uni-swap-v2-scroll-testnet/constants.ts new file mode 100644 index 0000000000..352bc5ab33 --- /dev/null +++ b/src/features/on-chain/calculation-manager/providers/dexes/scroll-testnet/uni-swap-v2-scroll-testnet/constants.ts @@ -0,0 +1,20 @@ +import { wrappedNativeTokensList } from 'src/common/tokens'; +import { BLOCKCHAIN_NAME } from 'src/core/blockchain/models/blockchain-name'; +import { UniswapV2ProviderConfiguration } from 'src/features/on-chain/calculation-manager/providers/dexes/common/uniswap-v2-abstract/models/uniswap-v2-provider-configuration'; + +const defaultScrollWethAddress = wrappedNativeTokensList[BLOCKCHAIN_NAME.SCROLL_TESTNET]!.address; + +const defaultScrollRoutingProvidersAddresses = [ + defaultScrollWethAddress, // WETH + '0x67aE69Fd63b4fc8809ADc224A9b82Be976039509', // USDC + '0x4702E5AEb70BdC05B11F8d8E701ad000dc85bD44', // DAI + '0x0CDEA04b370C1FA4bC2032b4ef23dB3EBCbA258a' // UNI +]; +export const UNISWAP_V2_SCROLL_TESTNET_CONTRACT_ADDRESS = + '0x0cfd11ac90992872d62a439bF0ED01EFA583d8Dc'; + +export const UNISWAP_V2_SCROLL_TESTNET_CONFIGURATION: UniswapV2ProviderConfiguration = { + maxTransitTokens: 2, + routingProvidersAddresses: defaultScrollRoutingProvidersAddresses, + wethAddress: defaultScrollWethAddress +}; diff --git a/src/features/on-chain/calculation-manager/providers/dexes/scroll-testnet/uni-swap-v2-scroll-testnet/uni-swap-v2-scroll-testnet-provider.ts b/src/features/on-chain/calculation-manager/providers/dexes/scroll-testnet/uni-swap-v2-scroll-testnet/uni-swap-v2-scroll-testnet-provider.ts new file mode 100644 index 0000000000..0861b316a4 --- /dev/null +++ b/src/features/on-chain/calculation-manager/providers/dexes/scroll-testnet/uni-swap-v2-scroll-testnet/uni-swap-v2-scroll-testnet-provider.ts @@ -0,0 +1,12 @@ +import { BLOCKCHAIN_NAME } from 'src/core/blockchain/models/blockchain-name'; +import { UniswapV2AbstractProvider } from 'src/features/on-chain/calculation-manager/providers/dexes/common/uniswap-v2-abstract/uniswap-v2-abstract-provider'; +import { UNISWAP_V2_SCROLL_TESTNET_CONFIGURATION } from 'src/features/on-chain/calculation-manager/providers/dexes/scroll-testnet/uni-swap-v2-scroll-testnet/constants'; +import { UniSwapV2ScrollTestnetTrade } from 'src/features/on-chain/calculation-manager/providers/dexes/scroll-testnet/uni-swap-v2-scroll-testnet/uni-swap-v2-scroll-testnet-trade'; + +export class UniSwapV2ScrollTestnetProvider extends UniswapV2AbstractProvider { + public readonly blockchain = BLOCKCHAIN_NAME.SCROLL_TESTNET; + + public readonly UniswapV2TradeClass = UniSwapV2ScrollTestnetTrade; + + public readonly providerSettings = UNISWAP_V2_SCROLL_TESTNET_CONFIGURATION; +} diff --git a/src/features/on-chain/calculation-manager/providers/dexes/scroll-testnet/uni-swap-v2-scroll-testnet/uni-swap-v2-scroll-testnet-trade.ts b/src/features/on-chain/calculation-manager/providers/dexes/scroll-testnet/uni-swap-v2-scroll-testnet/uni-swap-v2-scroll-testnet-trade.ts new file mode 100644 index 0000000000..c9c34d3402 --- /dev/null +++ b/src/features/on-chain/calculation-manager/providers/dexes/scroll-testnet/uni-swap-v2-scroll-testnet/uni-swap-v2-scroll-testnet-trade.ts @@ -0,0 +1,14 @@ +import { + ON_CHAIN_TRADE_TYPE, + OnChainTradeType +} from 'src/features/on-chain/calculation-manager/providers/common/models/on-chain-trade-type'; +import { UniswapV2AbstractTrade } from 'src/features/on-chain/calculation-manager/providers/dexes/common/uniswap-v2-abstract/uniswap-v2-abstract-trade'; +import { UNISWAP_V2_SCROLL_TESTNET_CONTRACT_ADDRESS } from 'src/features/on-chain/calculation-manager/providers/dexes/scroll-testnet/uni-swap-v2-scroll-testnet/constants'; + +export class UniSwapV2ScrollTestnetTrade extends UniswapV2AbstractTrade { + public static get type(): OnChainTradeType { + return ON_CHAIN_TRADE_TYPE.UNISWAP_V2; + } + + public readonly dexContractAddress = UNISWAP_V2_SCROLL_TESTNET_CONTRACT_ADDRESS; +} diff --git a/src/features/on-chain/calculation-manager/providers/dexes/scroll-testnet/uni-swap-v3-scroll-testnet/constants/router-configuration.ts b/src/features/on-chain/calculation-manager/providers/dexes/scroll-testnet/uni-swap-v3-scroll-testnet/constants/router-configuration.ts index 4c3eae2667..2738775bd7 100644 --- a/src/features/on-chain/calculation-manager/providers/dexes/scroll-testnet/uni-swap-v3-scroll-testnet/constants/router-configuration.ts +++ b/src/features/on-chain/calculation-manager/providers/dexes/scroll-testnet/uni-swap-v3-scroll-testnet/constants/router-configuration.ts @@ -14,12 +14,50 @@ type TokenSymbol = (typeof tokensSymbols)[number]; const routerTokens: Record = { WETH: wrappedNativeTokensList[BLOCKCHAIN_NAME.SCROLL_TESTNET]!.address, + // 0xa1ea0b2354f5a344110af2b6ad68e75545009a03 USDC: '0x67aE69Fd63b4fc8809ADc224A9b82Be976039509', DAI: '0x4702E5AEb70BdC05B11F8d8E701ad000dc85bD44', UNI: '0x0CDEA04b370C1FA4bC2032b4ef23dB3EBCbA258a' }; -const routerLiquidityPools: UniswapV3RouterLiquidityPool[] = []; +const routerLiquidityPools: UniswapV3RouterLiquidityPool[] = [ + { + poolAddress: '0xd33cb453ac9c69034365c7bf22e4afbada0fa4dd', + tokenSymbolA: 'USDC', + tokenSymbolB: 'WETH', + fee: 3000 + }, + { + poolAddress: '0x5c6a28124b8cc7091add3bdbd5591dc857b760d4', + tokenSymbolA: 'WETH', + tokenSymbolB: 'DAI', + fee: 3000 + }, + { + poolAddress: '0x3d85b9063da55b3cb7cdf6d11ef8f3b0c282d6c2', + tokenSymbolA: 'WETH', + tokenSymbolB: 'UNI', + fee: 3000 + }, + { + poolAddress: '0xb575c5b4d616a32f9669fecccdfa33eca9250913', + tokenSymbolA: 'USDC', + tokenSymbolB: 'DAI', + fee: 3000 + }, + { + poolAddress: '0xc8a882807d756af083db647fa05f9bcb8a8bb367', + tokenSymbolA: 'USDC', + tokenSymbolB: 'UNI', + fee: 3000 + }, + { + poolAddress: '0x8177bbbf8d174c204d10bd8aad43f136ef5ef462', + tokenSymbolA: 'DAI', + tokenSymbolB: 'UNI', + fee: 3000 + } +]; export const UNI_SWAP_V3_SCROLL_TESTNET_ROUTER_CONFIGURATION: UniswapV3RouterConfiguration = { diff --git a/src/features/on-chain/calculation-manager/providers/dexes/scroll-testnet/uni-swap-v3-scroll-testnet/uni-swap-v3-scroll-testnet-provider.ts b/src/features/on-chain/calculation-manager/providers/dexes/scroll-testnet/uni-swap-v3-scroll-testnet/uni-swap-v3-scroll-testnet-provider.ts index f21cc36b5b..9367e47565 100644 --- a/src/features/on-chain/calculation-manager/providers/dexes/scroll-testnet/uni-swap-v3-scroll-testnet/uni-swap-v3-scroll-testnet-provider.ts +++ b/src/features/on-chain/calculation-manager/providers/dexes/scroll-testnet/uni-swap-v3-scroll-testnet/uni-swap-v3-scroll-testnet-provider.ts @@ -1,3 +1,6 @@ +import { RubicSdkError } from 'src/common/errors'; +import { Token } from 'src/common/tokens'; +import { compareAddresses } from 'src/common/utils/blockchain'; import { BLOCKCHAIN_NAME } from 'src/core/blockchain/models/blockchain-name'; import { EvmWeb3Pure } from 'src/core/blockchain/web3-pure/typed-web3-pure/evm-web3-pure/evm-web3-pure'; import { createTokenNativeAddressProxyInPathStartAndEnd } from 'src/features/common/utils/token-native-address-proxy'; @@ -5,12 +8,11 @@ import { ON_CHAIN_TRADE_TYPE, OnChainTradeType } from 'src/features/on-chain/calculation-manager/providers/common/models/on-chain-trade-type'; -import { AlgebraQuoterController } from 'src/features/on-chain/calculation-manager/providers/dexes/common/algebra/algebra-quoter-controller'; +import { UniswapV3Route } from 'src/features/on-chain/calculation-manager/providers/dexes/common/uniswap-v3-abstract/models/uniswap-v3-route'; +import { UniswapV3QuoterController } from 'src/features/on-chain/calculation-manager/providers/dexes/common/uniswap-v3-abstract/utils/quoter-controller/uniswap-v3-quoter-controller'; import { UniswapV3AlgebraTradeStructOmitPath } from 'src/features/on-chain/calculation-manager/providers/dexes/common/uniswap-v3-algebra-abstract/models/uniswap-v3-algebra-trade-struct'; import { UniswapV3AlgebraAbstractProvider } from 'src/features/on-chain/calculation-manager/providers/dexes/common/uniswap-v3-algebra-abstract/uniswap-v3-algebra-abstract-provider'; import { ALGEBRA_SWAP_ROUTER_CONTRACT_ABI } from 'src/features/on-chain/calculation-manager/providers/dexes/polygon/algebra/constants/swap-router-contract-data'; -import { AlgebraRoute } from 'src/features/on-chain/calculation-manager/providers/dexes/polygon/algebra/models/algebra-route'; -import { QUICK_SWAP_V3_QUOTER_CONTRACT_ABI } from 'src/features/on-chain/calculation-manager/providers/dexes/polygon/quick-swap-v3/utils/quoter-controller/constants/quoter-contract-data'; import { UNI_SWAP_V3_SCROLL_TESTNET_PROVIDER_CONFIGURATION } from 'src/features/on-chain/calculation-manager/providers/dexes/scroll-testnet/uni-swap-v3-scroll-testnet/constants/provider-configuration'; import { UNI_SWAP_V3_SCROLL_TESTNET_ROUTER_CONFIGURATION } from 'src/features/on-chain/calculation-manager/providers/dexes/scroll-testnet/uni-swap-v3-scroll-testnet/constants/router-configuration'; import { UniSwapV3ScrollTestnetTrade } from 'src/features/on-chain/calculation-manager/providers/dexes/scroll-testnet/uni-swap-v3-scroll-testnet/uni-swap-v3-scroll-testnet-trade'; @@ -28,11 +30,11 @@ export class UniSwapV3ScrollTestnetProvider extends UniswapV3AlgebraAbstractProv public readonly routerConfiguration = UNI_SWAP_V3_SCROLL_TESTNET_ROUTER_CONFIGURATION; - protected readonly quoterController = new AlgebraQuoterController( - QUICK_SWAP_V3_QUOTER_CONTRACT_ABI, - '0xbf1c1FE1e9e900aFd5ba2Eb67480c44266D5eD84', - BLOCKCHAIN_NAME.SCROLL_TESTNET, - Object.values(this.routerConfiguration.tokens) + protected readonly quoterController = new UniswapV3QuoterController( + this.blockchain, + this.routerConfiguration, + '0x6E7E0d996eF50E289af9BFd93f774C566F014660', + '0xbf1c1FE1e9e900aFd5ba2Eb67480c44266D5eD84' ); public get type(): OnChainTradeType { @@ -41,14 +43,11 @@ export class UniSwapV3ScrollTestnetProvider extends UniswapV3AlgebraAbstractProv protected createTradeInstance( tradeStruct: UniswapV3AlgebraTradeStructOmitPath, - route: AlgebraRoute, + route: UniswapV3Route, providerAddress: string ): UniSwapV3ScrollTestnetTrade { - const path = createTokenNativeAddressProxyInPathStartAndEnd( - route.path, - EvmWeb3Pure.nativeTokenAddress - ); - return new UniSwapV3ScrollTestnetTrade( + const path = this.extractPath(route); + return new this.OnChainTradeClass( { ...tradeStruct, path, @@ -57,4 +56,31 @@ export class UniSwapV3ScrollTestnetProvider extends UniswapV3AlgebraAbstractProv providerAddress ); } + + private extractPath(route: UniswapV3Route): ReadonlyArray { + const initialPool = route.poolsPath[0]; + if (!initialPool) { + throw new RubicSdkError('Initial pool has to be defined'); + } + const path: Token[] = [ + compareAddresses(initialPool.token0.address, route.initialTokenAddress) + ? initialPool.token0 + : initialPool.token1 + ]; + + const lastToken = path[path.length - 1]; + if (!lastToken) { + throw new RubicSdkError('Last token has to be defined'); + } + + route.poolsPath.forEach(pool => { + path.push( + !compareAddresses(pool.token0.address, lastToken.address) + ? pool.token0 + : pool.token1 + ); + }); + + return createTokenNativeAddressProxyInPathStartAndEnd(path, EvmWeb3Pure.nativeTokenAddress); + } } diff --git a/src/features/on-chain/calculation-manager/providers/dexes/scroll-testnet/uni-swap-v3-scroll-testnet/uni-swap-v3-scroll-testnet-trade.ts b/src/features/on-chain/calculation-manager/providers/dexes/scroll-testnet/uni-swap-v3-scroll-testnet/uni-swap-v3-scroll-testnet-trade.ts index ffb2ba2918..5e0cbd301c 100644 --- a/src/features/on-chain/calculation-manager/providers/dexes/scroll-testnet/uni-swap-v3-scroll-testnet/uni-swap-v3-scroll-testnet-trade.ts +++ b/src/features/on-chain/calculation-manager/providers/dexes/scroll-testnet/uni-swap-v3-scroll-testnet/uni-swap-v3-scroll-testnet-trade.ts @@ -1,28 +1,33 @@ -import { Token } from 'src/common/tokens'; +import { RubicSdkError } from 'src/common/errors'; +import { compareAddresses } from 'src/common/utils/blockchain'; import { MethodData } from 'src/core/blockchain/web3-public-service/web3-public/models/method-data'; -import { AlgebraQuoterController } from 'src/features/on-chain/calculation-manager/providers/dexes/common/algebra/algebra-quoter-controller'; +import { + ON_CHAIN_TRADE_TYPE, + OnChainTradeType +} from 'src/features/on-chain/calculation-manager/providers/common/models/on-chain-trade-type'; +import { UNISWAP_V3_SWAP_ROUTER_CONTRACT_ABI } from 'src/features/on-chain/calculation-manager/providers/dexes/common/uniswap-v3-abstract/constants/swap-router-contract-abi'; +import { UniswapV3Route } from 'src/features/on-chain/calculation-manager/providers/dexes/common/uniswap-v3-abstract/models/uniswap-v3-route'; +import { UniswapV3TradeStruct } from 'src/features/on-chain/calculation-manager/providers/dexes/common/uniswap-v3-abstract/models/uniswap-v3-trade-struct'; +import { UniswapV3QuoterController } from 'src/features/on-chain/calculation-manager/providers/dexes/common/uniswap-v3-abstract/utils/quoter-controller/uniswap-v3-quoter-controller'; import { UniswapV3AlgebraAbstractTrade } from 'src/features/on-chain/calculation-manager/providers/dexes/common/uniswap-v3-algebra-abstract/uniswap-v3-algebra-abstract-trade'; -import { ALGEBRA_SWAP_ROUTER_CONTRACT_ABI } from 'src/features/on-chain/calculation-manager/providers/dexes/polygon/algebra/constants/swap-router-contract-data'; -import { AlgebraRoute } from 'src/features/on-chain/calculation-manager/providers/dexes/polygon/algebra/models/algebra-route'; -import { AlgebraTradeStruct } from 'src/features/on-chain/calculation-manager/providers/dexes/polygon/algebra/models/algebra-trade-struct'; export class UniSwapV3ScrollTestnetTrade extends UniswapV3AlgebraAbstractTrade { public readonly dexContractAddress = '0xD9880690bd717189cC3Fbe7B9020F27fae7Ac76F'; - protected readonly contractAbi = ALGEBRA_SWAP_ROUTER_CONTRACT_ABI; + protected readonly contractAbi = UNISWAP_V3_SWAP_ROUTER_CONTRACT_ABI; protected readonly unwrapWethMethodName = 'unwrapWNativeToken'; - private readonly route: AlgebraRoute; + private readonly route: UniswapV3Route; - public readonly wrappedPath: ReadonlyArray; + public static get type(): OnChainTradeType { + return ON_CHAIN_TRADE_TYPE.UNI_SWAP_V3; + } - constructor(tradeStruct: AlgebraTradeStruct, providerAddress: string) { + constructor(tradeStruct: UniswapV3TradeStruct, providerAddress: string) { super(tradeStruct, providerAddress); this.route = tradeStruct.route; - - this.wrappedPath = this.route.path; } /** @@ -31,15 +36,31 @@ export class UniSwapV3ScrollTestnetTrade extends UniswapV3AlgebraAbstractTrade { protected getSwapRouterExactInputMethodData(walletAddress: string): MethodData { const amountParams = this.getAmountParams(); - if (this.route.path.length === 2 && this.route?.path?.[0] && this.route?.path?.[1]) { + if (this.route.poolsPath.length === 1) { const methodName = this.exact === 'input' ? 'exactInputSingle' : 'exactOutputSingle'; + const pool = this.route.poolsPath[0]; + if (!pool) { + throw new RubicSdkError('Initial pool has to be defined'); + } + const toTokenAddress = compareAddresses( + pool.token0.address, + this.route.initialTokenAddress + ) + ? pool.token1.address + : pool.token0.address; + + if (!this.route?.poolsPath?.[0]) { + throw new RubicSdkError('PoolsPath[0] has to be defined'); + } + return { methodName, methodArguments: [ [ - this.route.path[0].address, - this.route.path[1].address, + this.route.initialTokenAddress, + toTokenAddress, + this.route.poolsPath[0].fee, walletAddress, this.deadlineMinutesTimestamp, ...amountParams, @@ -55,7 +76,10 @@ export class UniSwapV3ScrollTestnetTrade extends UniswapV3AlgebraAbstractTrade { methodName, methodArguments: [ [ - AlgebraQuoterController.getEncodedPath(this.route.path), + UniswapV3QuoterController.getEncodedPoolsPath( + this.route.poolsPath, + this.route.initialTokenAddress + ), walletAddress, this.deadlineMinutesTimestamp, ...amountParams From 1635947a7dfb119295fdcc70a24c93adfbd14f01 Mon Sep 17 00:00:00 2001 From: axtezy Date: Thu, 20 Jul 2023 12:01:05 +0200 Subject: [PATCH 05/15] Add scroll native bridge --- package.json | 2 +- .../constants/cross-chain-providers.ts | 4 +- .../models/cross-chain-trade-type.ts | 3 +- .../constants/l1-erc20-scroll-gateway-abi.ts | 55 +++ .../constants/l2-erc20-scroll-gateway-abi.ts | 55 +++ .../scroll-bridge-contract-address.ts | 19 + .../scroll-bridge-supported-blockchain.ts | 8 + .../scroll-bridge/scroll-bridge-provider.ts | 120 ++++++ .../scroll-bridge/scroll-bridge-trade.ts | 342 ++++++++++++++++++ .../constants/symbiosis-v2-config.ts | 35 ++ .../cross-chain-status-manager.ts | 20 +- .../models/scroll-api-response.ts | 18 + .../uni-swap-v3-scroll-testnet-provider.ts | 4 +- .../uni-swap-v3-scroll-testnet-trade.ts | 2 +- 14 files changed, 680 insertions(+), 7 deletions(-) create mode 100644 src/features/cross-chain/calculation-manager/providers/scroll-bridge/constants/l1-erc20-scroll-gateway-abi.ts create mode 100644 src/features/cross-chain/calculation-manager/providers/scroll-bridge/constants/l2-erc20-scroll-gateway-abi.ts create mode 100644 src/features/cross-chain/calculation-manager/providers/scroll-bridge/constants/scroll-bridge-contract-address.ts create mode 100644 src/features/cross-chain/calculation-manager/providers/scroll-bridge/models/scroll-bridge-supported-blockchain.ts create mode 100644 src/features/cross-chain/calculation-manager/providers/scroll-bridge/scroll-bridge-provider.ts create mode 100644 src/features/cross-chain/calculation-manager/providers/scroll-bridge/scroll-bridge-trade.ts create mode 100644 src/features/cross-chain/status-manager/models/scroll-api-response.ts diff --git a/package.json b/package.json index 98a05cbb69..40831056d0 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "rubic-sdk", - "version": "4.8.0-alpha-testnets.1", + "version": "4.8.0-alpha-testnets.2", "description": "Simplify dApp creation", "main": "lib/index.js", "types": "lib/index.d.ts", diff --git a/src/features/cross-chain/calculation-manager/constants/cross-chain-providers.ts b/src/features/cross-chain/calculation-manager/constants/cross-chain-providers.ts index e67f8d0e9e..3659a13b22 100644 --- a/src/features/cross-chain/calculation-manager/constants/cross-chain-providers.ts +++ b/src/features/cross-chain/calculation-manager/constants/cross-chain-providers.ts @@ -4,6 +4,7 @@ import { CbridgeCrossChainProvider } from 'src/features/cross-chain/calculation- import { ChangenowCrossChainProvider } from 'src/features/cross-chain/calculation-manager/providers/changenow-provider/changenow-cross-chain-provider'; import { DebridgeCrossChainProvider } from 'src/features/cross-chain/calculation-manager/providers/debridge-provider/debridge-cross-chain-provider'; import { LifiCrossChainProvider } from 'src/features/cross-chain/calculation-manager/providers/lifi-provider/lifi-cross-chain-provider'; +import { ScrollBridgeProvider } from 'src/features/cross-chain/calculation-manager/providers/scroll-bridge/scroll-bridge-provider'; import { SymbiosisCrossChainProvider } from 'src/features/cross-chain/calculation-manager/providers/symbiosis-provider/symbiosis-cross-chain-provider'; import { XyCrossChainProvider } from 'src/features/cross-chain/calculation-manager/providers/xy-provider/xy-cross-chain-provider'; @@ -21,7 +22,8 @@ const nonProxyProviders = [ DebridgeCrossChainProvider, BridgersCrossChainProvider, ChangenowCrossChainProvider, - ArbitrumRbcBridgeProvider + ArbitrumRbcBridgeProvider, + ScrollBridgeProvider ] as const; export const CrossChainProviders = [ diff --git a/src/features/cross-chain/calculation-manager/models/cross-chain-trade-type.ts b/src/features/cross-chain/calculation-manager/models/cross-chain-trade-type.ts index a0c7191b2b..44a995ccc4 100644 --- a/src/features/cross-chain/calculation-manager/models/cross-chain-trade-type.ts +++ b/src/features/cross-chain/calculation-manager/models/cross-chain-trade-type.ts @@ -10,7 +10,8 @@ export const CROSS_CHAIN_TRADE_TYPE = { CELER_BRIDGE: 'celer_bridge', CHANGENOW: 'changenow', STARGATE: 'stargate', - ARBITRUM: 'arbitrum' + ARBITRUM: 'arbitrum', + SCROLL_BRIDGE: 'scroll_bridge' } as const; export type CrossChainTradeType = diff --git a/src/features/cross-chain/calculation-manager/providers/scroll-bridge/constants/l1-erc20-scroll-gateway-abi.ts b/src/features/cross-chain/calculation-manager/providers/scroll-bridge/constants/l1-erc20-scroll-gateway-abi.ts new file mode 100644 index 0000000000..534c1a09dd --- /dev/null +++ b/src/features/cross-chain/calculation-manager/providers/scroll-bridge/constants/l1-erc20-scroll-gateway-abi.ts @@ -0,0 +1,55 @@ +import { AbiItem } from 'web3-utils'; + +export const l1Erc20ScrollGatewayAbi: AbiItem[] = [ + { + inputs: [ + { internalType: 'address', name: '_token', type: 'address' }, + { internalType: 'uint256', name: '_amount', type: 'uint256' }, + { internalType: 'uint256', name: '_gasLimit', type: 'uint256' } + ], + name: 'depositERC20', + outputs: [], + stateMutability: 'payable', + type: 'function' + }, + { + inputs: [ + { internalType: 'address', name: '_token', type: 'address' }, + { internalType: 'address', name: '_to', type: 'address' }, + { internalType: 'uint256', name: '_amount', type: 'uint256' }, + { internalType: 'uint256', name: '_gasLimit', type: 'uint256' } + ], + name: 'depositERC20', + outputs: [], + stateMutability: 'payable', + type: 'function' + }, + { + inputs: [ + { internalType: 'uint256', name: '_amount', type: 'uint256' }, + { internalType: 'uint256', name: '_gasLimit', type: 'uint256' } + ], + name: 'depositETH', + outputs: [], + stateMutability: 'payable', + type: 'function' + }, + { + inputs: [ + { internalType: 'address', name: '_to', type: 'address' }, + { internalType: 'uint256', name: '_amount', type: 'uint256' }, + { internalType: 'uint256', name: '_gasLimit', type: 'uint256' } + ], + name: 'depositETH', + outputs: [], + stateMutability: 'payable', + type: 'function' + }, + { + inputs: [{ internalType: 'address', name: '_l1Address', type: 'address' }], + name: 'getL2ERC20Address', + outputs: [{ internalType: 'address', name: '', type: 'address' }], + stateMutability: 'view', + type: 'function' + } +]; diff --git a/src/features/cross-chain/calculation-manager/providers/scroll-bridge/constants/l2-erc20-scroll-gateway-abi.ts b/src/features/cross-chain/calculation-manager/providers/scroll-bridge/constants/l2-erc20-scroll-gateway-abi.ts new file mode 100644 index 0000000000..732617ba0c --- /dev/null +++ b/src/features/cross-chain/calculation-manager/providers/scroll-bridge/constants/l2-erc20-scroll-gateway-abi.ts @@ -0,0 +1,55 @@ +import { AbiItem } from 'web3-utils'; + +export const l2Erc20ScrollGatewayAbi: AbiItem[] = [ + { + type: 'function', + stateMutability: 'view', + outputs: [{ type: 'address', name: '', internalType: 'address' }], + name: 'getL1ERC20Address', + inputs: [{ type: 'address', name: '_l2Address', internalType: 'address' }] + }, + { + type: 'function', + stateMutability: 'payable', + outputs: [], + name: 'withdrawERC20', + inputs: [ + { type: 'address', name: '_token', internalType: 'address' }, + { type: 'uint256', name: '_amount', internalType: 'uint256' }, + { type: 'uint256', name: '_gasLimit', internalType: 'uint256' } + ] + }, + { + type: 'function', + stateMutability: 'payable', + outputs: [], + name: 'withdrawERC20', + inputs: [ + { type: 'address', name: '_token', internalType: 'address' }, + { type: 'address', name: '_to', internalType: 'address' }, + { type: 'uint256', name: '_amount', internalType: 'uint256' }, + { type: 'uint256', name: '_gasLimit', internalType: 'uint256' } + ] + }, + { + type: 'function', + stateMutability: 'payable', + outputs: [], + name: 'withdrawETH', + inputs: [ + { type: 'address', name: '_to', internalType: 'address' }, + { type: 'uint256', name: '_amount', internalType: 'uint256' }, + { type: 'uint256', name: '_gasLimit', internalType: 'uint256' } + ] + }, + { + type: 'function', + stateMutability: 'payable', + outputs: [], + name: 'withdrawETH', + inputs: [ + { type: 'uint256', name: '_amount', internalType: 'uint256' }, + { type: 'uint256', name: '_gasLimit', internalType: 'uint256' } + ] + } +]; diff --git a/src/features/cross-chain/calculation-manager/providers/scroll-bridge/constants/scroll-bridge-contract-address.ts b/src/features/cross-chain/calculation-manager/providers/scroll-bridge/constants/scroll-bridge-contract-address.ts new file mode 100644 index 0000000000..f394771a41 --- /dev/null +++ b/src/features/cross-chain/calculation-manager/providers/scroll-bridge/constants/scroll-bridge-contract-address.ts @@ -0,0 +1,19 @@ +import { BLOCKCHAIN_NAME } from 'src/core/blockchain/models/blockchain-name'; +import { UniversalContract } from 'src/features/cross-chain/calculation-manager/providers/common/models/universal-contract'; +import { ScrollBridgeSupportedBlockchain } from 'src/features/cross-chain/calculation-manager/providers/scroll-bridge/models/scroll-bridge-supported-blockchain'; + +export const scrollBridgeContractAddress: Record< + ScrollBridgeSupportedBlockchain, + UniversalContract +> = { + [BLOCKCHAIN_NAME.SCROLL_TESTNET]: { + providerGateway: '0x6d79Aa2e4Fbf80CF8543Ad97e294861853fb0649', + providerRouter: '0x6d79Aa2e4Fbf80CF8543Ad97e294861853fb0649', + rubicRouter: '0x33798753ec66aEc00ed7E337B41F444f53A63333' + }, + [BLOCKCHAIN_NAME.GOERLI]: { + providerGateway: '0xe5E30E7c24e4dFcb281A682562E53154C15D3332', + providerRouter: '0xe5E30E7c24e4dFcb281A682562E53154C15D3332', + rubicRouter: '0x33798753ec66aEc00ed7E337B41F444f53A63333' + } +}; diff --git a/src/features/cross-chain/calculation-manager/providers/scroll-bridge/models/scroll-bridge-supported-blockchain.ts b/src/features/cross-chain/calculation-manager/providers/scroll-bridge/models/scroll-bridge-supported-blockchain.ts new file mode 100644 index 0000000000..533bda42e5 --- /dev/null +++ b/src/features/cross-chain/calculation-manager/providers/scroll-bridge/models/scroll-bridge-supported-blockchain.ts @@ -0,0 +1,8 @@ +import { BLOCKCHAIN_NAME } from 'src/core/blockchain/models/blockchain-name'; + +export const scrollBridgeSupportedBlockchains = [ + BLOCKCHAIN_NAME.GOERLI, + BLOCKCHAIN_NAME.SCROLL_TESTNET +] as const; + +export type ScrollBridgeSupportedBlockchain = (typeof scrollBridgeSupportedBlockchains)[number]; diff --git a/src/features/cross-chain/calculation-manager/providers/scroll-bridge/scroll-bridge-provider.ts b/src/features/cross-chain/calculation-manager/providers/scroll-bridge/scroll-bridge-provider.ts new file mode 100644 index 0000000000..bb24caf5cf --- /dev/null +++ b/src/features/cross-chain/calculation-manager/providers/scroll-bridge/scroll-bridge-provider.ts @@ -0,0 +1,120 @@ +import { NotSupportedTokensError, RubicSdkError } from 'src/common/errors'; +import { PriceToken, PriceTokenAmount } from 'src/common/tokens'; +import { compareAddresses } from 'src/common/utils/blockchain'; +import { + BLOCKCHAIN_NAME, + BlockchainName, + EvmBlockchainName +} from 'src/core/blockchain/models/blockchain-name'; +import { Injector } from 'src/core/injector/injector'; +import { RequiredCrossChainOptions } from 'src/features/cross-chain/calculation-manager/models/cross-chain-options'; +import { CROSS_CHAIN_TRADE_TYPE } from 'src/features/cross-chain/calculation-manager/models/cross-chain-trade-type'; +import { CbridgeCrossChainSupportedBlockchain } from 'src/features/cross-chain/calculation-manager/providers/cbridge/constants/cbridge-supported-blockchains'; +import { CrossChainProvider } from 'src/features/cross-chain/calculation-manager/providers/common/cross-chain-provider'; +import { CalculationResult } from 'src/features/cross-chain/calculation-manager/providers/common/models/calculation-result'; +import { FeeInfo } from 'src/features/cross-chain/calculation-manager/providers/common/models/fee-info'; +import { l1Erc20ScrollGatewayAbi } from 'src/features/cross-chain/calculation-manager/providers/scroll-bridge/constants/l1-erc20-scroll-gateway-abi'; +import { l2Erc20ScrollGatewayAbi } from 'src/features/cross-chain/calculation-manager/providers/scroll-bridge/constants/l2-erc20-scroll-gateway-abi'; +import { + ScrollBridgeSupportedBlockchain, + scrollBridgeSupportedBlockchains +} from 'src/features/cross-chain/calculation-manager/providers/scroll-bridge/models/scroll-bridge-supported-blockchain'; +import { ScrollBridgeTrade } from 'src/features/cross-chain/calculation-manager/providers/scroll-bridge/scroll-bridge-trade'; + +import { scrollBridgeContractAddress } from './constants/scroll-bridge-contract-address'; + +export class ScrollBridgeProvider extends CrossChainProvider { + public readonly type = CROSS_CHAIN_TRADE_TYPE.SCROLL_BRIDGE; + + public isSupportedBlockchain( + blockchain: BlockchainName + ): blockchain is ScrollBridgeSupportedBlockchain { + return scrollBridgeSupportedBlockchains.some( + supportedBlockchain => supportedBlockchain === blockchain + ); + } + + public async calculate( + fromToken: PriceTokenAmount, + toToken: PriceToken, + options: RequiredCrossChainOptions + ): Promise { + const fromBlockchain = fromToken.blockchain as ScrollBridgeSupportedBlockchain; + const toBlockchain = toToken.blockchain as ScrollBridgeSupportedBlockchain; + + if (!this.areSupportedBlockchains(fromBlockchain, toBlockchain)) { + return { + trade: null, + error: new NotSupportedTokensError(), + tradeType: this.type + }; + } + + try { + const web3Public = Injector.web3PublicService.getWeb3Public(fromBlockchain); + + if (!fromToken.isNative) { + if (fromBlockchain === BLOCKCHAIN_NAME.GOERLI) { + const l2Address = await web3Public.callContractMethod( + scrollBridgeContractAddress[fromBlockchain]!.providerGateway, + l1Erc20ScrollGatewayAbi, + 'getL2ERC20Address', + [fromToken.address] + ); + if (!compareAddresses(toToken.address, l2Address)) { + throw new RubicSdkError('Swap is not allowed.'); + } + } else { + const l1Address = await web3Public.callContractMethod( + scrollBridgeContractAddress[fromBlockchain]!.providerGateway, + l2Erc20ScrollGatewayAbi, + 'getL1ERC20Address', + [fromToken.address] + ); + if (!compareAddresses(toToken.address, l1Address)) { + throw new RubicSdkError('Swap is not allowed.'); + } + } + } + + const to = new PriceTokenAmount({ + ...toToken.asStruct, + tokenAmount: fromToken.tokenAmount + }); + + const gasData = + options.gasCalculation === 'enabled' + ? await ScrollBridgeTrade.getGasData(fromToken, to) + : null; + + return { + trade: new ScrollBridgeTrade( + { + from: fromToken, + to, + gasData + }, + options.providerAddress + ), + tradeType: this.type + }; + } catch (err) { + const rubicSdkError = CrossChainProvider.parseError(err); + + return { + trade: null, + error: rubicSdkError, + tradeType: this.type + }; + } + } + + protected async getFeeInfo( + _fromBlockchain: CbridgeCrossChainSupportedBlockchain, + _providerAddress: string, + _percentFeeToken: PriceTokenAmount, + _useProxy: boolean + ): Promise { + return {}; + } +} diff --git a/src/features/cross-chain/calculation-manager/providers/scroll-bridge/scroll-bridge-trade.ts b/src/features/cross-chain/calculation-manager/providers/scroll-bridge/scroll-bridge-trade.ts new file mode 100644 index 0000000000..454fae3ab2 --- /dev/null +++ b/src/features/cross-chain/calculation-manager/providers/scroll-bridge/scroll-bridge-trade.ts @@ -0,0 +1,342 @@ +import { + getL2Network, + L1TransactionReceipt, + L2ToL1MessageReader, + L2TransactionReceipt +} from '@arbitrum/sdk'; +import { JsonRpcProvider } from '@ethersproject/providers'; +import BigNumber from 'bignumber.js'; +import { BigNumber as EtherBigNumber } from 'ethers'; +import { RubicSdkError } from 'src/common/errors'; +import { PriceTokenAmount } from 'src/common/tokens'; +import { BLOCKCHAIN_NAME, EvmBlockchainName } from 'src/core/blockchain/models/blockchain-name'; +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'; +import { ContractParams } from 'src/features/common/models/contract-params'; +import { SwapTransactionOptions } from 'src/features/common/models/swap-transaction-options'; +import { CROSS_CHAIN_TRADE_TYPE } from 'src/features/cross-chain/calculation-manager/models/cross-chain-trade-type'; +import { outboxAbi } from 'src/features/cross-chain/calculation-manager/providers/arbitrum-rbc-bridge/constants/outbox-abi'; +import { retryableFactoryAbi } from 'src/features/cross-chain/calculation-manager/providers/arbitrum-rbc-bridge/constants/retryable-factory-abi'; +import { CbridgeCrossChainSupportedBlockchain } from 'src/features/cross-chain/calculation-manager/providers/cbridge/constants/cbridge-supported-blockchains'; +import { EvmCrossChainTrade } from 'src/features/cross-chain/calculation-manager/providers/common/emv-cross-chain-trade/evm-cross-chain-trade'; +import { GasData } from 'src/features/cross-chain/calculation-manager/providers/common/emv-cross-chain-trade/models/gas-data'; +import { BRIDGE_TYPE } from 'src/features/cross-chain/calculation-manager/providers/common/models/bridge-type'; +import { FeeInfo } from 'src/features/cross-chain/calculation-manager/providers/common/models/fee-info'; +import { GetContractParamsOptions } from 'src/features/cross-chain/calculation-manager/providers/common/models/get-contract-params-options'; +import { TradeInfo } from 'src/features/cross-chain/calculation-manager/providers/common/models/trade-info'; +import { l1Erc20ScrollGatewayAbi } from 'src/features/cross-chain/calculation-manager/providers/scroll-bridge/constants/l1-erc20-scroll-gateway-abi'; +import { l2Erc20ScrollGatewayAbi } from 'src/features/cross-chain/calculation-manager/providers/scroll-bridge/constants/l2-erc20-scroll-gateway-abi'; +import { scrollBridgeContractAddress } from 'src/features/cross-chain/calculation-manager/providers/scroll-bridge/constants/scroll-bridge-contract-address'; +import { TransactionReceipt } from 'web3-eth'; + +import { convertGasDataToBN } from '../../utils/convert-gas-price'; +import { ScrollBridgeSupportedBlockchain } from './models/scroll-bridge-supported-blockchain'; + +export class ScrollBridgeTrade extends EvmCrossChainTrade { + /** @internal */ + public static async getGasData( + from: PriceTokenAmount, + to: PriceTokenAmount + ): Promise { + const fromBlockchain = from.blockchain as CbridgeCrossChainSupportedBlockchain; + const walletAddress = + Injector.web3PrivateService.getWeb3PrivateByBlockchain(fromBlockchain).address; + if (!walletAddress) { + return null; + } + + try { + const { contractAddress, contractAbi, methodName, methodArguments, value } = + await new ScrollBridgeTrade( + { + from, + to, + gasData: null + }, + EvmWeb3Pure.EMPTY_ADDRESS + ).getContractParams({}); + + const web3Public = Injector.web3PublicService.getWeb3Public(fromBlockchain); + const [gasLimit, gasDetails] = await Promise.all([ + web3Public.getEstimatedGas( + contractAbi, + contractAddress, + methodName, + methodArguments, + walletAddress, + value + ), + convertGasDataToBN(await Injector.gasPriceApi.getGasPrice(from.blockchain)) + ]); + + if (!gasLimit?.isFinite()) { + return null; + } + + const increasedGasLimit = Web3Pure.calculateGasMargin(gasLimit, 1.2); + return { + gasLimit: increasedGasLimit, + ...gasDetails + }; + } catch (_err) { + return null; + } + } + + public readonly onChainSubtype = { from: undefined, to: undefined }; + + public readonly type = CROSS_CHAIN_TRADE_TYPE.SCROLL_BRIDGE; + + public readonly isAggregator = false; + + public readonly bridgeType = BRIDGE_TYPE.SCROLL_BRIDGE; + + public readonly from: PriceTokenAmount; + + public readonly to: PriceTokenAmount; + + public readonly toTokenAmountMin: BigNumber; + + public readonly gasData: GasData | null; + + private get fromBlockchain(): ScrollBridgeSupportedBlockchain { + return this.from.blockchain as ScrollBridgeSupportedBlockchain; + } + + protected get fromContractAddress(): string { + return scrollBridgeContractAddress[this.fromBlockchain]!.providerGateway; + } + + public readonly feeInfo: FeeInfo = {}; + + public readonly onChainTrade = null; + + protected get methodName(): string { + return this.onChainTrade + ? 'swapAndStartBridgeTokensViaGenericCrossChain' + : 'startBridgeTokensViaGenericCrossChain'; + } + + constructor( + crossChainTrade: { + from: PriceTokenAmount; + to: PriceTokenAmount; + gasData: GasData | null; + }, + providerAddress: string + ) { + super(providerAddress); + + this.from = crossChainTrade.from; + this.to = crossChainTrade.to; + this.gasData = crossChainTrade.gasData; + this.toTokenAmountMin = crossChainTrade.to.tokenAmount; + } + + protected async swapDirect(options: SwapTransactionOptions = {}): Promise { + await this.checkTradeErrors(); + await this.checkAllowanceAndApprove(options); + + const { onConfirm, gasLimit, gasPrice, gasPriceOptions } = options; + let transactionHash: string; + const onTransactionHash = (hash: string) => { + if (onConfirm) { + onConfirm(hash); + } + transactionHash = hash; + }; + + // eslint-disable-next-line no-useless-catch + try { + const params = await this.getContractParams(options); + + const { data, to, value } = EvmWeb3Pure.encodeMethodCall( + params.contractAddress, + params.contractAbi, + params.methodName, + params.methodArguments, + params.value + ); + + await this.web3Private.trySendTransaction(to, { + data, + value, + onTransactionHash, + gas: gasLimit, + gasPrice, + gasPriceOptions + }); + + return transactionHash!; + } catch (err) { + throw err; + } + } + + public async getContractParams(options: GetContractParamsOptions): Promise { + console.log(this.from.weiAmount.toFixed()); + if (this.fromBlockchain === BLOCKCHAIN_NAME.GOERLI) { + const methodArguments = [ + ...(this.from.isNative ? [] : [this.from.address]), + ...(options?.receiverAddress ? [options.receiverAddress] : []), + this.from.stringWeiAmount, + '40000' + ]; + const fee = Web3Pure.toWei(0.00001); + + return { + contractAddress: scrollBridgeContractAddress[this.fromBlockchain]!.providerGateway, + contractAbi: l1Erc20ScrollGatewayAbi, + methodName: this.from.isNative ? 'depositETH' : 'depositERC20', + methodArguments, + value: this.from.isNative + ? this.from.weiAmount.plus(fee).toFixed() + : this.from.stringWeiAmount + }; + } + + const methodArguments = [ + ...(this.from.isNative ? [] : [this.from.address]), + ...(options?.receiverAddress ? [options.receiverAddress] : []), + this.from.stringWeiAmount, + '160000' + ]; + const fee = Web3Pure.toWei(0.005); + + return { + contractAddress: scrollBridgeContractAddress[this.fromBlockchain]!.providerGateway, + contractAbi: l2Erc20ScrollGatewayAbi, + methodName: this.from.isNative ? 'withdrawETH' : 'withdrawERC20', + methodArguments, + value: this.from.isNative + ? this.from.weiAmount.plus(fee).toFixed() + : this.from.stringWeiAmount + }; + } + + public getTradeAmountRatio(_fromUsd: BigNumber): BigNumber { + return new BigNumber(1); + } + + public getUsdPrice(): BigNumber { + return this.from.price.multipliedBy(this.from.tokenAmount); + } + + public getTradeInfo(): TradeInfo { + return { + estimatedGas: this.estimatedGas, + feeInfo: this.feeInfo, + priceImpact: null, + slippage: 0 + }; + } + + public static async claimTargetTokens( + sourceTransaction: string, + options: SwapTransactionOptions + ): Promise { + const web3Private = Injector.web3PrivateService.getWeb3PrivateByBlockchain( + BLOCKCHAIN_NAME.ETHEREUM + ); + await web3Private.checkBlockchainCorrect(BLOCKCHAIN_NAME.ETHEREUM); + + const rpcProviders = Injector.web3PublicService.rpcProvider; + const l1Provider = new JsonRpcProvider( + rpcProviders[BLOCKCHAIN_NAME.ETHEREUM]!.rpcList[0]!, + 1 + ); + const l2Provider = new JsonRpcProvider( + rpcProviders[BLOCKCHAIN_NAME.ARBITRUM]!.rpcList[0]!, + 42161 + ); + const targetReceipt = await l2Provider.getTransactionReceipt(sourceTransaction); + const l2TxReceipt = new L2TransactionReceipt(targetReceipt); + const [event] = l2TxReceipt.getL2ToL1Events(); + if (!event) { + throw new RubicSdkError('Transaction is not ready'); + } + const messageReader = new L2ToL1MessageReader(l1Provider, event); + + const proof = await messageReader.getOutboxProof(l2Provider); + const l2network = await getL2Network(42161); + + const { onConfirm, gasLimit, gasPrice, gasPriceOptions } = options; + const onTransactionHash = (hash: string) => { + if (onConfirm) { + onConfirm(hash); + } + }; + + return web3Private.tryExecuteContractMethod( + l2network.ethBridge.outbox, + outboxAbi, + 'executeTransaction', + [ + proof, + (event as unknown as { position: EtherBigNumber }).position.toString(), + event.caller, + event.destination, + event.arbBlockNum.toString(), + event.ethBlockNum.toString(), + event.timestamp.toString(), + event.callvalue.toString(), + event.data + ], + { + onTransactionHash, + gas: gasLimit, + gasPrice, + gasPriceOptions + } + ); + } + + public static async redeemTokens( + sourceTransactionHash: string, + options: SwapTransactionOptions + ): Promise { + const rpcProviders = Injector.web3PublicService.rpcProvider; + const l1Provider = new JsonRpcProvider( + rpcProviders[BLOCKCHAIN_NAME.ETHEREUM]!.rpcList[0]!, + 1 + ); + const l2Provider = new JsonRpcProvider( + rpcProviders[BLOCKCHAIN_NAME.ARBITRUM]!.rpcList[0]!, + 42161 + ); + + const receipt = await l1Provider.getTransactionReceipt(sourceTransactionHash); + const messages = await new L1TransactionReceipt(receipt).getL1ToL2Messages(l2Provider); + const creationIdMessage = messages.find(el => el.retryableCreationId); + if (!creationIdMessage) { + throw new RubicSdkError('Can not find creation id message.'); + } + const { retryableCreationId } = creationIdMessage; + + const web3Private = Injector.web3PrivateService.getWeb3PrivateByBlockchain( + BLOCKCHAIN_NAME.ARBITRUM + ); + await web3Private.checkBlockchainCorrect(BLOCKCHAIN_NAME.ARBITRUM); + + const { onConfirm, gasLimit, gasPrice, gasPriceOptions } = options; + const onTransactionHash = (hash: string) => { + if (onConfirm) { + onConfirm(hash); + } + }; + + return web3Private.tryExecuteContractMethod( + '0x000000000000000000000000000000000000006E', + retryableFactoryAbi, + 'redeem', + [retryableCreationId], + { + onTransactionHash, + gas: gasLimit, + gasPrice, + gasPriceOptions + } + ); + } +} diff --git a/src/features/cross-chain/calculation-manager/providers/symbiosis-provider/constants/symbiosis-v2-config.ts b/src/features/cross-chain/calculation-manager/providers/symbiosis-provider/constants/symbiosis-v2-config.ts index 4cb3aea41d..1c40684cd8 100644 --- a/src/features/cross-chain/calculation-manager/providers/symbiosis-provider/constants/symbiosis-v2-config.ts +++ b/src/features/cross-chain/calculation-manager/providers/symbiosis-provider/constants/symbiosis-v2-config.ts @@ -232,6 +232,41 @@ const testnetConfig = { aavePool: '0x0000000000000000000000000000000000000000', creamComptroller: '0x0000000000000000000000000000000000000000', renGatewayRegistry: '0x0000000000000000000000000000000000000000' + }, + { + id: 534353, + rpc: 'https://alpha-rpc.scroll.io/l2', + filterBlockOffset: 2000, + waitForBlocksCount: 20, + stables: [ + { + name: 'Circle USD', + symbol: 'USDC', + address: '0x67aE69Fd63b4fc8809ADc224A9b82Be976039509', + chainId: 534353, + decimals: 6, + icons: { + large: 'https://s2.coinmarketcap.com/static/img/coins/64x64/3408.png', + small: 'https://s2.coinmarketcap.com/static/img/coins/64x64/3408.png' + } + } + ], + nerves: [], + router: '0xDe886ff69fE234c8db2e2694788e73aa6be8d0c7', + dexFee: 30, + metaRouter: '0xAED47A51AeFa6f95A388aDA3c459d94FF46fC4BB', + metaRouterGateway: '0x8Daf3F19dD8a27554BaE525075E90Df4E56a4c46', + bridge: '0x6fa0a77Bb9FC5AC9e9D9C26c101067486291d2B5', + synthesis: '0x0000000000000000000000000000000000000000', + portal: '0x7739E567B9626ca241bdC5528343F92F7e59Af37', + fabric: '0x0000000000000000000000000000000000000000', + multicallRouter: '0x9D15297f42fEf485f2d061a012cfE699Cc49132B', + aavePool: '0x0000000000000000000000000000000000000000', + // aavePoolDataProvider: '0x0000000000000000000000000000000000000000', + creamComptroller: '0x0000000000000000000000000000000000000000', + // creamCompoundLens: '0x0000000000000000000000000000000000000000', + // blocksPerYear: 2336000, + renGatewayRegistry: '0x0000000000000000000000000000000000000000' } ] }; diff --git a/src/features/cross-chain/status-manager/cross-chain-status-manager.ts b/src/features/cross-chain/status-manager/cross-chain-status-manager.ts index e6e7e320b5..29e45d1498 100644 --- a/src/features/cross-chain/status-manager/cross-chain-status-manager.ts +++ b/src/features/cross-chain/status-manager/cross-chain-status-manager.ts @@ -48,6 +48,7 @@ import { import { CrossChainStatus } from 'src/features/cross-chain/status-manager/models/cross-chain-status'; import { CrossChainTradeData } from 'src/features/cross-chain/status-manager/models/cross-chain-trade-data'; import { MultichainStatusApiResponse } from 'src/features/cross-chain/status-manager/models/multichain-status-api-response'; +import { ScrollApiResponse } from 'src/features/cross-chain/status-manager/models/scroll-api-response'; import { BtcStatusResponse, DeBridgeApiStateStatus, @@ -79,7 +80,8 @@ export class CrossChainStatusManager { [CROSS_CHAIN_TRADE_TYPE.CELER_BRIDGE]: this.getCelerBridgeDstSwapStatus, [CROSS_CHAIN_TRADE_TYPE.CHANGENOW]: this.getChangenowDstSwapStatus, [CROSS_CHAIN_TRADE_TYPE.STARGATE]: this.getStargateDstSwapStatus, - [CROSS_CHAIN_TRADE_TYPE.ARBITRUM]: this.getArbitrumBridgeDstSwapStatus + [CROSS_CHAIN_TRADE_TYPE.ARBITRUM]: this.getArbitrumBridgeDstSwapStatus, + [CROSS_CHAIN_TRADE_TYPE.SCROLL_BRIDGE]: this.getScrollBridgeDstSwapStatus }; /** @@ -676,4 +678,20 @@ export class CrossChainStatusManager { return { status: TxStatus.PENDING, hash: null }; } } + + public async getScrollBridgeDstSwapStatus(data: CrossChainTradeData): Promise { + const response = await Injector.httpClient.post( + 'https://alpha-api.scroll.io/bridgehistory/api/txsbyhashes', + { + txs: [data.srcTxHash] + } + ); + const sourceTx = response!.data!.result[0]!; + const targetHash = sourceTx?.finalizeTx?.hash; + if (targetHash) { + return { status: TxStatus.SUCCESS, hash: targetHash }; + } + + return { status: TxStatus.PENDING, hash: null }; + } } diff --git a/src/features/cross-chain/status-manager/models/scroll-api-response.ts b/src/features/cross-chain/status-manager/models/scroll-api-response.ts new file mode 100644 index 0000000000..b88135aa46 --- /dev/null +++ b/src/features/cross-chain/status-manager/models/scroll-api-response.ts @@ -0,0 +1,18 @@ +interface BaseScrollTransaction { + readonly amount: string; + readonly blockNumber: number; + readonly blockTimestamp: string; + readonly hash: string; + readonly isL1: boolean; + readonly to: string; +} + +interface ApiScrollTransaction extends BaseScrollTransaction { + readonly finalizeTx?: BaseScrollTransaction; +} + +export interface ScrollApiResponse { + data: { + readonly result: (ApiScrollTransaction | null)[]; + }; +} diff --git a/src/features/on-chain/calculation-manager/providers/dexes/scroll-testnet/uni-swap-v3-scroll-testnet/uni-swap-v3-scroll-testnet-provider.ts b/src/features/on-chain/calculation-manager/providers/dexes/scroll-testnet/uni-swap-v3-scroll-testnet/uni-swap-v3-scroll-testnet-provider.ts index 9367e47565..8805e584cc 100644 --- a/src/features/on-chain/calculation-manager/providers/dexes/scroll-testnet/uni-swap-v3-scroll-testnet/uni-swap-v3-scroll-testnet-provider.ts +++ b/src/features/on-chain/calculation-manager/providers/dexes/scroll-testnet/uni-swap-v3-scroll-testnet/uni-swap-v3-scroll-testnet-provider.ts @@ -8,11 +8,11 @@ import { ON_CHAIN_TRADE_TYPE, OnChainTradeType } from 'src/features/on-chain/calculation-manager/providers/common/models/on-chain-trade-type'; +import { UNISWAP_V3_SWAP_ROUTER_CONTRACT_ABI } from 'src/features/on-chain/calculation-manager/providers/dexes/common/uniswap-v3-abstract/constants/swap-router-contract-abi'; import { UniswapV3Route } from 'src/features/on-chain/calculation-manager/providers/dexes/common/uniswap-v3-abstract/models/uniswap-v3-route'; import { UniswapV3QuoterController } from 'src/features/on-chain/calculation-manager/providers/dexes/common/uniswap-v3-abstract/utils/quoter-controller/uniswap-v3-quoter-controller'; import { UniswapV3AlgebraTradeStructOmitPath } from 'src/features/on-chain/calculation-manager/providers/dexes/common/uniswap-v3-algebra-abstract/models/uniswap-v3-algebra-trade-struct'; import { UniswapV3AlgebraAbstractProvider } from 'src/features/on-chain/calculation-manager/providers/dexes/common/uniswap-v3-algebra-abstract/uniswap-v3-algebra-abstract-provider'; -import { ALGEBRA_SWAP_ROUTER_CONTRACT_ABI } from 'src/features/on-chain/calculation-manager/providers/dexes/polygon/algebra/constants/swap-router-contract-data'; import { UNI_SWAP_V3_SCROLL_TESTNET_PROVIDER_CONFIGURATION } from 'src/features/on-chain/calculation-manager/providers/dexes/scroll-testnet/uni-swap-v3-scroll-testnet/constants/provider-configuration'; import { UNI_SWAP_V3_SCROLL_TESTNET_ROUTER_CONFIGURATION } from 'src/features/on-chain/calculation-manager/providers/dexes/scroll-testnet/uni-swap-v3-scroll-testnet/constants/router-configuration'; import { UniSwapV3ScrollTestnetTrade } from 'src/features/on-chain/calculation-manager/providers/dexes/scroll-testnet/uni-swap-v3-scroll-testnet/uni-swap-v3-scroll-testnet-trade'; @@ -20,7 +20,7 @@ import { UniSwapV3ScrollTestnetTrade } from 'src/features/on-chain/calculation-m export class UniSwapV3ScrollTestnetProvider extends UniswapV3AlgebraAbstractProvider { public readonly contractAddress = '0xD9880690bd717189cC3Fbe7B9020F27fae7Ac76F'; - protected readonly contractAbi = ALGEBRA_SWAP_ROUTER_CONTRACT_ABI; + protected readonly contractAbi = UNISWAP_V3_SWAP_ROUTER_CONTRACT_ABI; public readonly blockchain = BLOCKCHAIN_NAME.SCROLL_TESTNET; diff --git a/src/features/on-chain/calculation-manager/providers/dexes/scroll-testnet/uni-swap-v3-scroll-testnet/uni-swap-v3-scroll-testnet-trade.ts b/src/features/on-chain/calculation-manager/providers/dexes/scroll-testnet/uni-swap-v3-scroll-testnet/uni-swap-v3-scroll-testnet-trade.ts index 5e0cbd301c..e56495a91c 100644 --- a/src/features/on-chain/calculation-manager/providers/dexes/scroll-testnet/uni-swap-v3-scroll-testnet/uni-swap-v3-scroll-testnet-trade.ts +++ b/src/features/on-chain/calculation-manager/providers/dexes/scroll-testnet/uni-swap-v3-scroll-testnet/uni-swap-v3-scroll-testnet-trade.ts @@ -16,7 +16,7 @@ export class UniSwapV3ScrollTestnetTrade extends UniswapV3AlgebraAbstractTrade { protected readonly contractAbi = UNISWAP_V3_SWAP_ROUTER_CONTRACT_ABI; - protected readonly unwrapWethMethodName = 'unwrapWNativeToken'; + protected readonly unwrapWethMethodName = 'unwrapWETH9'; private readonly route: UniswapV3Route; From f34a9b84503c79e37d587f55954030d6e267541b Mon Sep 17 00:00:00 2001 From: axtezy Date: Fri, 21 Jul 2023 17:14:08 +0200 Subject: [PATCH 06/15] Fix testnet checks --- package.json | 2 +- .../utils/blockchains-info/blockchains-info.ts | 10 ++++++++++ .../providers/cbridge/cbridge-cross-chain-provider.ts | 11 ++++------- .../constants/symbiosis-v2-config.ts | 8 +++----- .../cbridge-manager/cross-chain-cbridge-manager.ts | 3 ++- .../status-manager/cross-chain-status-manager.ts | 8 +++----- 6 files changed, 23 insertions(+), 19 deletions(-) diff --git a/package.json b/package.json index 40831056d0..1e5a4767b5 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "rubic-sdk", - "version": "4.8.0-alpha-testnets.2", + "version": "4.8.0-alpha-testnets.2qw", "description": "Simplify dApp creation", "main": "lib/index.js", "types": "lib/index.d.ts", diff --git a/src/core/blockchain/utils/blockchains-info/blockchains-info.ts b/src/core/blockchain/utils/blockchains-info/blockchains-info.ts index 40679b48cf..64a95240b3 100644 --- a/src/core/blockchain/utils/blockchains-info/blockchains-info.ts +++ b/src/core/blockchain/utils/blockchains-info/blockchains-info.ts @@ -6,6 +6,8 @@ import { BlockchainName, EVM_BLOCKCHAIN_NAME, EvmBlockchainName, + TEST_EVM_BLOCKCHAIN_NAME, + TestnetEvmBlockchain, TronBlockchainName } from 'src/core/blockchain/models/blockchain-name'; import { CHAIN_TYPE } from 'src/core/blockchain/models/chain-type'; @@ -47,6 +49,14 @@ export class BlockchainsInfo { ); } + public static isTestBlockchainName( + blockchainName: BlockchainName + ): blockchainName is TestnetEvmBlockchain { + return Object.values(TEST_EVM_BLOCKCHAIN_NAME).some( + testBlockchainName => testBlockchainName === blockchainName + ); + } + public static isBitcoinBlockchainName( blockchainName: BlockchainName ): blockchainName is BitcoinBlockchainName { diff --git a/src/features/cross-chain/calculation-manager/providers/cbridge/cbridge-cross-chain-provider.ts b/src/features/cross-chain/calculation-manager/providers/cbridge/cbridge-cross-chain-provider.ts index 919c77cb93..f7eedc4df5 100644 --- a/src/features/cross-chain/calculation-manager/providers/cbridge/cbridge-cross-chain-provider.ts +++ b/src/features/cross-chain/calculation-manager/providers/cbridge/cbridge-cross-chain-provider.ts @@ -9,11 +9,8 @@ import { PriceToken, PriceTokenAmount, wrappedNativeTokensList } from 'src/commo import { nativeTokensList } from 'src/common/tokens/constants/native-tokens'; import { PriceTokenAmountStruct } from 'src/common/tokens/price-token-amount'; import { compareAddresses } from 'src/common/utils/blockchain'; -import { - BlockchainName, - EvmBlockchainName, - TEST_EVM_BLOCKCHAIN_NAME -} from 'src/core/blockchain/models/blockchain-name'; +import { BlockchainName, EvmBlockchainName } from 'src/core/blockchain/models/blockchain-name'; +import { BlockchainsInfo } from 'src/core/blockchain/utils/blockchains-info/blockchains-info'; import { blockchainId } from 'src/core/blockchain/utils/blockchains-info/constants/blockchain-id'; import { Web3Pure } from 'src/core/blockchain/web3-pure/web3-pure'; import { Injector } from 'src/core/injector/injector'; @@ -213,7 +210,7 @@ export class CbridgeCrossChainProvider extends CrossChainProvider { toTokenOrNative: PriceToken ): Promise { let fromToken = fromTokenOrNative; - const useTestnet = fromToken.blockchain in TEST_EVM_BLOCKCHAIN_NAME; + const useTestnet = BlockchainsInfo.isTestBlockchainName(fromToken.blockchain); if (fromToken.isNative) { const wrappedFrom = wrappedNativeTokensList[fromTokenOrNative.blockchain]!; const token = await PriceTokenAmount.createToken({ @@ -267,7 +264,7 @@ export class CbridgeCrossChainProvider extends CrossChainProvider { config: CelerConfig ): Promise<{ amount: string; maxSlippage: number; fee: string }> { let tokenSymbol = fromToken.symbol; - const useTestnet = fromToken.blockchain in TEST_EVM_BLOCKCHAIN_NAME; + const useTestnet = BlockchainsInfo.isTestBlockchainName(fromToken.blockchain); if (config.isBridge) { tokenSymbol = config.supportedFromToken?.token.symbol || tokenSymbol; } diff --git a/src/features/cross-chain/calculation-manager/providers/symbiosis-provider/constants/symbiosis-v2-config.ts b/src/features/cross-chain/calculation-manager/providers/symbiosis-provider/constants/symbiosis-v2-config.ts index 1c40684cd8..ff10fb7449 100644 --- a/src/features/cross-chain/calculation-manager/providers/symbiosis-provider/constants/symbiosis-v2-config.ts +++ b/src/features/cross-chain/calculation-manager/providers/symbiosis-provider/constants/symbiosis-v2-config.ts @@ -1,7 +1,5 @@ -import { - BlockchainName, - TEST_EVM_BLOCKCHAIN_NAME -} from 'src/core/blockchain/models/blockchain-name'; +import { BlockchainName } from 'src/core/blockchain/models/blockchain-name'; +import { BlockchainsInfo } from 'src/core/blockchain/utils/blockchains-info/blockchains-info'; import { Config } from 'symbiosis-js-sdk'; const testnetConfig = { @@ -272,7 +270,7 @@ const testnetConfig = { }; export function getSymbiosisV2Config(blockchain: BlockchainName): Config { - if (blockchain in TEST_EVM_BLOCKCHAIN_NAME) { + if (BlockchainsInfo.isTestBlockchainName(blockchain)) { return testnetConfig; } return { diff --git a/src/features/cross-chain/cbridge-manager/cross-chain-cbridge-manager.ts b/src/features/cross-chain/cbridge-manager/cross-chain-cbridge-manager.ts index 0003ca457c..10b07fd47b 100644 --- a/src/features/cross-chain/cbridge-manager/cross-chain-cbridge-manager.ts +++ b/src/features/cross-chain/cbridge-manager/cross-chain-cbridge-manager.ts @@ -13,6 +13,7 @@ import { } from 'src/features/cross-chain/calculation-manager/providers/cbridge/models/cbridge-status-response'; import Web3 from 'web3'; import { TransactionReceipt } from 'web3-eth'; +import {BlockchainsInfo} from "src/core/blockchain/utils/blockchains-info/blockchains-info"; export class CrossChainCbridgeManager { public static async getTransferId( @@ -47,7 +48,7 @@ export class CrossChainCbridgeManager { onTransactionHash: (hash: string) => void ): Promise { try { - const useTestnet = fromBlockchain in TEST_EVM_BLOCKCHAIN_NAME; + const useTestnet = BlockchainsInfo.isTestBlockchainName(fromBlockchain); const transferId = await CrossChainCbridgeManager.getTransferId( sourceTransaction, diff --git a/src/features/cross-chain/status-manager/cross-chain-status-manager.ts b/src/features/cross-chain/status-manager/cross-chain-status-manager.ts index 29e45d1498..7ebfac0e10 100644 --- a/src/features/cross-chain/status-manager/cross-chain-status-manager.ts +++ b/src/features/cross-chain/status-manager/cross-chain-status-manager.ts @@ -10,10 +10,8 @@ import { createClient } from '@layerzerolabs/scan-client'; import { Via } from '@viaprotocol/router-sdk'; import { StatusResponse, TransactionStatus } from 'rango-sdk-basic'; import { RubicSdkError } from 'src/common/errors'; -import { - BLOCKCHAIN_NAME, - TEST_EVM_BLOCKCHAIN_NAME -} from 'src/core/blockchain/models/blockchain-name'; +import { BLOCKCHAIN_NAME } from 'src/core/blockchain/models/blockchain-name'; +import { BlockchainsInfo } from 'src/core/blockchain/utils/blockchains-info/blockchains-info'; import { blockchainId } from 'src/core/blockchain/utils/blockchains-info/constants/blockchain-id'; import { TxStatus } from 'src/core/blockchain/web3-public-service/web3-public/models/tx-status'; import { Injector } from 'src/core/injector/injector'; @@ -549,7 +547,7 @@ export class CrossChainStatusManager { data.srcTxHash, data.fromBlockchain as CbridgeCrossChainSupportedBlockchain ); - const useTestnet = data.fromBlockchain in TEST_EVM_BLOCKCHAIN_NAME; + const useTestnet = BlockchainsInfo.isTestBlockchainName(data.fromBlockchain); const swapData = await CbridgeCrossChainApiService.fetchTradeStatus(transferId, { useTestnet }); From 768e2593da9bef746ce1910358419da935dca90f Mon Sep 17 00:00:00 2001 From: axtezy Date: Fri, 21 Jul 2023 17:39:20 +0200 Subject: [PATCH 07/15] Fix testnet checks --- ...biosis-cross-chain-supported-blockchain.ts | 2 +- .../constants/symbiosis-transit-tokens.ts | 140 ------------------ .../constants/symbiosis-v2-config.ts | 0 .../symbiosis-cross-chain-provider.ts | 48 +++--- .../algebra/algebra-quoter-controller.ts | 8 +- .../quick-swap-v3/quick-swap-v3-provider.ts | 2 + 6 files changed, 35 insertions(+), 165 deletions(-) delete mode 100644 src/features/cross-chain/calculation-manager/providers/symbiosis-provider/constants/symbiosis-transit-tokens.ts delete mode 100644 src/features/cross-chain/calculation-manager/providers/symbiosis-provider/constants/symbiosis-v2-config.ts diff --git a/src/features/cross-chain/calculation-manager/providers/symbiosis-provider/constants/symbiosis-cross-chain-supported-blockchain.ts b/src/features/cross-chain/calculation-manager/providers/symbiosis-provider/constants/symbiosis-cross-chain-supported-blockchain.ts index 3820f96336..a64209ec9e 100644 --- a/src/features/cross-chain/calculation-manager/providers/symbiosis-provider/constants/symbiosis-cross-chain-supported-blockchain.ts +++ b/src/features/cross-chain/calculation-manager/providers/symbiosis-provider/constants/symbiosis-cross-chain-supported-blockchain.ts @@ -13,7 +13,7 @@ export const symbiosisCrossChainSupportedBlockchains = [ BLOCKCHAIN_NAME.ARBITRUM, BLOCKCHAIN_NAME.OPTIMISM, BLOCKCHAIN_NAME.POLYGON_ZKEVM, - BLOCKCHAIN_NAME.LINEA + BLOCKCHAIN_NAME.LINEA, BLOCKCHAIN_NAME.OPTIMISM, // Testnets BLOCKCHAIN_NAME.GOERLI, diff --git a/src/features/cross-chain/calculation-manager/providers/symbiosis-provider/constants/symbiosis-transit-tokens.ts b/src/features/cross-chain/calculation-manager/providers/symbiosis-provider/constants/symbiosis-transit-tokens.ts deleted file mode 100644 index b5e2eb57f1..0000000000 --- a/src/features/cross-chain/calculation-manager/providers/symbiosis-provider/constants/symbiosis-transit-tokens.ts +++ /dev/null @@ -1,140 +0,0 @@ -import { TokenStruct } from 'src/common/tokens/token'; -import { BLOCKCHAIN_NAME } from 'src/core/blockchain/models/blockchain-name'; -import { SymbiosisCrossChainSupportedBlockchain } from 'src/features/cross-chain/calculation-manager/providers/symbiosis-provider/constants/symbiosis-cross-chain-supported-blockchain'; - -export const symbiosisTransitTokens: Record = { - [BLOCKCHAIN_NAME.ETHEREUM]: { - blockchain: BLOCKCHAIN_NAME.ETHEREUM, - address: '0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48', - name: 'USDC', - symbol: 'USDC', - decimals: 6 - }, - [BLOCKCHAIN_NAME.BINANCE_SMART_CHAIN]: { - blockchain: BLOCKCHAIN_NAME.BINANCE_SMART_CHAIN, - address: '0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d', - name: 'USDC', - symbol: 'USDC', - decimals: 18 - }, - [BLOCKCHAIN_NAME.POLYGON]: { - blockchain: BLOCKCHAIN_NAME.POLYGON, - address: '0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174', - name: 'USDC', - symbol: 'USDC', - decimals: 6 - }, - [BLOCKCHAIN_NAME.AVALANCHE]: { - blockchain: BLOCKCHAIN_NAME.AVALANCHE, - address: '0xA7D7079b0FEaD91F3e65f86E8915Cb59c1a4C664', - name: 'USDC', - symbol: 'USDC.e', - decimals: 6 - }, - [BLOCKCHAIN_NAME.BOBA]: { - blockchain: BLOCKCHAIN_NAME.BOBA, - address: '0x66a2a913e447d6b4bf33efbec43aaef87890fbbc', - name: 'USDC', - symbol: 'USDC', - decimals: 6 - }, - [BLOCKCHAIN_NAME.BOBA_BSC]: { - blockchain: BLOCKCHAIN_NAME.BOBA_BSC, - address: '0x9f98f9f312d23d078061962837042b8918e6aff2', - name: 'USDC', - symbol: 'USDC', - decimals: 18 - }, - [BLOCKCHAIN_NAME.BOBA_AVALANCHE]: { - blockchain: BLOCKCHAIN_NAME.BOBA_AVALANCHE, - address: '0x126969743a6d300bab08f303f104f0f7dbafbe20', - name: 'USDC', - symbol: 'USDC', - decimals: 6 - }, - [BLOCKCHAIN_NAME.TELOS]: { - blockchain: BLOCKCHAIN_NAME.TELOS, - address: '0x818ec0a7fe18ff94269904fced6ae3dae6d6dc0b', - name: 'USDC', - symbol: 'USDC', - decimals: 6 - }, - [BLOCKCHAIN_NAME.ZK_SYNC]: { - blockchain: BLOCKCHAIN_NAME.ZK_SYNC, - address: '0x3355df6D4c9C3035724Fd0e3914dE96A5a83aaf4', - name: 'USDC', - symbol: 'USDC', - decimals: 6 - }, - [BLOCKCHAIN_NAME.ARBITRUM]: { - blockchain: BLOCKCHAIN_NAME.ARBITRUM, - address: '0xff970a61a04b1ca14834a43f5de4533ebddb5cc8', - name: 'USDC', - symbol: 'USDC', - decimals: 6 - }, - [BLOCKCHAIN_NAME.OPTIMISM]: { - blockchain: BLOCKCHAIN_NAME.ARBITRUM, - address: '0x7F5c764cBc14f9669B88837ca1490cCa17c31607', - name: 'USDC', - symbol: 'USDC', - decimals: 6 - }, - [BLOCKCHAIN_NAME.POLYGON_ZKEVM]: { - blockchain: BLOCKCHAIN_NAME.POLYGON_ZKEVM, - address: '0xA8CE8aee21bC2A48a5EF670afCc9274C7bbbC035', - name: 'USDC', - symbol: 'USDC', - decimals: 6 - }, - [BLOCKCHAIN_NAME.LINEA]: { - blockchain: BLOCKCHAIN_NAME.LINEA, - address: '0xe5d7c2a44ffddf6b295a15c148167daaaf5cf34f', - name: 'Wrapped Ether', - symbol: 'WETH', - decimals: 18 - }, - // Testnets - [BLOCKCHAIN_NAME.BINANCE_SMART_CHAIN_TESTNET]: { - blockchain: BLOCKCHAIN_NAME.BINANCE_SMART_CHAIN_TESTNET, - address: '0x9a01bf917477dd9f5d715d188618fc8b7350cd22', - name: 'Binance USD', - symbol: 'BUSD', - decimals: 18 - }, - [BLOCKCHAIN_NAME.FUJI]: { - blockchain: BLOCKCHAIN_NAME.FUJI, - address: '0x9a01bf917477dd9f5d715d188618fc8b7350cd22', - name: 'USDT', - symbol: 'USDT', - decimals: 6 - }, - [BLOCKCHAIN_NAME.GOERLI]: { - blockchain: BLOCKCHAIN_NAME.GOERLI, - address: '0x07865c6E87B9F70255377e024ace6630C1Eaa37F', - name: 'USD Coin', - symbol: 'USDC', - decimals: 6 - }, - [BLOCKCHAIN_NAME.MUMBAI]: { - blockchain: BLOCKCHAIN_NAME.MUMBAI, - address: '0x9a01bf917477dd9f5d715d188618fc8b7350cd22', - name: 'USDT', - symbol: 'USDT', - decimals: 6 - } - // [BLOCKCHAIN_NAME.BITCOIN]: { - // blockchain: BLOCKCHAIN_NAME.BITCOIN, - // address: 'No address', - // name: 'Bitcoin', - // symbol: 'BTC', - // decimals: 8 - // } - // [BLOCKCHAIN_NAME.AURORA]: { - // blockchain: BLOCKCHAIN_NAME.AURORA, - // address: '0xb12bfca5a55806aaf64e99521918a4bf0fc40802', - // name: 'USDC', - // symbol: 'USDC', - // decimals: 6 - // } -}; diff --git a/src/features/cross-chain/calculation-manager/providers/symbiosis-provider/constants/symbiosis-v2-config.ts b/src/features/cross-chain/calculation-manager/providers/symbiosis-provider/constants/symbiosis-v2-config.ts deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/src/features/cross-chain/calculation-manager/providers/symbiosis-provider/symbiosis-cross-chain-provider.ts b/src/features/cross-chain/calculation-manager/providers/symbiosis-provider/symbiosis-cross-chain-provider.ts index 96bf532a65..03d34d52db 100644 --- a/src/features/cross-chain/calculation-manager/providers/symbiosis-provider/symbiosis-cross-chain-provider.ts +++ b/src/features/cross-chain/calculation-manager/providers/symbiosis-provider/symbiosis-cross-chain-provider.ts @@ -13,6 +13,7 @@ import { BlockchainName, EvmBlockchainName } from 'src/core/blockchain/models/blockchain-name'; +import { BlockchainsInfo } from 'src/core/blockchain/utils/blockchains-info/blockchains-info'; import { blockchainId } from 'src/core/blockchain/utils/blockchains-info/constants/blockchain-id'; import { Web3PrivateSupportedBlockchain } from 'src/core/blockchain/web3-private-service/models/web-private-supported-blockchain'; import { Web3Pure } from 'src/core/blockchain/web3-pure/web3-pure'; @@ -32,7 +33,6 @@ import { SymbiosisTradeData } from 'src/features/cross-chain/calculation-manager import { SymbiosisCrossChainTrade } from 'src/features/cross-chain/calculation-manager/providers/symbiosis-provider/symbiosis-cross-chain-trade'; import { oneinchApiParams } from 'src/features/on-chain/calculation-manager/providers/dexes/common/oneinch-abstract/constants'; import { Error, ErrorCode, Symbiosis, Token, TokenAmount } from 'symbiosis-js-sdk'; -import {BlockchainsInfo} from "src/core/blockchain/utils/blockchains-info/blockchains-info"; export class SymbiosisCrossChainProvider extends CrossChainProvider { public readonly type = CROSS_CHAIN_TRADE_TYPE.SYMBIOSIS; @@ -116,15 +116,18 @@ export class SymbiosisCrossChainProvider extends CrossChainProvider { const deadline = Math.floor(Date.now() / 1000) + 60 * options.deadline; const slippageTolerance = options.slippageTolerance * 10000; - const trade = await this.getTrade({ - tokenAmountIn, - tokenOut, - fromAddress, - receiverAddress, - refundAddress: fromAddress, - slippage: slippageTolerance, - deadline, - }); + const trade = await this.getTrade( + { + tokenAmountIn, + tokenOut, + fromAddress, + receiverAddress, + refundAddress: fromAddress, + slippage: slippageTolerance, + deadline + }, + symbiosis + ); const { tokenAmountOut, fee: transitTokenFee, inTradeType, outTradeType } = trade; const swapFunction = (fromUserAddress: string, receiver?: string) => { @@ -137,15 +140,18 @@ export class SymbiosisCrossChainProvider extends CrossChainProvider { Web3Pure.toWei(amountIn, from.decimals) ); - return this.getTrade({ - tokenAmountIn, - tokenOut, - fromAddress: fromUserAddress, - receiverAddress, - refundAddress, - slippage: slippageTolerance, - deadline - }); + return this.getTrade( + { + tokenAmountIn, + tokenOut, + fromAddress: fromUserAddress, + receiverAddress, + refundAddress, + slippage: slippageTolerance, + deadline + }, + symbiosis + ); }; const to = new PriceTokenAmount({ @@ -233,8 +239,6 @@ export class SymbiosisCrossChainProvider extends CrossChainProvider { } private async getTrade( - fromBlockchain: BlockchainName, - toBlockchain: BlockchainName, swapParams: { tokenAmountIn: TokenAmount; tokenOut: Token | null; @@ -248,7 +252,7 @@ export class SymbiosisCrossChainProvider extends CrossChainProvider { ): Promise { const swappingParams: SwappingParams = { tokenAmountIn: swapParams.tokenAmountIn, - tokenOut: swapParams.tokenOut, + tokenOut: swapParams.tokenOut!, from: swapParams.fromAddress, to: swapParams.receiverAddress || swapParams.fromAddress, revertableAddress: swapParams.fromAddress, diff --git a/src/features/on-chain/calculation-manager/providers/dexes/common/algebra/algebra-quoter-controller.ts b/src/features/on-chain/calculation-manager/providers/dexes/common/algebra/algebra-quoter-controller.ts index cccb3bb83e..d183eb9541 100644 --- a/src/features/on-chain/calculation-manager/providers/dexes/common/algebra/algebra-quoter-controller.ts +++ b/src/features/on-chain/calculation-manager/providers/dexes/common/algebra/algebra-quoter-controller.ts @@ -26,9 +26,13 @@ interface GetQuoterMethodsDataOptions { export class AlgebraQuoterController implements UniswapV3AlgebraQuoterController { private routerTokens: Token[] | undefined; - private readonly quoterContractABI: AbiItem[]; + protected readonly quoterContractABI: AbiItem[]; - private readonly quoterContractAddress: string; + protected readonly quoterContractAddress: string; + + private readonly blockchainName: BlockchainName; + + private readonly routingTokensAddresses: string[]; constructor( quoterContractABI: AbiItem[], diff --git a/src/features/on-chain/calculation-manager/providers/dexes/polygon/quick-swap-v3/quick-swap-v3-provider.ts b/src/features/on-chain/calculation-manager/providers/dexes/polygon/quick-swap-v3/quick-swap-v3-provider.ts index eeaa245e8c..0c5dfc7b5d 100644 --- a/src/features/on-chain/calculation-manager/providers/dexes/polygon/quick-swap-v3/quick-swap-v3-provider.ts +++ b/src/features/on-chain/calculation-manager/providers/dexes/polygon/quick-swap-v3/quick-swap-v3-provider.ts @@ -30,6 +30,8 @@ export class QuickSwapV3Provider extends UniswapV3AlgebraAbstractProvider Date: Fri, 21 Jul 2023 18:53:00 +0200 Subject: [PATCH 08/15] Add scroll to symbiosis --- package.json | 2 +- .../symbiosis-provider/constants/contract-address-v2.ts | 4 ++++ .../constants/symbiosis-cross-chain-supported-blockchain.ts | 3 ++- 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 7529195caf..fdf9eba51d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "rubic-sdk", - "version": "4.8.0-alpha-testnets.2qw", + "version": "4.8.0-alpha-testnets.2qwer", "description": "Simplify dApp creation", "main": "lib/index.js", "types": "lib/index.d.ts", diff --git a/src/features/cross-chain/calculation-manager/providers/symbiosis-provider/constants/contract-address-v2.ts b/src/features/cross-chain/calculation-manager/providers/symbiosis-provider/constants/contract-address-v2.ts index bc00c711e7..17eba7d4bb 100644 --- a/src/features/cross-chain/calculation-manager/providers/symbiosis-provider/constants/contract-address-v2.ts +++ b/src/features/cross-chain/calculation-manager/providers/symbiosis-provider/constants/contract-address-v2.ts @@ -73,5 +73,9 @@ export const SYMBIOSIS_CONTRACT_ADDRESS_V2: Record< [BLOCKCHAIN_NAME.BINANCE_SMART_CHAIN_TESTNET]: { providerRouter: '0xd3F98c243374D79Bfd9a8ac03964623221D53F0f', providerGateway: '0x4Ee7B1e8Ad6E1682318f1c47F83634dAa1197eEf' + }, + [BLOCKCHAIN_NAME.SCROLL_TESTNET]: { + providerRouter: '0xAED47A51AeFa6f95A388aDA3c459d94FF46fC4BB', + providerGateway: '0x8Daf3F19dD8a27554BaE525075E90Df4E56a4c46' } }; diff --git a/src/features/cross-chain/calculation-manager/providers/symbiosis-provider/constants/symbiosis-cross-chain-supported-blockchain.ts b/src/features/cross-chain/calculation-manager/providers/symbiosis-provider/constants/symbiosis-cross-chain-supported-blockchain.ts index a64209ec9e..a409b83fb0 100644 --- a/src/features/cross-chain/calculation-manager/providers/symbiosis-provider/constants/symbiosis-cross-chain-supported-blockchain.ts +++ b/src/features/cross-chain/calculation-manager/providers/symbiosis-provider/constants/symbiosis-cross-chain-supported-blockchain.ts @@ -19,7 +19,8 @@ export const symbiosisCrossChainSupportedBlockchains = [ BLOCKCHAIN_NAME.GOERLI, BLOCKCHAIN_NAME.BINANCE_SMART_CHAIN_TESTNET, BLOCKCHAIN_NAME.FUJI, - BLOCKCHAIN_NAME.MUMBAI + BLOCKCHAIN_NAME.MUMBAI, + BLOCKCHAIN_NAME.SCROLL_TESTNET ] as const; export type SymbiosisCrossChainSupportedBlockchain = From e4d1a465af956683c8ae302577e7c3401f89b2f2 Mon Sep 17 00:00:00 2001 From: axtezy Date: Thu, 27 Jul 2023 12:05:14 +0200 Subject: [PATCH 09/15] Fix native bridge and symbiosis --- package.json | 4 ++-- .../providers/scroll-bridge/scroll-bridge-provider.ts | 4 ++++ .../status-manager/cross-chain-status-manager.ts | 6 +++--- yarn.lock | 8 ++++---- 4 files changed, 13 insertions(+), 9 deletions(-) diff --git a/package.json b/package.json index 694fdcdadf..dc3115d581 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "rubic-sdk", - "version": "4.8.0-alpha-testnets.2qwer", + "version": "4.8.0-alpha-testnet.3", "description": "Simplify dApp creation", "main": "lib/index.js", "types": "lib/index.d.ts", @@ -91,7 +91,7 @@ "lodash.clonedeep": "^4.5.0", "rango-sdk-basic": "^0.0.7", "rxjs": "7.8.1", - "symbiosis-js-sdk": "2.10.8", + "symbiosis-js-sdk": "^2.10.14", "tronweb": "^4.3.0", "viem": "^1.3.1", "web3": "^1.8.1" diff --git a/src/features/cross-chain/calculation-manager/providers/scroll-bridge/scroll-bridge-provider.ts b/src/features/cross-chain/calculation-manager/providers/scroll-bridge/scroll-bridge-provider.ts index bb24caf5cf..8b699b1b6b 100644 --- a/src/features/cross-chain/calculation-manager/providers/scroll-bridge/scroll-bridge-provider.ts +++ b/src/features/cross-chain/calculation-manager/providers/scroll-bridge/scroll-bridge-provider.ts @@ -75,6 +75,10 @@ export class ScrollBridgeProvider extends CrossChainProvider { throw new RubicSdkError('Swap is not allowed.'); } } + } else { + if (!toToken.isNative) { + throw new RubicSdkError('Swap is not allowed.'); + } } const to = new PriceTokenAmount({ diff --git a/src/features/cross-chain/status-manager/cross-chain-status-manager.ts b/src/features/cross-chain/status-manager/cross-chain-status-manager.ts index c407606999..a5a6a495e9 100644 --- a/src/features/cross-chain/status-manager/cross-chain-status-manager.ts +++ b/src/features/cross-chain/status-manager/cross-chain-status-manager.ts @@ -48,9 +48,9 @@ import { import { CrossChainStatus } from 'src/features/cross-chain/status-manager/models/cross-chain-status'; import { CrossChainTradeData } from 'src/features/cross-chain/status-manager/models/cross-chain-trade-data'; import { MultichainStatusApiResponse } from 'src/features/cross-chain/status-manager/models/multichain-status-api-response'; +import { ScrollApiResponse } from 'src/features/cross-chain/status-manager/models/scroll-api-response'; import { SquidrouterApiResponse } from 'src/features/cross-chain/status-manager/models/squidrouter-api-response'; import { SQUIDROUTER_TRANSFER_STATUS } from 'src/features/cross-chain/status-manager/models/squidrouter-transfer-status.enum'; -import { ScrollApiResponse } from 'src/features/cross-chain/status-manager/models/scroll-api-response'; import { BtcStatusResponse, DE_BRIDGE_API_STATE_STATUS, @@ -627,9 +627,9 @@ export class CrossChainStatusManager { const sourceTx = response!.data!.result[0]!; const targetHash = sourceTx?.finalizeTx?.hash; if (targetHash) { - return { status: TxStatus.SUCCESS, hash: targetHash }; + return { status: TX_STATUS.SUCCESS, hash: targetHash }; } - return { status: TxStatus.PENDING, hash: null }; + return { status: TX_STATUS.PENDING, hash: null }; } } diff --git a/yarn.lock b/yarn.lock index cdb1271b19..9f3aeffc91 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7361,10 +7361,10 @@ swarm-js@^0.1.40: tar "^4.0.2" xhr-request "^1.0.1" -symbiosis-js-sdk@2.10.8: - version "2.10.8" - resolved "https://registry.yarnpkg.com/symbiosis-js-sdk/-/symbiosis-js-sdk-2.10.8.tgz#c6196cfe5243b079b59c9b4e0a2044530f36771d" - integrity sha512-50/XTh3dAuMVxnooyPQ1a9yFXPEeQgF2naU8B17I44cAZlTrwZzEaGeRe8pOKfkCTxplVDNjgJa7m/5Z3KKnoQ== +symbiosis-js-sdk@^2.10.14: + version "2.10.14" + resolved "https://registry.yarnpkg.com/symbiosis-js-sdk/-/symbiosis-js-sdk-2.10.14.tgz#45d5c3769d21583ff751558aa11202f5aa5ef8b6" + integrity sha512-6JfWsNOOA+uIIxuXulq1eg0qSsQqMQZwVnym7d4hB39fGFNh9oxVcyYvsfxJnKWod/I++dYeYyfnv9RUOh7P5w== dependencies: big.js "^5.2.2" bignumber.js "^9.0.1" From 14577732ec5a1cb9a91078c8178d09b6adbbf7eb Mon Sep 17 00:00:00 2001 From: axtezy Date: Mon, 7 Aug 2023 13:18:11 +0200 Subject: [PATCH 10/15] Fix abi --- package.json | 2 +- .../constants/scroll-trade-abi | 140 ++++++++++++++++++ .../uni-swap-v3-scroll-testnet-provider.ts | 4 +- .../uni-swap-v3-scroll-testnet-trade.ts | 6 +- 4 files changed, 145 insertions(+), 7 deletions(-) create mode 100644 src/features/on-chain/calculation-manager/providers/dexes/scroll-testnet/uni-swap-v3-scroll-testnet/constants/scroll-trade-abi diff --git a/package.json b/package.json index dc3115d581..c7b04875fd 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "rubic-sdk", - "version": "4.8.0-alpha-testnet.3", + "version": "4.8.0-alpha-testnet.4", "description": "Simplify dApp creation", "main": "lib/index.js", "types": "lib/index.d.ts", diff --git a/src/features/on-chain/calculation-manager/providers/dexes/scroll-testnet/uni-swap-v3-scroll-testnet/constants/scroll-trade-abi b/src/features/on-chain/calculation-manager/providers/dexes/scroll-testnet/uni-swap-v3-scroll-testnet/constants/scroll-trade-abi new file mode 100644 index 0000000000..91ee089966 --- /dev/null +++ b/src/features/on-chain/calculation-manager/providers/dexes/scroll-testnet/uni-swap-v3-scroll-testnet/constants/scroll-trade-abi @@ -0,0 +1,140 @@ +import { AbiItem } from 'web3-utils'; + +export const SCROLL_UNISWAP_V3_SWAP_ROUTER_CONTRACT_ABI: AbiItem[] = [ + { + type: 'function', + stateMutability: 'payable', + outputs: [{ type: 'uint256', name: 'amountOut', internalType: 'uint256' }], + name: 'exactInput', + inputs: [ + { + type: 'tuple', + name: 'params', + internalType: 'struct IV3SwapRouter.ExactInputParams', + components: [ + { type: 'bytes', name: 'path', internalType: 'bytes' }, + { type: 'address', name: 'recipient', internalType: 'address' }, + { type: 'uint256', name: 'amountIn', internalType: 'uint256' }, + { type: 'uint256', name: 'amountOutMinimum', internalType: 'uint256' } + ] + } + ] + }, + { + type: 'function', + stateMutability: 'payable', + outputs: [{ type: 'uint256', name: 'amountOut', internalType: 'uint256' }], + name: 'exactInputSingle', + inputs: [ + { + type: 'tuple', + name: 'params', + internalType: 'struct IV3SwapRouter.ExactInputSingleParams', + components: [ + { type: 'address', name: 'tokenIn', internalType: 'address' }, + { type: 'address', name: 'tokenOut', internalType: 'address' }, + { type: 'uint24', name: 'fee', internalType: 'uint24' }, + { type: 'address', name: 'recipient', internalType: 'address' }, + { type: 'uint256', name: 'amountIn', internalType: 'uint256' }, + { type: 'uint256', name: 'amountOutMinimum', internalType: 'uint256' }, + { type: 'uint160', name: 'sqrtPriceLimitX96', internalType: 'uint160' } + ] + } + ] + }, + { + type: 'function', + stateMutability: 'payable', + outputs: [{ type: 'uint256', name: 'amountIn', internalType: 'uint256' }], + name: 'exactOutput', + inputs: [ + { + type: 'tuple', + name: 'params', + internalType: 'struct IV3SwapRouter.ExactOutputParams', + components: [ + { type: 'bytes', name: 'path', internalType: 'bytes' }, + { type: 'address', name: 'recipient', internalType: 'address' }, + { type: 'uint256', name: 'amountOut', internalType: 'uint256' }, + { type: 'uint256', name: 'amountInMaximum', internalType: 'uint256' } + ] + } + ] + }, + { + type: 'function', + stateMutability: 'payable', + outputs: [{ type: 'uint256', name: 'amountIn', internalType: 'uint256' }], + name: 'exactOutputSingle', + inputs: [ + { + type: 'tuple', + name: 'params', + internalType: 'struct IV3SwapRouter.ExactOutputSingleParams', + components: [ + { type: 'address', name: 'tokenIn', internalType: 'address' }, + { type: 'address', name: 'tokenOut', internalType: 'address' }, + { type: 'uint24', name: 'fee', internalType: 'uint24' }, + { type: 'address', name: 'recipient', internalType: 'address' }, + { type: 'uint256', name: 'amountOut', internalType: 'uint256' }, + { type: 'uint256', name: 'amountInMaximum', internalType: 'uint256' }, + { type: 'uint160', name: 'sqrtPriceLimitX96', internalType: 'uint160' } + ] + } + ] + }, + { + type: 'function', + stateMutability: 'payable', + outputs: [{ type: 'bytes[]', name: 'results', internalType: 'bytes[]' }], + name: 'multicall', + inputs: [{ type: 'bytes[]', name: 'data', internalType: 'bytes[]' }] + }, + { + type: 'function', + stateMutability: 'payable', + outputs: [], + name: 'unwrapWETH9', + inputs: [ + { type: 'uint256', name: 'amountMinimum', internalType: 'uint256' }, + { type: 'address', name: 'recipient', internalType: 'address' } + ] + }, + { + type: 'function', + stateMutability: 'payable', + outputs: [], + name: 'unwrapWETH9', + inputs: [{ type: 'uint256', name: 'amountMinimum', internalType: 'uint256' }] + }, + { + type: 'function', + stateMutability: 'payable', + outputs: [], + name: 'unwrapWETH9WithFee', + inputs: [ + { type: 'uint256', name: 'amountMinimum', internalType: 'uint256' }, + { type: 'address', name: 'recipient', internalType: 'address' }, + { type: 'uint256', name: 'feeBips', internalType: 'uint256' }, + { type: 'address', name: 'feeRecipient', internalType: 'address' } + ] + }, + { + type: 'function', + stateMutability: 'payable', + outputs: [], + name: 'unwrapWETH9WithFee', + inputs: [ + { type: 'uint256', name: 'amountMinimum', internalType: 'uint256' }, + { type: 'uint256', name: 'feeBips', internalType: 'uint256' }, + { type: 'address', name: 'feeRecipient', internalType: 'address' } + ] + }, + { + type: 'function', + stateMutability: 'payable', + outputs: [], + name: 'wrapETH', + inputs: [{ type: 'uint256', name: 'value', internalType: 'uint256' }] + } +]; diff --git a/src/features/on-chain/calculation-manager/providers/dexes/scroll-testnet/uni-swap-v3-scroll-testnet/uni-swap-v3-scroll-testnet-provider.ts b/src/features/on-chain/calculation-manager/providers/dexes/scroll-testnet/uni-swap-v3-scroll-testnet/uni-swap-v3-scroll-testnet-provider.ts index 8805e584cc..5b6dfea85e 100644 --- a/src/features/on-chain/calculation-manager/providers/dexes/scroll-testnet/uni-swap-v3-scroll-testnet/uni-swap-v3-scroll-testnet-provider.ts +++ b/src/features/on-chain/calculation-manager/providers/dexes/scroll-testnet/uni-swap-v3-scroll-testnet/uni-swap-v3-scroll-testnet-provider.ts @@ -8,11 +8,11 @@ import { ON_CHAIN_TRADE_TYPE, OnChainTradeType } from 'src/features/on-chain/calculation-manager/providers/common/models/on-chain-trade-type'; -import { UNISWAP_V3_SWAP_ROUTER_CONTRACT_ABI } from 'src/features/on-chain/calculation-manager/providers/dexes/common/uniswap-v3-abstract/constants/swap-router-contract-abi'; import { UniswapV3Route } from 'src/features/on-chain/calculation-manager/providers/dexes/common/uniswap-v3-abstract/models/uniswap-v3-route'; import { UniswapV3QuoterController } from 'src/features/on-chain/calculation-manager/providers/dexes/common/uniswap-v3-abstract/utils/quoter-controller/uniswap-v3-quoter-controller'; import { UniswapV3AlgebraTradeStructOmitPath } from 'src/features/on-chain/calculation-manager/providers/dexes/common/uniswap-v3-algebra-abstract/models/uniswap-v3-algebra-trade-struct'; import { UniswapV3AlgebraAbstractProvider } from 'src/features/on-chain/calculation-manager/providers/dexes/common/uniswap-v3-algebra-abstract/uniswap-v3-algebra-abstract-provider'; +import { SCROLL_UNISWAP_V3_SWAP_ROUTER_CONTRACT_ABI } from 'src/features/on-chain/calculation-manager/providers/dexes/scroll-testnet/uni-swap-v3-scroll-testnet/constants/scroll-trade-abi'; import { UNI_SWAP_V3_SCROLL_TESTNET_PROVIDER_CONFIGURATION } from 'src/features/on-chain/calculation-manager/providers/dexes/scroll-testnet/uni-swap-v3-scroll-testnet/constants/provider-configuration'; import { UNI_SWAP_V3_SCROLL_TESTNET_ROUTER_CONFIGURATION } from 'src/features/on-chain/calculation-manager/providers/dexes/scroll-testnet/uni-swap-v3-scroll-testnet/constants/router-configuration'; import { UniSwapV3ScrollTestnetTrade } from 'src/features/on-chain/calculation-manager/providers/dexes/scroll-testnet/uni-swap-v3-scroll-testnet/uni-swap-v3-scroll-testnet-trade'; @@ -20,7 +20,7 @@ import { UniSwapV3ScrollTestnetTrade } from 'src/features/on-chain/calculation-m export class UniSwapV3ScrollTestnetProvider extends UniswapV3AlgebraAbstractProvider { public readonly contractAddress = '0xD9880690bd717189cC3Fbe7B9020F27fae7Ac76F'; - protected readonly contractAbi = UNISWAP_V3_SWAP_ROUTER_CONTRACT_ABI; + protected readonly contractAbi = SCROLL_UNISWAP_V3_SWAP_ROUTER_CONTRACT_ABI; public readonly blockchain = BLOCKCHAIN_NAME.SCROLL_TESTNET; diff --git a/src/features/on-chain/calculation-manager/providers/dexes/scroll-testnet/uni-swap-v3-scroll-testnet/uni-swap-v3-scroll-testnet-trade.ts b/src/features/on-chain/calculation-manager/providers/dexes/scroll-testnet/uni-swap-v3-scroll-testnet/uni-swap-v3-scroll-testnet-trade.ts index e56495a91c..d3637de732 100644 --- a/src/features/on-chain/calculation-manager/providers/dexes/scroll-testnet/uni-swap-v3-scroll-testnet/uni-swap-v3-scroll-testnet-trade.ts +++ b/src/features/on-chain/calculation-manager/providers/dexes/scroll-testnet/uni-swap-v3-scroll-testnet/uni-swap-v3-scroll-testnet-trade.ts @@ -5,16 +5,16 @@ import { ON_CHAIN_TRADE_TYPE, OnChainTradeType } from 'src/features/on-chain/calculation-manager/providers/common/models/on-chain-trade-type'; -import { UNISWAP_V3_SWAP_ROUTER_CONTRACT_ABI } from 'src/features/on-chain/calculation-manager/providers/dexes/common/uniswap-v3-abstract/constants/swap-router-contract-abi'; import { UniswapV3Route } from 'src/features/on-chain/calculation-manager/providers/dexes/common/uniswap-v3-abstract/models/uniswap-v3-route'; import { UniswapV3TradeStruct } from 'src/features/on-chain/calculation-manager/providers/dexes/common/uniswap-v3-abstract/models/uniswap-v3-trade-struct'; import { UniswapV3QuoterController } from 'src/features/on-chain/calculation-manager/providers/dexes/common/uniswap-v3-abstract/utils/quoter-controller/uniswap-v3-quoter-controller'; import { UniswapV3AlgebraAbstractTrade } from 'src/features/on-chain/calculation-manager/providers/dexes/common/uniswap-v3-algebra-abstract/uniswap-v3-algebra-abstract-trade'; +import { SCROLL_UNISWAP_V3_SWAP_ROUTER_CONTRACT_ABI } from 'src/features/on-chain/calculation-manager/providers/dexes/scroll-testnet/uni-swap-v3-scroll-testnet/constants/scroll-trade-abi'; export class UniSwapV3ScrollTestnetTrade extends UniswapV3AlgebraAbstractTrade { public readonly dexContractAddress = '0xD9880690bd717189cC3Fbe7B9020F27fae7Ac76F'; - protected readonly contractAbi = UNISWAP_V3_SWAP_ROUTER_CONTRACT_ABI; + protected readonly contractAbi = SCROLL_UNISWAP_V3_SWAP_ROUTER_CONTRACT_ABI; protected readonly unwrapWethMethodName = 'unwrapWETH9'; @@ -62,7 +62,6 @@ export class UniSwapV3ScrollTestnetTrade extends UniswapV3AlgebraAbstractTrade { toTokenAddress, this.route.poolsPath[0].fee, walletAddress, - this.deadlineMinutesTimestamp, ...amountParams, 0 ] @@ -81,7 +80,6 @@ export class UniSwapV3ScrollTestnetTrade extends UniswapV3AlgebraAbstractTrade { this.route.initialTokenAddress ), walletAddress, - this.deadlineMinutesTimestamp, ...amountParams ] ] From cdb6077adb8b1e85617e57507bc546913eb02e1c Mon Sep 17 00:00:00 2001 From: axtezy Date: Mon, 14 Aug 2023 09:45:35 +0200 Subject: [PATCH 11/15] Refactor uni v3 like providers and quoter controllers --- package.json | 2 +- .../algebra/algebra-quoter-controller.ts | 43 ++++++++----------- .../quickswap-v3-quoter-controller.ts | 11 ----- ...horizondex-uniswap-v3-quoter-controller.ts | 23 +++++----- .../uniswap-v3-quoter-controller.ts | 16 ++++--- .../uniswap-v3-algebra-quoter-controller.ts | 12 +++++- .../linea/horizondex/horizondex-provider.ts | 8 +--- .../quick-swap-v3/quick-swap-v3-provider.ts | 6 +-- .../dexes/polygon/algebra/algebra-provider.ts | 6 +-- .../quick-swap-v3/quick-swap-v3-provider.ts | 6 +-- .../{scroll-trade-abi => scroll-trade-abi.ts} | 0 .../uni-swap-v3-scroll-testnet-provider.ts | 4 +- 12 files changed, 63 insertions(+), 74 deletions(-) rename src/features/on-chain/calculation-manager/providers/dexes/scroll-testnet/uni-swap-v3-scroll-testnet/constants/{scroll-trade-abi => scroll-trade-abi.ts} (100%) diff --git a/package.json b/package.json index fdc186f547..2764af2bb1 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "rubic-sdk", - "version": "4.8.0-alpha-testnet.4", + "version": "4.8.0-alpha-testnet.5", "description": "Simplify dApp creation", "main": "lib/index.js", "types": "lib/index.d.ts", diff --git a/src/features/on-chain/calculation-manager/providers/dexes/common/algebra/algebra-quoter-controller.ts b/src/features/on-chain/calculation-manager/providers/dexes/common/algebra/algebra-quoter-controller.ts index d183eb9541..3717a898e8 100644 --- a/src/features/on-chain/calculation-manager/providers/dexes/common/algebra/algebra-quoter-controller.ts +++ b/src/features/on-chain/calculation-manager/providers/dexes/common/algebra/algebra-quoter-controller.ts @@ -2,12 +2,16 @@ import BigNumber from 'bignumber.js'; import { RubicSdkError } from 'src/common/errors'; import { PriceToken, Token } from 'src/common/tokens'; import { notNull } from 'src/common/utils/object'; -import { BlockchainName } from 'src/core/blockchain/models/blockchain-name'; +import { EvmBlockchainName } from 'src/core/blockchain/models/blockchain-name'; import { EvmWeb3Public } from 'src/core/blockchain/web3-public-service/web3-public/evm-web3-public/evm-web3-public'; import { ContractMulticallResponse } from 'src/core/blockchain/web3-public-service/web3-public/models/contract-multicall-response'; import { MethodData } from 'src/core/blockchain/web3-public-service/web3-public/models/method-data'; import { Injector } from 'src/core/injector/injector'; import { Exact } from 'src/features/on-chain/calculation-manager/providers/common/on-chain-trade/evm-on-chain-trade/models/exact'; +import { + UNISWAP_V3_QUOTER_CONTRACT_ABI, + UNISWAP_V3_QUOTER_CONTRACT_ADDRESS +} from 'src/features/on-chain/calculation-manager/providers/dexes/common/uniswap-v3-abstract/utils/quoter-controller/constants/quoter-contract-data'; import { UniswapV3AlgebraQuoterController } from 'src/features/on-chain/calculation-manager/providers/dexes/common/uniswap-v3-algebra-abstract/models/uniswap-v3-algebra-quoter-controller'; import { AlgebraRoute } from 'src/features/on-chain/calculation-manager/providers/dexes/polygon/algebra/models/algebra-route'; import { AbiItem } from 'web3-utils'; @@ -23,28 +27,8 @@ interface GetQuoterMethodsDataOptions { /** * Works with requests, related to Uniswap v3 liquidity pools. */ -export class AlgebraQuoterController implements UniswapV3AlgebraQuoterController { - private routerTokens: Token[] | undefined; - - protected readonly quoterContractABI: AbiItem[]; - - protected readonly quoterContractAddress: string; - - private readonly blockchainName: BlockchainName; - - private readonly routingTokensAddresses: string[]; - - constructor( - quoterContractABI: AbiItem[], - quoterContractAddress: string, - blockchainName: BlockchainName, - routerTokens: string[] - ) { - this.quoterContractABI = quoterContractABI; - this.quoterContractAddress = quoterContractAddress; - this.blockchainName = blockchainName; - this.routingTokensAddresses = routerTokens; - } +export class AlgebraQuoterController extends UniswapV3AlgebraQuoterController { + protected routerTokens: Token[] | undefined; /** * Converts algebra route to encoded bytes string to pass it to contract. @@ -99,14 +83,23 @@ export class AlgebraQuoterController implements UniswapV3AlgebraQuoterController } protected get web3Public(): EvmWeb3Public { - return Injector.web3PublicService.getWeb3Public(this.blockchainName); + return Injector.web3PublicService.getWeb3Public(this.blockchain); + } + + constructor( + protected readonly blockchain: EvmBlockchainName, + protected readonly routingTokensAddresses: string[], + protected readonly quoterContractAddress: string = UNISWAP_V3_QUOTER_CONTRACT_ADDRESS, + protected readonly quoterContractABI: AbiItem[] = UNISWAP_V3_QUOTER_CONTRACT_ABI + ) { + super(); } protected async getOrCreateRouterTokens(): Promise { if (!this.routerTokens) { this.routerTokens = await Token.createTokens( this.routingTokensAddresses, - this.blockchainName + this.blockchain ); } diff --git a/src/features/on-chain/calculation-manager/providers/dexes/common/quickswap-v3/quickswap-v3-quoter-controller.ts b/src/features/on-chain/calculation-manager/providers/dexes/common/quickswap-v3/quickswap-v3-quoter-controller.ts index 9516733565..52447b2f3c 100644 --- a/src/features/on-chain/calculation-manager/providers/dexes/common/quickswap-v3/quickswap-v3-quoter-controller.ts +++ b/src/features/on-chain/calculation-manager/providers/dexes/common/quickswap-v3/quickswap-v3-quoter-controller.ts @@ -2,11 +2,9 @@ import BigNumber from 'bignumber.js'; import { RubicSdkError } from 'src/common/errors'; import { PriceToken, Token } from 'src/common/tokens'; import { notNull } from 'src/common/utils/object'; -import { BlockchainName } from 'src/core/blockchain/models/blockchain-name'; import { Exact } from 'src/features/on-chain/calculation-manager/providers/common/on-chain-trade/evm-on-chain-trade/models/exact'; import { AlgebraQuoterController } from 'src/features/on-chain/calculation-manager/providers/dexes/common/algebra/algebra-quoter-controller'; import { AlgebraRoute } from 'src/features/on-chain/calculation-manager/providers/dexes/polygon/algebra/models/algebra-route'; -import { AbiItem } from 'web3-utils'; interface GetQuoterMethodsDataOptions { routesTokens: Token[]; @@ -20,15 +18,6 @@ interface GetQuoterMethodsDataOptions { * Works with requests, related to Uniswap v3 liquidity pools. */ export class QuickswapV3QuoterController extends AlgebraQuoterController { - constructor( - quoterContractABI: AbiItem[], - quoterContractAddress: string, - blockchainName: BlockchainName, - routerTokens: string[] - ) { - super(quoterContractABI, quoterContractAddress, blockchainName, routerTokens); - } - public async getAllRoutes( from: PriceToken, to: PriceToken, diff --git a/src/features/on-chain/calculation-manager/providers/dexes/common/uniswap-v3-abstract/utils/quoter-controller/horizondex-uniswap-v3-quoter-controller.ts b/src/features/on-chain/calculation-manager/providers/dexes/common/uniswap-v3-abstract/utils/quoter-controller/horizondex-uniswap-v3-quoter-controller.ts index 1bcc9ae430..4745e64440 100644 --- a/src/features/on-chain/calculation-manager/providers/dexes/common/uniswap-v3-abstract/utils/quoter-controller/horizondex-uniswap-v3-quoter-controller.ts +++ b/src/features/on-chain/calculation-manager/providers/dexes/common/uniswap-v3-abstract/utils/quoter-controller/horizondex-uniswap-v3-quoter-controller.ts @@ -10,12 +10,14 @@ import { Exact } from 'src/features/on-chain/calculation-manager/providers/commo import { UniswapV3Route } from 'src/features/on-chain/calculation-manager/providers/dexes/common/uniswap-v3-abstract/models/uniswap-v3-route'; import { UniswapV3RouterConfiguration } from 'src/features/on-chain/calculation-manager/providers/dexes/common/uniswap-v3-abstract/models/uniswap-v3-router-configuration'; import { - UNISWAP_V3_QUOTER_CONTRACT_ABI, - UNISWAP_V3_QUOTER_CONTRACT_ADDRESS -} from 'src/features/on-chain/calculation-manager/providers/dexes/common/uniswap-v3-abstract/utils/quoter-controller/constants/quoter-contract-data'; -import { LiquidityPool } from 'src/features/on-chain/calculation-manager/providers/dexes/common/uniswap-v3-abstract/utils/quoter-controller/models/liquidity-pool'; + FeeAmount, + LiquidityPool +} from 'src/features/on-chain/calculation-manager/providers/dexes/common/uniswap-v3-abstract/utils/quoter-controller/models/liquidity-pool'; import { UniswapV3QuoterController } from 'src/features/on-chain/calculation-manager/providers/dexes/common/uniswap-v3-abstract/utils/quoter-controller/uniswap-v3-quoter-controller'; -import { AbiItem } from 'web3-utils'; +import { + HORIZONDEX_QUOTER_CONTRACT_ABI, + HORIZONDEX_QUOTER_CONTRACT_ADDRESS +} from 'src/features/on-chain/calculation-manager/providers/dexes/linea/horizondex/utils/quoter-controller/constants/quoter-contract-data'; interface GetQuoterMethodsDataOptions { routesLiquidityPools: LiquidityPool[]; @@ -26,18 +28,17 @@ interface GetQuoterMethodsDataOptions { maxTransitTokens: number; } export class HorizondexUniswapV3QuoterController extends UniswapV3QuoterController { + protected readonly feeAmounts: FeeAmount[] = [300, 500, 1000, 3000, 10000]; + constructor( blockchain: EvmBlockchainName, - routerConfiguration: UniswapV3RouterConfiguration, - quoterContractAddress: string = UNISWAP_V3_QUOTER_CONTRACT_ADDRESS, - quoterContractABI: AbiItem[] = UNISWAP_V3_QUOTER_CONTRACT_ABI + routerConfiguration: UniswapV3RouterConfiguration ) { super( blockchain, routerConfiguration, - quoterContractAddress, - quoterContractABI, - [300, 500, 1000, 3000, 10000] + HORIZONDEX_QUOTER_CONTRACT_ADDRESS, + HORIZONDEX_QUOTER_CONTRACT_ABI ); } diff --git a/src/features/on-chain/calculation-manager/providers/dexes/common/uniswap-v3-abstract/utils/quoter-controller/uniswap-v3-quoter-controller.ts b/src/features/on-chain/calculation-manager/providers/dexes/common/uniswap-v3-abstract/utils/quoter-controller/uniswap-v3-quoter-controller.ts index 6f3a23feb3..7e1a4f37a0 100644 --- a/src/features/on-chain/calculation-manager/providers/dexes/common/uniswap-v3-abstract/utils/quoter-controller/uniswap-v3-quoter-controller.ts +++ b/src/features/on-chain/calculation-manager/providers/dexes/common/uniswap-v3-abstract/utils/quoter-controller/uniswap-v3-quoter-controller.ts @@ -39,7 +39,7 @@ interface GetQuoterMethodsDataOptions { /** * Works with requests, related to Uniswap v3 liquidity pools. */ -export class UniswapV3QuoterController implements UniswapV3AlgebraQuoterController { +export class UniswapV3QuoterController extends UniswapV3AlgebraQuoterController { /** * Converts uni v3 route to encoded bytes string to pass it to contract. * Structure of encoded string: '0x${tokenAddress_0}${toHex(fee_0)}${tokenAddress_1}${toHex(fee_1)}...${tokenAddress_n}. @@ -127,12 +127,14 @@ export class UniswapV3QuoterController implements UniswapV3AlgebraQuoterControll } constructor( - private readonly blockchain: EvmBlockchainName, - private readonly routerConfiguration: UniswapV3RouterConfiguration, - private readonly quoterContractAddress: string = UNISWAP_V3_QUOTER_CONTRACT_ADDRESS, - private readonly quoterContractABI: AbiItem[] = UNISWAP_V3_QUOTER_CONTRACT_ABI, - private readonly factoryAddress = FACTORY_CONTRACT_ADDRESS, - ) {} + protected readonly blockchain: EvmBlockchainName, + protected readonly routerConfiguration: UniswapV3RouterConfiguration, + protected readonly quoterContractAddress: string = UNISWAP_V3_QUOTER_CONTRACT_ADDRESS, + protected readonly quoterContractABI: AbiItem[] = UNISWAP_V3_QUOTER_CONTRACT_ABI, + protected readonly factoryAddress: string = FACTORY_CONTRACT_ADDRESS + ) { + super(); + } private async getOrCreateRouterTokensAndLiquidityPools(): Promise<{ routerTokens: Token[]; diff --git a/src/features/on-chain/calculation-manager/providers/dexes/common/uniswap-v3-algebra-abstract/models/uniswap-v3-algebra-quoter-controller.ts b/src/features/on-chain/calculation-manager/providers/dexes/common/uniswap-v3-algebra-abstract/models/uniswap-v3-algebra-quoter-controller.ts index cb97eed91a..1993c6b30f 100644 --- a/src/features/on-chain/calculation-manager/providers/dexes/common/uniswap-v3-algebra-abstract/models/uniswap-v3-algebra-quoter-controller.ts +++ b/src/features/on-chain/calculation-manager/providers/dexes/common/uniswap-v3-algebra-abstract/models/uniswap-v3-algebra-quoter-controller.ts @@ -1,8 +1,16 @@ import { PriceToken } from 'src/common/tokens'; +import { EvmBlockchainName } from 'src/core/blockchain/models/blockchain-name'; import { Exact } from 'src/features/on-chain/calculation-manager/providers/common/on-chain-trade/evm-on-chain-trade/models/exact'; import { UniswapV3AlgebraRoute } from 'src/features/on-chain/calculation-manager/providers/dexes/common/uniswap-v3-algebra-abstract/models/uniswap-v3-algebra-route'; +import { AbiItem } from 'web3-utils'; + +export abstract class UniswapV3AlgebraQuoterController { + protected abstract readonly quoterContractAddress: string; + + protected abstract readonly quoterContractABI: AbiItem[]; + + protected abstract readonly blockchain: EvmBlockchainName; -export interface UniswapV3AlgebraQuoterController { /** * Returns all routes between given tokens with output amount. * @param from From token. @@ -11,7 +19,7 @@ export interface UniswapV3AlgebraQuoterController { * @param weiAmount Amount of tokens to trade. * @param routeMaxTransitTokens Max amount of transit tokens. */ - getAllRoutes( + public abstract getAllRoutes( from: PriceToken, to: PriceToken, exact: Exact, diff --git a/src/features/on-chain/calculation-manager/providers/dexes/linea/horizondex/horizondex-provider.ts b/src/features/on-chain/calculation-manager/providers/dexes/linea/horizondex/horizondex-provider.ts index e75b3777e4..e4ceafae3a 100644 --- a/src/features/on-chain/calculation-manager/providers/dexes/linea/horizondex/horizondex-provider.ts +++ b/src/features/on-chain/calculation-manager/providers/dexes/linea/horizondex/horizondex-provider.ts @@ -9,10 +9,6 @@ import { HorizondexUniswapV3QuoterController } from 'src/features/on-chain/calcu import { HORIZONDEX_PROVIDER_CONFIGURATION } from 'src/features/on-chain/calculation-manager/providers/dexes/linea/horizondex/constants/provider-configuration'; import { HORIZONDEX_ROUTER_CONFIGURATION } from 'src/features/on-chain/calculation-manager/providers/dexes/linea/horizondex/constants/router-configuration'; import { HorizondexTrade } from 'src/features/on-chain/calculation-manager/providers/dexes/linea/horizondex/horizondex-trade'; -import { - HORIZONDEX_QUOTER_CONTRACT_ABI, - HORIZONDEX_QUOTER_CONTRACT_ADDRESS -} from 'src/features/on-chain/calculation-manager/providers/dexes/linea/horizondex/utils/quoter-controller/constants/quoter-contract-data'; export class HorizondexProvider extends UniswapV3AbstractProvider { public readonly blockchain = BLOCKCHAIN_NAME.LINEA; @@ -25,9 +21,7 @@ export class HorizondexProvider extends UniswapV3AbstractProvider { @@ -34,6 +35,7 @@ export class UniSwapV3ScrollTestnetProvider extends UniswapV3AlgebraAbstractProv this.blockchain, this.routerConfiguration, '0x6E7E0d996eF50E289af9BFd93f774C566F014660', + UNISWAP_V3_QUOTER_CONTRACT_ABI, '0xbf1c1FE1e9e900aFd5ba2Eb67480c44266D5eD84' ); From 1123ff89ec1e4fa57a48cbfb2fb6bcd8ec24d2bd Mon Sep 17 00:00:00 2001 From: Kirill Demidov Date: Wed, 16 Aug 2023 14:46:07 +0300 Subject: [PATCH 12/15] fix wrap/unwrap and symbiosis testnet tx status api --- package.json | 2 +- src/common/tokens/constants/wrapped-addresses.ts | 5 ++++- src/common/tokens/constants/wrapped-native-tokens.ts | 7 ------- .../status-manager/cross-chain-status-manager.ts | 11 +++++++++-- 4 files changed, 14 insertions(+), 11 deletions(-) diff --git a/package.json b/package.json index 2764af2bb1..b1715513bb 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "rubic-sdk", - "version": "4.8.0-alpha-testnet.5", + "version": "4.8.0-alpha-testnet.6", "description": "Simplify dApp creation", "main": "lib/index.js", "types": "lib/index.d.ts", diff --git a/src/common/tokens/constants/wrapped-addresses.ts b/src/common/tokens/constants/wrapped-addresses.ts index 915f2c2682..7a36243f3a 100644 --- a/src/common/tokens/constants/wrapped-addresses.ts +++ b/src/common/tokens/constants/wrapped-addresses.ts @@ -34,5 +34,8 @@ export const wrappedAddress: Partial> = { [BLOCKCHAIN_NAME.SYSCOIN]: '0xd3e822f3ef011Ca5f17D82C956D952D8d7C3A1BB', [BLOCKCHAIN_NAME.ZK_SYNC]: '0x5aea5775959fbc2557cc8789bc1bf90a239d9a91', [BLOCKCHAIN_NAME.PULSECHAIN]: '0xa1077a294dde1b09bb078844df40758a5d0f9a27', - [BLOCKCHAIN_NAME.LINEA]: '0xe5d7c2a44ffddf6b295a15c148167daaaf5cf34f' + [BLOCKCHAIN_NAME.LINEA]: '0xe5d7c2a44ffddf6b295a15c148167daaaf5cf34f', + // Testnet + [BLOCKCHAIN_NAME.GOERLI]: '0xb4fbf271143f4fbf7b91a5ded31805e42b2208d6', + [BLOCKCHAIN_NAME.SCROLL_TESTNET]: '0xa1ea0b2354f5a344110af2b6ad68e75545009a03' }; diff --git a/src/common/tokens/constants/wrapped-native-tokens.ts b/src/common/tokens/constants/wrapped-native-tokens.ts index f4e100a3db..676606f062 100644 --- a/src/common/tokens/constants/wrapped-native-tokens.ts +++ b/src/common/tokens/constants/wrapped-native-tokens.ts @@ -269,13 +269,6 @@ export const wrappedNativeTokensList: Partial> symbol: 'WETH', decimals: 18 }), - [BLOCKCHAIN_NAME.GOERLI]: new Token({ - blockchain: BLOCKCHAIN_NAME.GOERLI, - address: '0xb4fbf271143f4fbf7b91a5ded31805e42b2208d6', - name: 'Wrapped Ether', - symbol: 'WETH', - decimals: 18 - }), [BLOCKCHAIN_NAME.SCROLL_TESTNET]: new Token({ blockchain: BLOCKCHAIN_NAME.SCROLL_TESTNET, address: '0xa1ea0b2354f5a344110af2b6ad68e75545009a03', diff --git a/src/features/cross-chain/status-manager/cross-chain-status-manager.ts b/src/features/cross-chain/status-manager/cross-chain-status-manager.ts index a5a6a495e9..71b438533c 100644 --- a/src/features/cross-chain/status-manager/cross-chain-status-manager.ts +++ b/src/features/cross-chain/status-manager/cross-chain-status-manager.ts @@ -8,7 +8,10 @@ import { import { JsonRpcProvider } from '@ethersproject/providers'; import { createClient } from '@layerzerolabs/scan-client'; import { RubicSdkError } from 'src/common/errors'; -import { BLOCKCHAIN_NAME } from 'src/core/blockchain/models/blockchain-name'; +import { + BLOCKCHAIN_NAME, + TEST_EVM_BLOCKCHAIN_NAME +} from 'src/core/blockchain/models/blockchain-name'; import { BlockchainsInfo } from 'src/core/blockchain/utils/blockchains-info/blockchains-info'; import { blockchainId } from 'src/core/blockchain/utils/blockchains-info/constants/blockchain-id'; import { @@ -195,6 +198,9 @@ export class CrossChainStatusManager { */ private async getSymbiosisDstSwapStatus(data: CrossChainTradeData): Promise { const symbiosisTxIndexingTimeSpent = Date.now() > data.txTimestamp + 30000; + const symbiosisApi = Object.keys(TEST_EVM_BLOCKCHAIN_NAME).includes(data.fromBlockchain) + ? 'api.testnet' + : 'api-v2'; if (symbiosisTxIndexingTimeSpent) { try { @@ -204,8 +210,9 @@ export class CrossChainStatusManager { status: { text: dstTxStatus }, tx } = await Injector.httpClient.get( - `https://api-v2.symbiosis.finance/crosschain/v1/tx/${srcChainId}/${data.srcTxHash}` + `https://${symbiosisApi}.symbiosis.finance/crosschain/v1/tx/${srcChainId}/${data.srcTxHash}` ); + let dstTxData: TxStatusData = { status: TX_STATUS.PENDING, hash: tx?.hash || null From 626cd24489d25120f4c0d189508c2b6d144a87f6 Mon Sep 17 00:00:00 2001 From: Kirill Demidov Date: Wed, 23 Aug 2023 11:15:52 +0300 Subject: [PATCH 13/15] change scroll-testnet to scroll-sepolia --- package.json | 4 +- src/common/tokens/constants/native-tokens.ts | 4 +- .../tokens/constants/wrapped-addresses.ts | 2 +- .../tokens/constants/wrapped-native-tokens.ts | 6 +- src/core/blockchain/models/blockchain-name.ts | 2 +- .../constants/blockchain-id.ts | 2 +- .../constants/multicall-addresses.ts | 2 +- .../constants/cbridge-contract-address.ts | 5 -- .../cbridge-supported-blockchains.ts | 3 +- .../scroll-bridge-contract-address.ts | 6 +- .../scroll-bridge-supported-blockchain.ts | 2 +- .../constants/contract-address-v2.ts | 2 +- ...biosis-cross-chain-supported-blockchain.ts | 2 +- .../symbiosis-cross-chain-trade.ts | 1 + .../uniswap-v2-trade-providers.ts | 5 +- .../uniswap-v3-trade-providers.ts | 4 +- .../uniswap-v3-algebra-abstract-provider.ts | 4 +- .../uni-swap-v2-scroll-sepolia}/constants.ts | 11 ++-- .../uni-swap-v2-scroll-sepolia-provider.ts | 12 ++++ .../uni-swap-v2-scroll-sepolia-trade.ts} | 6 +- .../constants/provider-configuration.ts | 4 +- .../constants/router-configuration.ts | 40 +++++++++++ .../constants/scroll-trade-abi.ts | 0 .../uni-swap-v3-scroll-sepolia-provider.ts} | 26 ++++---- .../uni-swap-v3-scroll-sepolia-trade.ts} | 6 +- .../uni-swap-v2-scroll-testnet-provider.ts | 12 ---- .../constants/router-configuration.ts | 66 ------------------- yarn.lock | 8 +-- 28 files changed, 106 insertions(+), 141 deletions(-) rename src/features/on-chain/calculation-manager/providers/dexes/{scroll-testnet/uni-swap-v2-scroll-testnet => scroll-sepolia/uni-swap-v2-scroll-sepolia}/constants.ts (62%) create mode 100644 src/features/on-chain/calculation-manager/providers/dexes/scroll-sepolia/uni-swap-v2-scroll-sepolia/uni-swap-v2-scroll-sepolia-provider.ts rename src/features/on-chain/calculation-manager/providers/dexes/{scroll-testnet/uni-swap-v2-scroll-testnet/uni-swap-v2-scroll-testnet-trade.ts => scroll-sepolia/uni-swap-v2-scroll-sepolia/uni-swap-v2-scroll-sepolia-trade.ts} (56%) rename src/features/on-chain/calculation-manager/providers/dexes/{scroll-testnet/uni-swap-v3-scroll-testnet => scroll-sepolia/uni-swap-v3-scroll-sepolia}/constants/provider-configuration.ts (84%) create mode 100644 src/features/on-chain/calculation-manager/providers/dexes/scroll-sepolia/uni-swap-v3-scroll-sepolia/constants/router-configuration.ts rename src/features/on-chain/calculation-manager/providers/dexes/{scroll-testnet/uni-swap-v3-scroll-testnet => scroll-sepolia/uni-swap-v3-scroll-sepolia}/constants/scroll-trade-abi.ts (100%) rename src/features/on-chain/calculation-manager/providers/dexes/{scroll-testnet/uni-swap-v3-scroll-testnet/uni-swap-v3-scroll-testnet-provider.ts => scroll-sepolia/uni-swap-v3-scroll-sepolia/uni-swap-v3-scroll-sepolia-provider.ts} (73%) rename src/features/on-chain/calculation-manager/providers/dexes/{scroll-testnet/uni-swap-v3-scroll-testnet/uni-swap-v3-scroll-testnet-trade.ts => scroll-sepolia/uni-swap-v3-scroll-sepolia/uni-swap-v3-scroll-sepolia-trade.ts} (92%) delete mode 100644 src/features/on-chain/calculation-manager/providers/dexes/scroll-testnet/uni-swap-v2-scroll-testnet/uni-swap-v2-scroll-testnet-provider.ts delete mode 100644 src/features/on-chain/calculation-manager/providers/dexes/scroll-testnet/uni-swap-v3-scroll-testnet/constants/router-configuration.ts diff --git a/package.json b/package.json index b1715513bb..2cba168523 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "rubic-sdk", - "version": "4.8.0-alpha-testnet.6", + "version": "4.8.0-alpha-testnet.8", "description": "Simplify dApp creation", "main": "lib/index.js", "types": "lib/index.d.ts", @@ -91,7 +91,7 @@ "lodash.clonedeep": "^4.5.0", "rango-sdk-basic": "^0.0.7", "rxjs": "7.8.1", - "symbiosis-js-sdk": "^2.10.24", + "symbiosis-js-sdk": "2.10.31", "tronweb": "^4.3.0", "viem": "^1.3.1", "web3": "^1.8.1" diff --git a/src/common/tokens/constants/native-tokens.ts b/src/common/tokens/constants/native-tokens.ts index fb9dee195f..03d7f932dc 100644 --- a/src/common/tokens/constants/native-tokens.ts +++ b/src/common/tokens/constants/native-tokens.ts @@ -39,8 +39,8 @@ const testnetNativeTokens: Record = { symbol: 'tBNB', decimals: 18 }), - [BLOCKCHAIN_NAME.SCROLL_TESTNET]: new Token({ - blockchain: BLOCKCHAIN_NAME.SCROLL_TESTNET, + [BLOCKCHAIN_NAME.SCROLL_SEPOLIA]: new Token({ + blockchain: BLOCKCHAIN_NAME.SCROLL_SEPOLIA, address: EvmWeb3Pure.nativeTokenAddress, name: 'ETH', symbol: 'ETH', diff --git a/src/common/tokens/constants/wrapped-addresses.ts b/src/common/tokens/constants/wrapped-addresses.ts index 7a36243f3a..bb3bd7ed8a 100644 --- a/src/common/tokens/constants/wrapped-addresses.ts +++ b/src/common/tokens/constants/wrapped-addresses.ts @@ -37,5 +37,5 @@ export const wrappedAddress: Partial> = { [BLOCKCHAIN_NAME.LINEA]: '0xe5d7c2a44ffddf6b295a15c148167daaaf5cf34f', // Testnet [BLOCKCHAIN_NAME.GOERLI]: '0xb4fbf271143f4fbf7b91a5ded31805e42b2208d6', - [BLOCKCHAIN_NAME.SCROLL_TESTNET]: '0xa1ea0b2354f5a344110af2b6ad68e75545009a03' + [BLOCKCHAIN_NAME.SCROLL_SEPOLIA]: '0x5300000000000000000000000000000000000004' }; diff --git a/src/common/tokens/constants/wrapped-native-tokens.ts b/src/common/tokens/constants/wrapped-native-tokens.ts index 676606f062..6ce537bcfa 100644 --- a/src/common/tokens/constants/wrapped-native-tokens.ts +++ b/src/common/tokens/constants/wrapped-native-tokens.ts @@ -269,9 +269,9 @@ export const wrappedNativeTokensList: Partial> symbol: 'WETH', decimals: 18 }), - [BLOCKCHAIN_NAME.SCROLL_TESTNET]: new Token({ - blockchain: BLOCKCHAIN_NAME.SCROLL_TESTNET, - address: '0xa1ea0b2354f5a344110af2b6ad68e75545009a03', + [BLOCKCHAIN_NAME.SCROLL_SEPOLIA]: new Token({ + blockchain: BLOCKCHAIN_NAME.SCROLL_SEPOLIA, + address: '0x5300000000000000000000000000000000000004', name: 'Wrapped Ether', symbol: 'WETH', decimals: 18 diff --git a/src/core/blockchain/models/blockchain-name.ts b/src/core/blockchain/models/blockchain-name.ts index 49c5d98593..0f7c5a23c0 100644 --- a/src/core/blockchain/models/blockchain-name.ts +++ b/src/core/blockchain/models/blockchain-name.ts @@ -3,7 +3,7 @@ export const TEST_EVM_BLOCKCHAIN_NAME = { BINANCE_SMART_CHAIN_TESTNET: 'BSCT', GOERLI: 'GOERLI', FUJI: 'FUJI', - SCROLL_TESTNET: 'SCROLL_TESTNET' + SCROLL_SEPOLIA: 'SCROLL_SEPOLIA' } as const; export const EVM_BLOCKCHAIN_NAME = { diff --git a/src/core/blockchain/utils/blockchains-info/constants/blockchain-id.ts b/src/core/blockchain/utils/blockchains-info/constants/blockchain-id.ts index 796ceb3b0f..b91fe65218 100644 --- a/src/core/blockchain/utils/blockchains-info/constants/blockchain-id.ts +++ b/src/core/blockchain/utils/blockchains-info/constants/blockchain-id.ts @@ -56,7 +56,7 @@ export const blockchainId: Record = { [BLOCKCHAIN_NAME.BINANCE_SMART_CHAIN_TESTNET]: 87, [BLOCKCHAIN_NAME.MUMBAI]: 80001, [BLOCKCHAIN_NAME.FUJI]: 43113, - [BLOCKCHAIN_NAME.SCROLL_TESTNET]: 534353, + [BLOCKCHAIN_NAME.SCROLL_SEPOLIA]: 534351, // Non EVN blockchains [BLOCKCHAIN_NAME.BITCOIN]: 5555, [BLOCKCHAIN_NAME.FILECOIN]: 314 diff --git a/src/core/blockchain/web3-public-service/web3-public/constants/multicall-addresses.ts b/src/core/blockchain/web3-public-service/web3-public/constants/multicall-addresses.ts index 76025809ef..6bc0ef442f 100644 --- a/src/core/blockchain/web3-public-service/web3-public/constants/multicall-addresses.ts +++ b/src/core/blockchain/web3-public-service/web3-public/constants/multicall-addresses.ts @@ -44,6 +44,6 @@ export const MULTICALL_ADDRESSES: Record [BLOCKCHAIN_NAME.PULSECHAIN]: '0x5ba1e12693dc8f9c48aad8770482f4739beed696', [BLOCKCHAIN_NAME.POLYGON_ZKEVM]: '0xca11bde05977b3631167028862be2a173976ca11', [BLOCKCHAIN_NAME.LINEA]: '0xcA11bde05977b3631167028862bE2a173976CA11', - [BLOCKCHAIN_NAME.SCROLL_TESTNET]: '0xcA11bde05977b3631167028862bE2a173976CA11', + [BLOCKCHAIN_NAME.SCROLL_SEPOLIA]: '0xcA11bde05977b3631167028862bE2a173976CA11', [BLOCKCHAIN_NAME.GOERLI]: '0x5ba1e12693dc8f9c48aad8770482f4739beed696' }; diff --git a/src/features/cross-chain/calculation-manager/providers/cbridge/constants/cbridge-contract-address.ts b/src/features/cross-chain/calculation-manager/providers/cbridge/constants/cbridge-contract-address.ts index 8a529812e6..116861094f 100644 --- a/src/features/cross-chain/calculation-manager/providers/cbridge/constants/cbridge-contract-address.ts +++ b/src/features/cross-chain/calculation-manager/providers/cbridge/constants/cbridge-contract-address.ts @@ -70,10 +70,5 @@ export const cbridgeContractAddress: Record< providerGateway: '0x358234B325EF9eA8115291A8b81b7d33A2Fa762D', providerRouter: '0x358234B325EF9eA8115291A8b81b7d33A2Fa762D', rubicRouter: '0x841ce48F9446C8E281D3F1444cB859b4A6D0738C' - }, - [BLOCKCHAIN_NAME.SCROLL_TESTNET]: { - providerGateway: '0x9B36f165baB9ebe611d491180418d8De4b8f3a1f', - providerRouter: '0x9B36f165baB9ebe611d491180418d8De4b8f3a1f', - rubicRouter: '0x841ce48F9446C8E281D3F1444cB859b4A6D0738C' } }; diff --git a/src/features/cross-chain/calculation-manager/providers/cbridge/constants/cbridge-supported-blockchains.ts b/src/features/cross-chain/calculation-manager/providers/cbridge/constants/cbridge-supported-blockchains.ts index c716100ac6..c575d26a3d 100644 --- a/src/features/cross-chain/calculation-manager/providers/cbridge/constants/cbridge-supported-blockchains.ts +++ b/src/features/cross-chain/calculation-manager/providers/cbridge/constants/cbridge-supported-blockchains.ts @@ -13,8 +13,7 @@ export const cbridgeSupportedBlockchains = [ BLOCKCHAIN_NAME.GOERLI, BLOCKCHAIN_NAME.BINANCE_SMART_CHAIN_TESTNET, BLOCKCHAIN_NAME.MUMBAI, - BLOCKCHAIN_NAME.FUJI, - BLOCKCHAIN_NAME.SCROLL_TESTNET + BLOCKCHAIN_NAME.FUJI ] as const; export type CbridgeCrossChainSupportedBlockchain = (typeof cbridgeSupportedBlockchains)[number]; diff --git a/src/features/cross-chain/calculation-manager/providers/scroll-bridge/constants/scroll-bridge-contract-address.ts b/src/features/cross-chain/calculation-manager/providers/scroll-bridge/constants/scroll-bridge-contract-address.ts index f394771a41..e6f5544c7c 100644 --- a/src/features/cross-chain/calculation-manager/providers/scroll-bridge/constants/scroll-bridge-contract-address.ts +++ b/src/features/cross-chain/calculation-manager/providers/scroll-bridge/constants/scroll-bridge-contract-address.ts @@ -6,9 +6,9 @@ export const scrollBridgeContractAddress: Record< ScrollBridgeSupportedBlockchain, UniversalContract > = { - [BLOCKCHAIN_NAME.SCROLL_TESTNET]: { - providerGateway: '0x6d79Aa2e4Fbf80CF8543Ad97e294861853fb0649', - providerRouter: '0x6d79Aa2e4Fbf80CF8543Ad97e294861853fb0649', + [BLOCKCHAIN_NAME.SCROLL_SEPOLIA]: { + providerGateway: '0xaDcA915971A336EA2f5b567e662F5bd74AEf9582', + providerRouter: '0xaDcA915971A336EA2f5b567e662F5bd74AEf9582', rubicRouter: '0x33798753ec66aEc00ed7E337B41F444f53A63333' }, [BLOCKCHAIN_NAME.GOERLI]: { diff --git a/src/features/cross-chain/calculation-manager/providers/scroll-bridge/models/scroll-bridge-supported-blockchain.ts b/src/features/cross-chain/calculation-manager/providers/scroll-bridge/models/scroll-bridge-supported-blockchain.ts index 533bda42e5..7ae456cad1 100644 --- a/src/features/cross-chain/calculation-manager/providers/scroll-bridge/models/scroll-bridge-supported-blockchain.ts +++ b/src/features/cross-chain/calculation-manager/providers/scroll-bridge/models/scroll-bridge-supported-blockchain.ts @@ -2,7 +2,7 @@ import { BLOCKCHAIN_NAME } from 'src/core/blockchain/models/blockchain-name'; export const scrollBridgeSupportedBlockchains = [ BLOCKCHAIN_NAME.GOERLI, - BLOCKCHAIN_NAME.SCROLL_TESTNET + BLOCKCHAIN_NAME.SCROLL_SEPOLIA ] as const; export type ScrollBridgeSupportedBlockchain = (typeof scrollBridgeSupportedBlockchains)[number]; diff --git a/src/features/cross-chain/calculation-manager/providers/symbiosis-provider/constants/contract-address-v2.ts b/src/features/cross-chain/calculation-manager/providers/symbiosis-provider/constants/contract-address-v2.ts index 17eba7d4bb..f26bc25d1b 100644 --- a/src/features/cross-chain/calculation-manager/providers/symbiosis-provider/constants/contract-address-v2.ts +++ b/src/features/cross-chain/calculation-manager/providers/symbiosis-provider/constants/contract-address-v2.ts @@ -74,7 +74,7 @@ export const SYMBIOSIS_CONTRACT_ADDRESS_V2: Record< providerRouter: '0xd3F98c243374D79Bfd9a8ac03964623221D53F0f', providerGateway: '0x4Ee7B1e8Ad6E1682318f1c47F83634dAa1197eEf' }, - [BLOCKCHAIN_NAME.SCROLL_TESTNET]: { + [BLOCKCHAIN_NAME.SCROLL_SEPOLIA]: { providerRouter: '0xAED47A51AeFa6f95A388aDA3c459d94FF46fC4BB', providerGateway: '0x8Daf3F19dD8a27554BaE525075E90Df4E56a4c46' } diff --git a/src/features/cross-chain/calculation-manager/providers/symbiosis-provider/constants/symbiosis-cross-chain-supported-blockchain.ts b/src/features/cross-chain/calculation-manager/providers/symbiosis-provider/constants/symbiosis-cross-chain-supported-blockchain.ts index a409b83fb0..89a18b1b7a 100644 --- a/src/features/cross-chain/calculation-manager/providers/symbiosis-provider/constants/symbiosis-cross-chain-supported-blockchain.ts +++ b/src/features/cross-chain/calculation-manager/providers/symbiosis-provider/constants/symbiosis-cross-chain-supported-blockchain.ts @@ -20,7 +20,7 @@ export const symbiosisCrossChainSupportedBlockchains = [ BLOCKCHAIN_NAME.BINANCE_SMART_CHAIN_TESTNET, BLOCKCHAIN_NAME.FUJI, BLOCKCHAIN_NAME.MUMBAI, - BLOCKCHAIN_NAME.SCROLL_TESTNET + BLOCKCHAIN_NAME.SCROLL_SEPOLIA ] as const; export type SymbiosisCrossChainSupportedBlockchain = diff --git a/src/features/cross-chain/calculation-manager/providers/symbiosis-provider/symbiosis-cross-chain-trade.ts b/src/features/cross-chain/calculation-manager/providers/symbiosis-provider/symbiosis-cross-chain-trade.ts index 4d82b14ee3..2f10427b9d 100644 --- a/src/features/cross-chain/calculation-manager/providers/symbiosis-provider/symbiosis-cross-chain-trade.ts +++ b/src/features/cross-chain/calculation-manager/providers/symbiosis-provider/symbiosis-cross-chain-trade.ts @@ -297,6 +297,7 @@ export class SymbiosisCrossChainTrade extends EvmCrossChainTrade { '1inch': ON_CHAIN_TRADE_TYPE.ONE_INCH, 'open-ocean': ON_CHAIN_TRADE_TYPE.OPEN_OCEAN, wrap: ON_CHAIN_TRADE_TYPE.WRAPPED, + izumi: undefined, default: undefined }; return { diff --git a/src/features/on-chain/calculation-manager/constants/trade-providers/uniswap-v2-trade-providers.ts b/src/features/on-chain/calculation-manager/constants/trade-providers/uniswap-v2-trade-providers.ts index 05a6d259ca..13dcbfad34 100644 --- a/src/features/on-chain/calculation-manager/constants/trade-providers/uniswap-v2-trade-providers.ts +++ b/src/features/on-chain/calculation-manager/constants/trade-providers/uniswap-v2-trade-providers.ts @@ -43,7 +43,6 @@ import { PulseXV1Provider } from 'src/features/on-chain/calculation-manager/prov import { PulseXV2Provider } from 'src/features/on-chain/calculation-manager/providers/dexes/pulsechain/pulsex-v2/pulsex-v2-provider'; import { SushiSwapPulsechainProvider } from 'src/features/on-chain/calculation-manager/providers/dexes/pulsechain/sushi-swap-pulsechain/sushi-swap-pulsechain-provider'; import { UniSwapV2PulsechainProvider } from 'src/features/on-chain/calculation-manager/providers/dexes/pulsechain/uni-swap-v2-pulsechain/uni-swap-v2-pulsechain-provider'; -import { UniSwapV2ScrollTestnetProvider } from 'src/features/on-chain/calculation-manager/providers/dexes/scroll-testnet/uni-swap-v2-scroll-testnet/uni-swap-v2-scroll-testnet-provider'; import { PegasysProvider } from 'src/features/on-chain/calculation-manager/providers/dexes/syscoin/pegasys/pegasys-provider'; import { ApeSwapTelosProvider } from 'src/features/on-chain/calculation-manager/providers/dexes/telos/ape-swap/ape-swap-telos-provider'; import { OmnidexProvider } from 'src/features/on-chain/calculation-manager/providers/dexes/telos/omnidex/omnidex-provider'; @@ -132,7 +131,7 @@ export const UniswapV2TradeProviders = [ QuickSwapMumbaiProvider, // Fuji JoeFujiProvider, - PangolinFujiProvider, + PangolinFujiProvider // Scroll - UniSwapV2ScrollTestnetProvider + // UniSwapV2ScrollSepoliaProvider ] as const; diff --git a/src/features/on-chain/calculation-manager/constants/trade-providers/uniswap-v3-trade-providers.ts b/src/features/on-chain/calculation-manager/constants/trade-providers/uniswap-v3-trade-providers.ts index bd61ffbe9a..cf0282f95d 100644 --- a/src/features/on-chain/calculation-manager/constants/trade-providers/uniswap-v3-trade-providers.ts +++ b/src/features/on-chain/calculation-manager/constants/trade-providers/uniswap-v3-trade-providers.ts @@ -4,7 +4,7 @@ import { UniSwapV3EthereumPowProvider } from 'src/features/on-chain/calculation- import { HorizondexProvider } from 'src/features/on-chain/calculation-manager/providers/dexes/linea/horizondex/horizondex-provider'; import { UniSwapV3PolygonProvider } from 'src/features/on-chain/calculation-manager/providers/dexes/polygon/uni-swap-v3-polygon/uni-swap-v3-polygon-provider'; import { UniSwapV3PulsechainProvider } from 'src/features/on-chain/calculation-manager/providers/dexes/pulsechain/uni-swap-v3-pulsechain/uni-swap-v3-ethereum-provider'; -import { UniSwapV3ScrollTestnetProvider } from 'src/features/on-chain/calculation-manager/providers/dexes/scroll-testnet/uni-swap-v3-scroll-testnet/uni-swap-v3-scroll-testnet-provider'; +import { UniSwapV3ScrollSepoliaProvider } from 'src/features/on-chain/calculation-manager/providers/dexes/scroll-sepolia/uni-swap-v3-scroll-sepolia/uni-swap-v3-scroll-sepolia-provider'; export const UniswapV3TradeProviders = [ UniSwapV3EthereumProvider, @@ -13,5 +13,5 @@ export const UniswapV3TradeProviders = [ UniSwapV3EthereumPowProvider, UniSwapV3PulsechainProvider, HorizondexProvider, - UniSwapV3ScrollTestnetProvider + UniSwapV3ScrollSepoliaProvider ] as const; diff --git a/src/features/on-chain/calculation-manager/providers/dexes/common/uniswap-v3-algebra-abstract/uniswap-v3-algebra-abstract-provider.ts b/src/features/on-chain/calculation-manager/providers/dexes/common/uniswap-v3-algebra-abstract/uniswap-v3-algebra-abstract-provider.ts index 8cfae17bed..a6dbd45fce 100644 --- a/src/features/on-chain/calculation-manager/providers/dexes/common/uniswap-v3-algebra-abstract/uniswap-v3-algebra-abstract-provider.ts +++ b/src/features/on-chain/calculation-manager/providers/dexes/common/uniswap-v3-algebra-abstract/uniswap-v3-algebra-abstract-provider.ts @@ -27,7 +27,7 @@ import { getFromToTokensAmountsByExact } from 'src/features/on-chain/calculation import { AlgebraTrade } from 'src/features/on-chain/calculation-manager/providers/dexes/polygon/algebra/algebra-trade'; import { QuickSwapV3Trade } from 'src/features/on-chain/calculation-manager/providers/dexes/polygon/quick-swap-v3/quick-swap-v3-trade'; import { QuickSwapV3PolygonZKEVMTrade } from 'src/features/on-chain/calculation-manager/providers/dexes/polygon-zkevm/quick-swap-v3/quick-swap-v3-trade'; -import { UniSwapV3ScrollTestnetTrade } from 'src/features/on-chain/calculation-manager/providers/dexes/scroll-testnet/uni-swap-v3-scroll-testnet/uni-swap-v3-scroll-testnet-trade'; +import { UniSwapV3ScrollSepoliaTrade } from 'src/features/on-chain/calculation-manager/providers/dexes/scroll-sepolia/uni-swap-v3-scroll-sepolia/uni-swap-v3-scroll-sepolia-trade'; import { AbiItem } from 'web3-utils'; export abstract class UniswapV3AlgebraAbstractProvider< @@ -42,7 +42,7 @@ export abstract class UniswapV3AlgebraAbstractProvider< | typeof AlgebraTrade | typeof QuickSwapV3Trade | typeof QuickSwapV3PolygonZKEVMTrade - | typeof UniSwapV3ScrollTestnetTrade; + | typeof UniSwapV3ScrollSepoliaTrade; protected abstract readonly quoterController: UniswapV3AlgebraQuoterController; diff --git a/src/features/on-chain/calculation-manager/providers/dexes/scroll-testnet/uni-swap-v2-scroll-testnet/constants.ts b/src/features/on-chain/calculation-manager/providers/dexes/scroll-sepolia/uni-swap-v2-scroll-sepolia/constants.ts similarity index 62% rename from src/features/on-chain/calculation-manager/providers/dexes/scroll-testnet/uni-swap-v2-scroll-testnet/constants.ts rename to src/features/on-chain/calculation-manager/providers/dexes/scroll-sepolia/uni-swap-v2-scroll-sepolia/constants.ts index 352bc5ab33..6106f7b9b6 100644 --- a/src/features/on-chain/calculation-manager/providers/dexes/scroll-testnet/uni-swap-v2-scroll-testnet/constants.ts +++ b/src/features/on-chain/calculation-manager/providers/dexes/scroll-sepolia/uni-swap-v2-scroll-sepolia/constants.ts @@ -2,18 +2,15 @@ import { wrappedNativeTokensList } from 'src/common/tokens'; import { BLOCKCHAIN_NAME } from 'src/core/blockchain/models/blockchain-name'; import { UniswapV2ProviderConfiguration } from 'src/features/on-chain/calculation-manager/providers/dexes/common/uniswap-v2-abstract/models/uniswap-v2-provider-configuration'; -const defaultScrollWethAddress = wrappedNativeTokensList[BLOCKCHAIN_NAME.SCROLL_TESTNET]!.address; +const defaultScrollWethAddress = wrappedNativeTokensList[BLOCKCHAIN_NAME.SCROLL_SEPOLIA]!.address; const defaultScrollRoutingProvidersAddresses = [ defaultScrollWethAddress, // WETH - '0x67aE69Fd63b4fc8809ADc224A9b82Be976039509', // USDC - '0x4702E5AEb70BdC05B11F8d8E701ad000dc85bD44', // DAI - '0x0CDEA04b370C1FA4bC2032b4ef23dB3EBCbA258a' // UNI + '0x15Fe86961428E095B064bb52FcF5964bAb834E34' // USDC ]; -export const UNISWAP_V2_SCROLL_TESTNET_CONTRACT_ADDRESS = - '0x0cfd11ac90992872d62a439bF0ED01EFA583d8Dc'; +export const UNISWAP_V2_SCROLL_SEPOLIA_CONTRACT_ADDRESS = ''; -export const UNISWAP_V2_SCROLL_TESTNET_CONFIGURATION: UniswapV2ProviderConfiguration = { +export const UNISWAP_V2_SCROLL_SEPOLIA_CONFIGURATION: UniswapV2ProviderConfiguration = { maxTransitTokens: 2, routingProvidersAddresses: defaultScrollRoutingProvidersAddresses, wethAddress: defaultScrollWethAddress diff --git a/src/features/on-chain/calculation-manager/providers/dexes/scroll-sepolia/uni-swap-v2-scroll-sepolia/uni-swap-v2-scroll-sepolia-provider.ts b/src/features/on-chain/calculation-manager/providers/dexes/scroll-sepolia/uni-swap-v2-scroll-sepolia/uni-swap-v2-scroll-sepolia-provider.ts new file mode 100644 index 0000000000..775ec4bf13 --- /dev/null +++ b/src/features/on-chain/calculation-manager/providers/dexes/scroll-sepolia/uni-swap-v2-scroll-sepolia/uni-swap-v2-scroll-sepolia-provider.ts @@ -0,0 +1,12 @@ +import { BLOCKCHAIN_NAME } from 'src/core/blockchain/models/blockchain-name'; +import { UniswapV2AbstractProvider } from 'src/features/on-chain/calculation-manager/providers/dexes/common/uniswap-v2-abstract/uniswap-v2-abstract-provider'; +import { UNISWAP_V2_SCROLL_SEPOLIA_CONFIGURATION } from 'src/features/on-chain/calculation-manager/providers/dexes/scroll-sepolia/uni-swap-v2-scroll-sepolia/constants'; +import { UniSwapV2ScrollSepoliaTrade } from 'src/features/on-chain/calculation-manager/providers/dexes/scroll-sepolia/uni-swap-v2-scroll-sepolia/uni-swap-v2-scroll-sepolia-trade'; + +export class UniSwapV2ScrollSepoliaProvider extends UniswapV2AbstractProvider { + public readonly blockchain = BLOCKCHAIN_NAME.SCROLL_SEPOLIA; + + public readonly UniswapV2TradeClass = UniSwapV2ScrollSepoliaTrade; + + public readonly providerSettings = UNISWAP_V2_SCROLL_SEPOLIA_CONFIGURATION; +} diff --git a/src/features/on-chain/calculation-manager/providers/dexes/scroll-testnet/uni-swap-v2-scroll-testnet/uni-swap-v2-scroll-testnet-trade.ts b/src/features/on-chain/calculation-manager/providers/dexes/scroll-sepolia/uni-swap-v2-scroll-sepolia/uni-swap-v2-scroll-sepolia-trade.ts similarity index 56% rename from src/features/on-chain/calculation-manager/providers/dexes/scroll-testnet/uni-swap-v2-scroll-testnet/uni-swap-v2-scroll-testnet-trade.ts rename to src/features/on-chain/calculation-manager/providers/dexes/scroll-sepolia/uni-swap-v2-scroll-sepolia/uni-swap-v2-scroll-sepolia-trade.ts index c9c34d3402..56fa1a07bd 100644 --- a/src/features/on-chain/calculation-manager/providers/dexes/scroll-testnet/uni-swap-v2-scroll-testnet/uni-swap-v2-scroll-testnet-trade.ts +++ b/src/features/on-chain/calculation-manager/providers/dexes/scroll-sepolia/uni-swap-v2-scroll-sepolia/uni-swap-v2-scroll-sepolia-trade.ts @@ -3,12 +3,12 @@ import { OnChainTradeType } from 'src/features/on-chain/calculation-manager/providers/common/models/on-chain-trade-type'; import { UniswapV2AbstractTrade } from 'src/features/on-chain/calculation-manager/providers/dexes/common/uniswap-v2-abstract/uniswap-v2-abstract-trade'; -import { UNISWAP_V2_SCROLL_TESTNET_CONTRACT_ADDRESS } from 'src/features/on-chain/calculation-manager/providers/dexes/scroll-testnet/uni-swap-v2-scroll-testnet/constants'; +import { UNISWAP_V2_SCROLL_SEPOLIA_CONTRACT_ADDRESS } from 'src/features/on-chain/calculation-manager/providers/dexes/scroll-sepolia/uni-swap-v2-scroll-sepolia/constants'; -export class UniSwapV2ScrollTestnetTrade extends UniswapV2AbstractTrade { +export class UniSwapV2ScrollSepoliaTrade extends UniswapV2AbstractTrade { public static get type(): OnChainTradeType { return ON_CHAIN_TRADE_TYPE.UNISWAP_V2; } - public readonly dexContractAddress = UNISWAP_V2_SCROLL_TESTNET_CONTRACT_ADDRESS; + public readonly dexContractAddress = UNISWAP_V2_SCROLL_SEPOLIA_CONTRACT_ADDRESS; } diff --git a/src/features/on-chain/calculation-manager/providers/dexes/scroll-testnet/uni-swap-v3-scroll-testnet/constants/provider-configuration.ts b/src/features/on-chain/calculation-manager/providers/dexes/scroll-sepolia/uni-swap-v3-scroll-sepolia/constants/provider-configuration.ts similarity index 84% rename from src/features/on-chain/calculation-manager/providers/dexes/scroll-testnet/uni-swap-v3-scroll-testnet/constants/provider-configuration.ts rename to src/features/on-chain/calculation-manager/providers/dexes/scroll-sepolia/uni-swap-v3-scroll-sepolia/constants/provider-configuration.ts index 4492e6fba1..3c64bb28e2 100644 --- a/src/features/on-chain/calculation-manager/providers/dexes/scroll-testnet/uni-swap-v3-scroll-testnet/constants/provider-configuration.ts +++ b/src/features/on-chain/calculation-manager/providers/dexes/scroll-sepolia/uni-swap-v3-scroll-sepolia/constants/provider-configuration.ts @@ -2,8 +2,8 @@ import { wrappedNativeTokensList } from 'src/common/tokens'; import { BLOCKCHAIN_NAME } from 'src/core/blockchain/models/blockchain-name'; import { UniswapV3AlgebraProviderConfiguration } from 'src/features/on-chain/calculation-manager/providers/dexes/common/uniswap-v3-algebra-abstract/models/uniswap-v3-algebra-provider-configuration'; -export const UNI_SWAP_V3_SCROLL_TESTNET_PROVIDER_CONFIGURATION: UniswapV3AlgebraProviderConfiguration = +export const UNI_SWAP_V3_SCROLL_SEPOLIA_PROVIDER_CONFIGURATION: UniswapV3AlgebraProviderConfiguration = { - wethAddress: wrappedNativeTokensList[BLOCKCHAIN_NAME.SCROLL_TESTNET]!.address, + wethAddress: wrappedNativeTokensList[BLOCKCHAIN_NAME.SCROLL_SEPOLIA]!.address, maxTransitTokens: 1 }; diff --git a/src/features/on-chain/calculation-manager/providers/dexes/scroll-sepolia/uni-swap-v3-scroll-sepolia/constants/router-configuration.ts b/src/features/on-chain/calculation-manager/providers/dexes/scroll-sepolia/uni-swap-v3-scroll-sepolia/constants/router-configuration.ts new file mode 100644 index 0000000000..bce40662fd --- /dev/null +++ b/src/features/on-chain/calculation-manager/providers/dexes/scroll-sepolia/uni-swap-v3-scroll-sepolia/constants/router-configuration.ts @@ -0,0 +1,40 @@ +import { wrappedNativeTokensList } from 'src/common/tokens'; +import { BLOCKCHAIN_NAME } from 'src/core/blockchain/models/blockchain-name'; +import { + UniswapV3RouterConfiguration, + UniswapV3RouterLiquidityPool +} from 'src/features/on-chain/calculation-manager/providers/dexes/common/uniswap-v3-abstract/models/uniswap-v3-router-configuration'; + +/** + * Most popular tokens in uni v3 to use in a route. + */ +const tokensSymbols = ['WETH', 'USDC', 'GHO'] as const; + +type TokenSymbol = (typeof tokensSymbols)[number]; + +const routerTokens: Record = { + WETH: wrappedNativeTokensList[BLOCKCHAIN_NAME.SCROLL_SEPOLIA]!.address, + USDC: '0x15Fe86961428E095B064bb52FcF5964bAb834E34', + GHO: '0xD9692f1748aFEe00FACE2da35242417dd05a8615' +}; + +const routerLiquidityPools: UniswapV3RouterLiquidityPool[] = [ + { + poolAddress: '0x60ba72f15c2b133e8ef826602bab511f4c7bca78', + tokenSymbolA: 'USDC', + tokenSymbolB: 'WETH', + fee: 3000 + }, + { + poolAddress: '0xd8ac608580a56fdea4f1d9ef2ce5e4fa09591325', + tokenSymbolA: 'WETH', + tokenSymbolB: 'GHO', + fee: 3000 + } +]; + +export const UNI_SWAP_V3_SCROLL_SEPOLIA_ROUTER_CONFIGURATION: UniswapV3RouterConfiguration = + { + tokens: routerTokens, + liquidityPools: routerLiquidityPools + }; diff --git a/src/features/on-chain/calculation-manager/providers/dexes/scroll-testnet/uni-swap-v3-scroll-testnet/constants/scroll-trade-abi.ts b/src/features/on-chain/calculation-manager/providers/dexes/scroll-sepolia/uni-swap-v3-scroll-sepolia/constants/scroll-trade-abi.ts similarity index 100% rename from src/features/on-chain/calculation-manager/providers/dexes/scroll-testnet/uni-swap-v3-scroll-testnet/constants/scroll-trade-abi.ts rename to src/features/on-chain/calculation-manager/providers/dexes/scroll-sepolia/uni-swap-v3-scroll-sepolia/constants/scroll-trade-abi.ts diff --git a/src/features/on-chain/calculation-manager/providers/dexes/scroll-testnet/uni-swap-v3-scroll-testnet/uni-swap-v3-scroll-testnet-provider.ts b/src/features/on-chain/calculation-manager/providers/dexes/scroll-sepolia/uni-swap-v3-scroll-sepolia/uni-swap-v3-scroll-sepolia-provider.ts similarity index 73% rename from src/features/on-chain/calculation-manager/providers/dexes/scroll-testnet/uni-swap-v3-scroll-testnet/uni-swap-v3-scroll-testnet-provider.ts rename to src/features/on-chain/calculation-manager/providers/dexes/scroll-sepolia/uni-swap-v3-scroll-sepolia/uni-swap-v3-scroll-sepolia-provider.ts index 1194212d20..8db0caaae3 100644 --- a/src/features/on-chain/calculation-manager/providers/dexes/scroll-testnet/uni-swap-v3-scroll-testnet/uni-swap-v3-scroll-testnet-provider.ts +++ b/src/features/on-chain/calculation-manager/providers/dexes/scroll-sepolia/uni-swap-v3-scroll-sepolia/uni-swap-v3-scroll-sepolia-provider.ts @@ -13,30 +13,30 @@ import { UNISWAP_V3_QUOTER_CONTRACT_ABI } from 'src/features/on-chain/calculatio import { UniswapV3QuoterController } from 'src/features/on-chain/calculation-manager/providers/dexes/common/uniswap-v3-abstract/utils/quoter-controller/uniswap-v3-quoter-controller'; import { UniswapV3AlgebraTradeStructOmitPath } from 'src/features/on-chain/calculation-manager/providers/dexes/common/uniswap-v3-algebra-abstract/models/uniswap-v3-algebra-trade-struct'; import { UniswapV3AlgebraAbstractProvider } from 'src/features/on-chain/calculation-manager/providers/dexes/common/uniswap-v3-algebra-abstract/uniswap-v3-algebra-abstract-provider'; -import { UNI_SWAP_V3_SCROLL_TESTNET_PROVIDER_CONFIGURATION } from 'src/features/on-chain/calculation-manager/providers/dexes/scroll-testnet/uni-swap-v3-scroll-testnet/constants/provider-configuration'; -import { UNI_SWAP_V3_SCROLL_TESTNET_ROUTER_CONFIGURATION } from 'src/features/on-chain/calculation-manager/providers/dexes/scroll-testnet/uni-swap-v3-scroll-testnet/constants/router-configuration'; -import { SCROLL_UNISWAP_V3_SWAP_ROUTER_CONTRACT_ABI } from 'src/features/on-chain/calculation-manager/providers/dexes/scroll-testnet/uni-swap-v3-scroll-testnet/constants/scroll-trade-abi'; -import { UniSwapV3ScrollTestnetTrade } from 'src/features/on-chain/calculation-manager/providers/dexes/scroll-testnet/uni-swap-v3-scroll-testnet/uni-swap-v3-scroll-testnet-trade'; +import { UNI_SWAP_V3_SCROLL_SEPOLIA_PROVIDER_CONFIGURATION } from 'src/features/on-chain/calculation-manager/providers/dexes/scroll-sepolia/uni-swap-v3-scroll-sepolia/constants/provider-configuration'; +import { UNI_SWAP_V3_SCROLL_SEPOLIA_ROUTER_CONFIGURATION } from 'src/features/on-chain/calculation-manager/providers/dexes/scroll-sepolia/uni-swap-v3-scroll-sepolia/constants/router-configuration'; +import { SCROLL_UNISWAP_V3_SWAP_ROUTER_CONTRACT_ABI } from 'src/features/on-chain/calculation-manager/providers/dexes/scroll-sepolia/uni-swap-v3-scroll-sepolia/constants/scroll-trade-abi'; +import { UniSwapV3ScrollSepoliaTrade } from 'src/features/on-chain/calculation-manager/providers/dexes/scroll-sepolia/uni-swap-v3-scroll-sepolia/uni-swap-v3-scroll-sepolia-trade'; -export class UniSwapV3ScrollTestnetProvider extends UniswapV3AlgebraAbstractProvider { - public readonly contractAddress = '0xD9880690bd717189cC3Fbe7B9020F27fae7Ac76F'; +export class UniSwapV3ScrollSepoliaProvider extends UniswapV3AlgebraAbstractProvider { + public readonly contractAddress = '0x17AFD0263D6909Ba1F9a8EAC697f76532365Fb95'; protected readonly contractAbi = SCROLL_UNISWAP_V3_SWAP_ROUTER_CONTRACT_ABI; - public readonly blockchain = BLOCKCHAIN_NAME.SCROLL_TESTNET; + public readonly blockchain = BLOCKCHAIN_NAME.SCROLL_SEPOLIA; - public readonly OnChainTradeClass = UniSwapV3ScrollTestnetTrade; + public readonly OnChainTradeClass = UniSwapV3ScrollSepoliaTrade; - public readonly providerConfiguration = UNI_SWAP_V3_SCROLL_TESTNET_PROVIDER_CONFIGURATION; + public readonly providerConfiguration = UNI_SWAP_V3_SCROLL_SEPOLIA_PROVIDER_CONFIGURATION; - public readonly routerConfiguration = UNI_SWAP_V3_SCROLL_TESTNET_ROUTER_CONFIGURATION; + public readonly routerConfiguration = UNI_SWAP_V3_SCROLL_SEPOLIA_ROUTER_CONFIGURATION; protected readonly quoterController = new UniswapV3QuoterController( this.blockchain, this.routerConfiguration, - '0x6E7E0d996eF50E289af9BFd93f774C566F014660', + '0xd5dd33650Ef1DC6D23069aEDC8EAE87b0D3619B2', UNISWAP_V3_QUOTER_CONTRACT_ABI, - '0xbf1c1FE1e9e900aFd5ba2Eb67480c44266D5eD84' + '0xB856587fe1cbA8600F75F1b1176E44250B11C788' ); public get type(): OnChainTradeType { @@ -47,7 +47,7 @@ export class UniSwapV3ScrollTestnetProvider extends UniswapV3AlgebraAbstractProv tradeStruct: UniswapV3AlgebraTradeStructOmitPath, route: UniswapV3Route, providerAddress: string - ): UniSwapV3ScrollTestnetTrade { + ): UniSwapV3ScrollSepoliaTrade { const path = this.extractPath(route); return new this.OnChainTradeClass( { diff --git a/src/features/on-chain/calculation-manager/providers/dexes/scroll-testnet/uni-swap-v3-scroll-testnet/uni-swap-v3-scroll-testnet-trade.ts b/src/features/on-chain/calculation-manager/providers/dexes/scroll-sepolia/uni-swap-v3-scroll-sepolia/uni-swap-v3-scroll-sepolia-trade.ts similarity index 92% rename from src/features/on-chain/calculation-manager/providers/dexes/scroll-testnet/uni-swap-v3-scroll-testnet/uni-swap-v3-scroll-testnet-trade.ts rename to src/features/on-chain/calculation-manager/providers/dexes/scroll-sepolia/uni-swap-v3-scroll-sepolia/uni-swap-v3-scroll-sepolia-trade.ts index d3637de732..9f23efbba0 100644 --- a/src/features/on-chain/calculation-manager/providers/dexes/scroll-testnet/uni-swap-v3-scroll-testnet/uni-swap-v3-scroll-testnet-trade.ts +++ b/src/features/on-chain/calculation-manager/providers/dexes/scroll-sepolia/uni-swap-v3-scroll-sepolia/uni-swap-v3-scroll-sepolia-trade.ts @@ -9,10 +9,10 @@ import { UniswapV3Route } from 'src/features/on-chain/calculation-manager/provid import { UniswapV3TradeStruct } from 'src/features/on-chain/calculation-manager/providers/dexes/common/uniswap-v3-abstract/models/uniswap-v3-trade-struct'; import { UniswapV3QuoterController } from 'src/features/on-chain/calculation-manager/providers/dexes/common/uniswap-v3-abstract/utils/quoter-controller/uniswap-v3-quoter-controller'; import { UniswapV3AlgebraAbstractTrade } from 'src/features/on-chain/calculation-manager/providers/dexes/common/uniswap-v3-algebra-abstract/uniswap-v3-algebra-abstract-trade'; -import { SCROLL_UNISWAP_V3_SWAP_ROUTER_CONTRACT_ABI } from 'src/features/on-chain/calculation-manager/providers/dexes/scroll-testnet/uni-swap-v3-scroll-testnet/constants/scroll-trade-abi'; +import { SCROLL_UNISWAP_V3_SWAP_ROUTER_CONTRACT_ABI } from 'src/features/on-chain/calculation-manager/providers/dexes/scroll-sepolia/uni-swap-v3-scroll-sepolia/constants/scroll-trade-abi'; -export class UniSwapV3ScrollTestnetTrade extends UniswapV3AlgebraAbstractTrade { - public readonly dexContractAddress = '0xD9880690bd717189cC3Fbe7B9020F27fae7Ac76F'; +export class UniSwapV3ScrollSepoliaTrade extends UniswapV3AlgebraAbstractTrade { + public readonly dexContractAddress = '0x17AFD0263D6909Ba1F9a8EAC697f76532365Fb95'; protected readonly contractAbi = SCROLL_UNISWAP_V3_SWAP_ROUTER_CONTRACT_ABI; diff --git a/src/features/on-chain/calculation-manager/providers/dexes/scroll-testnet/uni-swap-v2-scroll-testnet/uni-swap-v2-scroll-testnet-provider.ts b/src/features/on-chain/calculation-manager/providers/dexes/scroll-testnet/uni-swap-v2-scroll-testnet/uni-swap-v2-scroll-testnet-provider.ts deleted file mode 100644 index 0861b316a4..0000000000 --- a/src/features/on-chain/calculation-manager/providers/dexes/scroll-testnet/uni-swap-v2-scroll-testnet/uni-swap-v2-scroll-testnet-provider.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { BLOCKCHAIN_NAME } from 'src/core/blockchain/models/blockchain-name'; -import { UniswapV2AbstractProvider } from 'src/features/on-chain/calculation-manager/providers/dexes/common/uniswap-v2-abstract/uniswap-v2-abstract-provider'; -import { UNISWAP_V2_SCROLL_TESTNET_CONFIGURATION } from 'src/features/on-chain/calculation-manager/providers/dexes/scroll-testnet/uni-swap-v2-scroll-testnet/constants'; -import { UniSwapV2ScrollTestnetTrade } from 'src/features/on-chain/calculation-manager/providers/dexes/scroll-testnet/uni-swap-v2-scroll-testnet/uni-swap-v2-scroll-testnet-trade'; - -export class UniSwapV2ScrollTestnetProvider extends UniswapV2AbstractProvider { - public readonly blockchain = BLOCKCHAIN_NAME.SCROLL_TESTNET; - - public readonly UniswapV2TradeClass = UniSwapV2ScrollTestnetTrade; - - public readonly providerSettings = UNISWAP_V2_SCROLL_TESTNET_CONFIGURATION; -} diff --git a/src/features/on-chain/calculation-manager/providers/dexes/scroll-testnet/uni-swap-v3-scroll-testnet/constants/router-configuration.ts b/src/features/on-chain/calculation-manager/providers/dexes/scroll-testnet/uni-swap-v3-scroll-testnet/constants/router-configuration.ts deleted file mode 100644 index 2738775bd7..0000000000 --- a/src/features/on-chain/calculation-manager/providers/dexes/scroll-testnet/uni-swap-v3-scroll-testnet/constants/router-configuration.ts +++ /dev/null @@ -1,66 +0,0 @@ -import { wrappedNativeTokensList } from 'src/common/tokens'; -import { BLOCKCHAIN_NAME } from 'src/core/blockchain/models/blockchain-name'; -import { - UniswapV3RouterConfiguration, - UniswapV3RouterLiquidityPool -} from 'src/features/on-chain/calculation-manager/providers/dexes/common/uniswap-v3-abstract/models/uniswap-v3-router-configuration'; - -/** - * Most popular tokens in uni v3 to use in a route. - */ -const tokensSymbols = ['WETH', 'USDC', 'DAI', 'UNI'] as const; - -type TokenSymbol = (typeof tokensSymbols)[number]; - -const routerTokens: Record = { - WETH: wrappedNativeTokensList[BLOCKCHAIN_NAME.SCROLL_TESTNET]!.address, - // 0xa1ea0b2354f5a344110af2b6ad68e75545009a03 - USDC: '0x67aE69Fd63b4fc8809ADc224A9b82Be976039509', - DAI: '0x4702E5AEb70BdC05B11F8d8E701ad000dc85bD44', - UNI: '0x0CDEA04b370C1FA4bC2032b4ef23dB3EBCbA258a' -}; - -const routerLiquidityPools: UniswapV3RouterLiquidityPool[] = [ - { - poolAddress: '0xd33cb453ac9c69034365c7bf22e4afbada0fa4dd', - tokenSymbolA: 'USDC', - tokenSymbolB: 'WETH', - fee: 3000 - }, - { - poolAddress: '0x5c6a28124b8cc7091add3bdbd5591dc857b760d4', - tokenSymbolA: 'WETH', - tokenSymbolB: 'DAI', - fee: 3000 - }, - { - poolAddress: '0x3d85b9063da55b3cb7cdf6d11ef8f3b0c282d6c2', - tokenSymbolA: 'WETH', - tokenSymbolB: 'UNI', - fee: 3000 - }, - { - poolAddress: '0xb575c5b4d616a32f9669fecccdfa33eca9250913', - tokenSymbolA: 'USDC', - tokenSymbolB: 'DAI', - fee: 3000 - }, - { - poolAddress: '0xc8a882807d756af083db647fa05f9bcb8a8bb367', - tokenSymbolA: 'USDC', - tokenSymbolB: 'UNI', - fee: 3000 - }, - { - poolAddress: '0x8177bbbf8d174c204d10bd8aad43f136ef5ef462', - tokenSymbolA: 'DAI', - tokenSymbolB: 'UNI', - fee: 3000 - } -]; - -export const UNI_SWAP_V3_SCROLL_TESTNET_ROUTER_CONFIGURATION: UniswapV3RouterConfiguration = - { - tokens: routerTokens, - liquidityPools: routerLiquidityPools - }; diff --git a/yarn.lock b/yarn.lock index f2c7e80126..e76b30d475 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7361,10 +7361,10 @@ swarm-js@^0.1.40: tar "^4.0.2" xhr-request "^1.0.1" -symbiosis-js-sdk@^2.10.24: - version "2.10.24" - resolved "https://registry.yarnpkg.com/symbiosis-js-sdk/-/symbiosis-js-sdk-2.10.24.tgz#94e367096329ad6b9056f1f94f7c7d793bca840f" - integrity sha512-J6uk3yy+ggV3Hfi/xBjMfTWAztN/lQwX/+iKOi7AK7K0+UZ5Eu3D0ZHPQjLVsbAsivChA95ePrUnK7PY5IO30g== +symbiosis-js-sdk@2.10.31: + version "2.10.31" + resolved "https://registry.yarnpkg.com/symbiosis-js-sdk/-/symbiosis-js-sdk-2.10.31.tgz#e012a001fcc44f2c36e7cd78fbc94c95926d2181" + integrity sha512-STl/YmqFuAlrxX8R8yHW1dzo0Mhms/0adgfJ/O4APU7th4E/XPhPbS4ceZwZsvZEBQaBrwAAIxz1sNB6QgC4Eg== dependencies: big.js "^5.2.2" bignumber.js "^9.0.1" From 7380676caa6a85c7e6ef82311903d07d6d1e1c58 Mon Sep 17 00:00:00 2001 From: axtezy Date: Mon, 28 Aug 2023 15:03:25 +0200 Subject: [PATCH 14/15] Fix lint --- .../symbiosis-provider/symbiosis-cross-chain-trade.ts | 2 +- .../cross-chain/cbridge-manager/cross-chain-cbridge-manager.ts | 3 +-- .../symbiosis-manager/cross-chain-symbiosis-manager.ts | 2 +- 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/src/features/cross-chain/calculation-manager/providers/symbiosis-provider/symbiosis-cross-chain-trade.ts b/src/features/cross-chain/calculation-manager/providers/symbiosis-provider/symbiosis-cross-chain-trade.ts index 2f10427b9d..9a316d780b 100644 --- a/src/features/cross-chain/calculation-manager/providers/symbiosis-provider/symbiosis-cross-chain-trade.ts +++ b/src/features/cross-chain/calculation-manager/providers/symbiosis-provider/symbiosis-cross-chain-trade.ts @@ -297,7 +297,7 @@ export class SymbiosisCrossChainTrade extends EvmCrossChainTrade { '1inch': ON_CHAIN_TRADE_TYPE.ONE_INCH, 'open-ocean': ON_CHAIN_TRADE_TYPE.OPEN_OCEAN, wrap: ON_CHAIN_TRADE_TYPE.WRAPPED, - izumi: undefined, + // izumi: undefined, default: undefined }; return { diff --git a/src/features/cross-chain/cbridge-manager/cross-chain-cbridge-manager.ts b/src/features/cross-chain/cbridge-manager/cross-chain-cbridge-manager.ts index c1f293c934..b541faf316 100644 --- a/src/features/cross-chain/cbridge-manager/cross-chain-cbridge-manager.ts +++ b/src/features/cross-chain/cbridge-manager/cross-chain-cbridge-manager.ts @@ -1,7 +1,7 @@ import BigNumber from 'bignumber.js'; import { compareAddresses } from 'src/common/utils/blockchain'; -import { TEST_EVM_BLOCKCHAIN_NAME } from 'src/core/blockchain/models/blockchain-name'; import { CHAIN_TYPE } from 'src/core/blockchain/models/chain-type'; +import { BlockchainsInfo } from 'src/core/blockchain/utils/blockchains-info/blockchains-info'; import { Injector } from 'src/core/injector/injector'; import { CbridgeCrossChainApiService } from 'src/features/cross-chain/calculation-manager/providers/cbridge/cbridge-cross-chain-api-service'; import { cbridgeContractAbi } from 'src/features/cross-chain/calculation-manager/providers/cbridge/constants/cbridge-contract-abi'; @@ -13,7 +13,6 @@ import { } from 'src/features/cross-chain/calculation-manager/providers/cbridge/models/cbridge-status-response'; import Web3 from 'web3'; import { TransactionReceipt } from 'web3-eth'; -import {BlockchainsInfo} from "src/core/blockchain/utils/blockchains-info/blockchains-info"; export class CrossChainCbridgeManager { public static async getTransferId( diff --git a/src/features/cross-chain/symbiosis-manager/cross-chain-symbiosis-manager.ts b/src/features/cross-chain/symbiosis-manager/cross-chain-symbiosis-manager.ts index 74c5ba3266..532d032bbd 100644 --- a/src/features/cross-chain/symbiosis-manager/cross-chain-symbiosis-manager.ts +++ b/src/features/cross-chain/symbiosis-manager/cross-chain-symbiosis-manager.ts @@ -7,6 +7,7 @@ import { RubicSdkError } from 'src/common/errors'; import { Token } from 'src/common/tokens'; import { BlockchainName } from 'src/core/blockchain/models/blockchain-name'; import { CHAIN_TYPE } from 'src/core/blockchain/models/chain-type'; +import { BlockchainsInfo } from 'src/core/blockchain/utils/blockchains-info/blockchains-info'; import { blockchainId } from 'src/core/blockchain/utils/blockchains-info/constants/blockchain-id'; import { EvmWeb3Private } from 'src/core/blockchain/web3-private-service/web3-private/evm-web3-private/evm-web3-private'; import { Injector } from 'src/core/injector/injector'; @@ -15,7 +16,6 @@ import { SymbiosisRevertResponse } from 'src/features/cross-chain/symbiosis-mana import { SymbiosisStuckedResponse } from 'src/features/cross-chain/symbiosis-manager/models/symbiosis-stucked-api'; import { ChainId, CHAINS_PRIORITY, Symbiosis, WaitForComplete } from 'symbiosis-js-sdk'; import { TransactionReceipt } from 'web3-eth'; -import {BlockchainsInfo} from "src/core/blockchain/utils/blockchains-info/blockchains-info"; export class CrossChainSymbiosisManager { private get web3Private(): EvmWeb3Private { From 15922a3626a659707f2a946e16191b1a380a0207 Mon Sep 17 00:00:00 2001 From: axtezy Date: Mon, 28 Aug 2023 15:09:55 +0200 Subject: [PATCH 15/15] Fix izumi name --- .../providers/symbiosis-provider/symbiosis-cross-chain-trade.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/features/cross-chain/calculation-manager/providers/symbiosis-provider/symbiosis-cross-chain-trade.ts b/src/features/cross-chain/calculation-manager/providers/symbiosis-provider/symbiosis-cross-chain-trade.ts index 9a316d780b..2f10427b9d 100644 --- a/src/features/cross-chain/calculation-manager/providers/symbiosis-provider/symbiosis-cross-chain-trade.ts +++ b/src/features/cross-chain/calculation-manager/providers/symbiosis-provider/symbiosis-cross-chain-trade.ts @@ -297,7 +297,7 @@ export class SymbiosisCrossChainTrade extends EvmCrossChainTrade { '1inch': ON_CHAIN_TRADE_TYPE.ONE_INCH, 'open-ocean': ON_CHAIN_TRADE_TYPE.OPEN_OCEAN, wrap: ON_CHAIN_TRADE_TYPE.WRAPPED, - // izumi: undefined, + izumi: undefined, default: undefined }; return {