信息发布→ 登录 注册 退出

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的正确使用姿势及版本迁移的详细内容,更多请关注其它相关文章!


相关文章: 没有大陆身份证/银行卡如何实名微信? 亲测有效的几种方法分享  Golang如何使用net/url解析URL_Golang URL解析与处理方法  使用PHP DOM解析器高效提取HTML中特定标题及其紧邻段落  Golang如何使用bytes.Split分割字节切片_Golang bytes切片分割方法  BetterDiscord插件中安全更新用户简介的实践指南  在J*a中如何使用Stream.map转换元素_Stream映射操作解析  sublime如何配置Go语言开发环境_sublime搭建Golang编译运行系统  《北京人工智能产业白皮书(2025)》发布:全年核心产值预计突破 4500 亿元  千牛数据看板网页版_千牛数据看板网页版访问方法  html网页设计源代码怎么运行_运行html网页设计源代码步骤【指南】  PHP文件上传至S3:策略、考量与避免本地存储的挑战  MongoDB Aggregation:在嵌套对象数组中精确匹配ObjectId  漫蛙漫画登录站点 漫蛙2正版漫画快速访问  Composer的 archive 命令怎么用_快速打包你的PHP项目及其Composer依赖  TikTok国际版官网直达_TikTok国际版官网直达进入在线观看  在Pyomo中实现基于变量的条件约束:Big-M方法详解  树莓派传感器触发:通过Twilio API发送WhatsApp消息教程  ACG动漫手机版官网入口 手机ACG动漫APP在线观看正版  正确连接J*aScript到HTML实现可点击图片与自定义事件处理  黑鲨3Pro怎样在相册开漫画风滤镜_iPhone黑鲨3Pro相册开漫画风滤镜【趣味滤镜】  VS Code远程开发时如何处理文件权限问题  在J*a中如何使用BigDecimal进行高精度计算_BigDecimal类应用指南  Win11怎么设置开机NumLock亮 Win11修改注册表InitialKeyboardIndicators值  Golang如何实现简单的Web表单_Golang表单提交与验证处理方法  怎样使用“本地安全策略”提升Windows安全性_Secpol.msc配置指南【高手】  EMS快递官网app_中国邮政速递物流手机客户端  基于多条件高效更新SQL表:利用CASE表达式优化业务逻辑  Android Studio计算器C键逻辑错误排查与修复:条件判断优化指南  如何在 Windows 11 中启动游戏手柄设置  qq游戏免费畅玩入口_qq游戏电脑版快速启动  C#如何安全地从用户上传的XML文件中读取数据? 验证与清理策略  C++的std::forward_list怎么用_C++ STL中单向链表容器的特点与应用  优化 Jest 模拟:强制未实现函数抛出错误以提升测试效率  腾讯QQ邮箱官方网站_QQ邮箱网页版在线登录  Python异步编程实践:使用Binance API构建实时交易数据流  2026春节假期时间安排 2026春节假日查询  Shopware订单对象中获取产品自定义字段的正确方法  京东京造J1和网易云音乐氧气真无线有什么不同_国产电商蓝牙耳机音质对比  C++如何比较两个字符串_C++ string compare函数与操作符对比  Angular中单选按钮的正确使用与常见陷阱解析  React Router v6 教程:构建认证保护的私有路由与重定向策略  如何使用Node.js csv 包按条件移除含空字段的CSV记录  手机屏幕碎了但能正常使用怎么办 手机外屏碎裂的修复建议  谷歌google账号注册详细步骤 谷歌账号注册官方教程  Node.js 中使用 node-cron 实现定时 API 数据抓取与处理  MAC如何将整个网页截长图_MAC使用Safari的导出为PDF或第三方工具  Pygame教程:解决用户输入与游戏状态更新不同步问题  J*aScript设计模式实践_j*ascript代码优化  Yandex搜索引擎一键访问入口_俄罗斯Yandex官网免登录  深入理解J*aScript Promise异步执行与微任务队列 

在线客服
服务热线

服务热线

4008988990

微信咨询
二维码
返回顶部
×二维码

截屏,微信识别二维码

打开微信

微信号已复制,请打开微信添加咨询详情!