From 7964bf00259e6bda2413f9d1f47eb0d93f7f9033 Mon Sep 17 00:00:00 2001 From: iosh Date: Wed, 11 Sep 2024 21:24:07 +0800 Subject: [PATCH] fix: hardhat-chai-matchers - add check byte32 string to reverted matcher --- .changeset/ninety-trainers-rush.md | 5 ++++ .../src/internal/reverted/reverted.ts | 23 ++++++++++++++++++- .../src/internal/reverted/utils.ts | 5 ++++ .../test/reverted/reverted.ts | 8 +++++++ 4 files changed, 40 insertions(+), 1 deletion(-) create mode 100644 .changeset/ninety-trainers-rush.md diff --git a/.changeset/ninety-trainers-rush.md b/.changeset/ninety-trainers-rush.md new file mode 100644 index 0000000000..1b8843806a --- /dev/null +++ b/.changeset/ninety-trainers-rush.md @@ -0,0 +1,5 @@ +--- +"@nomicfoundation/hardhat-chai-matchers": patch +--- + +Enhanced byte32 string in `reverted` matcher check diff --git a/packages/hardhat-chai-matchers/src/internal/reverted/reverted.ts b/packages/hardhat-chai-matchers/src/internal/reverted/reverted.ts index 77a3c74ea7..b22464b3b2 100644 --- a/packages/hardhat-chai-matchers/src/internal/reverted/reverted.ts +++ b/packages/hardhat-chai-matchers/src/internal/reverted/reverted.ts @@ -3,7 +3,11 @@ import type EthersT from "ethers"; import { buildAssert } from "../../utils"; import { REVERTED_MATCHER } from "../constants"; import { assertIsNotNull, preventAsyncMatcherChaining } from "../utils"; -import { decodeReturnData, getReturnDataFromError } from "./utils"; +import { + decodeReturnData, + getReturnDataFromError, + parseBytes32String, +} from "./utils"; export function supportReverted( Assertion: Chai.AssertionStatic, @@ -36,6 +40,14 @@ export function supportReverted( const receipt = await getTransactionReceipt(hash); + if (receipt === null) { + // If the receipt is null, maybe the string is a bytes32 string + if (isByte32String(hash)) { + assert(false, "Expected transaction to be reverted"); + return; + } + } + assertIsNotNull(receipt, "receipt"); assert( receipt.status === 0, @@ -134,3 +146,12 @@ function isTransactionReceipt(x: unknown): x is { status: number } { function isValidTransactionHash(x: string): boolean { return /0x[0-9a-fA-F]{64}/.test(x); } + +function isByte32String(v: string): boolean { + try { + parseBytes32String(v); + return true; + } catch { + return false; + } +} diff --git a/packages/hardhat-chai-matchers/src/internal/reverted/utils.ts b/packages/hardhat-chai-matchers/src/internal/reverted/utils.ts index 253ed71562..0a769a17c4 100644 --- a/packages/hardhat-chai-matchers/src/internal/reverted/utils.ts +++ b/packages/hardhat-chai-matchers/src/internal/reverted/utils.ts @@ -125,3 +125,8 @@ export function resultToArray(result: EthersT.Result): any[] { : x ); } + +export function parseBytes32String(v: string): string { + const ethers = require("ethers") as typeof EthersT; + return ethers.decodeBytes32String(v); +} diff --git a/packages/hardhat-chai-matchers/test/reverted/reverted.ts b/packages/hardhat-chai-matchers/test/reverted/reverted.ts index 7d32cb391b..7c73113384 100644 --- a/packages/hardhat-chai-matchers/test/reverted/reverted.ts +++ b/packages/hardhat-chai-matchers/test/reverted/reverted.ts @@ -112,6 +112,14 @@ describe("INTEGRATION: Reverted", function () { "Expected a valid transaction hash, but got '0x123'" ); }); + + it("promise of an byte32 string", async function () { + await expect( + Promise.resolve( + "0x3230323400000000000000000000000000000000000000000000000000000000" + ) + ).not.to.be.reverted; + }); }); describe("with a TxResponse as its subject", function () {