Bridge: slash destination may be an explicit account (#4106)

Extracted to a separate PR as requested here:
https://github.com/paritytech/parity-bridges-common/pull/2873#discussion_r1562459573
This commit is contained in:
Svyatoslav Nikolsky
2024-04-15 09:37:04 +03:00
committed by GitHub
parent 2bc4ed1153
commit 6acf4787e1
6 changed files with 56 additions and 17 deletions
@@ -23,7 +23,7 @@ use crate::messages_call_ext::{
CallHelper as MessagesCallHelper, CallInfo as MessagesCallInfo, MessagesCallSubType, CallHelper as MessagesCallHelper, CallInfo as MessagesCallInfo, MessagesCallSubType,
}; };
use bp_messages::{LaneId, MessageNonce}; use bp_messages::{LaneId, MessageNonce};
use bp_relayers::{RewardsAccountOwner, RewardsAccountParams}; use bp_relayers::{ExplicitOrAccountParams, RewardsAccountOwner, RewardsAccountParams};
use bp_runtime::{Chain, Parachain, ParachainIdOf, RangeInclusiveExt, StaticStrProvider}; use bp_runtime::{Chain, Parachain, ParachainIdOf, RangeInclusiveExt, StaticStrProvider};
use codec::{Codec, Decode, Encode}; use codec::{Codec, Decode, Encode};
use frame_support::{ use frame_support::{
@@ -589,7 +589,10 @@ where
); );
}, },
RelayerAccountAction::Slash(relayer, slash_account) => RelayerAccountAction::Slash(relayer, slash_account) =>
RelayersPallet::<T::Runtime>::slash_and_deregister(&relayer, slash_account), RelayersPallet::<T::Runtime>::slash_and_deregister(
&relayer,
ExplicitOrAccountParams::Params(slash_account),
),
} }
Ok(()) Ok(())
+1 -1
View File
@@ -106,7 +106,7 @@ benchmarks! {
let slash_destination = RewardsAccountParams::new(lane, *b"test", RewardsAccountOwner::ThisChain); let slash_destination = RewardsAccountParams::new(lane, *b"test", RewardsAccountOwner::ThisChain);
T::prepare_rewards_account(slash_destination, Zero::zero()); T::prepare_rewards_account(slash_destination, Zero::zero());
}: { }: {
crate::Pallet::<T>::slash_and_deregister(&relayer, slash_destination) crate::Pallet::<T>::slash_and_deregister(&relayer, slash_destination.into())
} }
verify { verify {
assert!(!crate::Pallet::<T>::is_registration_active(&relayer)); assert!(!crate::Pallet::<T>::is_registration_active(&relayer));
+4 -3
View File
@@ -21,7 +21,8 @@
#![warn(missing_docs)] #![warn(missing_docs)]
use bp_relayers::{ use bp_relayers::{
PaymentProcedure, Registration, RelayerRewardsKeyProvider, RewardsAccountParams, StakeAndSlash, ExplicitOrAccountParams, PaymentProcedure, Registration, RelayerRewardsKeyProvider,
RewardsAccountParams, StakeAndSlash,
}; };
use bp_runtime::StorageDoubleMapKeyProvider; use bp_runtime::StorageDoubleMapKeyProvider;
use frame_support::fail; use frame_support::fail;
@@ -242,7 +243,7 @@ pub mod pallet {
/// It may fail inside, but error is swallowed and we only log it. /// It may fail inside, but error is swallowed and we only log it.
pub fn slash_and_deregister( pub fn slash_and_deregister(
relayer: &T::AccountId, relayer: &T::AccountId,
slash_destination: RewardsAccountParams, slash_destination: ExplicitOrAccountParams<T::AccountId>,
) { ) {
let registration = match RegisteredRelayers::<T>::take(relayer) { let registration = match RegisteredRelayers::<T>::take(relayer) {
Some(registration) => registration, Some(registration) => registration,
@@ -259,7 +260,7 @@ pub mod pallet {
match T::StakeAndSlash::repatriate_reserved( match T::StakeAndSlash::repatriate_reserved(
relayer, relayer,
slash_destination, slash_destination.clone(),
registration.stake, registration.stake,
) { ) {
Ok(failed_to_slash) if failed_to_slash.is_zero() => { Ok(failed_to_slash) if failed_to_slash.is_zero() => {
+28 -8
View File
@@ -17,7 +17,7 @@
//! Code that allows `NamedReservableCurrency` to be used as a `StakeAndSlash` //! Code that allows `NamedReservableCurrency` to be used as a `StakeAndSlash`
//! mechanism of the relayers pallet. //! mechanism of the relayers pallet.
use bp_relayers::{PayRewardFromAccount, RewardsAccountParams, StakeAndSlash}; use bp_relayers::{ExplicitOrAccountParams, PayRewardFromAccount, StakeAndSlash};
use codec::Codec; use codec::Codec;
use frame_support::traits::{tokens::BalanceStatus, NamedReservableCurrency}; use frame_support::traits::{tokens::BalanceStatus, NamedReservableCurrency};
use sp_runtime::{traits::Get, DispatchError, DispatchResult}; use sp_runtime::{traits::Get, DispatchError, DispatchResult};
@@ -55,11 +55,14 @@ where
fn repatriate_reserved( fn repatriate_reserved(
relayer: &AccountId, relayer: &AccountId,
beneficiary: RewardsAccountParams, beneficiary: ExplicitOrAccountParams<AccountId>,
amount: Currency::Balance, amount: Currency::Balance,
) -> Result<Currency::Balance, DispatchError> { ) -> Result<Currency::Balance, DispatchError> {
let beneficiary_account = let beneficiary_account = match beneficiary {
PayRewardFromAccount::<(), AccountId>::rewards_account(beneficiary); ExplicitOrAccountParams::Explicit(account) => account,
ExplicitOrAccountParams::Params(params) =>
PayRewardFromAccount::<(), AccountId>::rewards_account(params),
};
Currency::repatriate_reserved_named( Currency::repatriate_reserved_named(
&ReserveId::get(), &ReserveId::get(),
relayer, relayer,
@@ -134,7 +137,11 @@ mod tests {
Balances::mint_into(&beneficiary_account, expected_balance).unwrap(); Balances::mint_into(&beneficiary_account, expected_balance).unwrap();
assert_eq!( assert_eq!(
TestStakeAndSlash::repatriate_reserved(&1, beneficiary, test_stake()), TestStakeAndSlash::repatriate_reserved(
&1,
ExplicitOrAccountParams::Params(beneficiary),
test_stake()
),
Ok(test_stake()) Ok(test_stake())
); );
assert_eq!(Balances::free_balance(1), 0); assert_eq!(Balances::free_balance(1), 0);
@@ -146,7 +153,11 @@ mod tests {
Balances::mint_into(&2, test_stake() * 2).unwrap(); Balances::mint_into(&2, test_stake() * 2).unwrap();
TestStakeAndSlash::reserve(&2, test_stake() / 3).unwrap(); TestStakeAndSlash::reserve(&2, test_stake() / 3).unwrap();
assert_eq!( assert_eq!(
TestStakeAndSlash::repatriate_reserved(&2, beneficiary, test_stake()), TestStakeAndSlash::repatriate_reserved(
&2,
ExplicitOrAccountParams::Params(beneficiary),
test_stake()
),
Ok(test_stake() - test_stake() / 3) Ok(test_stake() - test_stake() / 3)
); );
assert_eq!(Balances::free_balance(2), test_stake() * 2 - test_stake() / 3); assert_eq!(Balances::free_balance(2), test_stake() * 2 - test_stake() / 3);
@@ -158,7 +169,11 @@ mod tests {
Balances::mint_into(&3, test_stake() * 2).unwrap(); Balances::mint_into(&3, test_stake() * 2).unwrap();
TestStakeAndSlash::reserve(&3, test_stake()).unwrap(); TestStakeAndSlash::reserve(&3, test_stake()).unwrap();
assert_eq!( assert_eq!(
TestStakeAndSlash::repatriate_reserved(&3, beneficiary, test_stake()), TestStakeAndSlash::repatriate_reserved(
&3,
ExplicitOrAccountParams::Params(beneficiary),
test_stake()
),
Ok(0) Ok(0)
); );
assert_eq!(Balances::free_balance(3), test_stake()); assert_eq!(Balances::free_balance(3), test_stake());
@@ -176,7 +191,12 @@ mod tests {
Balances::mint_into(&3, test_stake() * 2).unwrap(); Balances::mint_into(&3, test_stake() * 2).unwrap();
TestStakeAndSlash::reserve(&3, test_stake()).unwrap(); TestStakeAndSlash::reserve(&3, test_stake()).unwrap();
assert!(TestStakeAndSlash::repatriate_reserved(&3, beneficiary, test_stake()).is_err()); assert!(TestStakeAndSlash::repatriate_reserved(
&3,
ExplicitOrAccountParams::Params(beneficiary),
test_stake()
)
.is_err());
assert_eq!(Balances::free_balance(3), test_stake()); assert_eq!(Balances::free_balance(3), test_stake());
assert_eq!(Balances::reserved_balance(3), test_stake()); assert_eq!(Balances::reserved_balance(3), test_stake());
assert_eq!(Balances::free_balance(beneficiary_account), 0); assert_eq!(Balances::free_balance(beneficiary_account), 0);
+1 -1
View File
@@ -19,7 +19,7 @@
#![warn(missing_docs)] #![warn(missing_docs)]
#![cfg_attr(not(feature = "std"), no_std)] #![cfg_attr(not(feature = "std"), no_std)]
pub use registration::{Registration, StakeAndSlash}; pub use registration::{ExplicitOrAccountParams, Registration, StakeAndSlash};
use bp_messages::LaneId; use bp_messages::LaneId;
use bp_runtime::{ChainId, StorageDoubleMapKeyProvider}; use bp_runtime::{ChainId, StorageDoubleMapKeyProvider};
@@ -46,6 +46,21 @@ use sp_runtime::{
DispatchError, DispatchResult, DispatchError, DispatchResult,
}; };
/// Either explicit account reference or `RewardsAccountParams`.
#[derive(Clone, Debug)]
pub enum ExplicitOrAccountParams<AccountId> {
/// Explicit account reference.
Explicit(AccountId),
/// Account, referenced using `RewardsAccountParams`.
Params(RewardsAccountParams),
}
impl<AccountId> From<RewardsAccountParams> for ExplicitOrAccountParams<AccountId> {
fn from(params: RewardsAccountParams) -> Self {
ExplicitOrAccountParams::Params(params)
}
}
/// Relayer registration. /// Relayer registration.
#[derive(Copy, Clone, Debug, Decode, Encode, Eq, PartialEq, TypeInfo, MaxEncodedLen)] #[derive(Copy, Clone, Debug, Decode, Encode, Eq, PartialEq, TypeInfo, MaxEncodedLen)]
pub struct Registration<BlockNumber, Balance> { pub struct Registration<BlockNumber, Balance> {
@@ -90,7 +105,7 @@ pub trait StakeAndSlash<AccountId, BlockNumber, Balance> {
/// Returns `Ok(_)` with non-zero balance if we have failed to repatriate some portion of stake. /// Returns `Ok(_)` with non-zero balance if we have failed to repatriate some portion of stake.
fn repatriate_reserved( fn repatriate_reserved(
relayer: &AccountId, relayer: &AccountId,
beneficiary: RewardsAccountParams, beneficiary: ExplicitOrAccountParams<AccountId>,
amount: Balance, amount: Balance,
) -> Result<Balance, DispatchError>; ) -> Result<Balance, DispatchError>;
} }
@@ -113,7 +128,7 @@ where
fn repatriate_reserved( fn repatriate_reserved(
_relayer: &AccountId, _relayer: &AccountId,
_beneficiary: RewardsAccountParams, _beneficiary: ExplicitOrAccountParams<AccountId>,
_amount: Balance, _amount: Balance,
) -> Result<Balance, DispatchError> { ) -> Result<Balance, DispatchError> {
Ok(Zero::zero()) Ok(Zero::zero())