diff --git a/packages/eth-providers/src/base-provider.ts b/packages/eth-providers/src/base-provider.ts index e328da215..831c2d21f 100644 --- a/packages/eth-providers/src/base-provider.ts +++ b/packages/eth-providers/src/base-provider.ts @@ -932,7 +932,11 @@ export abstract class BaseProvider extends AbstractProvider { transaction: Deferrable, blockTag?: BlockTag | Promise ): Promise => { - const { usedGas, gasLimit, usedStorage } = await this.estimateResources(transaction, blockTag); + const blockHash = blockTag && blockTag !== 'latest' + ? await this._getBlockHash(blockTag) + : undefined; // if blockTag is latest, avoid explicit blockhash for better performance + + const { usedGas, gasLimit, usedStorage } = await this.estimateResources(transaction, blockHash); const tx = await resolveProperties(transaction); const data = tx.data?.toString() ?? '0x'; @@ -968,9 +972,13 @@ export abstract class BaseProvider extends AbstractProvider { return encodeGasLimit(txFee, gasPrice, gasLimit, usedStorage, isTokenTransfer); }; - _estimateGasCost = async (extrinsic: SubmittableExtrinsic<'promise', ISubmittableResult>) => { + _estimateGasCost = async ( + extrinsic: SubmittableExtrinsic<'promise', ISubmittableResult>, + at?: string, + ) => { + const apiAt = await this.api.at(at ?? await this.bestBlockHash); + const u8a = extrinsic.toU8a(); - const apiAt = await this.api.at(await this.bestBlockHash); const lenIncreaseAfterSignature = 100; // approximate length increase after signature const feeDetails = await apiAt.call.transactionPaymentApi.queryFeeDetails( u8a, @@ -1102,7 +1110,7 @@ export abstract class BaseProvider extends AbstractProvider { */ estimateResources = async ( transaction: Deferrable, - blockTag?: BlockTag | Promise, + blockHash?: string, ): Promise<{ usedGas: BigNumber; gasLimit: BigNumber; @@ -1120,10 +1128,6 @@ export abstract class BaseProvider extends AbstractProvider { storageLimit: STORAGE_LIMIT, }; - const blockHash = blockTag && blockTag !== 'latest' - ? await this._getBlockHash(blockTag) - : undefined; // if blockTag is latest, avoid explicit blockhash for better performance - const gasInfo = await this._ethCall(txRequest, blockHash); const usedGas = BigNumber.from(gasInfo.used_gas).toNumber(); const usedStorage = gasInfo.used_storage;