From 62d27f08303036ab2be6ef556495cc9c6adc348b Mon Sep 17 00:00:00 2001 From: Matt Solomon Date: Thu, 30 Jun 2022 07:22:33 -0700 Subject: [PATCH 1/3] perf: use StaticJsonRpcProvider for inura endpoints in frontend --- frontend/src/utils/constants.ts | 4 ++-- frontend/src/utils/ethers.ts | 2 +- frontend/src/utils/payment-links.ts | 4 ++-- frontend/src/utils/umbra-api.ts | 4 ++-- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/frontend/src/utils/constants.ts b/frontend/src/utils/constants.ts index 59c48729f..c10f11f15 100644 --- a/frontend/src/utils/constants.ts +++ b/frontend/src/utils/constants.ts @@ -1,7 +1,7 @@ -import { JsonRpcProvider } from 'src/utils/ethers'; +import { StaticJsonRpcProvider } from 'src/utils/ethers'; export const MAINNET_RPC_URL = `https://mainnet.infura.io/v3/${String(process.env.INFURA_ID)}`; -export const MAINNET_PROVIDER = new JsonRpcProvider(MAINNET_RPC_URL); +export const MAINNET_PROVIDER = new StaticJsonRpcProvider(MAINNET_RPC_URL); export const ETH_NETWORK_LOGO = 'data:image/png;base64,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'; // prettier-ignore diff --git a/frontend/src/utils/ethers.ts b/frontend/src/utils/ethers.ts index 3831de19e..9e4402ff5 100644 --- a/frontend/src/utils/ethers.ts +++ b/frontend/src/utils/ethers.ts @@ -12,6 +12,6 @@ export { Contract } from '@ethersproject/contracts'; export { namehash } from '@ethersproject/hash'; export { keccak256 } from '@ethersproject/keccak256'; export { Logger, LogLevel } from '@ethersproject/logger'; -export { Block, JsonRpcProvider, JsonRpcSigner, Network, TransactionReceipt, TransactionResponse, Web3Provider, } from '@ethersproject/providers'; // prettier-ignore +export { Block, JsonRpcSigner, Network, StaticJsonRpcProvider, TransactionReceipt, TransactionResponse, Web3Provider } from '@ethersproject/providers'; // prettier-ignore export { toUtf8Bytes } from '@ethersproject/strings'; export { parseUnits, formatUnits } from '@ethersproject/units'; diff --git a/frontend/src/utils/payment-links.ts b/frontend/src/utils/payment-links.ts index 85bfe9ea3..87a5e1140 100644 --- a/frontend/src/utils/payment-links.ts +++ b/frontend/src/utils/payment-links.ts @@ -3,7 +3,7 @@ import { TokenInfoExtended } from 'components/models'; import { utils as umbraUtils } from '@umbra/umbra-js'; import useWalletStore from 'src/store/wallet'; import { notifyUser } from 'src/utils/alerts'; -import { JsonRpcProvider } from 'src/utils/ethers'; +import { StaticJsonRpcProvider } from 'src/utils/ethers'; import { UmbraApi } from 'src/utils/umbra-api'; /** @@ -11,7 +11,7 @@ import { UmbraApi } from 'src/utils/umbra-api'; */ function getProvider() { const { provider } = useWalletStore(); - return provider.value || new JsonRpcProvider(`https://mainnet.infura.io/v3/${String(process.env.INFURA_ID)}`); + return provider.value || new StaticJsonRpcProvider(`https://mainnet.infura.io/v3/${String(process.env.INFURA_ID)}`); } /** diff --git a/frontend/src/utils/umbra-api.ts b/frontend/src/utils/umbra-api.ts index 52541a040..270fe20d1 100644 --- a/frontend/src/utils/umbra-api.ts +++ b/frontend/src/utils/umbra-api.ts @@ -2,7 +2,7 @@ * @notice Class for managing relayed withdrawal transactions */ -import { JsonRpcProvider } from 'src/utils/ethers'; +import { StaticJsonRpcProvider } from './ethers'; import { FeeEstimateResponse, RelayerStatusResponse, @@ -21,7 +21,7 @@ export class UmbraApi { readonly nativeTokenMinSendAmount: string | undefined ) {} - static async create(provider: Provider | JsonRpcProvider) { + static async create(provider: Provider | StaticJsonRpcProvider) { // Get API URL based on chain ID const chainId = (await provider.getNetwork()).chainId; const baseUrl = 'https://mainnet.api.umbra.cash'; // works for all networks From bf8ab5a6077a744da057514cbb0a783049c22f93 Mon Sep 17 00:00:00 2001 From: Matt Solomon Date: Thu, 30 Jun 2022 07:24:26 -0700 Subject: [PATCH 2/3] refactor: remove unused itx method --- frontend/src/utils/umbra-api.ts | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/frontend/src/utils/umbra-api.ts b/frontend/src/utils/umbra-api.ts index 270fe20d1..dfb00f631 100644 --- a/frontend/src/utils/umbra-api.ts +++ b/frontend/src/utils/umbra-api.ts @@ -5,7 +5,6 @@ import { StaticJsonRpcProvider } from './ethers'; import { FeeEstimateResponse, - RelayerStatusResponse, Provider, TokenInfoExtended, RelayResponse, @@ -60,15 +59,4 @@ export class UmbraApi { if ('error' in data) throw new Error(`Could not relay withdraw: ${data.error}`); return data; } - - // Returns the status of the provided relayer transaction ID - async getRelayStatus(itxId: string) { - // If ChainID is 1 or 4, relaying is supported so fetch the status from the relayer. Otherwise, relaying is - // not supported on this chain so we throw an error - if (this.chainId !== 1 && this.chainId !== 4) throw new Error(`Unsupported relayer chain ID ${this.chainId}`); - const response = await fetch(`${this.baseUrl}/status/${itxId}?chainId=${this.chainId}`); - const data = (await response.json()) as RelayerStatusResponse; - if ('error' in data) throw new Error(`Could not get relay status: ${data.error}`); - return data; - } } From 071f2dbae7f074d7fc9b1dfb2cebb7a19b4d74bd Mon Sep 17 00:00:00 2001 From: Matt Solomon Date: Thu, 30 Jun 2022 07:34:42 -0700 Subject: [PATCH 3/3] perf: use StaticJsonRpcProvider for inura endpoints in umbra-js --- umbra-js/src/classes/Umbra.ts | 8 +++++--- umbra-js/src/ethers.ts | 2 +- umbra-js/src/types.ts | 4 ++-- umbra-js/src/utils/utils.ts | 5 +++-- umbra-js/test/Umbra.test.ts | 4 ++-- umbra-js/test/utils.test.ts | 10 +++++++--- 6 files changed, 20 insertions(+), 13 deletions(-) diff --git a/umbra-js/src/classes/Umbra.ts b/umbra-js/src/classes/Umbra.ts index 76bbb9b9b..eea76adec 100644 --- a/umbra-js/src/classes/Umbra.ts +++ b/umbra-js/src/classes/Umbra.ts @@ -13,12 +13,12 @@ import { getAddress, hexlify, isHexString, - JsonRpcProvider, JsonRpcSigner, keccak256, Overrides, sha256, splitSignature, + StaticJsonRpcProvider, toUtf8Bytes, TransactionResponse, Wallet, @@ -118,7 +118,7 @@ export class Umbra { // Fallback provider, used when a user's provider rejects the transaction. This may happen if the provider from // the user's wallet rejects transactions from accounts not associated with that user's wallet (in this case, that // means transactions from stealth addresses would be rejected). More info: https://github.com/coinbase/coinbase-wallet-sdk/issues/580 - readonly fallbackProvider: JsonRpcProvider; + readonly fallbackProvider: StaticJsonRpcProvider; // ========================================= CONSTRUCTOR ========================================= /** @@ -129,7 +129,9 @@ export class Umbra { constructor(readonly provider: EthersProvider, chainConfig: ChainConfig | number) { this.chainConfig = parseChainConfig(chainConfig); this.umbraContract = new Contract(this.chainConfig.umbraAddress, abi, provider) as UmbraContract; - this.fallbackProvider = new JsonRpcProvider(infuraUrl(this.chainConfig.chainId, String(process.env.INFURA_ID))); + this.fallbackProvider = new StaticJsonRpcProvider( + infuraUrl(this.chainConfig.chainId, String(process.env.INFURA_ID)) + ); } // ==================================== CONTRACT INTERACTION ===================================== diff --git a/umbra-js/src/ethers.ts b/umbra-js/src/ethers.ts index b774a1533..196a04467 100644 --- a/umbra-js/src/ethers.ts +++ b/umbra-js/src/ethers.ts @@ -18,8 +18,8 @@ export { EtherscanProvider, ExternalProvider, JsonRpcFetchFunc, - JsonRpcProvider, JsonRpcSigner, + StaticJsonRpcProvider, TransactionReceipt, TransactionResponse, Web3Provider, diff --git a/umbra-js/src/types.ts b/umbra-js/src/types.ts index 766e391e3..af666a3a3 100644 --- a/umbra-js/src/types.ts +++ b/umbra-js/src/types.ts @@ -2,7 +2,7 @@ import { BigNumber, ExternalProvider as EthersExternalProvider, JsonRpcFetchFunc, - JsonRpcProvider, + StaticJsonRpcProvider, Overrides, Web3Provider, } from './ethers'; @@ -11,7 +11,7 @@ import { export { TransactionResponse } from './ethers'; import { TransactionResponse } from './ethers'; export type ExternalProvider = EthersExternalProvider | JsonRpcFetchFunc; -export type EthersProvider = Web3Provider | JsonRpcProvider; +export type EthersProvider = Web3Provider | StaticJsonRpcProvider; // Transaction responses on L2s and other chains may have more fields than on L1. export interface TransactionResponseExtended extends TransactionResponse { diff --git a/umbra-js/src/utils/utils.ts b/umbra-js/src/utils/utils.ts index ce48d88f8..9d13bbe86 100644 --- a/umbra-js/src/utils/utils.ts +++ b/umbra-js/src/utils/utils.ts @@ -10,12 +10,12 @@ import { ContractInterface, getAddress, isHexString, - JsonRpcProvider, keccak256, Overrides, resolveProperties, serialize as serializeTransaction, splitSignature, + StaticJsonRpcProvider, UnsignedTransaction, } from '../ethers'; import { Point, Signature, recoverPublicKey } from 'noble-secp256k1'; @@ -304,7 +304,8 @@ async function resolveEns(name: string, provider: EthersProvider) { // and overriding with a mainnet provider otherwise. This ensures ENS resolution is always done // against L1, as explained here: https://twitter.com/makoto_inoue/status/1453737962110275598 const { chainId } = await provider.getNetwork(); - if (chainId !== 1) provider = new JsonRpcProvider(`https://mainnet.infura.io/v3/${String(process.env.INFURA_ID)}`); + if (chainId !== 1) + provider = new StaticJsonRpcProvider(`https://mainnet.infura.io/v3/${String(process.env.INFURA_ID)}`); const address = await provider.resolveName(name); return address || null; } catch (e) { diff --git a/umbra-js/test/Umbra.test.ts b/umbra-js/test/Umbra.test.ts index 7d977cdbc..9415a897e 100644 --- a/umbra-js/test/Umbra.test.ts +++ b/umbra-js/test/Umbra.test.ts @@ -1,7 +1,7 @@ import { ethers } from 'hardhat'; import hardhatConfig from '../hardhat.config'; import { Umbra } from '../src/classes/Umbra'; -import { BigNumberish, BigNumber, JsonRpcProvider, Wallet } from '../src/ethers'; +import { BigNumberish, BigNumber, StaticJsonRpcProvider, Wallet } from '../src/ethers'; import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/dist/src/signer-with-address'; import { HardhatNetworkHDAccountsUserConfig } from 'hardhat/src/types/config'; import { expect } from 'chai'; @@ -17,7 +17,7 @@ import { const { parseEther } = ethers.utils; const ethersProvider = ethers.provider; -const jsonRpcProvider = new JsonRpcProvider(hardhatConfig.networks?.hardhat?.forking?.url); +const jsonRpcProvider = new StaticJsonRpcProvider(hardhatConfig.networks?.hardhat?.forking?.url); const ETH_ADDRESS = '0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE'; const quantity = parseEther('5'); diff --git a/umbra-js/test/utils.test.ts b/umbra-js/test/utils.test.ts index 3a2280436..56187c275 100644 --- a/umbra-js/test/utils.test.ts +++ b/umbra-js/test/utils.test.ts @@ -166,19 +166,23 @@ describe('Utilities', () => { }); it('looks up transaction history on polygon', async () => { - const ethersProvider = new ethers.providers.JsonRpcProvider('https://polygon-rpc.com') as EthersProvider; + const ethersProvider = new ethers.providers.StaticJsonRpcProvider('https://polygon-rpc.com') as EthersProvider; const txHash = await utils.getSentTransaction(address, ethersProvider); expect(txHash).to.have.lengthOf(66); }); it('looks up transaction history on optimism', async () => { - const ethersProvider = new ethers.providers.JsonRpcProvider('https://mainnet.optimism.io') as EthersProvider; + const ethersProvider = new ethers.providers.StaticJsonRpcProvider( + 'https://mainnet.optimism.io' + ) as EthersProvider; const txHash = await utils.getSentTransaction(address, ethersProvider); expect(txHash).to.have.lengthOf(66); }); it('looks up transaction history on arbitrum one', async () => { - const ethersProvider = new ethers.providers.JsonRpcProvider('https://arb1.arbitrum.io/rpc') as EthersProvider; + const ethersProvider = new ethers.providers.StaticJsonRpcProvider( + 'https://arb1.arbitrum.io/rpc' + ) as EthersProvider; const txHash = await utils.getSentTransaction(address, ethersProvider); expect(txHash).to.have.lengthOf(66); });