diff --git a/contracts/pools/erc20.sol b/contracts/pools/erc20.sol index 8615077..286d68c 100644 --- a/contracts/pools/erc20.sol +++ b/contracts/pools/erc20.sol @@ -87,8 +87,13 @@ contract PoolToken is ReentrancyGuard, DSMath, ERC20Pausable { require(_currentRate != 0, "currentRate-is-0"); if (_currentRate > _previousRate) { uint difTkn = sub(tokenBalance, _totalToken); - insuranceAmt = sub(insuranceAmt, difTkn); - _currentRate = _previousRate; + if (difTkn < insuranceAmt) { + insuranceAmt = sub(insuranceAmt, difTkn); + _currentRate = _previousRate; + } else { + tokenBalance = add(_totalToken, insuranceAmt); + _currentRate = wdiv(totalSupply(), tokenBalance); + } } else { uint insureFeeAmt = wmul(sub(_totalToken, tokenBalance), registry.insureFee(address(this))); insuranceAmt = add(insuranceAmt, insureFeeAmt); diff --git a/contracts/pools/eth.sol b/contracts/pools/eth.sol index 18f5ace..b111308 100644 --- a/contracts/pools/eth.sol +++ b/contracts/pools/eth.sol @@ -82,8 +82,13 @@ contract PoolToken is ReentrancyGuard, ERC20Pausable, DSMath { require(_currentRate != 0, "currentRate-is-0"); if (_currentRate > _previousRate) { uint difTkn = sub(tokenBalance, _totalToken); - insuranceAmt = sub(insuranceAmt, difTkn); - _currentRate = _previousRate; + if (difTkn < insuranceAmt) { + insuranceAmt = sub(insuranceAmt, difTkn); + _currentRate = _previousRate; + } else { + tokenBalance = add(_totalToken, insuranceAmt); + _currentRate = wdiv(totalSupply(), tokenBalance); + } } else { uint insureFeeAmt = wmul(sub(_totalToken, tokenBalance), registry.insureFee(address(this))); insuranceAmt = add(insuranceAmt, insureFeeAmt);