Summary
Dividing locals.normalizationFactor prematurely may cause precision loss if locals.sumKappa is very large or very small.
https://github.com/Cyfrin/2024-12-quantamm/blob/a775db4273eb36e7b4536c5b60207c9f17541b92/pkg/pool-quantamm/contracts/rules/AntimomentumUpdateRule.sol#L114-L125
locals.normalizationFactor = locals.normalizationFactor.div(locals.sumKappa);
for (locals.i = 0; locals.i < _prevWeights.length; ) {
int256 res = int256(_prevWeights[locals.i]) + int256(locals.kappa[locals.i]).mul(locals.normalizationFactor - locals.newWeights[locals.i]);
require(res >= 0, "Invalid weight");
newWeightsConverted[locals.i] = res;
unchecked {
++locals.i;
}
}
Impact
Incorrect Weight Calculations
Recommendations
-- locals.normalizationFactor = locals.normalizationFactor.div(locals.sumKappa);
for (locals.i = 0; locals.i < _prevWeights.length; ) {
-- int256 res = int256(_prevWeights[locals.i]) + int256(locals.kappa[locals.i]).mul(locals.normalizationFactor - locals.newWeights[locals.i]);
++ int256 res = int256(_prevWeights[locals.i]) + int256(locals.kappa[locals.i]).mul(locals.normalizationFactor - locals.newWeights[locals.i].mul(locals.sumKappa)).div(locals.sumKappa);
require(res >= 0, "Invalid weight");
newWeightsConverted[locals.i] = res;
unchecked {
++locals.i;
}
}