@@ -27,98 +27,22 @@ contract BondingManagerRetroactiveRewardCalculationFix is BondingManagerRetroact
2727 assertEq (infoAddr, address (newBondingManagerTarget));
2828 }
2929
30- function _delta (uint256 a , uint256 b ) internal pure returns (int256 ) {
31- return a >= b ? int256 (a - b) : - int256 (b - a);
32- }
33-
34- function _abs (int256 x ) internal pure returns (uint256 ) {
35- return uint256 (x >= 0 ? x : - x);
36- }
37-
38- function testFeeFactorEqualityAfterUpgrade () public {
39- // Pre-upgrade measurement
40- CHEATS.revertToState (baselineSnapshot);
41- FeeMetrics memory baselineConsecutive = _scenarioConsecutive ();
42- CHEATS.revertToState (baselineSnapshot);
43- FeeMetrics memory baselineMissed = _scenarioMissed ();
44- int256 preUpgradeDelta = _delta (
45- baselineMissed.cumulativeFeeFactorInc,
46- baselineConsecutive.cumulativeFeeFactorInc
47- );
48-
49- // Post-upgrade measurement
50- CHEATS.revertToState (baselineSnapshot);
51- _deployUpgrade ();
52- FeeMetrics memory postConsecutive = _scenarioConsecutive ();
53- CHEATS.revertToState (baselineSnapshot);
30+ function _scenarioConsecutive () internal override returns (FeeMetrics memory ) {
5431 _deployUpgrade ();
55- FeeMetrics memory postMissed = _scenarioMissed ();
56- int256 postUpgradeDelta = _delta (postMissed.cumulativeFeeFactorInc, postConsecutive.cumulativeFeeFactorInc);
57-
58- // Sanity: identical commission parameters preserved
59- assertEq (postConsecutive.feeShare, postMissed.feeShare, "feeShare mismatch " );
60- assertEq (postConsecutive.commission, postMissed.commission, "commission mismatch " );
61-
62- // Post-upgrade delta less than 1% of pre-upgrade delta
63- uint256 deltaTolerance = _abs (preUpgradeDelta) / 100000 ;
64- if (deltaTolerance == 0 ) deltaTolerance = 1 ;
65-
66- assertTrue (_abs (postUpgradeDelta) <= deltaTolerance, "fee factor deflation persists " );
67-
68- emit log_named_uint ("preUpgrade_cumulativeFeeFactor_missed " , baselineMissed.cumulativeFeeFactor);
69- emit log_named_uint ("preUpgrade_cumulativeFeeFactor_consec " , baselineConsecutive.cumulativeFeeFactor);
70- emit log_named_uint ("aftUpgrade_cumulativeFeeFactor_missed " , postMissed.cumulativeFeeFactor);
71- emit log_named_uint ("aftUpgrade_cumulativeFeeFactor_consec " , postConsecutive.cumulativeFeeFactor);
72- emit log_named_int ("preUpgrade_cumulativeFeeFactor_delta " , preUpgradeDelta);
73- emit log_named_int ("aftUpgrade_cumulativeFeeFactor_delta " , postUpgradeDelta);
32+ return super ._scenarioConsecutive ();
7433 }
7534
76- function testDelegatorNoFeeLossAfterUpgrade () public {
77- // Pre-upgrade measurement
78- CHEATS.revertToState (baselineSnapshot);
79- _bondDelegator (testDelegator, 1 ether);
80- _scenarioConsecutive ();
81- CHEATS.prank (testDelegator);
82- BONDING_MANAGER.claimEarnings (type (uint256 ).max);
83- (, uint256 baseFeesCons , , , , , ) = BONDING_MANAGER.getDelegator (testDelegator);
84-
85- CHEATS.revertToState (baselineSnapshot);
86- _bondDelegator (testDelegator, 1 ether);
87- _scenarioMissed ();
88- CHEATS.prank (testDelegator);
89- BONDING_MANAGER.claimEarnings (type (uint256 ).max);
90- (, uint256 baseFeesMiss , , , , , ) = BONDING_MANAGER.getDelegator (testDelegator);
91- int256 preUpgradeDeltaFees = _delta (baseFeesMiss, baseFeesCons);
92-
93- // Post-upgrade measurement
94- CHEATS.revertToState (baselineSnapshot);
35+ function _scenarioMissed () internal override returns (FeeMetrics memory ) {
9536 _deployUpgrade ();
96- _bondDelegator (testDelegator, 1 ether);
97- _scenarioConsecutive ();
98- CHEATS.prank (testDelegator);
99- BONDING_MANAGER.claimEarnings (type (uint256 ).max);
100- (, uint256 postFeesCons , , , , , ) = BONDING_MANAGER.getDelegator (testDelegator);
101-
102- CHEATS.revertToState (baselineSnapshot);
103- _deployUpgrade ();
104- _bondDelegator (testDelegator, 1 ether);
105- _scenarioMissed ();
106- CHEATS.prank (testDelegator);
107- BONDING_MANAGER.claimEarnings (type (uint256 ).max);
108- (, uint256 postFeesMiss , , , , , ) = BONDING_MANAGER.getDelegator (testDelegator);
109- int256 postUpgradeDeltaFees = _delta (postFeesMiss, postFeesCons);
110-
111- // Post-upgrade delta less than 1% of pre-upgrade delta
112- uint256 deltaToleranceFees = _abs (preUpgradeDeltaFees) / 100000 ;
113- if (deltaToleranceFees == 0 ) deltaToleranceFees = 1 ;
37+ return super ._scenarioMissed ();
38+ }
11439
115- assertTrue (_abs (postUpgradeDeltaFees) <= deltaToleranceFees, "delegator fee loss not mitigated sufficiently " );
40+ function _validateFeeFactor (uint256 consecutive , uint256 missed ) internal override {
41+ // We use 1e12 as a safe tolerance for rounding noise
42+ assertApproxEqAbs (consecutive, missed, 1e12 , "Fee factor deflation persists " );
43+ }
11644
117- emit log_named_uint ("preUpgrade_delegatorFees_consec " , baseFeesCons);
118- emit log_named_uint ("preUpgrade_delegatorFees_missed " , baseFeesMiss);
119- emit log_named_uint ("aftUpgrade_delegatorFees_consec " , postFeesCons);
120- emit log_named_uint ("aftUpgrade_delegatorFees_missed " , postFeesMiss);
121- emit log_named_int ("preUpgrade_delegatorFees_delta " , preUpgradeDeltaFees);
122- emit log_named_int ("aftUpgrade_delegatorFees_delta " , postUpgradeDeltaFees);
45+ function _validateDelegatorFees (uint256 consecutive , uint256 missed ) internal override {
46+ assertEq (consecutive, missed, "Delegator fee loss persists " );
12347 }
12448}
0 commit comments