diff --git a/pallets/multi-asset-delegation/src/lib.rs b/pallets/multi-asset-delegation/src/lib.rs index 7656688d..0db47788 100644 --- a/pallets/multi-asset-delegation/src/lib.rs +++ b/pallets/multi-asset-delegation/src/lib.rs @@ -89,7 +89,7 @@ pub mod pallet { use scale_info::TypeInfo; use sp_core::H160; use sp_runtime::traits::{MaybeSerializeDeserialize, Member, Zero}; - use sp_staking::{OnStakingUpdate, SessionIndex, StakingInterface}; + use sp_staking::{OnStakingUpdate, SessionIndex, Stake, StakingInterface}; use sp_std::{fmt::Debug, prelude::*, vec::Vec}; use tangle_primitives::traits::RewardsManager; use tangle_primitives::types::rewards::LockMultiplier; @@ -1231,5 +1231,9 @@ pub mod pallet { } } - impl OnStakingUpdate> for Pallet {} + impl OnStakingUpdate> for Pallet { + fn on_stake_update(_who: &C::AccountId, _prev_stake: Option>>) { + unimplemented!("Custom stake update logic not implemented") + } + } } diff --git a/pallets/multi-asset-delegation/src/tests/delegate.rs b/pallets/multi-asset-delegation/src/tests/delegate.rs index 6209d620..5833f52e 100644 --- a/pallets/multi-asset-delegation/src/tests/delegate.rs +++ b/pallets/multi-asset-delegation/src/tests/delegate.rs @@ -613,3 +613,53 @@ fn native_restaking_should_work() { assert_eq!(locks[1].amount, delegate_amount); }); } + +#[test] +fn unbond_should_fail_if_delegated_nomination() { + new_test_ext().execute_with(|| { + // Arrange + let who: AccountId = Dave.into(); + let validator = Staking::invulnerables()[0].clone(); + let operator: AccountId = Alice.into(); + let amount = 100_000; + let delegate_amount = amount / 2; + // Bond Some TNT + assert_ok!(Staking::bond( + RuntimeOrigin::signed(who.clone()), + amount, + pallet_staking::RewardDestination::Staked + )); + // Nominate the validator + assert_ok!(Staking::nominate(RuntimeOrigin::signed(who.clone()), vec![validator.clone()])); + + System::set_block_number(2); + Session::on_initialize(2); + Staking::on_initialize(2); + Session::on_finalize(2); + Staking::on_finalize(2); + + assert_ok!(MultiAssetDelegation::join_operators( + RuntimeOrigin::signed(operator.clone()), + 10_000 + )); + + // Restake + assert_ok!(MultiAssetDelegation::delegate_nomination( + RuntimeOrigin::signed(who.clone()), + operator.clone(), + delegate_amount, + Default::default(), + )); + + // Try to unbond from the staking pallet + assert_ok!(Staking::unbond(RuntimeOrigin::signed(who.clone()), amount)); + + // Assert + let ledger = Staking::ledger(sp_staking::StakingAccount::Stash(who.clone())).unwrap(); + assert_eq!(ledger.active, 0); + assert_eq!(ledger.total, amount); + assert_eq!(ledger.unlocking.len(), 1); + + todo!("This test should fail but it is passing"); + }); +}