From 5509757640ce5b4e0f30af644771eaba2b307db5 Mon Sep 17 00:00:00 2001 From: Yaroslav Bolyukin Date: Thu, 22 Dec 2022 15:41:34 +0000 Subject: [PATCH] Merge pull request #800 from UniqueNetwork/fix/payout-stakers Fix/payout stakers --- --- a/Cargo.lock +++ b/Cargo.lock @@ -5549,7 +5549,7 @@ [[package]] name = "pallet-app-promotion" -version = "0.1.1" +version = "0.1.2" dependencies = [ "frame-benchmarking", "frame-support", --- a/pallets/app-promotion/CHANGELOG.md +++ b/pallets/app-promotion/CHANGELOG.md @@ -4,6 +4,13 @@ +## [0.1.2] - 2022-12-20 + +### Fixed + +- The behaviour of the `payoutStakers` extrinsic + in which only one stake is calculated for the last processed staker. + ## [0.1.1] - 2022-12-13 ### Added --- a/pallets/app-promotion/Cargo.toml +++ b/pallets/app-promotion/Cargo.toml @@ -9,7 +9,7 @@ license = 'GPLv3' name = 'pallet-app-promotion' repository = 'https://github.com/UniqueNetwork/unique-chain' -version = '0.1.1' +version = '0.1.2' [package.metadata.docs.rs] targets = ['x86_64-unknown-linux-gnu'] --- a/pallets/app-promotion/src/lib.rs +++ b/pallets/app-promotion/src/lib.rs @@ -608,6 +608,8 @@ { // Address handled in the last payout loop iteration (below) let last_id = RefCell::new(None); + // Block number (as a part of the key) for which calculation was performed in the last payout loop iteration + let mut last_staked_calculated_block = Default::default(); // Reward balance for the address in the iteration let income_acc = RefCell::new(BalanceOf::::default()); // Staked balance for the address in the iteration (before stake is recalculated) @@ -666,9 +668,22 @@ // or just start handling the very first address. In the latter case last_id will be None and // flush_stake will do nothing if last_id.borrow().as_ref() != Some(¤t_id) { - flush_stake()?; - *last_id.borrow_mut() = Some(current_id.clone()); - stakers_number -= 1; + if stakers_number > 0 { + flush_stake()?; + *last_id.borrow_mut() = Some(current_id.clone()); + stakers_number -= 1; + } + // Break out if we reached the address limit + else { + if let Some(staker) = &*last_id.borrow() { + // Save the last calculated record to pick up in the next extrinsic call + PreviousCalculatedRecord::::set(Some(( + staker.clone(), + last_staked_calculated_block, + ))); + } + break; + }; }; // Increase accumulated reward for current address and update current staking record, i.e. (address, staked_block) -> amount @@ -685,15 +700,7 @@ &mut *income_acc.borrow_mut(), ); } - - // Break out if we reached the address limit - if stakers_number == 0 { - if storage_iterator.next().is_some() { - // Save the last calculated record to pick up in the next extrinsic call - PreviousCalculatedRecord::::set(Some((current_id, staked_block))); - } - break; - } + last_staked_calculated_block = staked_block; } flush_stake()?; } -- gitstuff