Skip to content
This repository was archived by the owner on Aug 26, 2024. It is now read-only.

Commit dfd9cdd

Browse files
authored
Merge pull request #55 from ionicprotocol/test/uni-v3-pool-for-fee
Test - Uni v3 pool for fee
2 parents 36ebd53 + 787d76f commit dfd9cdd

File tree

6 files changed

+155
-39
lines changed

6 files changed

+155
-39
lines changed
Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
// SPDX-License-Identifier: UNLICENSED
2+
pragma solidity ^0.8.0;
3+
4+
import { UpgradesBaseTest } from "./UpgradesBaseTest.sol";
5+
import { IonicComptroller } from "../compound/ComptrollerInterface.sol";
6+
import { Unitroller } from "../compound/Unitroller.sol";
7+
import { PoolLensSecondary } from "../PoolLensSecondary.sol";
8+
import { ICErc20 } from "../compound/CTokenInterfaces.sol";
9+
10+
contract AccountLiquidityTest is UpgradesBaseTest {
11+
IonicComptroller pool = IonicComptroller(0xFB3323E24743Caf4ADD0fDCCFB268565c0685556);
12+
PoolLensSecondary lens2 = PoolLensSecondary(0x7Ea7BB80F3bBEE9b52e6Ed3775bA06C9C80D4154);
13+
14+
ICErc20 wethMarket;
15+
ICErc20 usdcMarket;
16+
ICErc20 usdtMarket;
17+
ICErc20 wbtcMarket;
18+
19+
function afterForkSetUp() internal override {
20+
super.afterForkSetUp();
21+
22+
if (block.chainid == MODE_MAINNET) {
23+
wethMarket = ICErc20(0x71ef7EDa2Be775E5A7aa8afD02C45F059833e9d2);
24+
usdcMarket = ICErc20(0x2BE717340023C9e14C1Bb12cb3ecBcfd3c3fB038);
25+
usdtMarket = ICErc20(0x94812F2eEa03A49869f95e1b5868C6f3206ee3D3);
26+
wbtcMarket = ICErc20(0xd70254C3baD29504789714A7c69d60Ec1127375C);
27+
} else {
28+
ICErc20[] memory markets = pool.getAllMarkets();
29+
wethMarket = markets[0];
30+
usdcMarket = markets[1];
31+
}
32+
}
33+
34+
function testModeAccountLiquidity() public debuggingOnly fork(MODE_MAINNET) {
35+
_testAccountLiquidity(0x0C387030a5D3AcDcde1A8DDaF26df31BbC1CE763);
36+
}
37+
38+
function _testAccountLiquidity(address borrower) internal {
39+
(uint256 error, uint256 collateralValue, uint256 liquidity, uint256 shortfall) = pool.getAccountLiquidity(borrower);
40+
41+
emit log("");
42+
emit log_named_address("user", borrower);
43+
emit log_named_uint("collateralValue", collateralValue);
44+
if (liquidity > 0) emit log_named_uint("liquidity", liquidity);
45+
if (shortfall > 0) emit log_named_uint("SHORTFALL", shortfall);
46+
}
47+
48+
function testUserMaxWithdraw() public debuggingOnly forkAtBlock(MODE_MAINNET, 5890823) {
49+
address user = 0xBf891E7eFCC98A8239385D3172bA10AD593c7886;
50+
51+
Unitroller asUnitroller = Unitroller(payable(address(pool)));
52+
_upgradePoolWithExtension(asUnitroller);
53+
54+
{
55+
_testAccountLiquidity(user);
56+
57+
uint256 maxRedeem = lens2.getMaxRedeem(user, wethMarket);
58+
emit log_named_uint("maxRedeem", maxRedeem);
59+
60+
bool isMember = pool.checkMembership(user, wethMarket);
61+
emit log(isMember ? "is member" : "NOT A MEMBER");
62+
}
63+
//vm.rollFork(5891795);
64+
// redeemed before liquidation at 5890822
65+
66+
// before withdraw call at block 5890821
67+
// user: 0xBf891E7eFCC98A8239385D3172bA10AD593c7886
68+
// collateralValue: 156238264982770748812
69+
// liquidity: 16428491404549045373
70+
// maxRedeem: 23469273435070064818
71+
// is member
72+
73+
// user calls withdraw with max(uint256) at block 5890822
74+
// user: 0xBf891E7eFCC98A8239385D3172bA10AD593c7886
75+
// collateralValue: 139809773853485792955
76+
// SHORTFALL: 257892668904
77+
// maxRedeem: 0
78+
// is member
79+
80+
// liquidated at 5890902
81+
// https://explorer.mode.network/tx/0x424fd0504e7afb00382c6dcd25a2efdefd96c005c2333112be450fc7bd98cc88
82+
}
83+
}

