Hardhat开发中ethers.parseUnits的正确使用姿势及版本迁移


本文旨在解决hardhat项目中常见的`typeerror: cannot read properties of undefined (reading 'parseunits')`错误。该问题通常源于`ethers.js`库在v5和v6版本之间对工具函数api的重大变更。我们将详细解释这一变化,提供正确的`ethers v6`语法,并指导开发者如何检查和适配`ethers.js`版本,确保智能合约测试和交互的顺畅进行。

理解ethers.parseUnits错误

在Hardhat开发中,我们经常需要将人类可读的以太币数量(如"1 ether")转换为EVM所需的最小单位(wei)。ethers.js库提供了parseUnits和parseEther等实用函数来完成这项任务。然而,当开发者在测试或脚本中尝试使用如下代码时,可能会遇到TypeError: Cannot read properties of undefined (reading 'parseUnits')的错误:

const { deployments, ethers, getNamedAccounts } = require("hardhat");
const { assert, expect } = require("chai");

describe("FundMe", async function () {
    let fundMe;
    let deployer;
    // 错误示例:在ethers v6环境中尝试使用v5语法
    const sendValue = ethers.utils.parseUnits("1", "ether"); 
    // 或者
    // const sendValue = ethers.utils.parseEther("1"); 
});

这个错误明确指出ethers.utils对象上没有parseUnits属性,这通常不是因为拼写错误,而是因为ethers.js库的版本发生了变化。

错误的根源:ethers.js版本差异

ethers.js是一个核心的以太坊JavaScript库,广泛用于Hardhat项目。在ethers.js的v5版本中,许多实用工具函数,如parseUnits、formatUnits、keccak256等,都被封装在ethers.utils命名空间下。因此,使用ethers.utils.parseUnits()是正确的。

然而,从ethers.js的v6版本开始,为了简化API和提高模块化程度,许多常用的工具函数被提升到了ethers对象的顶层。这意味着ethers.utils命名空间下的许多函数,包括parseUnits和parseEther,都直接成为了ethers对象的属性。

因此,当你的Hardhat项目依赖于ethers.js v6版本,但你的代码仍然沿用ethers v5的ethers.utils.parseUnits语法时,就会出现上述的TypeError。

解决方案:适配ethers v6语法

解决这个问题的关键是更新你的代码以匹配ethers v6的API。只需将对ethers.utils.parseUnits或ethers.utils.parseEther的调用更改为直接调用ethers.parseUnits或ethers.parseEther即可。

以下是修正后的代码示例:

const { deployments, ethers, getNamedAccounts } = require("hardhat");
const { assert, expect } = require("chai");

describe("FundMe", async function () {
    let fundMe;
    let deployer;
    // 正确的ethers v6语法
    const sendValue = ethers.parseUnits("1", "ether"); 
    // 或者,对于以太币单位,更简洁的写法
    // const sendValue = ethers.parseEther("1"); 
});

如何确认ethers.js版本

为了避免此类版本兼容性问题,了解你的项目当前使用的ethers.js版本至关重要。你可以通过以下方式进行检查:

  1. package.json文件: 在你的项目根目录下的package.json文件中,查找dependencies或devDependencies部分,通常会看到ethers的依赖项及其版本号:

    {
      "name": "your-hardhat-project",
      "version": "1.0.0",
      "devDependencies": {
        "hardhat": "^2.x.x",
        "@nomicfoundation/hardhat-ethers": "^3.x.x", // 这个包通常会拉取ethers v6
        "ethers": "^6.x.x" // 直接声明的ethers版本
      }
    }

    请注意,Hardhat本身或其插件(如@nomicfoundation/hardhat-ethers)可能会隐式地依赖特定版本的ethers.js。@nomicfoundation/hardhat-ethers v3及以上版本通常会引入ethers v6。

  2. npm list ethers或yarn why ethers: 在项目终端中运行以下命令,可以查看ethers库的实际安装版本:

    npm list ethers
    # 或者
    yarn why ethers

    这将显示项目中所有ethers依赖的树状结构和版本信息。

注意事项与最佳实践

  1. 始终查阅最新文档: 在进行开发时,务必查阅与你项目所安装的ethers.js版本相对应的官方文档。ethers.js的官方文档在不同版本之间有清晰的区分,例如v5文档和v6文档。
  2. 版本锁定: 在package.json中使用^或~符号来指定依赖版本虽然方便,但在团队协作或长期项目中可能导致不一致。为了确保所有开发者和部署环境都使用相同的库版本,可以考虑使用确切的版本号(例如"ethers": "6.7.0")或在安装依赖后生成package-lock.json(npm)或yarn.lock(yarn)文件并提交到版本控制。
  3. 迁移指南: 如果你的项目是从ethers v5升级到ethers v6,请务必仔细阅读ethers.js官方提供的迁移指南,了解所有API的重大变更,以便进行全面的代码更新。

总结

TypeError: Cannot read properties of undefined (reading 'parseUnits')错误是ethers.js从v5到v6版本API变更的一个典型表现。通过将ethers.utils.parseUnits或ethers.utils.parseEther更新为ethers.parseUnits或ethers.parseEther,并确保你的代码与项目实际使用的ethers.js版本保持一致,可以轻松解决这一问题。在日常开发中,养成检查依赖版本和查阅对应版本文档的习惯,将大大提高开发效率并减少不必要的调试时间。


