Fixed underflow in rewarding all delegators (#1099)

* Fixed underflow in rewarding all delegators

* Slightly simplifying the loop
This commit is contained in:
Jędrzej Stuczyński
2022-02-07 11:30:17 +00:00
committed by GitHub
parent d907b6b81a
commit f22bb282ab
+18 -17
View File
@@ -268,10 +268,6 @@ impl<C> Client<C> {
where
C: SigningCosmWasmClient + Sync,
{
// determine how many times we are going to have to call the delegator rewarding,
// note that it doesn't include the "base" call to `RewardMixnode` that rewards one page
let further_calls = node.total_delegations / MIXNODE_DELEGATORS_PAGE_LIMIT;
// start with the base call to reward operator and first page of delegators
let msgs = vec![(node.to_reward_execute_msg(interval_id), vec![])];
let memo = format!(
@@ -281,20 +277,25 @@ impl<C> Client<C> {
self.execute_multiple_with_retry(msgs, Default::default(), memo)
.await?;
// reward rest of delegators
let mut remaining_delegators = node.total_delegations - MIXNODE_DELEGATORS_PAGE_LIMIT;
let delegator_rewarding_msg = (
node.to_next_delegator_reward_execute_msg(interval_id),
vec![],
);
for _ in 0..further_calls {
let delegators_in_call = remaining_delegators.min(MIXNODE_DELEGATORS_PAGE_LIMIT);
let msgs = vec![delegator_rewarding_msg.clone()];
let memo = format!("rewarding another {} delegators", delegators_in_call);
self.execute_multiple_with_retry(msgs, Default::default(), memo)
.await?;
// reward rest of delegators (if applicable)
if node.total_delegations > MIXNODE_DELEGATORS_PAGE_LIMIT {
// the first 'batch' of delegators has been rewarded while rewarding the operator
let mut remaining_delegators = node.total_delegations - MIXNODE_DELEGATORS_PAGE_LIMIT;
let delegator_rewarding_msg = (
node.to_next_delegator_reward_execute_msg(interval_id),
vec![],
);
remaining_delegators -= MIXNODE_DELEGATORS_PAGE_LIMIT;
while remaining_delegators > 0 {
let delegators_in_call = remaining_delegators.min(MIXNODE_DELEGATORS_PAGE_LIMIT);
let msgs = vec![delegator_rewarding_msg.clone()];
let memo = format!("rewarding another {} delegators", delegators_in_call);
self.execute_multiple_with_retry(msgs, Default::default(), memo)
.await?;
remaining_delegators =
remaining_delegators.saturating_sub(MIXNODE_DELEGATORS_PAGE_LIMIT)
}
}
Ok(())