After executing the steps provided in the above gist in order to set up the tests, add the following functions to the AuditorTests.t.sol
function setUpLiquidityPool() public {
skip(2 days);
vm.startPrank(alice);
(, int256 EurUsdRate,,,) = ClEurUsd.latestRoundData();
(, int256 EthUsdRate,,,) = ClEthUsd.latestRoundData();
uint256 amountInETH = (65_000_000e18 * uint256(EurUsdRate)) / uint256(EthUsdRate);
vm.deal(alice, amountInETH);
(address vault, ) = vaultManagerV5Instance.mint();
address(vault).call{value: amountInETH}("");
SmartVaultV3 vaultInstance = SmartVaultV3(payable(vault));
uint256 maxMintable = vaultInstance.maxMintable();
uint256 fee = maxMintable * vaultManagerV5Instance.mintFeeRate() / vaultManagerV5Instance.HUNDRED_PC();
uint256 amountToMint = maxMintable - fee;
console2.log("Here is maxMintable and amountToMint: ", maxMintable, amountToMint);
vaultInstance.mint(alice, amountToMint);
TST.mint(alice, EURO.balanceOf(alice));
TST.approve(address(liquidationPool), TST.balanceOf(alice));
EURO.approve(address(liquidationPool), EURO.balanceOf(alice));
console2.log("Alice EURO balance: ", EURO.balanceOf(alice));
liquidationPool.increasePosition(TST.balanceOf(alice), EURO.balanceOf(alice));
vm.stopPrank();
vm.startPrank(bob);
vm.deal(bob, amountInETH);
(address vaultB, ) = vaultManagerV5Instance.mint();
address(vaultB).call{value: amountInETH}("");
SmartVaultV3 vaultInstanceB = SmartVaultV3(payable(vaultB));
console2.log("Here is maxMintable and amountToMint: ", maxMintable, amountToMint);
vaultInstanceB.mint(bob, amountToMint);
TST.mint(bob, EURO.balanceOf(bob));
TST.approve(address(liquidationPool), TST.balanceOf(bob));
EURO.approve(address(liquidationPool), EURO.balanceOf(bob));
console2.log("Alice EURO balance: ", EURO.balanceOf(bob));
liquidationPool.increasePosition(TST.balanceOf(bob), EURO.balanceOf(bob));
vm.stopPrank();
vm.startPrank(john);
uint256 amountInETHJohn = (100e18 * uint256(EurUsdRate)) / uint256(EthUsdRate);
vm.deal(john, amountInETH);
(address vaultJ, ) = vaultManagerV5Instance.mint();
address(vaultJ).call{value: amountInETHJohn}("");
SmartVaultV3 vaultInstanceJ = SmartVaultV3(payable(vaultJ));
uint256 maxMintableJ = vaultInstanceJ.maxMintable();
uint256 feeJ = maxMintableJ * vaultManagerV5Instance.mintFeeRate() / vaultManagerV5Instance.HUNDRED_PC();
uint256 amountToMintJ = maxMintableJ - feeJ;
vaultInstanceJ.mint(john, amountToMintJ);
TST.mint(john, EURO.balanceOf(john));
TST.approve(address(liquidationPool), type(uint256).max);
EURO.approve(address(liquidationPool), EURO.balanceOf(john));
console2.log("Balance of John: ", EURO.balanceOf(john));
liquidationPool.increasePosition(TST.balanceOf(john), EURO.balanceOf(john));
skip(2 days);
TST.mint(john, 1);
liquidationPool.increasePosition(1, 0);
vm.stopPrank();
}
function test_MissedRewardsWithTokensWithLessDecimals() public {
setUpLiquidityPool();
vm.startPrank(tom);
(, int256 EurUsdRate,,,) = ClEurUsd.latestRoundData();
(, int256 WbtcUsdRate,,,) = ClWbtcUsd.latestRoundData();
uint256 amountInWBTCTom = (400e8 * uint256(EurUsdRate)) / uint256(WbtcUsdRate);
WBTC.mint(tom, amountInWBTCTom);
(address vaultT, uint256 vaultId) = vaultManagerV5Instance.mint();
WBTC.transfer(address(vaultT), amountInWBTCTom);
SmartVaultV3 vaultInstanceT = SmartVaultV3(payable(vaultT));
uint256 maxMintableT = vaultInstanceT.maxMintable();
uint256 feeT = maxMintableT * vaultManagerV5Instance.mintFeeRate() / vaultManagerV5Instance.HUNDRED_PC();
uint256 amountToMintT = maxMintableT - feeT;
vaultInstanceT.mint(tom, amountToMintT);
console2.log("Tom EUROs balance: ", EURO.balanceOf(tom));
console2.log("Tom euros balance divided: ", EURO.balanceOf(tom)/1e18);
console2.log("VaultT WBTC balance: ", WBTC.balanceOf(vaultT));
vm.stopPrank();
vm.startPrank(attacker);
console2.log("Here is the Euro balance of the liquidationPool contract: ", EURO.balanceOf(address(liquidationPool)));
console2.log("Here is the Euro balance of the liquidationPool contract divided by 1e18: ", EURO.balanceOf(address(liquidationPool))/1e18);
console2.log("Balance of Tom's vault in EUROs before we drop the price: ", vaultInstanceT.euroCollateral()/1e18);
ClWbtcUsd.setPrice(4311586000000);
console2.log("Balance of Tom's vault in EUROs before we drop the price: ", vaultInstanceT.euroCollateral()/1e18);
(, uint256 TSTa, uint256 EUROa) = liquidationPool.positions(alice);
(, uint256 TSTb, uint256 EUROb) = liquidationPool.positions(bob);
(, uint256 TSTj, uint256 EUROj) = liquidationPool.positions(john);
console2.log("Position of alice, bob and john: ", EUROa/1e18, EUROb/1e18, EUROj/1e18);
liquidationPoolManager.runLiquidation(vaultId);
(bytes32 symbol, address addr, uint8 dec, address clAddr, uint8 clDec) = tokenManager.acceptedTokens(1);
bytes memory aliceRewards = abi.encodePacked(alice, symbol);
bytes memory bobRewards = abi.encodePacked(bob, symbol);
bytes memory johnRewards = abi.encodePacked(john, symbol);
console2.log("Alice acumulated rewards in WBTC: ", liquidationPool.rewards(aliceRewards));
console2.log("Bob acumulated rewards in WBTC: ", liquidationPool.rewards(bobRewards));
console2.log("John acumulated rewards in WBTC: ", liquidationPool.rewards(johnRewards));
vm.stopPrank();
}