Assessment reports>Tortuga Liquid Staking>Informational findings>Precision loss in reward rate calculation
Category: Coding Mistakes

Precision loss in reward rate calculation

Informational Severity
Informational Impact
N/A Likelihood

Description

When calculating the effective reward rate, the effective_reward_rate function uses an order of operations that is not ideal; we recommend multiplying before dividing in cases where there is little risk of overflow to improve calculation precision.

Impact

The effective reward rate may be slightly lower than intended.

Recommendations

Change the order of the following operations:

fun effective_reward_rate(
    stats_config: &StatsConfig,
    rewards: u128,
    balance_at_last_update: u128,
    time_delta: u128,
): u128 {
-    (rewards * stats_config.rate_normalizer / balance_at_last_update) *
-        stats_config.time_normalizer / time_delta
+    (rewards * stats_config.rate_normalizer*stats_config.time_normalizer)/
+        (balance_at_last_update * time_delta)
}

Remediation

In response to this finding, Move Labs noted that:

We have two normalizers just so that we can have double control over precision. rate_normalizer will be as large as possible that still ensures no overflows in the first mul_div. Then time_normalizer could be any other reasonable value for precision.

Multiplying the normalizers first, as in the recommendation is the same as using just one normalizer. We are hoping to get additional precision if necessary using two normalizers.

Zellic © 2023Back to top ↑