Solidity
Solidity 中的“MyInterface.MyCustomError”是什麼類型?
我正在玩弄最近引入的自定義錯誤。這是我設置的迷你副本:
interface MyInterface { error MyCustomError(); }
我正在用 Solidity 編寫測試,我想使用expectRevert作弊碼(HEVM 的一部分)來測試我的實現契約是否恢復為
MyCustomError
. 到目前為止,這是我想出的:vm.expectRevert(abi.encodeWithSignature("MyCustomError()"));
這是有效的,因為
expectRevert
作弊碼以三種不同的方式實現:
expectRevert()
expectRevert(bytes calldata)
expectRevert(bytes4)
但是使用
abi.encodeWithSignature
感覺就像在繞道而行。我試圖直接引用自定義錯誤:vm.expectRevert(MyInterface.MyCustomError);
但這不會編譯,因此
MyCustomError
它既不是bytes
也不是bytes4
這樣引用時。沒關係。但是,它是什麼類型,我可以將它轉換為bytes
orbytes4
嗎?
我最終通過嘗試將類型強制轉換為
bytes4
. 似乎MyInterface.MyCustomError
是類型function() pure
:不允許從“function () pure”到“bytes4”的顯式類型轉換。
請注意,我使用 Solidity 編譯我的程式碼
v0.8.13+commit.abaa5c0e
。@hroussille 的提示闡明了另一半,以使用
.selector
成員訪問自定義錯誤的bytes4
簽名。MyCustomError
以下作品:vm.expectRevert(MyInterface.MyCustomError.selector);
旁注:我最後在 Solidity 論壇上提出了一個建議,為自定義錯誤添加一個定制類型,即類似於(就像)
error
的別名。bytes24``function
更新:看起來這實際上是 Solidity 中的一個錯誤。投射
MyInterface.MyCustomError
到bytes4
應該工作。我為此打開了一個問題。