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

如何在Hardhat中测试已部署合约?Ethers.js v6适配问题

解决方案:Ethers.js v6下Hardhat测试已部署合约

1. 先修复代码中的低级错误

你的测试代码里存在拼写错误:getContractFactrory → getContractFactory(少了字母o),这会直接导致函数调用失败。

2. Ethers.js v6下连接已部署合约的两种正确方式

方式一:使用getContractFactory + attach(兼容原有写法)

在Hardhat环境中,即使升级到Ethers.js v6,ethers.getContractFactory仍可正常使用,修正拼写后即可:

const { expect } = require("chai")
const { ethers } = require("hardhat")
require("dotenv").config({path: "/home/ardakl/blockchain-tutorials/hardhat/.env"})

describe("StarDucks", () => {

    let starDucks, tokenSale;

    before("Get the signers and contracts", async() => {
        
        // 修复拼写错误
        const StarDucks = await ethers.getContractFactory("StarDucks")
        starDucks = await StarDucks.attach("0x1613beB3B2C4f22Ee086B2b38C1476A3cE7f78E8")

        const TokenSale = await ethers.getContractFactory("TokenSale")
        tokenSale = await TokenSale.attach("0x851356ae760d987E095750cCeb3bC6014560891C")
    })

    it("Should not have any tokens in my deployer account", async() => {
        // balanceOf是异步函数,必须加await
        const balance = await starDucks.balanceOf("0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266")
        expect(balance).to.equal(0)
    })
})

方式二:直接使用ethers.getContractAt(更简洁)

Ethers.js v6推荐直接用getContractAt连接已部署合约,无需先获取工厂,写法更简洁:

const { expect } = require("chai")
const { ethers } = require("hardhat")
require("dotenv").config({path: "/home/ardakl/blockchain-tutorials/hardhat/.env"})

describe("StarDucks", () => {

    let starDucks, tokenSale;

    before("Get the signers and contracts", async() => {
        // 直接用getContractAt连接合约
        starDucks = await ethers.getContractAt("StarDucks", "0x1613beB3B2C4f22Ee086B2b38C1476A3cE7f78E8")
        tokenSale = await ethers.getContractAt("TokenSale", "0x851356ae760d987E095750cCeb3bC6014560891C")
    })

    it("Should not have any tokens in my deployer account", async() => {
        const balance = await starDucks.balanceOf("0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266")
        expect(balance).to.equal(0)
    })
})

3. 额外注意事项

  • 异步操作必须加await:balanceOf是异步函数,未加await会返回Promise对象而非实际余额,导致测试失败。
  • 环境变量路径校验:确保.env文件路径配置正确,避免因路径错误导致环境变量无法加载。
  • Hardhat版本适配:建议使用最新版Hardhat以兼容Ethers.js v6,可通过npm install hardhat@latest更新。

内容的提问来源于stack exchange,提问作者Arda Karahan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 13:16:19