提问人:jjordan 提问时间:10/1/2023 更新时间:10/1/2023 访问量:44
为什么解码自定义错误时调用会恢复
Why is call reverting when decoding custom error
问:
我有一个合约,它使用 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?
答: 暂无答案
评论