如何在Hardhat测试和脚本中使用不同地址调用函数?
Hardhat 测试/脚本切换调用地址的实现方法
完全可以在单份测试/脚本内自由切换调用地址,以下是3种常用的实现方式:
- 单次调用临时切换:使用合约实例的
connect()方法
这是最常用的切换方式,仅对当前单次调用生效,不会影响其他调用的默认地址,示例代码如下:// 获取Hardhat默认提供的10个测试签名者,第一个是默认调用地址 const [defaultSigner, user1, user2] = await ethers.getSigners(); // 部署合约默认使用第一个签名者 const MyContract = await ethers.getContractFactory("MyContract"); const myContract = await MyContract.deploy(); await myContract.deployed(); // 切换为user1发起调用 await myContract.connect(user1).transfer(user2.address, 100); // 切换为user2发起调用 await myContract.connect(user2).approve(defaultSigner.address, 50); - 批量调用绑定签名者:生成绑定指定地址的合约实例
如果你需要连续多次用同一个非默认地址调用合约,可以直接生成绑定了指定签名者的合约实例,后续调用无需重复写connect():// 生成绑定user1的合约实例 const user1Contract = myContract.connect(user1); // 后续所有调用都默认使用user1地址 await user1Contract.mint(1000); await user1Contract.burn(200); - 全局修改默认调用地址:修改ethers默认签名者
如果你需要将当前脚本/测试的所有后续调用都切换为另一个地址,可以直接修改ethers的默认签名者配置:const [_, user1] = await ethers.getSigners(); // 全局替换默认签名者为user1 ethers.provider.getSigner = () => user1; // 后续部署合约、调用合约默认都用user1发起 const AnotherContract = await ethers.getContractFactory("AnotherContract"); const anotherContract = await AnotherContract.deploy();
注意:以上所有修改都仅在当前测试/脚本的运行上下文内生效,不会影响其他测试用例的默认地址配置。
内容的提问来源于stack exchange,提问作者Nico
相关产品推荐
相关产品推荐

