在你的合约中,如果你有接收 Enum 类型的方法,你将如何从安全帽脚本传递参数?
contract SomeContract {
enum WinStatus {
PENDING,
LOST,
WON
}
WinStatus status;
function updateWinStatus(WinStatus _status) public {
status = _status;
}
}
// in your hardhat script
...
await someContract.updateWinStatus() // how should i call it. bare in mind hardhat is setup using javascript not typescript in my case.
我尝试传递一个数字,希望它能按顺序(索引)获取它。但我收到“无效的 BigNumber 值”。另外,我尝试传递像“PENDING”或“WinType.PENDING”这样的字符串:thinking:
Javascript 本身不支持非常大的数字(最多支持 Solidity 中支持的
uint256
类型),因此 Ethers.js(包含在 Hardhat 中)接受 BigNumber 实例。
const myNumber = ethers.BigNumber.from("0") // pass the numeric value as a string
await someContract.updateWinStatus(myNumber) // pass the BigNumber instance
作为替代方案,您可以遵循 OpenZeppelin 库在其测试中使用的解决方法。
创建一个新的
utils.js
文件并添加以下方法:
function Enum(...options) {
return Object.fromEntries(options.map((key, i) => [key, web3.utils.toBN(i)]));
}
之后,您将可以使用以下方式添加任何自定义枚举:
export const MyCustomEnum = Enum("State1", "State2", "State3");
谈到您的情况,
utils.js
中定义的新枚举格式将是:
export const WinStatus = Enum("PENDING", "LOST", "WON");
在脚本中导入新的
WinStatus
枚举并像这样使用它:
// in your hardhat script
...
await someContract.updateWinStatus(WinStatus.PENDING)