0x
如何冒泡有意義的 0x 合約還原數據?
我對 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 選擇器並解碼原因。