如何在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
相关产品推荐
相关产品推荐

