diff --git a/__mocks__/ethers.ts b/__mocks__/ethers.ts index fe9e44e6223..1f2617e84dd 100644 --- a/__mocks__/ethers.ts +++ b/__mocks__/ethers.ts @@ -15,7 +15,7 @@ const ethersMock = { ...ethers, providers: { JsonRpcProvider: vi.fn(), - JsonRpcBatchProvider: vi.fn(), + StaticJsonRpcProvider: vi.fn(), }, Contract: vi.fn().mockImplementation(address => ({ decimals: () => { diff --git a/packages/caip/src/adapters/yearn/utils.ts b/packages/caip/src/adapters/yearn/utils.ts index e546b294ec4..65dd160c843 100644 --- a/packages/caip/src/adapters/yearn/utils.ts +++ b/packages/caip/src/adapters/yearn/utils.ts @@ -10,7 +10,7 @@ import { toChainId } from '../../chainId/chainId' import { CHAIN_NAMESPACE, CHAIN_REFERENCE } from '../../constants' const network = 1 // 1 for mainnet -const provider = new ethers.providers.JsonRpcBatchProvider(process.env.REACT_APP_ETHEREUM_NODE_URL) +const provider = new ethers.providers.StaticJsonRpcProvider(process.env.REACT_APP_ETHEREUM_NODE_URL) const yearnSdk = new Yearn(network, { provider }) export const writeFiles = async (data: Record>) => { diff --git a/packages/unchained-client/src/evm/bnbsmartchain/parser/bep20.ts b/packages/unchained-client/src/evm/bnbsmartchain/parser/bep20.ts index ce703cdc7fa..75dd0009853 100644 --- a/packages/unchained-client/src/evm/bnbsmartchain/parser/bep20.ts +++ b/packages/unchained-client/src/evm/bnbsmartchain/parser/bep20.ts @@ -16,11 +16,11 @@ export interface TxMetadata extends BaseTxMetadata { interface ParserArgs { chainId: ChainId - provider: ethers.providers.JsonRpcBatchProvider + provider: ethers.providers.StaticJsonRpcProvider } export class Parser implements SubParser { - provider: ethers.providers.JsonRpcBatchProvider + provider: ethers.providers.StaticJsonRpcProvider readonly chainId: ChainId readonly abiInterface = new ethers.utils.Interface(bep20) diff --git a/packages/unchained-client/src/evm/ethereum/parser/uniV2.ts b/packages/unchained-client/src/evm/ethereum/parser/uniV2.ts index 02929d69afb..2ced225eb75 100644 --- a/packages/unchained-client/src/evm/ethereum/parser/uniV2.ts +++ b/packages/unchained-client/src/evm/ethereum/parser/uniV2.ts @@ -23,11 +23,11 @@ export interface TxMetadata extends BaseTxMetadata { export interface ParserArgs { chainId: ChainId - provider: ethers.providers.JsonRpcBatchProvider + provider: ethers.providers.StaticJsonRpcProvider } export class Parser implements SubParser { - provider: ethers.providers.JsonRpcBatchProvider + provider: ethers.providers.StaticJsonRpcProvider readonly chainId: ChainId readonly wethContract: string readonly abiInterface = new ethers.utils.Interface(UNIV2_ABI) diff --git a/packages/unchained-client/src/evm/ethereum/parser/weth.ts b/packages/unchained-client/src/evm/ethereum/parser/weth.ts index 704cc270d00..cbb9458bf15 100644 --- a/packages/unchained-client/src/evm/ethereum/parser/weth.ts +++ b/packages/unchained-client/src/evm/ethereum/parser/weth.ts @@ -16,11 +16,11 @@ export interface TxMetadata extends BaseTxMetadata { export interface ParserArgs { chainId: ChainId - provider: ethers.providers.JsonRpcBatchProvider + provider: ethers.providers.StaticJsonRpcProvider } export class Parser implements SubParser { - provider: ethers.providers.JsonRpcBatchProvider + provider: ethers.providers.StaticJsonRpcProvider readonly chainId: ChainId readonly wethContract: string readonly abiInterface = new ethers.utils.Interface(WETH_ABI) diff --git a/packages/unchained-client/src/evm/parser/erc20.ts b/packages/unchained-client/src/evm/parser/erc20.ts index 51a17cfa4b6..99f15b9885e 100644 --- a/packages/unchained-client/src/evm/parser/erc20.ts +++ b/packages/unchained-client/src/evm/parser/erc20.ts @@ -16,11 +16,11 @@ export interface TxMetadata extends BaseTxMetadata { interface ParserArgs { chainId: ChainId - provider: ethers.providers.JsonRpcBatchProvider + provider: ethers.providers.StaticJsonRpcProvider } export class Parser implements SubParser { - provider: ethers.providers.JsonRpcBatchProvider + provider: ethers.providers.StaticJsonRpcProvider readonly chainId: ChainId readonly abiInterface = new ethers.utils.Interface(ERC20_ABI) diff --git a/packages/unchained-client/src/evm/parser/index.ts b/packages/unchained-client/src/evm/parser/index.ts index e05ff2ec060..ada84ef49d1 100644 --- a/packages/unchained-client/src/evm/parser/index.ts +++ b/packages/unchained-client/src/evm/parser/index.ts @@ -26,7 +26,7 @@ export class BaseTransactionParser { assetId: AssetId protected readonly api: Api - protected readonly provider: ethers.providers.JsonRpcBatchProvider + protected readonly provider: ethers.providers.StaticJsonRpcProvider private parsers: SubParser[] = [] @@ -34,7 +34,7 @@ export class BaseTransactionParser { this.chainId = args.chainId this.assetId = args.assetId this.api = args.api - this.provider = new ethers.providers.JsonRpcBatchProvider(args.rpcUrl) + this.provider = new ethers.providers.StaticJsonRpcProvider(args.rpcUrl) } /** diff --git a/packages/unchained-client/src/evm/parser/nft.ts b/packages/unchained-client/src/evm/parser/nft.ts index 09ede124ef7..8acc5997db9 100644 --- a/packages/unchained-client/src/evm/parser/nft.ts +++ b/packages/unchained-client/src/evm/parser/nft.ts @@ -18,13 +18,13 @@ export interface TxMetadata extends BaseTxMetadata { interface ParserArgs { chainId: ChainId api: Api - provider: ethers.providers.JsonRpcBatchProvider + provider: ethers.providers.StaticJsonRpcProvider } const supportedTokenTypes = ['ERC721', 'ERC1155', 'BEP721', 'BEP1155'] export class Parser implements SubParser { - provider: ethers.providers.JsonRpcBatchProvider + provider: ethers.providers.StaticJsonRpcProvider readonly chainId: ChainId readonly api: Api diff --git a/scripts/generateAssetData/ethereum/yearnVaults.ts b/scripts/generateAssetData/ethereum/yearnVaults.ts index 3df057030e9..65ebf5ea880 100644 --- a/scripts/generateAssetData/ethereum/yearnVaults.ts +++ b/scripts/generateAssetData/ethereum/yearnVaults.ts @@ -9,7 +9,7 @@ import { ethereum } from '../baseAssets' import { colorMap } from '../colorMap' const network = 1 // 1 for mainnet -const provider = new ethers.providers.JsonRpcBatchProvider(process.env.ETHEREUM_NODE_URL) +const provider = new ethers.providers.StaticJsonRpcProvider(process.env.ETHEREUM_NODE_URL) export const yearnSdk = new Yearn(network, { provider }) const explorerData = { diff --git a/src/lib/ethersProviderSingleton.ts b/src/lib/ethersProviderSingleton.ts index b208071a4a2..a66c8686dd8 100644 --- a/src/lib/ethersProviderSingleton.ts +++ b/src/lib/ethersProviderSingleton.ts @@ -29,13 +29,13 @@ export const rpcUrlByChainId = (chainId: EvmChainId): string => { } } -const ethersProviders: Map = new Map() +const ethersProviders: Map = new Map() export const getEthersProvider = ( chainId: EvmChainId = KnownChainIds.EthereumMainnet, -): providers.JsonRpcBatchProvider => { +): providers.StaticJsonRpcProvider => { if (!ethersProviders.has(chainId)) { - const provider = new providers.JsonRpcBatchProvider(rpcUrlByChainId(chainId)) + const provider = new providers.StaticJsonRpcProvider(rpcUrlByChainId(chainId)) ethersProviders.set(chainId, provider) return provider } else { diff --git a/src/lib/investor/investor-foxy/api/api.ts b/src/lib/investor/investor-foxy/api/api.ts index eb45b5d9d55..c74d047279c 100644 --- a/src/lib/investor/investor-foxy/api/api.ts +++ b/src/lib/investor/investor-foxy/api/api.ts @@ -60,6 +60,7 @@ type EthereumChainReference = export type ConstructorArgs = { adapter: EvmBaseAdapter providerUrl: string + provider: ethers.providers.StaticJsonRpcProvider foxyAddresses: FoxyAddressesType chainReference?: EthereumChainReference } @@ -83,9 +84,8 @@ const TOKE_IPFS_URL = 'https://ipfs.tokemaklabs.xyz/ipfs' export class FoxyApi { public adapter: EvmBaseAdapter - public provider: ethers.providers.JsonRpcBatchProvider + public provider: ethers.providers.StaticJsonRpcProvider private providerUrl: string - public jsonRpcProvider: ethers.providers.JsonRpcBatchProvider private foxyStakingContracts: ethers.Contract[] private liquidityReserveContracts: ethers.Contract[] private readonly ethereumChainReference: ChainReference @@ -96,10 +96,10 @@ export class FoxyApi { providerUrl, foxyAddresses, chainReference = CHAIN_REFERENCE.EthereumMainnet, + provider, }: ConstructorArgs) { this.adapter = adapter - this.provider = new ethers.providers.JsonRpcBatchProvider(providerUrl) - this.jsonRpcProvider = new ethers.providers.JsonRpcBatchProvider(providerUrl) + this.provider = provider this.foxyStakingContracts = foxyAddresses.map( addresses => new ethers.Contract(addresses.staking, foxyStakingAbi, this.provider), ) diff --git a/src/lib/investor/investor-foxy/foxycli.ts b/src/lib/investor/investor-foxy/foxycli.ts index d77cbfb2020..4c717810d98 100644 --- a/src/lib/investor/investor-foxy/foxycli.ts +++ b/src/lib/investor/investor-foxy/foxycli.ts @@ -4,6 +4,7 @@ import { NativeHDWallet } from '@shapeshiftoss/hdwallet-native' import { WithdrawType } from '@shapeshiftoss/types' import * as unchained from '@shapeshiftoss/unchained-client' import dotenv from 'dotenv' +import { ethers } from 'ethers' import readline from 'readline-sync' import { bnOrZero } from 'lib/bignumber/bignumber' @@ -54,6 +55,9 @@ const main = async (): Promise => { adapter: ethChainAdapter, providerUrl: process.env.ARCHIVE_NODE || 'http://127.0.0.1:8545/', foxyAddresses, + provider: new ethers.providers.StaticJsonRpcProvider( + process.env.ARCHIVE_NODE || 'http://127.0.0.1:8545/', + ), }) const accountNumber = 0 diff --git a/src/lib/market-service/foxy/foxy.test.ts b/src/lib/market-service/foxy/foxy.test.ts index 7c8898d27a3..d4a006b1950 100644 --- a/src/lib/market-service/foxy/foxy.test.ts +++ b/src/lib/market-service/foxy/foxy.test.ts @@ -1,5 +1,6 @@ import { HistoryTimeframe } from '@shapeshiftoss/types' import type { AxiosInstance } from 'axios' +import { ethers } from 'ethers' import { beforeAll, describe, expect, it, vi } from 'vitest' import { bn } from 'lib/bignumber/bignumber' @@ -7,6 +8,7 @@ import { FOXY_ASSET_ID, FoxyMarketService } from './foxy' import { fox, mockFoxyMarketData } from './foxyMockData' const foxyMarketService = new FoxyMarketService({ + provider: new ethers.providers.StaticJsonRpcProvider(''), providerUrls: { jsonRpcProviderUrl: 'dummy', unchainedEthereumHttpUrl: '', diff --git a/src/lib/market-service/foxy/foxy.ts b/src/lib/market-service/foxy/foxy.ts index 5b7a7a7ce9a..712cc074629 100644 --- a/src/lib/market-service/foxy/foxy.ts +++ b/src/lib/market-service/foxy/foxy.ts @@ -7,6 +7,7 @@ import type { PriceHistoryArgs, } from '@shapeshiftoss/types' import * as unchained from '@shapeshiftoss/unchained-client' +import type { ethers } from 'ethers' import { foxyAddresses, FoxyApi } from 'lib/investor/investor-foxy' import type { MarketService } from '../api' @@ -19,11 +20,19 @@ const FOXY_ASSET_PRECISION = '18' export class FoxyMarketService extends CoinGeckoMarketService implements MarketService { providerUrls: ProviderUrls - - constructor({ providerUrls }: { providerUrls: ProviderUrls }) { + provider: ethers.providers.StaticJsonRpcProvider + + constructor({ + providerUrls, + provider, + }: { + providerUrls: ProviderUrls + provider: ethers.providers.StaticJsonRpcProvider + }) { super() this.providerUrls = providerUrls + this.provider = provider } async findAll() { @@ -71,6 +80,7 @@ export class FoxyMarketService extends CoinGeckoMarketService implements MarketS adapter: ethChainAdapter, providerUrl: this.providerUrls.jsonRpcProviderUrl, foxyAddresses, + provider: this.provider, }) const tokenContractAddress = foxyAddresses[0].foxy diff --git a/src/lib/market-service/market-service-manager.ts b/src/lib/market-service/market-service-manager.ts index 352b0d0a8bf..736f706a075 100644 --- a/src/lib/market-service/market-service-manager.ts +++ b/src/lib/market-service/market-service-manager.ts @@ -6,6 +6,7 @@ import type { MarketDataArgs, PriceHistoryArgs, } from '@shapeshiftoss/types' +import type { ethers } from 'ethers' import { AssetService } from 'lib/asset-service' // import { Yearn } from '@yfi/sdk' @@ -25,6 +26,7 @@ export type ProviderUrls = { export type MarketServiceManagerArgs = { yearnChainReference: 1 | 250 | 1337 | 42161 // from @yfi/sdk providerUrls: ProviderUrls + provider: ethers.providers.StaticJsonRpcProvider } export class MarketServiceManager { @@ -32,7 +34,7 @@ export class MarketServiceManager { assetService: AssetService constructor(args: MarketServiceManagerArgs) { - const { providerUrls } = args + const { providerUrls, provider } = args // TODO(0xdef1cafe): after chain agnosticism, we need to dependency inject a chainReference here // YearnVaultMarketCapService deps @@ -48,7 +50,7 @@ export class MarketServiceManager { // Yearn is currently borked upstream // new YearnVaultMarketCapService({ yearnSdk }), // new YearnTokenMarketCapService({ yearnSdk }), - new FoxyMarketService({ providerUrls }), + new FoxyMarketService({ providerUrls, provider }), ] this.assetService = new AssetService() diff --git a/src/lib/market-service/market-service.test.ts b/src/lib/market-service/market-service.test.ts index 42662230677..93560c39bb1 100644 --- a/src/lib/market-service/market-service.test.ts +++ b/src/lib/market-service/market-service.test.ts @@ -1,4 +1,5 @@ import { HistoryTimeframe } from '@shapeshiftoss/types' +import { ethers } from 'ethers' import { describe, expect, it, vi } from 'vitest' import { CoinGeckoMarketService } from './coingecko/coingecko' @@ -99,6 +100,7 @@ describe('market service', () => { const marketServiceManagerArgs = { coinGeckoAPIKey: 'dummyCoingeckoApiKey', yearnChainReference: 1 as const, + provider: new ethers.providers.StaticJsonRpcProvider(''), providerUrls: { jsonRpcProviderUrl: '', unchainedEthereumWsUrl: '', diff --git a/src/plugins/walletConnectToDapps/hooks/useGetAbi.tsx b/src/plugins/walletConnectToDapps/hooks/useGetAbi.tsx index 085f62d965d..c41df7d08b0 100644 --- a/src/plugins/walletConnectToDapps/hooks/useGetAbi.tsx +++ b/src/plugins/walletConnectToDapps/hooks/useGetAbi.tsx @@ -28,7 +28,7 @@ export const useGetAbi = ( const { to: contractAddress, data } = transactionParams const provider = useMemo( - () => new ethers.providers.JsonRpcBatchProvider(getConfig().REACT_APP_ETHEREUM_NODE_URL), + () => new ethers.providers.StaticJsonRpcProvider(getConfig().REACT_APP_ETHEREUM_NODE_URL), [], ) diff --git a/src/state/apis/foxy/foxyApiSingleton.ts b/src/state/apis/foxy/foxyApiSingleton.ts index 97d35bc547f..e2d09623c58 100644 --- a/src/state/apis/foxy/foxyApiSingleton.ts +++ b/src/state/apis/foxy/foxyApiSingleton.ts @@ -1,6 +1,7 @@ import type { EvmBaseAdapter } from '@shapeshiftoss/chain-adapters' import { KnownChainIds } from '@shapeshiftoss/types' import { getConfig } from 'config' +import { getEthersProvider } from 'lib/ethersProviderSingleton' import { foxyAddresses, FoxyApi } from 'lib/investor/investor-foxy' import { assertGetEvmChainAdapter } from 'lib/utils/evm' @@ -19,6 +20,7 @@ export const getFoxyApi = (): FoxyApi => { ) as EvmBaseAdapter, providerUrl: getConfig()[RPC_PROVIDER_ENV], foxyAddresses, + provider: getEthersProvider(KnownChainIds.EthereumMainnet), }) _foxyApi = foxyApi diff --git a/src/state/slices/marketDataSlice/marketServiceManagerSingleton.ts b/src/state/slices/marketDataSlice/marketServiceManagerSingleton.ts index 6e1bb819e56..239d3759ade 100644 --- a/src/state/slices/marketDataSlice/marketServiceManagerSingleton.ts +++ b/src/state/slices/marketDataSlice/marketServiceManagerSingleton.ts @@ -1,5 +1,7 @@ // do not directly use or export, singleton +import { KnownChainIds } from '@shapeshiftoss/types' import { getConfig } from 'config' +import { getEthersProvider } from 'lib/ethersProviderSingleton' import { MarketServiceManager } from 'lib/market-service' let _marketServiceManager: MarketServiceManager | undefined @@ -11,6 +13,7 @@ export const getMarketServiceManager: GetMarketServiceManager = () => { if (!_marketServiceManager) { _marketServiceManager = new MarketServiceManager({ yearnChainReference: 1, // CHAIN_REFERENCE.EthereumMainnet is '1', yearn requires strict number union + provider: getEthersProvider(KnownChainIds.EthereumMainnet), providerUrls: { jsonRpcProviderUrl: config.REACT_APP_ETHEREUM_NODE_URL, unchainedEthereumHttpUrl: config.REACT_APP_UNCHAINED_ETHEREUM_HTTP_URL,