0x

如何冒泡有意義的 0x 合約還原數據?

  • January 6, 2022

我對 Solidity 還很陌生,所以提前感謝您對這個問題的耐心等待。

我正在嘗試使用此處提供的 0x 範例中的以下行來實施契約:https ://github.com/0xProject/0x-api-starter-guide-code/blob/master/contracts/SimpleTokenSwap.sol# L90

我知道該呼叫不會自行恢復,但會返回一個布爾值“成功”,具體取決於它是否有效。但是,下一行沒有提供任何有用的資訊,因為它有一個硬編碼的"SWAP_CALL_FAILED"字元串。

我想說出它失敗的原因。根據 0x 文件,0x 協議使用“豐富的還原”原因,這些原因不僅僅是字元串,而是帶有自定義參數的自定義錯誤: https ://0x.org/docs/guides/v3-specification#rich-reverts

我的問題:我應該如何bytes memory response在事先不知道其中存在哪個錯誤配置文件的情況下解碼?有什麼方法可以從swapTarget.call{value: msg.value}(swapCallData);呼叫中獲取有意義的錯誤數據?

我應該提到我正在使用安全帽本地叉子,如果這有所作為的話。

Solidity 開發人員正在努力以更本機的方式支持這一點(您可以在try/catch 文件中閱讀此內容)。

在此之前,您必須response像解析方法 id 一樣解析字節。也可以在數組切片文件中找到一個範例

基本上你會做以下事情:

// Check if the call failed
if (!success) {
 if (bytes4(response) == bytes4(keccak256("OrderStatus(bytes32,uint8)"))) {
    (bytes32 orderHash, uint8 orderStatus) = abi.decode(response[4:], (bytes32,uint8));
   // Custom error handling
 } else {
   revert("Unknown error");
 }
}

對於 0x V3,這些可以RevertError.decode(bytes)@0x/utils包中解碼。這將查看 Error bytes4 選擇器並解碼原因。

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