diff --git a/substrate/runtime/src/lib.rs b/substrate/runtime/src/lib.rs index 790bfbb5..4daae391 100644 --- a/substrate/runtime/src/lib.rs +++ b/substrate/runtime/src/lib.rs @@ -248,7 +248,9 @@ impl coins::Config for Runtime { impl validator_sets::Config for Runtime { type RuntimeEvent = RuntimeEvent; } -impl staking::Config for Runtime {} +impl staking::Config for Runtime { + type RuntimeEvent = RuntimeEvent; +} pub struct IdentityValidatorIdOf; impl Convert> for IdentityValidatorIdOf { diff --git a/substrate/staking/pallet/src/lib.rs b/substrate/staking/pallet/src/lib.rs index ad6a4c41..80a6c885 100644 --- a/substrate/staking/pallet/src/lib.rs +++ b/substrate/staking/pallet/src/lib.rs @@ -24,12 +24,35 @@ pub mod pallet { NoDeallocation, } - // TODO: Event + #[pallet::event] + #[pallet::generate_deposit(pub(super) fn deposit_event)] + pub enum Event { + Staked { + validator: T::AccountId, + amount: Amount, + }, + Unstaked { + validator: T::AccountId, + amount: Amount, + }, + ImmediateDeallocation { + validator: T::AccountId, + network: NetworkId, + amount: Amount, + }, + DeallocationClaimed { + validator: T::AccountId, + network: NetworkId, + session: Session, + amount: Amount, + }, + } #[pallet::config] pub trait Config: frame_system::Config + CoinsConfig + VsConfig + SessionConfig { + type RuntimeEvent: IsType<::RuntimeEvent> + From>; } #[pallet::pallet] @@ -52,17 +75,19 @@ pub mod pallet { T::AccountId::decode(&mut TrailingZeroInput::new(b"staking")).unwrap() } - fn add_stake(account: &T::AccountId, amount: u64) { + fn add_stake(account: T::AccountId, amount: u64) { Staked::::mutate(account, |staked| *staked += amount); + Self::deposit_event(Event::Staked { validator: account, amount: Amount(amount) }); } - fn remove_stake(account: &T::AccountId, amount: u64) -> Result<(), Error> { + fn remove_stake(account: T::AccountId, amount: u64) -> Result<(), Error> { Staked::::mutate(account, |staked| { let available = *staked - Self::allocated(account); if available < amount { Err(Error::::StakeUnavilable)?; } *staked -= amount; + Self::deposit_event(Event::Unstaked { validator: account, amount: Amount(amount) }); Ok::<_, Error>(()) }) } @@ -98,7 +123,7 @@ pub mod pallet { let signer = ensure_signed(origin)?; let balance = Balance { coin: Coin::Serai, amount: Amount(amount) }; Coins::::transfer_internal(signer, Self::account(), balance)?; - Self::add_stake(&signer, amount); + Self::add_stake(signer, amount); Ok(()) } @@ -107,7 +132,7 @@ pub mod pallet { #[pallet::weight((0, DispatchClass::Operational))] // TODO pub fn unstake(origin: OriginFor, #[pallet::compact] amount: u64) -> DispatchResult { let signer = ensure_signed(origin)?; - Self::remove_stake(&signer, amount)?; + Self::remove_stake(signer, amount)?; let balance = Balance { coin: Coin::Serai, amount: Amount(amount) }; Coins::::transfer_internal(Self::account(), signer, balance)?; Ok(()) @@ -125,6 +150,7 @@ pub mod pallet { // add to amount allocated Self::allocate_internal(&account, amount)?; + // This does not emit an event as the validator-sets pallet will // increase allocation for participant in validator set VsPallet::::increase_allocation(network, account, Amount(amount))?; @@ -146,6 +172,11 @@ pub mod pallet { VsPallet::::decrease_allocation(network, account, Amount(amount))?; if can_immediately_deallocate { Self::deallocate_internal(&account, amount)?; + Self::deposit_event(Event::ImmediateDeallocation { + validator: account, + network, + amount: Amount(amount), + }); } Ok(()) @@ -163,6 +194,12 @@ pub mod pallet { Err(Error::::NoDeallocation)? }; Self::deallocate_internal(&account, amount.0)?; + Self::deposit_event(Event::DeallocationClaimed { + validator: account, + network, + session, + amount, + }); Ok(()) } }