Skip to content

Commit e9eb217

Browse files
deluca-mikeJGcarvlucas-manuel0xfarhaan
authored
feat: Add functionality for fees, DL 401 versions, assertPoolAccounting, and mainnet refinances (#206)
* feat: add extra validation * feat: update payment scripts * feat: update script * feat: add scripts * fix: update scripts during migration * feat: adjust scripts * feat: udpate to add scripts * feat: fix qeury scripts * feat: update scripts * feat: sims passing # Conflicts: # simulations/mainnet/SimulationBase.sol * feat: add broadcast to gitignore * feat: add scripts for refi # Conflicts: # simulations/mainnet/addresses/TransientAddresses.sol * feat: update upgrade DLs scripts * adjusted amounts * create check lp script * feat: add fees validation * fix: update to zero * feat: add timestamps and fee validation scripts * fix: Mike Draft * fix: tests fixed and rebased properly off main * fix: cleanup * feat: correct future addresses * feat: verify loanMigrator * feat: restore balance writing functions * feat: remove scripts and update interfaces * feat: add validation script for LM * feat: update to get accounting checker working * feat: Add check for change of sherlock address in airdrop * feat: Validate Globals set correctly on Loan Factory * fix: Compiler issue * feat: Add DebtLocker 401 upgrade simulations (#207) * feat: update block * feat: debuggig * fix: adjust to lateste block - wip * feat: update mainnet block * feat: uncomment accounting test * fix: extra lines * feat: split debt locker upgrades * fix: adjust PR comments * fix: adjust PR comments * feat: lpV1 -> lpV2 note in validation * fix: rollback for 401 DL * fix: 9.2 order and function name Co-authored-by: JG <[email protected]> Co-authored-by: lucas-manuel <[email protected]> Co-authored-by: 0xfarhaan <[email protected]>
1 parent 0ba2f19 commit e9eb217

21 files changed

+1067
-529
lines changed

.gitignore

+2
Original file line numberDiff line numberDiff line change
@@ -8,3 +8,5 @@ out/
88
# Ignore CSV files
99
*.csv
1010
.env
11+
12+
broadcast/

Makefile

+2-2
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,8 @@ mainnet-sim:
2828
clean:
2929
@forge clean
3030

31-
pay-upcoming-loans:
32-
@scripts/pay-upcoming-loans.sh
31+
pay-and-refi-upcoming-loans:
32+
@scripts/pay-and-refi-upcoming-loans.sh
3333

3434
upgrade-loans-301:
3535
@scripts/upgrade-loans-301.sh

foundry.toml

+3-3
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ solc_version = '0.8.7' # Override for the solc version (setti
66
optimizer = false # Enable or disable the solc optimizer
77
optimizer_runs = 200 # The number of optimizer runs
88
verbosity = 3 # The verbosity of tests
9-
block_timestamp = 1_670_476_031 # Timestamp for tests (non-zero)
9+
block_timestamp = 1_670_562_431 # Timestamp for tests (non-zero)
1010
gas_limit = "18446744073709551615" # Gas limit for tests
1111

1212
[profile.production]
@@ -23,8 +23,8 @@ fail_on_revert = true # Fail the test if the contract reverts
2323

2424
[profile.mainnet_simulations]
2525
test = 'simulations/mainnet' # The test directory
26-
block_number = 16137800 # Block number for tests
27-
fork_block_number = 16137800
26+
block_number = 16149580 # Block number for tests
27+
fork_block_number = 16149580
2828
rpc_storage_caching = { chains = ["mainnet"], endpoints = "all" }
2929

3030
[profile.local_simulations]

scripts/GetFrozenPoolState.s.sol

-50
This file was deleted.

scripts/PayAndRefiUpcomingLoans.s.sol

+142
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,142 @@
1+
// SPDX-License-Identifier: BUSL-1.1
2+
pragma solidity 0.8.7;
3+
4+
import { console } from "../modules/contract-test-utils/contracts/test.sol";
5+
6+
import { IDebtLockerLike, IERC20Like, IMapleLoanLike, IPoolV1Like } from "../simulations/mainnet/Interfaces.sol";
7+
8+
import { SimulationBase } from "../simulations/mainnet/SimulationBase.sol";
9+
10+
contract PayAndRefiUpcomingLoans is SimulationBase {
11+
12+
// Maven Permissioned loans to
13+
address constant mavenPermissionedLoan1 = 0x500055809685ecebA5eC55786f65440583954501;
14+
address constant mavenPermissionedLoan2 = 0xa83b134809183c634A692D5b5F457b78Cd6913e6;
15+
16+
// Maven USDC loans
17+
address constant mavenUsdcLoan1 = 0x245De7E3B9B21B68c2C8D2e4759652F0dbCE65A6;
18+
address constant mavenUsdcLoan2 = 0x502EE6D0b16d834547Fc44344D4BE3E019Fc2573;
19+
address constant mavenUsdcLoan3 = 0x726893373DE92b8272298D76a7D60a5F51b90dA9;
20+
address constant mavenUsdcLoan4 = 0xF6950F28353cA676100C2a92DD360DEa16A213cE;
21+
address constant mavenUsdcLoan5 = 0xa58fD39138083783689d700758D00873538C6C2A;
22+
address constant mavenUsdcLoan6 = 0xd027CdD569b6cd1aD13dc82d42d0CD7cDeda3521;
23+
24+
// Maven WETH loans
25+
address constant mavenWethLoan1 = 0x0104AE451AD2542aC9250Ebe4a37D0717FdfC60C;
26+
address constant mavenWethLoan2 = 0x91A4eEe4D33d9cd7840CAe21A4f408c0919F555D;
27+
address constant mavenWethLoan3 = 0xC8c17328796F472A97B7784cc5F52b802A89deC1;
28+
address constant mavenWethLoan4 = 0x4DbE67c683A731807EAAa99A1DF2D3E79ebECA00;
29+
address constant mavenWethLoan5 = 0xFcF8725d0D9A786448c5B9b9cc67226d7e4d5c3D;
30+
address constant mavenWethLoan6 = 0x64982f1aA56340C0051bDCeFb7a69911Fd9D141d;
31+
address constant mavenWethLoan7 = 0x2cB5c20309B2DbfDda758237f20c94b5F72d0331;
32+
address constant mavenWethLoan8 = 0x40d9fBe05d8F9f1215D5a6d01994ad1a6a097616;
33+
address constant mavenWethLoan9 = 0x2872C1140117a5DE85E0DD06Ed1B439D23707AD1;
34+
address constant mavenWethLoan10 = 0xdeF9146F12e22e5c69Fb7b7D181534240c04FdCE;
35+
36+
// Orthogonal loans
37+
address constant orthogonalLoan1 = 0x249B5907564f0Cf3Fb771b013A6f9f33e1225657;
38+
39+
address constant usdcWhale = 0x6555e1CC97d3cbA6eAddebBCD7Ca51d75771e0B8;
40+
address constant wethWhale = 0x2fEb1512183545f48f6b9C5b4EbfCaF49CfCa6F3;
41+
42+
function run() external {
43+
payAllHealthyLoans();
44+
claimAllLoans();
45+
assertNoClaimableLoans();
46+
refinanceAllLoans();
47+
}
48+
49+
function payLoan(address loan) internal {
50+
address fundsAsset = IMapleLoanLike(loan).fundsAsset();
51+
52+
( uint256 principal, uint256 interest, uint256 delegateFee, uint256 treasuryFee ) = IMapleLoanLike(loan).getNextPaymentBreakdown();
53+
54+
uint256 paymentAmount = principal + interest + delegateFee + treasuryFee;
55+
56+
address sender = address(fundsAsset) == usdc ? usdcWhale : wethWhale;
57+
58+
address borrower = IMapleLoanLike(loan).borrower();
59+
60+
vm.broadcast(sender);
61+
IERC20Like(fundsAsset).transfer(borrower, paymentAmount);
62+
63+
vm.startBroadcast(IMapleLoanLike(loan).borrower());
64+
65+
IERC20Like(fundsAsset).approve(address(loan), paymentAmount);
66+
IMapleLoanLike(loan).makePayment(paymentAmount);
67+
68+
vm.stopBroadcast();
69+
}
70+
71+
function payAllHealthyLoans() internal {
72+
payLoan(mavenPermissionedLoan2);
73+
}
74+
75+
function assertNotClaimable(address loan) internal {
76+
assertEq(IMapleLoanLike(loan).claimableFunds(), 0);
77+
}
78+
79+
function assertNoClaimableLoans() internal {
80+
assertNotClaimable(mavenPermissionedLoan1);
81+
assertNotClaimable(mavenPermissionedLoan1);
82+
83+
assertNotClaimable(mavenUsdcLoan1);
84+
assertNotClaimable(mavenUsdcLoan2);
85+
assertNotClaimable(mavenUsdcLoan3);
86+
assertNotClaimable(mavenUsdcLoan4);
87+
assertNotClaimable(mavenUsdcLoan5);
88+
assertNotClaimable(mavenUsdcLoan6);
89+
90+
assertNotClaimable(mavenWethLoan1);
91+
assertNotClaimable(mavenWethLoan2);
92+
assertNotClaimable(mavenWethLoan3);
93+
assertNotClaimable(mavenWethLoan4);
94+
assertNotClaimable(mavenWethLoan5);
95+
assertNotClaimable(mavenWethLoan6);
96+
assertNotClaimable(mavenWethLoan7);
97+
assertNotClaimable(mavenWethLoan8);
98+
assertNotClaimable(mavenWethLoan9);
99+
assertNotClaimable(mavenWethLoan10);
100+
101+
assertNotClaimable(orthogonalLoan1);
102+
}
103+
104+
function refinanceLoan(address poolV1, address loan) internal {
105+
address borrower = IMapleLoanLike(loan).borrower();
106+
address debtLocker = IMapleLoanLike(loan).lender();
107+
address poolDelegate = IPoolV1Like(poolV1).poolDelegate();
108+
109+
bytes[] memory calls = new bytes[](4);
110+
111+
calls[0] = abi.encodeWithSignature("setGracePeriod(uint256)", 0 seconds);
112+
calls[3] = abi.encodeWithSignature("setLateInterestPremium(uint256)", 0.05e18);
113+
calls[1] = abi.encodeWithSignature("setPaymentInterval(uint256)", 10 days);
114+
calls[2] = abi.encodeWithSignature("setPaymentsRemaining(uint256)", 1);
115+
116+
vm.broadcast(borrower);
117+
IMapleLoanLike(loan).proposeNewTerms(refinancer, type(uint256).max, calls);
118+
119+
vm.broadcast(poolDelegate);
120+
IDebtLockerLike(debtLocker).acceptNewTerms(refinancer, type(uint256).max, calls, 0);
121+
122+
assertEq(IMapleLoanLike(loan).gracePeriod(), 0 seconds);
123+
assertEq(IMapleLoanLike(loan).lateInterestPremium(), 0.05e18);
124+
assertEq(IMapleLoanLike(loan).paymentInterval(), 10 days);
125+
assertEq(IMapleLoanLike(loan).paymentsRemaining(), 1);
126+
assertEq(IMapleLoanLike(loan).nextPaymentDueDate(), block.timestamp + 10 days);
127+
}
128+
129+
function refinanceAllLoans() internal {
130+
refinanceLoan(mavenPermissionedPoolV1, mavenPermissionedLoan1);
131+
132+
refinanceLoan(mavenUsdcPoolV1, mavenUsdcLoan1);
133+
refinanceLoan(mavenUsdcPoolV1, mavenUsdcLoan3);
134+
135+
refinanceLoan(mavenWethPoolV1, mavenWethLoan1);
136+
refinanceLoan(mavenWethPoolV1, mavenWethLoan2);
137+
refinanceLoan(mavenWethPoolV1, mavenWethLoan5);
138+
refinanceLoan(mavenWethPoolV1, mavenWethLoan6);
139+
refinanceLoan(mavenWethPoolV1, mavenWethLoan7);
140+
}
141+
142+
}

scripts/PayUpcomingLoans.s.sol

-83
This file was deleted.

scripts/UpgradeDebtLockersTo400.s.sol

+16-15
Original file line numberDiff line numberDiff line change
@@ -7,34 +7,35 @@ import { DebtLocker as DebtLockerV4 } from "../modules/debt-locker-v4/contracts/
77
import { DebtLockerFactory } from "../modules/debt-locker-v4/contracts/DebtLockerFactory.sol";
88
import { DebtLockerV4Migrator } from "../modules/debt-locker-v4/contracts/DebtLockerV4Migrator.sol";
99

10-
import { IDebtLockerLike, IMapleLoanLike } from "../simulations/mainnet/Interfaces.sol";
11-
import { SimulationBase } from "../simulations/mainnet/SimulationBase.sol";
10+
import { IDebtLockerLike, IMapleLoanLike, IMapleProxyFactoryLike } from "../simulations/mainnet/Interfaces.sol";
11+
12+
import { SimulationBase } from "../simulations/mainnet/SimulationBase.sol";
1213

1314
contract UpgradeDebtLockersTo400 is SimulationBase {
1415

1516
function run() external {
16-
upgradeDebtLockersTo400(mavenPermissionedLoans);
17-
upgradeDebtLockersTo400(mavenUsdcLoans);
18-
upgradeDebtLockersTo400(mavenWethLoans);
19-
upgradeDebtLockersTo400(orthogonalLoans);
20-
upgradeDebtLockersTo400(icebreakerLoans);
21-
// upgradeDebtLockersTo400(unorderedMigrationLoans);
17+
// upgradeDebtLockersTo400(mavenPermissionedLoans);
18+
// upgradeDebtLockersTo400(mavenUsdcLoans);
19+
// upgradeDebtLockersTo400(mavenWethLoans);
20+
// upgradeDebtLockersTo400(orthogonalLoans);
21+
// upgradeDebtLockersTo400(icebreakerLoans);
22+
upgradeDebtLockersTo400(unorderedMigrationLoans);
2223
}
2324

24-
function upgradeDebtLockersTo400(IMapleLoanLike[] storage loans) internal {
25+
function upgradeDebtLockersTo400(address[] storage loans) internal {
2526
for (uint256 i = 0; i < loans.length; i++) {
26-
IDebtLockerLike debtLocker = IDebtLockerLike(loans[i].lender());
27+
IDebtLockerLike debtLocker = IDebtLockerLike(IMapleLoanLike(loans[i]).lender());
2728

28-
if (debtLockerFactory.versionOf(debtLocker.implementation()) == 400) continue;
29+
if (IMapleProxyFactoryLike(debtLockerFactory).versionOf(debtLocker.implementation()) == 400) continue;
2930

30-
if (debtLockerFactory.versionOf(debtLocker.implementation()) == 200) {
31+
if (IMapleProxyFactoryLike(debtLockerFactory).versionOf(debtLocker.implementation()) == 200) {
3132
vm.broadcast(debtLocker.poolDelegate());
32-
debtLocker.upgrade(300, abi.encode(migrationMultisig));
33+
debtLocker.upgrade(300, abi.encode(migrationHelperProxy));
3334
}
3435

35-
if (debtLockerFactory.versionOf(debtLocker.implementation()) == 300) {
36+
if (IMapleProxyFactoryLike(debtLockerFactory).versionOf(debtLocker.implementation()) == 300) {
3637
vm.broadcast(debtLocker.poolDelegate());
37-
debtLocker.upgrade(400, abi.encode(migrationMultisig));
38+
debtLocker.upgrade(400, abi.encode(migrationHelperProxy));
3839
}
3940

4041
assertVersion(400, address(debtLocker));

0 commit comments

Comments
 (0)