To calculate blockMultiplier, the protocol divides the distance between the updated weights and the current weight by the update interval. It seems the protocol incorrectly assumes that weight updates occur precisely at the update intervals. However, weight updates can happen at any time, not just at the designated intervals. Therefore, blockMultiplier should be calculated by dividing the distance by the time elapsed since the last update, rather than by the update interval.
in UpdateWeightRunner::performUpdate there is a check for controlling the time of calling the function:
This means that the update can happen at any time after the interval. Therefore, the time that has passed since the last update should be taken into account when calculating blockMultiplier.
Consider pass the last update time for multiplier calculation. change the add lastUpdate to CalculateMuliplierAndSetWeightsLocal structure and then :
Now change the blockMultiplier calculation like this:
The contest is live. Earn rewards by submitting a finding.
This is your time to appeal against judgements on your submissions.
Appeals are being carefully reviewed by our judges.