contracts/test/AnyLiquidationTest.t.sol

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -604,8 +604,8 @@ contract AnyLiquidationTest is BaseTest {
604604
function testRawLiquidation() public debuggingOnly fork(MODE_MAINNET) {
605605
vm.prank(0x1110DECC92083fbcae218a8478F75B2Ad1b9AEe6);
606606
_functionCall(
607-
0x5782c512c07F217A8DE9611E7CE8c98f13193a46,
608-
hex"55e9e8fe000000000000000000000000000000000000000000000000000000000000002000000000000000000000000073d33e0456bd0428b16305b398ada69facfe53a60000000000000000000000000000000000000000000000000062fb977fb2d11b00000000000000000000000071ef7eda2be775e5a7aa8afd02c45f059833e9d200000000000000000000000071ef7eda2be775e5a7aa8afd02c45f059833e9d2000000000000000000000000293f2b2c17f8cea4db346d87ef5712c9dd0491ef000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000001a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
607+
0xa12c1E460c06B1745EFcbfC9A1f666a8749B0e3A,
608+
hex"55e9e8fe00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000fda4ac09a12c10fae30e429f4d6b47c9a83c87e00000000000000000000000000000000000000000000000001797af2fe6e167700000000000000000000000071ef7eda2be775e5a7aa8afd02c45f059833e9d200000000000000000000000094812f2eea03a49869f95e1b5868c6f3206ee3d3000000000000000000000000468cc91df6f669cae6cdce766995bd7874052fbc0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000001800000000000000000000000000000000000000000000000000000000000000220000000000000000000000000000000000000000000000000000000000000024000000000000000000000000000000000000000000000000000000000000000010000000000000000000000005ca3fd2c285c4138185ef1bda7573d415020f3c80000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000400000000000000000000000004200000000000000000000000000000000000006000000000000000000000000ac48fcf1049668b285f3dc72483df5ae2162f7e800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
609609
"raw liquidation failed"
610610
);
611611
}

contracts/test/DevTesting.t.sol

Lines changed: 24 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,13 @@ import { MasterPriceOracle, BasePriceOracle } from "../oracles/MasterPriceOracle
1616
import { PoolLens } from "../PoolLens.sol";
1717
import { PoolLensSecondary } from "../PoolLensSecondary.sol";
1818
import { JumpRateModel } from "../compound/JumpRateModel.sol";
19+
import { LeveredPositionsLens } from "../ionic/levered/LeveredPositionsLens.sol";
1920

2021
contract DevTesting is BaseTest {
2122
IonicComptroller pool = IonicComptroller(0xFB3323E24743Caf4ADD0fDCCFB268565c0685556);
2223
PoolLensSecondary lens2 = PoolLensSecondary(0x7Ea7BB80F3bBEE9b52e6Ed3775bA06C9C80D4154);
2324
PoolLens lens = PoolLens(0x431C87E08e2636733a945D742d25Ba77577ED480);
25+
LeveredPositionsLens levPosLens;
2426

2527
address deployer = 0x1155b614971f16758C92c4890eD338C9e3ede6b7;
2628
address multisig = 0x8Fba84867Ba458E7c6E2c024D2DE3d0b5C3ea1C2;
@@ -55,6 +57,7 @@ contract DevTesting is BaseTest {
5557
wethMarket = markets[0];
5658
usdcMarket = markets[1];
5759
}
60+
levPosLens = LeveredPositionsLens(ap.getAddress("LeveredPositionsLens"));
5861
}
5962

6063
function testModePoolBorrowers() public debuggingOnly fork(MODE_MAINNET) {
@@ -188,6 +191,16 @@ contract DevTesting is BaseTest {
188191
pool.exitMarket(usdcMarketAddr);
189192
}
190193

194+
function testBorrowRateAtRatio() public debuggingOnly fork(MODE_MAINNET) {
195+
uint256 rate = levPosLens.getBorrowRateAtRatio(
196+
ICErc20(0x71ef7EDa2Be775E5A7aa8afD02C45F059833e9d2),
197+
ICErc20(0x59e710215d45F584f44c0FEe83DA6d43D762D857),
198+
9988992945501686,
199+
2e18
200+
);
201+
emit log_named_uint("borrow rate at ratio", rate);
202+
}
203+
191204
function testAssetAsCollateralCap() public debuggingOnly fork(MODE_MAINNET) {
192205
address MODE_EZETH = 0x2416092f143378750bb29b79eD961ab195CcEea5;
193206
address ezEthWhale = 0x2344F131B07E6AFd943b0901C55898573F0d1561;
@@ -348,7 +361,10 @@ contract DevTesting is BaseTest {
348361
}
349362

350363
function testModeAccountLiquidity() public debuggingOnly fork(MODE_MAINNET) {
351-
address borrower = 0x0C387030a5D3AcDcde1A8DDaF26df31BbC1CE763;
364+
_testAccountLiquidity(0x0C387030a5D3AcDcde1A8DDaF26df31BbC1CE763);
365+
}
366+
367+
function _testAccountLiquidity(address borrower) internal {
352368
(uint256 error, uint256 collateralValue, uint256 liquidity, uint256 shortfall) = pool.getAccountLiquidity(borrower);
353369

354370
emit log("");
@@ -358,11 +374,6 @@ contract DevTesting is BaseTest {
358374
if (shortfall > 0) emit log_named_uint("SHORTFALL", shortfall);
359375
}
360376

361-
function testModeUsdcBorrow() public debuggingOnly fork(MODE_MAINNET) {
362-
vm.prank(deployer);
363-
require(usdcMarket.borrow(5e6) == 0, "can't borrow");
364-
}
365-
366377
function testModeDeployMarket() public debuggingOnly fork(MODE_MAINNET) {
367378
address MODE_WEETH = 0x028227c4dd1e5419d11Bb6fa6e661920c519D4F5;
368379
address weEthWhale = 0x6e55a90772B92f17f87Be04F9562f3faafd0cc38;
@@ -425,9 +436,13 @@ contract DevTesting is BaseTest {
425436
}
426437

427438
function testRawCall() public debuggingOnly fork(MODE_MAINNET) {
428-
address caller = 0x1155b614971f16758C92c4890eD338C9e3ede6b7;
429-
address target = 0x431C87E08e2636733a945D742d25Ba77577ED480;
430-
bytes memory data = hex"4a5844320000000000000000000000002be717340023c9e14c1bb12cb3ecbcfd3c3fb038";
439+
address caller = 0xF70CBE91fB1b1AfdeB3C45Fb8CDD2E1249b5b75E;
440+
address target = 0x9B506A03bBFf2a842866b10BC6732da72640cd45;
441+
442+
ERC20(WETH).allowance(caller, target);
443+
444+
bytes
445+
memory data = hex"534da46000000000000000000000000071ef7eda2be775e5a7aa8afd02c45f059833e9d20000000000000000000000002be717340023c9e14c1bb12cb3ecbcfd3c3fb0380000000000000000000000004200000000000000000000000000000000000006000000000000000000000000000000000000000000000000001329713137a5260000000000000000000000000000000000000000000000000000000000000001";
431446
vm.prank(caller);
432447
_functionCall(target, data, "raw call failed");
433448
}

contracts/test/LiquidatorsRegistryTest.t.sol

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -244,4 +244,14 @@ contract LiquidatorsRegistryTest is BaseTest {
244244

245245
_swap(tusdWhale, inputToken, inputAmount, outputToken, 5e16);
246246
}
247+
248+
function testUpdateLiquidator() public debuggingOnly fork(MODE_MAINNET) {
249+
LiquidatorsRegistry registry = LiquidatorsRegistry(0xc71B968C6C23e2723Bae32957D815C9bE3ca1b34);
250+
address multisig = 0x8Fba84867Ba458E7c6E2c024D2DE3d0b5C3ea1C2;
251+
vm.prank(multisig);
252+
registry._registerExtension(
253+
DiamondExtension(0x3FA4BC2FCAc5515d5b758D4D580bbD626c93D621),
254+
DiamondExtension(0xac409691b385Fdbb66752Ff2D97e50BC23fF2295)
255+
);
256+
}
247257
}

contracts/test/liquidators/IonicLiquidatorTest.sol

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -130,31 +130,31 @@ contract IonicLiquidatorTest is UpgradesBaseTest {
130130
}
131131
}
132132

133-
function useThisToTestLiquidations() public fork(POLYGON_MAINNET) {
134-
address borrower = 0xA4F4406D3dc6482dB1397d0ad260fd223C8F37FC;
135-
address debtMarketAddr = 0x456b363D3dA38d3823Ce2e1955362bBd761B324b;
136-
address collateralMarketAddr = 0x28D0d45e593764C4cE88ccD1C033d0E2e8cE9aF3;
133+
function testSpecificLiquidation() public debuggingOnly fork(MODE_MAINNET) {
134+
address borrower = 0x5834a3AAFA83A53822B313994Bb554d8E8c215dF;
135+
address debtMarketAddr = 0x71ef7EDa2Be775E5A7aa8afD02C45F059833e9d2;
136+
address collateralMarketAddr = 0x94812F2eEa03A49869f95e1b5868C6f3206ee3D3;
137+
138+
liquidator = ILiquidator(payable(ap.getAddress("IonicUniV3Liquidator")));
137139

138140
ILiquidator.LiquidateToTokensWithFlashSwapVars memory vars;
139141
vars.borrower = borrower;
140142
vars.cErc20 = ICErc20(debtMarketAddr);
141143
vars.cTokenCollateral = ICErc20(collateralMarketAddr);
142-
vars.repayAmount = 70565471214557927746795;
143-
vars.flashSwapContract = 0x6e7a5FAFcec6BB1e78bAE2A1F0B612012BF14827;
144+
vars.repayAmount = 0x408c7a4d7c4092;
145+
vars.flashSwapContract = 0x468cC91dF6F669CaE6cdCE766995Bd7874052FBc;
144146
vars.minProfitAmount = 0;
145-
vars.redemptionStrategies = new IRedemptionStrategy[](0);
146-
vars.strategyData = new bytes[](0);
147-
vars.debtFundingStrategies = new IFundsConversionStrategy[](1);
148-
vars.debtFundingStrategiesData = new bytes[](1);
147+
vars.redemptionStrategies = new IRedemptionStrategy[](1);
148+
vars.strategyData = new bytes[](1);
149+
vars.debtFundingStrategies = new IFundsConversionStrategy[](0);
150+
vars.debtFundingStrategiesData = new bytes[](0);
149151

150-
vars.debtFundingStrategies[0] = IFundsConversionStrategy(0x98110E8482E4e286716AC0671438BDd84C4D838c);
151-
vars.debtFundingStrategiesData[
152+
vars.redemptionStrategies[0] = IFundsConversionStrategy(0x5cA3fd2c285C4138185Ef1BdA7573D415020F3C8);
153+
vars.strategyData[
152154
0
153-
] = hex"0000000000000000000000002791bca1f2de4661ed88a30c99a7a9449aa84174000000000000000000000000aec757bf73cc1f4609a1459205835dd40b4e3f290000000000000000000000000000000000000000000000000000000000000960";
154-
155-
// liquidator.safeLiquidateToTokensWithFlashLoan(vars);
155+
] = hex"0000000000000000000000004200000000000000000000000000000000000006000000000000000000000000ac48fcf1049668b285f3dc72483df5ae2162f7e8";
156156

157-
vars.cErc20.comptroller();
157+
liquidator.safeLiquidateToTokensWithFlashLoan(vars);
158158
}
159159

160160
// TODO test with marginal shortfall for liquidation penalty errors

contracts/test/liquidators/UniswapV3LiquidatorTest.t.sol

Lines changed: 20 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -89,20 +89,28 @@ contract UniswapV3LiquidatorTest is IonicLiquidatorTest {
8989
_testLiquidatorLiquidate(uniV3PooForFlash);
9090
}
9191

92-
function testSupPair() public debuggingOnly fork(MODE_MAINNET) {
93-
IUniswapV2Pair flashSwapPair = IUniswapV2Pair(0xf2e9C024F1C0B7a2a4ea11243C2D86A7b38DD72f);
94-
IUniswapV3Pool flashSwapPool = IUniswapV3Pool(0xf2e9C024F1C0B7a2a4ea11243C2D86A7b38DD72f);
92+
function testUniV3PoolForFee() public debuggingOnly fork(MODE_MAINNET) {
93+
address wethAddr = 0x4200000000000000000000000000000000000006;
94+
address usdcAddr = 0xd988097fb8612cc24eeC14542bC03424c656005f;
95+
IERC20Upgradeable usdc = IERC20Upgradeable(usdcAddr);
96+
IERC20Upgradeable weth = IERC20Upgradeable(wethAddr);
9597

9698
IUniswapV2Router02 kimRouter = IUniswapV2Router02(0x5D61c537393cf21893BE619E36fC94cd73C77DD3);
99+
address factoryAddress;
100+
//factory = kimRouter.factory();
101+
factoryAddress = 0xC33Ce0058004d44E7e1F366E5797A578fDF38584;
102+
IUniswapV3Factory factory = IUniswapV3Factory(factoryAddress);
103+
address pool;
104+
105+
uint256 feeConfig = liquidatorsRegistry.uniswapV3Fees(usdc, weth);
106+
emit log_named_uint("feeConfig", feeConfig);
107+
108+
if (feeConfig == 0) {
109+
pool = factory.getPool(wethAddr, usdcAddr, uint24(feeConfig));
110+
emit log_named_address("Pool at fee 0", pool);
111+
}
97112

98-
emit log_named_address("Factory", kimRouter.factory());
99-
100-
IUniswapV3Factory factory = IUniswapV3Factory(kimRouter.factory());
101-
address pool = factory.getPool(
102-
0x4200000000000000000000000000000000000006,
103-
0xd988097fb8612cc24eeC14542bC03424c656005f,
104-
500
105-
);
106-
emit log_named_address("Pool", pool);
113+
pool = factory.getPool(wethAddr, usdcAddr, 500);
114+
emit log_named_address("Pool at fee 500", pool);
107115
}
108116
}

0 commit comments

Comments
 (0)