# javascript  # java  # js  # json  # npm  # 工具  # ai  # 以太坊  # 以太币  #  


相关栏目: 【 Google疑问12 】 【 Facebook疑问10 】 【 网络优化76771 】 【 技术知识130152 】 【 IDC云计算60162 】 【 营销推广131313 】 【 AI优化88182 】 【 百度推广37138 】 【 网站推荐60173 】 【 精选阅读31334


相关推荐: Win11怎么设置默认邮件应用_Windows11应用关联Mail设置  Windows如何设置登录时的欢迎屏幕背景?(锁屏界面)  Windows10怎么备份注册表_Windows10注册表备份步骤【教程】  Windows 11如何查看系统激活密钥_Windows 11使用CMD或PowerShell命令找回Product Key  Win11怎么设置单手模式_Win11触控键盘布局调整教程【技巧】  使用类变量定义字符串常量时的类型安全最佳实践  c++怎么使用std::unique实现去重_c++ 容器元素排序与连续重复删除【教程】  Windows10怎么查看系统激活状态_Windows10激活状态查看方法【教程】  PHP 中如何在函数内持久化修改引用变量的指向  Win10如何更改开机密码_Windows10登录选项更改密码  Windows10如何更改桌面图标间距_Win10注册表WindowMetrics修改  Windows10如何更改日期格式_Win10区域设置短日期修改  如何减少Golang内存碎片化_Golang内存分配与回收优化方法  Win11怎么关闭小组件_Win11禁用任务栏天气与小组件方法【设置】  c++如何用AFL++进行模糊测试 c++ Fuzzing入门【安全】  Win10如何关闭安全中心所有通知 Win10禁用Windows Defender提醒【设置】  Python高性能计算项目教程_NumPyCythonGPU并行加速  phpstudy本地环境mysql忘记密码_重置mysqlroot密码操作流程【解答】  Win10电脑C盘红了怎么清理_Windows10系统盘深度瘦身指南  Python解释执行模型_字节码流程说明【指导】  c++ reinterpret_cast怎么用 c++最危险的类型转换【详解】  如何用::实现单例模式_php静态方法与作用域操作符应用【技巧】  Mac电脑如何恢复出厂设置_Mac抹掉数据并重装系统【安全指南】  Win11怎么更改输入法顺序_Win11调整语言首选位置【设置】  Win11怎么用设置清理回收站_Win11设置清理回收站技巧【步骤】  php订单日志怎么记录评价_php记录订单评价日志方法【方法】  Win11怎样激活系统密钥_Win11系统密钥激活步骤【攻略】  Mac如何修复应用程序权限问题_Mac磁盘工具修复权限【教程】  php控制舵机角度怎么调_php发送pwm信号控制舵机转动【解答】  Python面向对象实战讲解_类与设计模式深入理解  Win11怎么设置任务栏对齐方式_Windows11个性化任务栏行为  Python大型项目拆分策略_模块化解析【教程】  为什么本地php环境运行php脚本卡顿_php执行效率优化方法与设置【说明】  如何在 PHP 中按相同键合并两个关联数组为二维数组  php高频调试功能有哪些_php常用调试函数与工具汇总【解答】  Win11键盘快捷键大全_Windows 11常用高效快捷键汇总【技巧】  php修改数据怎么批量改状态_批量更新status字段值技巧【操作】  php删除数据怎么清空表_truncate与delete区别及用法【汇总】  全球各国上班时间表外贸邮件时间  Python装饰器复用技巧_通用能力解析【教程】  Windows蓝屏BAD_POOL_HEADER故障详解_蓝屏池损坏错误修复指南  Mac的访达(Finder)怎么用_Mac文件管理入门教程【详解】  Win10怎样设置闹钟贪睡时间 Win10闹钟贪睡时长设置【步骤】  Win11怎么关闭应用权限_Windows11相机麦克风隐私管理  Win11怎么退出微软账户_切换Win11为本地账户登录方法【详解】  短链接怎么用php递归还原_多层加密链接的处理法【详解】  Win10路由器怎么隐藏ssid Win10隐藏wifi名称设置【指南】  Win11关机快捷键是什么_Win11快速关机方法【大全】  php中作用域操作符能访问私有静态属性吗_访问权限限制【指南】  如何在Golang中实现服务熔断与限流_Golang微服务容错与流控方法 

 2025-12-08

了解您产品搜索量及市场趋势,制定营销计划

同行竞争及网站分析保障您的广告效果

点击免费数据支持

提交您的需求,1小时内享受我们的专业解答。

致胜网络推广营销网


致胜网络推广营销网

致胜网络推广营销网专注海外推广十年,是谷歌推广.Facebook广告全球合作伙伴,我们精英化的技术团队为企业提供谷歌海外推广+外贸网站建设+网站维护运营+Google SEO优化+社交营销为您提供一站式海外营销服务。

 915688610

 17370845950

 915688610@qq.com

Notice

We and selected third parties use cookies or similar technologies for technical purposes and, with your consent, for other purposes as specified in the cookie policy.
You can consent to the use of such technologies by closing this notice, by interacting with any link or button outside of this notice or by continuing to browse otherwise.