Solidity:如何在函数修饰符中应用 OR 运算符?

问题描述

我与私有枚举 state 签订了合同,其中包含三个选项:CREATEDVALIDTERMINATED。这个合约有一个只能被合约创建者调用函数withdrawn,还有一个只能被合约创建时设置的第三方调用函数terminatine。这两个函数都有一个修饰符 requireState(State.VALID),因此只有在合约处于 VALID 状态后才能调用它们。

问题是我想配置 withdrawn 函数,以便在 state 设置为 VALID 时可以调用OR {{1} }.我该怎么做?

我的 TERMINATED 如下所示:

modifier

我使用的是 solidity 0.8.1。

解决方法

一个函数的所有修饰符都需要在这个函数执行之前通过。所以他们总是表现得好像它们是由 AND 运算符连接起来的。

您可以创建一个接受多个值并对它们执行 OR 操作的新修饰符。

但是,您需要使用固定数量的参数或固定长度的数组,因为 Solidity 目前不允许对动态长度数组进行单行声明。

示例:[State.VALID,State.TERMINATED] 是定长数组的声明,因此与 State[] 动态长度定义不匹配。

modifier requireAnyOfStates(State[2] memory _states) {
    require(_states[0] == state || _states[1] == state);
    _;
}
    
function foo() external requireAnyOfStates([State.VALID,State.TERMINATED]) {
}

但在这种情况下,更简单的方法是在您的函数中使用 require 语句而不是修饰符。

function foo() external {
    require(state == State.VALID || state == State.TERMINATED);
}