hardhat-zksync-chai-matchers


hardhat-zksync-chai-matchers

这个插件为Chaiopen in new window断言库增加了zkSync的特定功能,用于测试智能合约。它扩展了hardhat-chai-matchersopen in new window插件所支持的所有功能,其理念是保留相同的行为和接口。 目前,它是与本地测试环境结合使用的。

NOTE: 由于恢复的事务的响应高度依赖于RPC的实现,所有hardhatopen in new window以revert开头的chai匹配器都受到了影响(但chai匹配器接口没有任何变化)。此外,来自changeEtherBalance/changeEtherBalances的options参数已经扩展了overrides字段,以便支持带有overrides的zksync-web3传输方法。

安装

用以下命令将该插件的最新版本添加到你的项目中。

# Yarn
yarn add -D @matterlabs/hardhat-zksync-chai-matchers @nomicfoundation/hardhat-chai-matchers chai @nomiclabs/hardhat-ethers ethers

# Npm (version 7 or later is recommended)
npm i -D @matterlabs/hardhat-zksync-chai-matchers

Usage

安装后,将该插件添加到你的Hardhat配置中。

import "@matterlabs/hardhat-zksync-chai-matchers";

Then you'll be able to use the matchers in your tests.

changeEtherBalance

断言一个地址的余额改变了一个特定的数量。

await expect(() =>
  sender.transfer({
    to: receiver.address,
    amount: 2000,
  })
).to.changeEtherBalance(sender.address, BigInt("-2000"));

await expect(() =>
  sender.sendTransaction({
    to: receiver.address,
    value: 1000,
  })
).to.changeEtherBalance(sender.address, "-1000");

这种匹配器包括额外的选项参数,包括收费和覆盖交易的功能。

overrides = {
  type: 2,
  maxFeePerGas: 1 * gasPrice,
  maxPriorityFeePerGas: 1 * gasPrice,
};

await expect(() =>
  sender.transfer({
    to: receiver.address,
    amount: 500,
    overrides,
  })
).to.changeEtherBalance(sender, -(txGasFees + 500), {
  balanceChangeOptions: {
    includeFee: true,
  },
  overrides,
});

changeTokenBalance

断言一个地址的ERC20代币余额改变了一个特定的数额。

await expect(sender.transfer({ to: receiver.address, amount: 5, token: token.address })).to.changeTokenBalance(token, sender, -5);

await expect(token.transfer(receiver.address, 5)).to.not.changeTokenBalance(token, sender, 0);

reverted

断言一项交易因任何原因而恢复。

await expect(contract.setAmount(100)).to.be.reverted;

revertedWithCustomError

断言一个交易因一个特定的自定义错误而被恢复。

await expect(contract.setAmount(100)).to.be.revertedWithCustomError(contract, "InvalidAmount");

而你也可以使用常规的匹配器,如。

emit

await expect(contract.setAmount(100)).to.emit(contract, "AmountUpdated");

properAddress

expect("0x36615Cf349d7F6344891B1e7CA7C72883F5dc049").to.be.properAddress;

Comparisons of numbers

expect(await contract.getAmount()).to.equal(100);

查看使用chai匹配器的优势这里open in new window。由于所有支持的chai匹配器的列表与hardhat-chai-matchersopen in new window插件相同,请查看参考文档open in new window