You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在JavaScript版Hardhat中调用接收Enum类型的合约方法?

Hardhat调用Solidity枚举参数方法的正确姿势

问题本质

Solidity枚举编译后会被映射成uint8类型,合约只认对应的数值索引,但很多人容易踩两个坑:要么传了字符串类型的数字触发BigNumber错误,要么直接传枚举名称字符串导致合约无法识别。

正确调用方法

方法1:直接传数字类型的索引

Solidity枚举的索引从0开始,按定义顺序排序:PENDING=0、LOST=1、WON=2。调用时直接传对应数字(注意是Number类型,不是字符串):

// 假设你已经获取了合约实例contract
await contract.updateWinStatus(0); // 对应PENDING
await contract.updateWinStatus(1); // 对应LOST
await contract.updateWinStatus(2); // 对应WON

方法2:用TypeChain生成的枚举映射(更推荐)

如果你的Hardhat项目启用了TypeChain插件,编译后会在typechain目录下生成合约的类型文件,里面包含了枚举的键值映射,直接引用即可:

// 导入合约的枚举类型
const { WinStatus } = require("../typechain-types/YourContract");
// 直接用枚举名称调用,无需记索引
await contract.updateWinStatus(WinStatus.PENDING);

避坑提醒

  • 绝对不能直接传"PENDING"这类字符串,合约无法将字符串解析为枚举。
  • 不要传"0"这种字符串类型的数字,必须传0(纯数字),否则会触发"invalid BigNumber value"错误。
  • 确认枚举的定义顺序,索引是按定义顺序从0开始递增的。

内容的提问来源于stack exchange,提问作者Benyam

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 07:45:16