Solidity

Solidity 中的“MyInterface.MyCustomError”是什麼類型?

  • April 4, 2022

我正在玩弄最近引入的自定義錯誤。這是我設置的迷你副本:

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這樣引用時。沒關係。但是,它是什麼類型,我可以將它轉換為bytesorbytes4嗎?

我最終通過嘗試將類型強制轉換為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.MyCustomErrorbytes4應該工作。我為此打開了一個問題

引用自:https://ethereum.stackexchange.com/questions/125412