为什么解码自定义错误时调用会恢复

Why is call reverting when decoding custom error

提问人:jjordan 提问时间:10/1/2023 更新时间:10/1/2023 访问量:44

问:

我有一个合约,它使用 try-catch 调用另一个合约,该合约因自定义错误而恢复。我正在使用 abi.decode 解码错误原因字节,但当我尝试解码时它正在恢复。

这是在混音中使用 solidity 0.8.4。

代码为:

pragma solidity = 0.8.4;

error MyCustomError(uint256 value1, uint256 value2);

contract Reverter {
    function revertMe(uint256 valueA, uint256 valueB) public {
        revert MyCustomError(valueA, valueB);
    }
}

contract RevertCaller {
    Reverter reverter;
    event Revert(uint256 indexed value1, uint256 indexed value2);
    event LogBytes(bytes);
    
    constructor() {
        reverter = new Reverter();
    }

    function callRevert(uint256 valueA, uint256 valueB) public {
        try reverter.revertMe(valueA, valueB) {

        } catch (bytes memory reason) {
            emit Revert(valueA, valueB);
            emit LogBytes(reason);        

            (bytes4 errorSelector, uint256 value1, uint256 value2) = abi.decode(reason, (bytes4, uint256, uint256));

            if (errorSelector == MyCustomError.selector) {
                // Handle invalid amount error
                emit Revert(value1, value2);
            } else {
                emit Revert(0, 0);
            }
        }
    }
}

如果我注释掉 abi.decode 行并将其他一些值传递到事件中,它不会恢复。此外,它只能像这样对选择器进行解码:

(bytes4 errorSelector) = abi.decode(reason, (bytes4));

但是我没有得到我想使用的错误参数。

记录的原因(使用 LogBytes)是0x64f2b82800000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000000000005

也许我错误地使用了abi.decode?

错误处理 try-catch solidity remix 自定义错误

评论


答: 暂无答案