You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.15 04:12:12