Solidity

未經檢查的塊之外的算術運算下溢或上溢 - 安全帽測試

  • February 2, 2022

我在solidity v0.8.11中創建了一個保險庫合約:

struct User {
 uint256 totalAmount;
}

mapping(address => mapping(address => User)) Users;

function withdraw(
  address _token,
  address _user,
  uint256 _amount
) external {
  User storage user = Users[_token][_user];
  user.totalAmount -= _amount;

  // transfer access token amount to the user
  IERC20(_token).safeTransfer(_user, _amount);
}

當我在安全帽測試腳本中呼叫withdraw() 時,我收到此錯誤: Error: VM Exception while processing transaction: reverted with panic code 0x11 (Arithmetic operation underflowed or overflowed outside of an unchecked block)

合約A有250000token,使用者totalAmount也是250000,我試圖50000從這個合約中取出token。

我已經知道使用的解決方案unchecked { ... },但它不會改變userPositoin.totalAmount.

我不明白為什麼會這樣。如果您有這種情況的經驗,請幫助我。

我的猜測是使用者$$ _token $$$$ _user $$實際上並沒有設置操作user.totalAmount -= _amount; 導致下溢(即 0 - 50000)

它需要一些汽油,但也許只是提出一個簡單的要求:

require(user.totalAmount >= _amount, "Empty wallet");

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