Solidity
未經檢查的塊之外的算術運算下溢或上溢 - 安全帽測試
我在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有
250000
token,使用者totalAmount
也是250000
,我試圖50000
從這個合約中取出token。我已經知道使用的解決方案
unchecked { ... }
,但它不會改變userPositoin.totalAmount
.我不明白為什麼會這樣。如果您有這種情況的經驗,請幫助我。
我的猜測是使用者$$ _token $$$$ _user $$實際上並沒有設置操作user.totalAmount -= _amount; 導致下溢(即 0 - 50000)
它需要一些汽油,但也許只是提出一個簡單的要求:
require(user.totalAmount >= _amount, "Empty wallet");