diff --git a/package.json b/package.json index 2f78ba0ef..31c96a755 100644 --- a/package.json +++ b/package.json @@ -101,7 +101,6 @@ "@across-protocol/across-token": "^1.0.0", "@across-protocol/constants": "^3.1.20", "@across-protocol/contracts": "^3.0.16", - "@eth-optimism/sdk": "^3.3.1", "@ethersproject/bignumber": "^5.7.0", "@pinata/sdk": "^2.1.0", "@types/mocha": "^10.0.1", diff --git a/src/relayFeeCalculator/chain-queries/baseQuery.ts b/src/relayFeeCalculator/chain-queries/baseQuery.ts index 514075eb6..6faf643cd 100644 --- a/src/relayFeeCalculator/chain-queries/baseQuery.ts +++ b/src/relayFeeCalculator/chain-queries/baseQuery.ts @@ -1,4 +1,3 @@ -import { L2Provider } from "@eth-optimism/sdk/dist/interfaces/l2-provider"; import { providers } from "ethers"; import assert from "assert"; import { Coingecko } from "../../coingecko"; @@ -17,7 +16,6 @@ import { Logger, QueryInterface } from "../relayFeeCalculator"; import { Transport } from "viem"; type Provider = providers.Provider; -type OptimismProvider = L2Provider; type SymbolMappingType = Record< string, { @@ -45,7 +43,7 @@ export class QueryBase implements QueryInterface { * @param coingeckoBaseCurrency The basis currency that CoinGecko will use to resolve pricing */ constructor( - readonly provider: Provider | OptimismProvider, + readonly provider: Provider, readonly symbolMapping: SymbolMappingType, readonly spokePoolAddress: string, readonly simulatedRelayerAddress: string, diff --git a/src/relayFeeCalculator/chain-queries/factory.ts b/src/relayFeeCalculator/chain-queries/factory.ts index 00a1051f3..1283a540d 100644 --- a/src/relayFeeCalculator/chain-queries/factory.ts +++ b/src/relayFeeCalculator/chain-queries/factory.ts @@ -1,10 +1,9 @@ import assert from "assert"; import { CHAIN_IDs, TOKEN_SYMBOLS_MAP } from "@across-protocol/constants"; import { getDeployedAddress } from "@across-protocol/contracts"; -import { asL2Provider } from "@eth-optimism/sdk"; import { providers } from "ethers"; import { DEFAULT_SIMULATED_RELAYER_ADDRESS } from "../../constants"; -import { chainIsAlephZero, chainIsMatic, chainIsOPStack, isDefined } from "../../utils"; +import { chainIsAlephZero, chainIsMatic, isDefined } from "../../utils"; import { QueryBase } from "./baseQuery"; import { PolygonQueries } from "./polygon"; import { DEFAULT_LOGGER, Logger } from "../relayFeeCalculator"; @@ -56,9 +55,6 @@ export class QueryBase__factory { ); } - // For OPStack chains, we need to wrap the provider in an L2Provider - provider = chainIsOPStack(chainId) ? asL2Provider(provider) : provider; - return new QueryBase( provider, symbolMapping, diff --git a/src/utils/common.ts b/src/utils/common.ts index 1943e33d2..0943b4307 100644 --- a/src/utils/common.ts +++ b/src/utils/common.ts @@ -1,5 +1,3 @@ -import { L2Provider } from "@eth-optimism/sdk/dist/interfaces/l2-provider"; -import { isL2Provider as isOptimismL2Provider } from "@eth-optimism/sdk/dist/l2-provider"; import assert from "assert"; import Decimal from "decimal.js"; import { ethers, PopulatedTransaction, providers, VoidSigner } from "ethers"; @@ -8,8 +6,9 @@ import { TypedMessage } from "../interfaces/TypedData"; import { BigNumber, BigNumberish, BN, formatUnits, parseUnits, toBN } from "./BigNumberUtils"; import { ConvertDecimals } from "./FormattingUtils"; import { chainIsOPStack } from "./NetworkUtils"; -import { Address, Transport } from "viem"; -import { CHAIN_IDs } from "@across-protocol/constants"; +import { Address, createPublicClient, Hex, http, Transport } from "viem"; +import * as chains from "viem/chains"; +import { publicActionsL2 } from "viem/op-stack"; import { estimateGas } from "viem/linea"; import { getPublicClient } from "../gasPriceOracle/util"; @@ -252,7 +251,7 @@ export type TransactionCostEstimate = { export async function estimateTotalGasRequiredByUnsignedTransaction( unsignedTx: PopulatedTransaction, senderAddress: string, - provider: providers.Provider | L2Provider, + provider: providers.Provider, options: Partial<{ gasPrice: BigNumberish; gasUnits: BigNumberish; @@ -270,19 +269,28 @@ export async function estimateTotalGasRequiredByUnsignedTransaction( // OP stack is a special case; gas cost is computed by the SDK, without having to query price. if (chainIsOPStack(chainId)) { - assert(isOptimismL2Provider(provider), `Unexpected provider for chain ID ${chainId}.`); + const chain = Object.values(chains).find((chain) => chain.id === chainId); + assert(chain, `Chain ID ${chainId} not supported`); + const opStackClient = createPublicClient({ + chain, + transport: transport ?? http(), + }).extend(publicActionsL2()); const populatedTransaction = await voidSigner.populateTransaction({ ...unsignedTx, gasLimit: nativeGasCost, // prevents additional gas estimation call }); - // Concurrently estimate the gas cost on L1 and L2 instead of calling - // `provider.estimateTotalGasCost` to improve performance. const [l1GasCost, l2GasPrice] = await Promise.all([ - provider.estimateL1GasCost(populatedTransaction), - _gasPrice || provider.getGasPrice(), + opStackClient.estimateL1Fee({ + account: senderAddress as Address, + to: populatedTransaction.to as Address, + value: BigInt(populatedTransaction.value?.toString() ?? 0), + data: populatedTransaction.data as Hex, + gas: populatedTransaction.gasLimit ? BigInt(populatedTransaction.gasLimit.toString()) : undefined, + }), + _gasPrice ? BigInt(_gasPrice.toString()) : opStackClient.getGasPrice(), ]); - const l2GasCost = nativeGasCost.mul(l2GasPrice); - tokenGasCost = l1GasCost.add(l2GasCost); + const l2GasCost = nativeGasCost.mul(l2GasPrice.toString()); + tokenGasCost = BigNumber.from(l1GasCost.toString()).add(l2GasCost); } else if (chainId === CHAIN_IDs.LINEA && process.env[`NEW_GAS_PRICE_ORACLE_${chainId}`] === "true") { // Permit linea_estimateGas via NEW_GAS_PRICE_ORACLE_59144=true const { diff --git a/yarn.lock b/yarn.lock index 938219667..fa1163c46 100644 --- a/yarn.lock +++ b/yarn.lock @@ -565,15 +565,6 @@ resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.49.0.tgz#86f79756004a97fa4df866835093f1df3d03c333" integrity sha512-1S8uAY/MTJqVx0SC4epBq+N2yhuwtNwLbJYNZyhL2pO1ZVKn5HFXav5T41Ryzy9K9V7ZId2JB2oy/W4aCd9/2w== -"@eth-optimism/contracts@0.6.0": - version "0.6.0" - resolved "https://registry.yarnpkg.com/@eth-optimism/contracts/-/contracts-0.6.0.tgz#15ae76222a9b4d958a550cafb1960923af613a31" - integrity sha512-vQ04wfG9kMf1Fwy3FEMqH2QZbgS0gldKhcBeBUPfO8zu68L61VI97UDXmsMQXzTsEAxK8HnokW3/gosl4/NW3w== - dependencies: - "@eth-optimism/core-utils" "0.12.0" - "@ethersproject/abstract-provider" "^5.7.0" - "@ethersproject/abstract-signer" "^5.7.0" - "@eth-optimism/contracts@^0.5.37", "@eth-optimism/contracts@^0.5.40", "@eth-optimism/contracts@^0.5.5": version "0.5.40" resolved "https://registry.yarnpkg.com/@eth-optimism/contracts/-/contracts-0.5.40.tgz#d13a04a15ea947a69055e6fc74d87e215d4c936a" @@ -605,26 +596,6 @@ bufio "^1.0.7" chai "^4.3.4" -"@eth-optimism/core-utils@0.13.2": - version "0.13.2" - resolved "https://registry.yarnpkg.com/@eth-optimism/core-utils/-/core-utils-0.13.2.tgz#c0187c3abf6d86dad039edf04ff81299253214fe" - integrity sha512-u7TOKm1RxH1V5zw7dHmfy91bOuEAZU68LT/9vJPkuWEjaTl+BgvPDRDTurjzclHzN0GbWdcpOqPZg4ftjkJGaw== - dependencies: - "@ethersproject/abi" "^5.7.0" - "@ethersproject/abstract-provider" "^5.7.0" - "@ethersproject/address" "^5.7.0" - "@ethersproject/bignumber" "^5.7.0" - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/constants" "^5.7.0" - "@ethersproject/contracts" "^5.7.0" - "@ethersproject/keccak256" "^5.7.0" - "@ethersproject/properties" "^5.7.0" - "@ethersproject/rlp" "^5.7.0" - "@ethersproject/web" "^5.7.1" - chai "^4.3.10" - ethers "^5.7.2" - node-fetch "^2.6.7" - "@eth-optimism/core-utils@^0.7.7": version "0.7.7" resolved "https://registry.yarnpkg.com/@eth-optimism/core-utils/-/core-utils-0.7.7.tgz#c993d45d2be7a1956284621ad18129a88880c658" @@ -638,18 +609,6 @@ ethers "^5.5.4" lodash "^4.17.21" -"@eth-optimism/sdk@^3.3.1": - version "3.3.1" - resolved "https://registry.yarnpkg.com/@eth-optimism/sdk/-/sdk-3.3.1.tgz#f72b6f93b58e2a2943f10aca3be91dfc23d9839f" - integrity sha512-zf8qL+KwYWUUwvdcjF1HpBxgKSt5wsKr8oa6jwqUhdPkQHUtVK5SRKtqXqYplnAgKtxDQYwlK512GU16odEl1w== - dependencies: - "@eth-optimism/contracts" "0.6.0" - "@eth-optimism/core-utils" "0.13.2" - lodash "^4.17.21" - merkletreejs "^0.3.11" - rlp "^2.2.7" - semver "^7.6.0" - "@ethereum-waffle/chai@4.0.10": version "4.0.10" resolved "https://registry.yarnpkg.com/@ethereum-waffle/chai/-/chai-4.0.10.tgz#6f600a40b6fdaed331eba42b8625ff23f3a0e59a" @@ -1142,7 +1101,7 @@ "@ethersproject/transactions" "^5.7.0" "@ethersproject/wordlists" "^5.7.0" -"@ethersproject/web@5.7.1", "@ethersproject/web@^5.5.1", "@ethersproject/web@^5.7.0", "@ethersproject/web@^5.7.1": +"@ethersproject/web@5.7.1", "@ethersproject/web@^5.5.1", "@ethersproject/web@^5.7.0": version "5.7.1" resolved "https://registry.yarnpkg.com/@ethersproject/web/-/web-5.7.1.tgz#de1f285b373149bee5928f4eb7bcb87ee5fbb4ae" integrity sha512-Gueu8lSvyjBWL4cYsWsjh6MtMwM0+H4HvqFPZfB6dV8ctbP9zFAO73VG1cMWae0FLPCtz0peKPpZY8/ugJJX2w== @@ -4883,11 +4842,6 @@ buffer-layout@^1.2.0, buffer-layout@^1.2.2: resolved "https://registry.yarnpkg.com/buffer-layout/-/buffer-layout-1.2.2.tgz#b9814e7c7235783085f9ca4966a0cfff112259d5" integrity sha512-kWSuLN694+KTk8SrYvCqwP2WcgQjoRCiF5b4QDvkkz8EmgD+aWAIceGFKMIAdmF/pH+vpgNV3d3kAKorcdAmWA== -buffer-reverse@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/buffer-reverse/-/buffer-reverse-1.0.1.tgz#49283c8efa6f901bc01fa3304d06027971ae2f60" - integrity sha1-SSg8jvpvkBvAH6MwTQYCeXGuL2A= - buffer-to-arraybuffer@^0.0.5: version "0.0.5" resolved "https://registry.yarnpkg.com/buffer-to-arraybuffer/-/buffer-to-arraybuffer-0.0.5.tgz#6064a40fa76eb43c723aba9ef8f6e1216d10511a" @@ -5133,7 +5087,7 @@ chai-exclude@^2.1.0: dependencies: fclone "^1.0.11" -chai@^4.3.0, chai@^4.3.10, chai@^4.3.4, chai@^4.3.8: +chai@^4.3.0, chai@^4.3.4, chai@^4.3.8: version "4.4.1" resolved "https://registry.yarnpkg.com/chai/-/chai-4.4.1.tgz#3603fa6eba35425b0f2ac91a009fe924106e50d1" integrity sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g== @@ -5888,11 +5842,6 @@ crypto-hash@^1.3.0: resolved "https://registry.yarnpkg.com/crypto-hash/-/crypto-hash-1.3.0.tgz#b402cb08f4529e9f4f09346c3e275942f845e247" integrity sha512-lyAZ0EMyjDkVvz8WOeVnuCPvKVBXcMv1l5SVqO1yC7PzTwrD/pPje/BIRbWhMoPe436U+Y2nD7f5bFx0kt+Sbg== -crypto-js@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/crypto-js/-/crypto-js-4.2.0.tgz#4d931639ecdfd12ff80e8186dba6af2c2e856631" - integrity sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q== - css-color-names@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/css-color-names/-/css-color-names-1.0.1.tgz#6ff7ee81a823ad46e020fa2fd6ab40a887e2ba67" @@ -10949,17 +10898,6 @@ merkle-patricia-tree@^4.2.2, merkle-patricia-tree@^4.2.4: readable-stream "^3.6.0" semaphore-async-await "^1.5.1" -merkletreejs@^0.3.11: - version "0.3.11" - resolved "https://registry.yarnpkg.com/merkletreejs/-/merkletreejs-0.3.11.tgz#e0de05c3ca1fd368de05a12cb8efb954ef6fc04f" - integrity sha512-LJKTl4iVNTndhL+3Uz/tfkjD0klIWsHlUzgtuNnNrsf7bAlXR30m+xYB7lHr5Z/l6e/yAIsr26Dabx6Buo4VGQ== - dependencies: - bignumber.js "^9.0.1" - buffer-reverse "^1.0.1" - crypto-js "^4.2.0" - treeify "^1.1.0" - web3-utils "^1.3.4" - methods@^1.1.2, methods@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" @@ -13183,7 +13121,7 @@ rlp@2.2.6: dependencies: bn.js "^4.11.1" -rlp@^2.0.0, rlp@^2.2.3, rlp@^2.2.4, rlp@^2.2.7: +rlp@^2.0.0, rlp@^2.2.3, rlp@^2.2.4: version "2.2.7" resolved "https://registry.yarnpkg.com/rlp/-/rlp-2.2.7.tgz#33f31c4afac81124ac4b283e2bd4d9720b30beaf" integrity sha512-d5gdPmgQ0Z+AklL2NVXr/IoSjNZFfTVvQWzL/AM2AOcSzYP2xjlb0AC8YyCLc41MSNf6P6QVtjgPdmVtzb+4lQ== @@ -13417,7 +13355,7 @@ semver@^6.1.0, semver@^6.1.1, semver@^6.1.2, semver@^6.3.0, semver@^6.3.1: resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== -semver@^7.0.0, semver@^7.1.2, semver@^7.3.4, semver@^7.3.5, semver@^7.5.3, semver@^7.5.4, semver@^7.6.0: +semver@^7.0.0, semver@^7.1.2, semver@^7.3.4, semver@^7.3.5, semver@^7.5.3, semver@^7.5.4: version "7.6.0" resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.0.tgz#1a46a4db4bffcccd97b743b5005c8325f23d4e2d" integrity sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg== @@ -14547,11 +14485,6 @@ tr46@~0.0.3: resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" integrity sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o= -treeify@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/treeify/-/treeify-1.1.0.tgz#4e31c6a463accd0943879f30667c4fdaff411bb8" - integrity sha512-1m4RA7xVAJrSGrrXGs0L3YTwyvBs2S8PbRHaLZAkFw7JR8oIFwYtysxlBZhYIa7xSyiYJKZ3iGrrk55cGA3i9A== - triple-beam@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/triple-beam/-/triple-beam-1.3.0.tgz#a595214c7298db8339eeeee083e4d10bd8cb8dd9" @@ -15584,7 +15517,7 @@ web3-utils@1.8.2: randombytes "^2.1.0" utf8 "3.0.0" -web3-utils@^1.0.0-beta.31, web3-utils@^1.2.1, web3-utils@^1.3.0, web3-utils@^1.3.4, web3-utils@^1.3.6: +web3-utils@^1.0.0-beta.31, web3-utils@^1.2.1, web3-utils@^1.3.0, web3-utils@^1.3.6: version "1.10.2" resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.10.2.tgz#361103d28a94d5e2a87ba15d776a62c33303eb44" integrity sha512-TdApdzdse5YR+5GCX/b/vQnhhbj1KSAtfrDtRW7YS0kcWp1gkJsN62gw6GzCaNTeXookB7UrLtmDUuMv65qgow==