Skip to content
New issue

Have a question about this project? # for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “#”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? # to your account

Staking On Innovation: Claim Reward Tests #314

Merged
merged 9 commits into from
Feb 28, 2024
5 changes: 2 additions & 3 deletions pallets/economy/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -601,10 +601,9 @@ pub mod pallet {
///
/// The dispatch origin for this call must be _Signed_.
///
/// `amount`: the unstake amount
///
/// Emit `UnstakedInnovation` event if successful
#[pallet::weight(T::WeightInfo::stake_a())]
/// Emit `ClaimRewards` event if successful
#[pallet::weight(T::WeightInfo::claim_reward())]
#[transactional]
pub fn claim_reward(origin: OriginFor<T>) -> DispatchResult {
let who = ensure_signed(origin)?;
Expand Down
16 changes: 9 additions & 7 deletions pallets/economy/src/mock.rs
Original file line number Diff line number Diff line change
Expand Up @@ -496,13 +496,14 @@ impl ExtBuilder {
.unwrap();

pallet_balances::GenesisConfig::<Runtime> {
balances: vec![(ALICE, 10000)],
}
.assimilate_storage(&mut t)
.unwrap();

pallet_balances::GenesisConfig::<Runtime> {
balances: vec![(BOB, 20000)],
balances: vec![
(ALICE, 10000),
(BOB, 20000),
(
<mock::Runtime as pallet::Config>::RewardPayoutAccount::get().into_account_truncating(),
30000,
),
],
}
.assimilate_storage(&mut t)
.unwrap();
Expand All @@ -525,6 +526,7 @@ pub fn run_to_block(n: u64) {
System::set_block_number(System::block_number() + 1);
System::on_initialize(System::block_number());
Mining::on_initialize(System::block_number());
EconomyModule::on_initialize(System::block_number());
}
}

Expand Down
130 changes: 129 additions & 1 deletion pallets/economy/src/tests.rs
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@

use frame_support::{assert_noop, assert_ok};

use sp_runtime::traits::BadOrigin;
use sp_runtime::traits::{AccountIdConversion, BadOrigin};
use sp_std::default::Default;

use core_primitives::{Attributes, CollectionType, TokenType};
Expand Down Expand Up @@ -607,3 +607,131 @@ fn unstake_on_innovation_should_work() {
);
});
}

#[test]
fn claim_reward_should_work() {
ExtBuilder::default().build().execute_with(|| {
assert_ok!(EconomyModule::stake_on_innovation(
RuntimeOrigin::signed(account(1)),
STAKE_BALANCE,
));

/// Account share of pool reward should be == STAKE_BALANCE
let acc_1_shared_rewards = EconomyModule::shares_and_withdrawn_rewards(account(1));
assert_eq!(acc_1_shared_rewards, (STAKE_BALANCE, Default::default()));
assert_eq!(EconomyModule::get_innovation_staking_info(account(1)), STAKE_BALANCE);
assert_eq!(EconomyModule::total_innovation_staking(), STAKE_BALANCE);

let reward_amount = 100u128;
let mut reward_map: BTreeMap<FungibleTokenId, u128> = BTreeMap::new();
reward_map.insert(FungibleTokenId::NativeToken(0), reward_amount.clone());

PendingRewardsOfStakingInnovation::<Runtime>::insert(account(1), reward_map.clone());

run_to_block(2);

assert_ok!(EconomyModule::claim_reward(RuntimeOrigin::signed(account(1))));

assert_eq!(
last_event(),
RuntimeEvent::Economy(crate::Event::ClaimRewards(
account(1),
FungibleTokenId::NativeToken(0),
reward_amount
))
);

assert_eq!(EconomyModule::get_innovation_staking_info(account(1)), STAKE_BALANCE);
assert_eq!(EconomyModule::total_innovation_staking(), STAKE_BALANCE);
assert_eq!(
Balances::free_balance(
&<mock::Runtime as pallet::Config>::RewardPayoutAccount::get().into_account_truncating()
),
29900u128
);
assert_eq!(Balances::free_balance(account(1)), 9100u128);
});
}

#[test]
fn claim_reward_with_multiple_stakers_should_work() {
ExtBuilder::default().build().execute_with(|| {
let account_2_stake_balance = STAKE_BALANCE / 4;
let account_1_stake_balance = STAKE_BALANCE - account_2_stake_balance;

assert_ok!(EconomyModule::stake_on_innovation(
RuntimeOrigin::signed(account(1)),
account_1_stake_balance,
));
assert_ok!(EconomyModule::stake_on_innovation(
RuntimeOrigin::signed(account(2)),
account_2_stake_balance,
));

let acc_1_shared_rewards = EconomyModule::shares_and_withdrawn_rewards(account(1));
assert_eq!(acc_1_shared_rewards, (account_1_stake_balance, Default::default()));
assert_eq!(
EconomyModule::get_innovation_staking_info(account(1)),
account_1_stake_balance
);
let acc_2_shared_rewards = EconomyModule::shares_and_withdrawn_rewards(account(2));
assert_eq!(acc_2_shared_rewards, (account_2_stake_balance, Default::default()));
assert_eq!(
EconomyModule::get_innovation_staking_info(account(2)),
account_2_stake_balance
);
assert_eq!(EconomyModule::total_innovation_staking(), STAKE_BALANCE);

EstimatedStakingRewardPerEra::<Runtime>::set(2000u128);
UpdateEraFrequency::<Runtime>::set(1u64);

run_to_block(2);

assert_ok!(EconomyModule::claim_reward(RuntimeOrigin::signed(account(1))));

assert_eq!(
last_event(),
RuntimeEvent::Economy(crate::Event::ClaimRewards(
account(1),
FungibleTokenId::NativeToken(0),
3000u128
))
);

assert_eq!(
EconomyModule::get_innovation_staking_info(account(1)),
account_1_stake_balance
);
assert_eq!(EconomyModule::total_innovation_staking(), STAKE_BALANCE);
assert_eq!(
Balances::free_balance(
&<mock::Runtime as pallet::Config>::RewardPayoutAccount::get().into_account_truncating()
),
27000u128
);
assert_eq!(Balances::free_balance(account(1)), 12250u128);

assert_ok!(EconomyModule::claim_reward(RuntimeOrigin::signed(account(2))));

assert_eq!(
last_event(),
RuntimeEvent::Economy(crate::Event::ClaimRewards(
account(2),
FungibleTokenId::NativeToken(0),
1000u128
))
);

assert_eq!(
EconomyModule::get_innovation_staking_info(account(2)),
account_2_stake_balance
);
assert_eq!(
Balances::free_balance(
&<mock::Runtime as pallet::Config>::RewardPayoutAccount::get().into_account_truncating()
),
26000u128
);
assert_eq!(Balances::free_balance(account(2)), 20750u128);
});
}
Loading
Loading