diff --git a/src/contracts/core/DelegationManager.sol b/src/contracts/core/DelegationManager.sol index 4cf592555a..b4073446a7 100644 --- a/src/contracts/core/DelegationManager.sol +++ b/src/contracts/core/DelegationManager.sol @@ -793,8 +793,8 @@ contract DelegationManager is // less than or equal to MIN_WITHDRAWAL_DELAY_BLOCKS ago. These shares are still slashable. uint256 scaledSharesAdded = curQueuedScaledShares - prevQueuedScaledShares; - return SlashingLib.scaleForBurning({ - scaledShares: scaledSharesAdded, + return SlashingLib.calcSlashedAmount({ + operatorShares: scaledSharesAdded.mulWad(prevMaxMagnitude), prevMaxMagnitude: prevMaxMagnitude, newMaxMagnitude: newMaxMagnitude }); diff --git a/src/contracts/libraries/SlashingLib.sol b/src/contracts/libraries/SlashingLib.sol index f608480f08..9719b1c139 100644 --- a/src/contracts/libraries/SlashingLib.sol +++ b/src/contracts/libraries/SlashingLib.sol @@ -74,20 +74,6 @@ library SlashingLib { return scaledShares.mulWad(slashingFactor); } - /** - * @notice Scales shares according to the difference in an operator's magnitude before and - * after being slashed. This is used to calculate the number of slashable shares in the - * withdrawal queue. - * NOTE: max magnitude is guaranteed to only ever decrease. - */ - function scaleForBurning( - uint256 scaledShares, - uint64 prevMaxMagnitude, - uint64 newMaxMagnitude - ) internal pure returns (uint256) { - return scaledShares.mulWad(prevMaxMagnitude - newMaxMagnitude); - } - function update( DepositScalingFactor storage dsf, uint256 prevDepositShares, @@ -178,6 +164,10 @@ library SlashingLib { uint256 prevMaxMagnitude, uint256 newMaxMagnitude ) internal pure returns (uint256) { + if (prevMaxMagnitude == 0) { + // TODO: consider throwing an error instead + return 0; + } // round up mulDiv so we don't overslash return operatorShares - operatorShares.mulDiv(newMaxMagnitude, prevMaxMagnitude, Math.Rounding.Up); }