diff --git a/contracts/Vault.vy b/contracts/Vault.vy index 7cfb5a5b..2a89ad9c 100644 --- a/contracts/Vault.vy +++ b/contracts/Vault.vy @@ -978,7 +978,9 @@ def _reportLoss(strategy: address, loss: uint256): # Also, make sure we reduce our trust with the strategy by the same amount debtRatio: uint256 = self.strategies[strategy].debtRatio precisionFactor: uint256 = self.precisionFactor - ratio_change: uint256 = min(precisionFactor * loss * MAX_BPS / self._totalAssets() / precisionFactor, debtRatio) + ratio_change: uint256 = debtRatio + if self._totalAssets() > 0: + ratio_change = min(precisionFactor * loss * MAX_BPS / self._totalAssets() / precisionFactor, ratio_change) self.strategies[strategy].debtRatio -= ratio_change self.debtRatio -= ratio_change diff --git a/tests/functional/vault/test_losses.py b/tests/functional/vault/test_losses.py index 97f9350f..159ec6a2 100644 --- a/tests/functional/vault/test_losses.py +++ b/tests/functional/vault/test_losses.py @@ -58,3 +58,21 @@ def test_losses(chain, vault, strategy, gov, token): params = vault.strategies(strategy).dict() assert params["totalLoss"] == 500 assert params["totalDebt"] == 0 + + +def test_total_loss(chain, vault, strategy, gov, token): + vault.addStrategy(strategy, 10_000, 0, 2 ** 256 - 1, 1_000, {"from": gov}) + token.approve(vault, 2 ** 256 - 1, {"from": gov}) + vault.deposit(5000, {"from": gov}) + + strategy.harvest({"from": gov}) + assert token.balanceOf(strategy) == 5000 + + # send all our tokens back to the token contract + token.transfer(token, token.balanceOf(strategy), {"from": strategy}) + + strategy.harvest({"from": gov}) + params = vault.strategies(strategy) + assert params["totalLoss"] == 5000 + assert params["totalDebt"] == 0 + assert params["debtRatio"] == 0