Skip to content

Commit cfaeebd

Browse files
authored
fix: add checks for liquidationPenaltyRedistribution (#27)
1 parent 19e5c6d commit cfaeebd

File tree

2 files changed

+89
-3
lines changed

2 files changed

+89
-3
lines changed

contracts/src/SystemParams.sol

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -82,9 +82,6 @@ contract SystemParams is ISystemParams, Initializable {
8282
if (_liquidationParams.liquidationPenaltySP > _liquidationParams.liquidationPenaltyRedistribution) {
8383
revert SPPenaltyGtRedist();
8484
}
85-
if (_liquidationParams.liquidationPenaltyRedistribution > MAX_LIQUIDATION_PENALTY_REDISTRIBUTION) {
86-
revert RedistPenaltyTooHigh();
87-
}
8885

8986
// Validate gas compensation parameters
9087
if (_gasCompParams.collGasCompensationDivisor == 0 || _gasCompParams.collGasCompensationDivisor > 1000) {
@@ -103,6 +100,14 @@ contract SystemParams is ISystemParams, Initializable {
103100
if (_collateralParams.bcr < 5 * _1pct || _collateralParams.bcr >= 50 * _1pct) revert InvalidBCR();
104101
if (_collateralParams.scr <= _100pct || _collateralParams.scr >= 2 * _100pct) revert InvalidSCR();
105102

103+
// The redistribution penalty must not exceed the overcollateralization buffer (MCR - 100%)
104+
if (
105+
_liquidationParams.liquidationPenaltyRedistribution > MAX_LIQUIDATION_PENALTY_REDISTRIBUTION
106+
|| _liquidationParams.liquidationPenaltyRedistribution > _collateralParams.mcr - _100pct
107+
) {
108+
revert RedistPenaltyTooHigh();
109+
}
110+
106111
// Validate interest parameters
107112
if (_interestParams.minAnnualInterestRate > MAX_ANNUAL_INTEREST_RATE) {
108113
revert MinInterestRateGtMax();

contracts/test/systemParams.t.sol

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -164,6 +164,87 @@ contract SystemParamsTest is DevTestSetup {
164164
);
165165
}
166166

167+
function testConstructorRevertsWhenRedistPenaltyExceedsMCRBuffer() public {
168+
// MCR = 110%, so buffer = 10%. Set redistribution penalty to 11% (exceeds buffer)
169+
ISystemParams.LiquidationParams memory liquidationParams = ISystemParams.LiquidationParams({
170+
liquidationPenaltySP: 5e16,
171+
liquidationPenaltyRedistribution: 11 * _1pct // 11% > (110% - 100%)
172+
});
173+
174+
vm.expectRevert(ISystemParams.RedistPenaltyTooHigh.selector);
175+
new SystemParams(false,
176+
_getValidDebtParams(),
177+
liquidationParams,
178+
_getValidGasCompParams(),
179+
_getValidCollateralParams(),
180+
_getValidInterestParams(),
181+
_getValidRedemptionParams(),
182+
_getValidPoolParams()
183+
);
184+
}
185+
186+
function testConstructorAllowsRedistPenaltyEqualToMCRBuffer() public {
187+
// MCR = 110%, so buffer = 10%. Set redistribution penalty to exactly 10%
188+
ISystemParams.LiquidationParams memory liquidationParams = ISystemParams.LiquidationParams({
189+
liquidationPenaltySP: 5e16,
190+
liquidationPenaltyRedistribution: 10 * _1pct // 10% == (110% - 100%)
191+
});
192+
193+
// Should not revert
194+
SystemParams params = new SystemParams(false,
195+
_getValidDebtParams(),
196+
liquidationParams,
197+
_getValidGasCompParams(),
198+
_getValidCollateralParams(),
199+
_getValidInterestParams(),
200+
_getValidRedemptionParams(),
201+
_getValidPoolParams()
202+
);
203+
204+
assertEq(params.LIQUIDATION_PENALTY_REDISTRIBUTION(), 10 * _1pct);
205+
}
206+
207+
function testConstructorRevertsWhenRedistPenaltyExceedsMCRBufferWithDifferentMCR() public {
208+
// MCR = 115%, so buffer = 15%. Set redistribution penalty to 16% (exceeds buffer)
209+
ISystemParams.CollateralParams memory collateralParams = ISystemParams.CollateralParams({
210+
ccr: 150 * _1pct,
211+
scr: 115 * _1pct,
212+
mcr: 115 * _1pct,
213+
bcr: 10 * _1pct
214+
});
215+
216+
ISystemParams.LiquidationParams memory liquidationParams = ISystemParams.LiquidationParams({
217+
liquidationPenaltySP: 5e16,
218+
liquidationPenaltyRedistribution: 16 * _1pct // 16% > (115% - 100%)
219+
});
220+
221+
vm.expectRevert(ISystemParams.RedistPenaltyTooHigh.selector);
222+
new SystemParams(false,
223+
_getValidDebtParams(),
224+
liquidationParams,
225+
_getValidGasCompParams(),
226+
collateralParams,
227+
_getValidInterestParams(),
228+
_getValidRedemptionParams(),
229+
_getValidPoolParams()
230+
);
231+
232+
liquidationParams = ISystemParams.LiquidationParams({
233+
liquidationPenaltySP: 5e16,
234+
liquidationPenaltyRedistribution: 15 * _1pct // 15%
235+
});
236+
237+
new SystemParams(false,
238+
_getValidDebtParams(),
239+
liquidationParams,
240+
_getValidGasCompParams(),
241+
collateralParams,
242+
_getValidInterestParams(),
243+
_getValidRedemptionParams(),
244+
_getValidPoolParams()
245+
);
246+
}
247+
167248
// ========== GAS COMPENSATION VALIDATION TESTS ==========
168249

169250
function testConstructorRevertsWhenGasCompDivisorZero() public {

0 commit comments

Comments
 (0)