Skip to content
This repository was archived by the owner on Nov 15, 2023. It is now read-only.

Commit 4c83ee0

Browse files
authored
Fix nomination pools pending rewards RPC (#12095)
* Fix nomination pools pending rewards RPC * Fix node * Update frame/nomination-pools/src/lib.rs * Fix docs
1 parent ea4f532 commit 4c83ee0

File tree

3 files changed

+65
-8
lines changed

3 files changed

+65
-8
lines changed

bin/node/runtime/src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1842,7 +1842,7 @@ impl_runtime_apis! {
18421842

18431843
impl pallet_nomination_pools_runtime_api::NominationPoolsApi<Block, AccountId, Balance> for Runtime {
18441844
fn pending_rewards(member_account: AccountId) -> Balance {
1845-
NominationPools::pending_rewards(member_account)
1845+
NominationPools::pending_rewards(member_account).unwrap_or_default()
18461846
}
18471847
}
18481848

frame/nomination-pools/src/lib.rs

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2156,16 +2156,20 @@ pub mod pallet {
21562156
impl<T: Config> Pallet<T> {
21572157
/// Returns the pending rewards for the specified `member_account`.
21582158
///
2159-
/// In the case of error the function returns balance of zero.
2160-
pub fn pending_rewards(member_account: T::AccountId) -> BalanceOf<T> {
2159+
/// In the case of error, `None` is returned.
2160+
pub fn pending_rewards(member_account: T::AccountId) -> Option<BalanceOf<T>> {
21612161
if let Some(pool_member) = PoolMembers::<T>::get(member_account) {
2162-
if let Some(reward_pool) = RewardPools::<T>::get(pool_member.pool_id) {
2163-
return pool_member
2164-
.pending_rewards(reward_pool.last_recorded_reward_counter())
2165-
.unwrap_or_default()
2162+
if let Some((reward_pool, bonded_pool)) = RewardPools::<T>::get(pool_member.pool_id)
2163+
.zip(BondedPools::<T>::get(pool_member.pool_id))
2164+
{
2165+
let current_reward_counter = reward_pool
2166+
.current_reward_counter(pool_member.pool_id, bonded_pool.points)
2167+
.ok()?;
2168+
return pool_member.pending_rewards(current_reward_counter).ok()
21662169
}
21672170
}
2168-
BalanceOf::<T>::default()
2171+
2172+
None
21692173
}
21702174

21712175
/// The amount of bond that MUST REMAIN IN BONDED in ALL POOLS.

frame/nomination-pools/src/tests.rs

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1285,6 +1285,59 @@ mod claim_payout {
12851285
});
12861286
}
12871287

1288+
#[test]
1289+
fn pending_rewards_per_member_works() {
1290+
ExtBuilder::default().build_and_execute(|| {
1291+
let ed = Balances::minimum_balance();
1292+
1293+
assert_eq!(Pools::pending_rewards(10), Some(0));
1294+
Balances::mutate_account(&default_reward_account(), |f| f.free += 30).unwrap();
1295+
assert_eq!(Pools::pending_rewards(10), Some(30));
1296+
assert_eq!(Pools::pending_rewards(20), None);
1297+
1298+
Balances::make_free_balance_be(&20, ed + 10);
1299+
assert_ok!(Pools::join(Origin::signed(20), 10, 1));
1300+
1301+
assert_eq!(Pools::pending_rewards(10), Some(30));
1302+
assert_eq!(Pools::pending_rewards(20), Some(0));
1303+
1304+
Balances::mutate_account(&default_reward_account(), |f| f.free += 100).unwrap();
1305+
1306+
assert_eq!(Pools::pending_rewards(10), Some(30 + 50));
1307+
assert_eq!(Pools::pending_rewards(20), Some(50));
1308+
assert_eq!(Pools::pending_rewards(30), None);
1309+
1310+
Balances::make_free_balance_be(&30, ed + 10);
1311+
assert_ok!(Pools::join(Origin::signed(30), 10, 1));
1312+
1313+
assert_eq!(Pools::pending_rewards(10), Some(30 + 50));
1314+
assert_eq!(Pools::pending_rewards(20), Some(50));
1315+
assert_eq!(Pools::pending_rewards(30), Some(0));
1316+
1317+
Balances::mutate_account(&default_reward_account(), |f| f.free += 60).unwrap();
1318+
1319+
assert_eq!(Pools::pending_rewards(10), Some(30 + 50 + 20));
1320+
assert_eq!(Pools::pending_rewards(20), Some(50 + 20));
1321+
assert_eq!(Pools::pending_rewards(30), Some(20));
1322+
1323+
// 10 should claim 10, 20 should claim nothing.
1324+
assert_ok!(Pools::claim_payout(Origin::signed(10)));
1325+
assert_eq!(Pools::pending_rewards(10), Some(0));
1326+
assert_eq!(Pools::pending_rewards(20), Some(50 + 20));
1327+
assert_eq!(Pools::pending_rewards(30), Some(20));
1328+
1329+
assert_ok!(Pools::claim_payout(Origin::signed(20)));
1330+
assert_eq!(Pools::pending_rewards(10), Some(0));
1331+
assert_eq!(Pools::pending_rewards(20), Some(0));
1332+
assert_eq!(Pools::pending_rewards(30), Some(20));
1333+
1334+
assert_ok!(Pools::claim_payout(Origin::signed(30)));
1335+
assert_eq!(Pools::pending_rewards(10), Some(0));
1336+
assert_eq!(Pools::pending_rewards(20), Some(0));
1337+
assert_eq!(Pools::pending_rewards(30), Some(0));
1338+
});
1339+
}
1340+
12881341
#[test]
12891342
fn rewards_distribution_is_fair_bond_extra() {
12901343
ExtBuilder::default().build_and_execute(|| {

0 commit comments

Comments
 (0)