Contract-Debugging

在 0.5.0 及以上版本中,使用 address.call.value 將乙太幣從合約發送到合約

  • April 7, 2019

在 Solidity v0.4.24 及更低版本中,我將在更大的函式中使用以下程式碼將乙太幣從合約發送到合約:

if (!_address.call.value(_ether)()){
               revert();
  }

在 Solidity v0.5.0 之後,這會在編譯時引發幾個錯誤。

“類型錯誤:函式呼叫的參數計數錯誤:給出了 0 個參數,但預期為 1。此函式需要一個字節參數。使用“”作為參數以提供空的呼叫數據。”

“TypeError:類型元組(布爾,字節記憶體)不能隱式轉換為預期的布爾類型。”

“TypeError:一元運算符!不能應用於類型元組(布爾,字節記憶體)”

將之前的程式碼更改為:

if (!_address.call.value(_ether)("")){
               revert();
}

刪除第一個錯誤,但其他兩個仍然存在。

將程式碼更改為:

_address.call.value(_ether)("");

留下以下警告。“警告:未使用低級呼叫的返回值。”

它似乎在實踐中有效,但在 Etherscan 上顯示警告和錯誤符號。

我能做些什麼來刪除這些警告?

來自https://solidity.readthedocs.io/en/v0.5.7/050-break-changes.html#semantic-and-syntactic-changes

函式.call().delegatecall()現在.staticcall()返回(bool, bytes memory)以提供對返回數據的訪問。更改bool success = otherContract.call("f")(bool success, bytes memory data) = otherContract.call("f")

所以在你的情況下,你想要這個:

(bool success, bytes memory) = _address.call.value(_ether)("");
require(success); // if (!success) { revert(); } is fine too, just needlessly long.

請注意,我省略了第二個返回值的變數名,因為您沒有使用它。如果你關心返回值,你會想要(bool success, bytes memory data) = ....

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