全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-690-7320

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

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


相关文章: c++20的std::jthread是什么_c++可中断线程与RAII式管理  cad怎么合并重叠的线段_cad清理重复重叠线条的操作方法  如何仅使用CSS更改登录界面背景图像图标的颜色  如何更改在 Excel 中打开超链接时的默认浏览器  steam官方入口大全 steam账号注册及操作指南  一加手机拍照效果不好怎么办 一加哈苏影像调校与专业模式使用教程【高手篇】  C++如何连接MySQL数据库_C++使用Connector/C++操作MySQL数据库教程  Golang如何实现微服务鉴权与权限控制_Golang微服务鉴权与权限管理实践  抓大鹅无需下载版 抓大鹅秒玩版入口  怎样更改Windows系统的默认安装路径_避免C盘爆满的终极设置【技巧】  KFC游戏互动怎么赢取优惠券_KFC线上游戏活动参与与优惠代码赢取教程  LINUX的perf命令入门_LINUX官方性能分析工具的使用与解读  C++如何打印当前代码行号与文件名_C++预定义宏FILE与LINE的使用  使用CSS更改登录屏幕输入框中PNG图标颜色的策略与局限性  J*a实现学校排课程序_面向对象结构化项目示例  一加 14R 快充无反应_一加 14R 充电优化  必由学网页版入口 必由学官方平台直接访问  c++中的std::launder有什么实际用途_c++对象生命周期与指针优化  天眼查企业查询官网入口 天眼查官方网页版查询  微信商城在哪里打开【步骤】  XML中包含HTML标签导致解析错误? 正确嵌入非XML数据的两种方法  PHP教程:将数据库查询结果动态展示到HTML Textarea的最佳实践  PDF文件体积过大处理_PDF压缩技巧详解  J*aScript数据结构转换:将对象数组按类别分组  win11专注助手在哪 Win11免打扰模式设置与自动化规则【指南】  理解Python模块与全局变量的作用域管理  我的世界mc.js免费游戏直接能玩 我的世界mc.js小游戏免费秒玩入口  新手怎么开始学化妆 零基础化妆入门教程  Angular响应式表单:实现提交后表单及按钮的禁用与只读化  百度网盘网页版入口 百度网盘网页版官方登录网址  Lar*el开发:如何在编辑界面正确预选数据库中的多选标签  漫蛙官网正版漫画入口 漫蛙2官方网页登录地址  如何使用J*aScript精确选择并批量修改特定父元素下子链接的样式  Django表单提交验证失败后保持字段值不刷新  漫蛙2漫画入口 漫蛙正版网页漫画直达网址  C++如何实现单例模式_C++设计模式之线程安全的单例写法  抖音极速版最新版本 抖音极速版官方下载地址  在J*a中如何使用Exception包装底层异常_异常包装与信息传递方法说明  Safari浏览器输入栏卡顿如何解决 Safari搜索建议与缓存清理  Python中高效访问嵌套字典与列表中的键值对  J*a TimerTask中HashMap意外清空的深层原因与解决方案  c++如何使用折叠表达式(Fold Expressions)_c++17可变参数模板新技巧  j*a toString()的覆盖  React Router 嵌套组件中 URL 重定向问题的解决方案  冬*霸灯泡不亮怎么办_浴霸取暖灯一盏不亮的灯座清洁修复法  浏览器打开即用 美图秀秀网页版入口  《噬血代码2》新预告片发布 展示游戏剧情  html怎么在cmd下运行php文件_cmd运行html中php文件方法【教程】  如何设置Windows Defender的定时扫描_计划任务实现自动杀毒【安全】  解决Tabulator日期时间排序问题的专业指南 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。