如何通过hardhat调用采用Enum类型的合约方法?

问题描述 投票:0回答:2

在你的合约中,如果你有接收 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:

solidity hardhat
2个回答
4
投票

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

0
投票

作为替代方案,您可以遵循 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) 
© www.soinside.com 2019 - 2024. All rights reserved.