测试中调用ethers.utils.parseEther等方法时遇未定义错误求助
问题排查与解决方案
一、Ethers相关错误修复
1. ethers.utils.parseEther 未定义错误
错误原因:
- 测试代码中直接使用
ethers但未正确获取Hardhat环境的ethers实例; sendValue定义在beforeEach外部,此时Hardhat环境可能未初始化完成。
修复方案:
- 在测试逻辑中通过Hardhat Runtime Environment获取ethers实例;
- 将
sendValue的定义移至beforeEach内部,确保环境初始化后再调用工具方法。
修正后的测试代码片段:
let fundMe let mockV3Aggregator let deployer let sendValue beforeEach(async () => { deployer = (await getNamedAccounts()).deployer await deployments.fixture(["all"]) // 正确获取Hardhat环境内的ethers实例 const ethers = require("hardhat").ethers sendValue = ethers.utils.parseEther("1") // 获取对应地址的signer实例 const signer = await ethers.getSigner(deployer) // 正确传入getContractAt的参数:合约名、地址、signer fundMe = await ethers.getContractAt("FundMe", deployer, signer) mockV3Aggregator = await ethers.getContractAt( "MockV3Aggregator", deployer, signer ) })
2. Cannot read properties of undefined (reading 'getContract') 错误
错误原因:
ethers.getContractAt参数顺序错误:第二个参数应为合约地址,第三个参数才是signer实例,你之前直接传入deployer地址导致方法调用异常;- 未明确获取signer对象,Hardhat合约交互需要绑定具体的signer实例。
修复方案:
- 通过
ethers.getSigner(deployer)获取对应地址的signer实例; - 调用
getContractAt时严格遵循参数顺序:合约名称/ABI、合约地址、signer实例。
二、Verify工具代码修复
你的verify代码存在两处关键问题:
1. 错误捕获逻辑失效
当前代码中catch (e) {}直接吞掉错误,导致后续无法判断错误类型;且错误判断语句在catch块外部,此时e未定义,无法执行逻辑。
2. 参数名拼写错误
Hardhat的verify:verify任务中,构造函数参数的键名是小写开头的constructorArguments,你写成了大写开头的ConstructorArguments,会导致验证请求失败。
修正后的verify代码:
const { run } = require("hardhat") async function verify(contractAddress, args) { console.log("Verifying contract..") try { await run("verify:verify", { address: contractAddress, constructorArguments: args, // 修正参数名大小写 }) } catch (e) { // 将错误判断逻辑移至catch块内部 if (e.message.toLowerCase().includes("already verified")) { console.log("Already Verified") } else { console.log(e) } } } module.exports = { verify }
内容的提问来源于stack exchange,提问作者Anooj Patnaik
相关产品推荐
相关产品推荐

