diff --git a/.changeset/eleven-pears-accept.md b/.changeset/eleven-pears-accept.md new file mode 100644 index 0000000000..e9aa77aea2 --- /dev/null +++ b/.changeset/eleven-pears-accept.md @@ -0,0 +1,5 @@ +--- +"@nomicfoundation/hardhat-ethers": patch +--- + +Added support for passing bigints as block tags diff --git a/packages/hardhat-ethers/src/internal/hardhat-ethers-provider.ts b/packages/hardhat-ethers/src/internal/hardhat-ethers-provider.ts index 7289c075c8..19d5a31fe3 100644 --- a/packages/hardhat-ethers/src/internal/hardhat-ethers-provider.ts +++ b/packages/hardhat-ethers/src/internal/hardhat-ethers-provider.ts @@ -597,6 +597,15 @@ export class HardhatEthersProvider implements ethers.Provider { return this.getBlockNumber().then((b) => toQuantity(b + blockTag)); } + if (typeof blockTag === "bigint") { + if (blockTag >= 0n) { + return toQuantity(blockTag); + } + return this.getBlockNumber().then((b) => + toQuantity(b + Number(blockTag)) + ); + } + throw new HardhatEthersError(`Invalid blockTag: ${blockTag}`); } diff --git a/packages/hardhat-ethers/test/hardhat-ethers-provider.ts b/packages/hardhat-ethers/test/hardhat-ethers-provider.ts index 3faa40eaba..ae3878dcf7 100644 --- a/packages/hardhat-ethers/test/hardhat-ethers-provider.ts +++ b/packages/hardhat-ethers/test/hardhat-ethers-provider.ts @@ -688,6 +688,43 @@ describe("hardhat ethers provider", function () { ); }); + it("should accept a block number as a bigint", async function () { + const signer = await this.env.ethers.provider.getSigner(0); + const factory = new this.env.ethers.ContractFactory<[], ExampleContract>( + EXAMPLE_CONTRACT.abi, + EXAMPLE_CONTRACT.deploymentBytecode, + signer + ); + const contract = await factory.deploy(); + await contract.inc(); + + const blockNumber = await this.env.ethers.provider.getBlockNumber(); + + const resultAfter = await this.env.ethers.provider.call({ + from: signer.address, + to: contract, + data: "0x3fa4f245", // value() + blockTag: "latest", + }); + + assert.strictEqual( + resultAfter, + "0x0000000000000000000000000000000000000000000000000000000000000001" + ); + + const resultBefore = await this.env.ethers.provider.call({ + from: signer.address, + to: contract, + data: "0x3fa4f245", // value() + blockTag: BigInt(blockNumber - 1), + }); + + assert.strictEqual( + resultBefore, + "0x0000000000000000000000000000000000000000000000000000000000000000" + ); + }); + it("should accept a block hash", async function () { const signer = await this.env.ethers.provider.getSigner(0); const factory = new this.env.ethers.ContractFactory<[], ExampleContract>(