新闻中心

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

2025-12-08
浏览次数:
返回列表

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是一个核心的以太坊J*aScript库,广泛用于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即可。

标贝悦读AI配音 标贝悦读AI配音

在线文字转语音软件-专业的配音网站

标贝悦读AI配音 78 查看详情 标贝悦读AI配音

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

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版本保持一致,可以轻松解决这一问题。在日常开发中,养成检查依赖版本和查阅对应版本文档的习惯,将大大提高开发效率并减少不必要的调试时间。

以上就是Hardhat开发中ethers.parseUnits的正确使用姿势及版本迁移的详细内容,更多请关注其它相关文章!


# java  # 加载  # 有何不同  # 是一个  # 键值  # 如何使用  # 通常会  # 这一  # 文档  # 以太  # 以太币  # 以太坊  # ai  # 工具  # npm  # json  # js  # javascript  #   # 网站推广排名怎样收费高  # 行唐商城网站推广费用  # 中山定制型网站推广公司  # 洛阳网站建设文案  # 网站优化排名一年多少钱  # 阿图什网络营销推广  # 武汉关键词排名靠谱乐云seo  # 果汁营销推广  # 闵行营销推广加盟店电话  # 沈阳专业的seo优化  # 就会 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: Lar*el Excel导入时生成自定义递增ID的策略与实践  Angular响应式表单:实现提交后表单及按钮的禁用与只读化  12306选座怎么选到临时改签座_12306改签选座策略与步骤  mysql如何设置表访问权限_mysql表访问权限配置  Django通过AJAX异步上传图片并保存至模型的完整指南  谷歌浏览器怎么给标签页静音_Chrome标签静音快捷操作  在J*a中如何开发简易博客标签推荐系统_博客标签推荐项目实战解析  C++如何比较两个字符串_C++ string compare函数与操作符对比  sublime怎么覆盖插件的默认快捷键_sublime快捷键优先级与设置  抖音网页版快捷访问 抖音网页版网页版入口操作教程  天眼查怎么看公司融资情况 天眼查企业融资历史查询步骤【攻略】  Lar*el Form Request中唯一性验证在更新操作中的正确实现  Yandex官方入口网址 Yandex俄罗斯搜索引擎最新在线地址  mysql密码锁定怎么解锁_mysql密码锁定解锁后修改密码步骤  汽水音乐在线解析 汽水音乐在线解析入口  qq游戏大厅官方下载_qq游戏免费下载安装入口  腾讯视频怎么举报不良内容_腾讯视频内容举报流程与违规信息处理方法  动漫共和国防屏蔽稳定域名-动漫共和国官方正版直达通道  微博网页版怎么开启两步验证_微博网页版账号安全两步验证设置方法  KFC套餐升级怎么获取优惠代码_KFC套餐升级活动与优惠代码获取方法  凉拌黄瓜怎么拌更入味 凉拌黄瓜简单家常做法  谷歌浏览器无痕模式怎么开 Chrome开启无痕浏览设置方法【教程】  React列表渲染与独立状态管理:避免全局状态影响局部更新  yandex入口引擎手机版 yandex安卓版下载入口  Python getattr() 异常处理深度解析:避免程序意外退出  12306几点到几点不能订票? | 官方最新系统维护时间全解析  批改网学生版PC登录 批改网官网登录系统入口  qq邮箱日历功能怎么用_创建日程与会议邀请的技巧  J*aScript中高效管理与清空动态列表:避免循环陷阱  Go语言HTML解析:利用Goquery精准获取指定元素内容  《GTA6》开发画面疑似泄露!这次可不是AI了  优化 Python 函数中的条件逻辑:解决 if-else 嵌套与参数选择问题  sublime怎么进行远程开发编辑_配置rsub/rmate实现sublime编辑服务器文件  CSS实现侧边栏导航项全宽圆角悬停背景效果  高德地图怎么看全景照片_高德地图全景照片浏览教程  韩剧圈正版入口页面_韩剧圈官网登录链接  mc.js游戏直达 mc.js网页免下载版本秒进地址  抖音网页版平台入口 抖音网页版官网在线访问教程  在J*aScript中复现SciPy的B样条拟合与求值:关键考量  Win11如何使用Windows Sandbox Win11沙盒功能开启与使用教程【详解】  特斯拉自动驾驶房车计划曝光 原型车将于2027年亮相  c++如何使用折叠表达式(Fold Expressions)_c++17可变参数模板新技巧  Python自定义类排序:解决lambda键值访问TypeError的实践指南  新手怎么开始学化妆 零基础化妆入门教程  荒野行动PC版怎么注册_荒野行动PC版账号注册详细流程图文教程  Fabric模组开发:自定义物品与物品组的现代管理方法  AO3同人作品网入口 AO3搜索引擎官网永久地址  Yandex官网免登录入口_俄罗斯Yandex搜索引擎一键访问  知乎APP怎么管理已购盐选内容_知乎APP盐选内容购买记录与查看方法  汽水音乐车机版横屏版7.1 汽水音乐车机版横屏版下载入口 

搜索