mirror of
https://github.com/pezkuwichain/pezkuwi-subxt.git
synced 2026-04-26 07:37:57 +00:00
Remove bridges subtree
This commit is contained in:
committed by
Bastian Köcher
parent
d38f6e6728
commit
9a3e2c8c5a
@@ -1,131 +0,0 @@
|
||||
// Copyright (C) Parity Technologies (UK) Ltd.
|
||||
// This file is part of Parity Bridges Common.
|
||||
|
||||
// Parity Bridges Common is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// (at your option) any later version.
|
||||
|
||||
// Parity Bridges Common is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with Parity Bridges Common. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
//! Benchmarks for the relayers Pallet.
|
||||
|
||||
#![cfg(feature = "runtime-benchmarks")]
|
||||
|
||||
use crate::*;
|
||||
|
||||
use bp_messages::LaneId;
|
||||
use bp_relayers::RewardsAccountOwner;
|
||||
use frame_benchmarking::{benchmarks, whitelisted_caller};
|
||||
use frame_system::RawOrigin;
|
||||
use sp_runtime::traits::One;
|
||||
|
||||
/// Reward amount that is (hopefully) is larger than existential deposit across all chains.
|
||||
const REWARD_AMOUNT: u32 = u32::MAX;
|
||||
|
||||
/// Pallet we're benchmarking here.
|
||||
pub struct Pallet<T: Config>(crate::Pallet<T>);
|
||||
|
||||
/// Trait that must be implemented by runtime.
|
||||
pub trait Config: crate::Config {
|
||||
/// Prepare environment for paying given reward for serving given lane.
|
||||
fn prepare_rewards_account(account_params: RewardsAccountParams, reward: Self::Reward);
|
||||
/// Give enough balance to given account.
|
||||
fn deposit_account(account: Self::AccountId, balance: Self::Reward);
|
||||
}
|
||||
|
||||
benchmarks! {
|
||||
// Benchmark `claim_rewards` call.
|
||||
claim_rewards {
|
||||
let lane = LaneId([0, 0, 0, 0]);
|
||||
let account_params =
|
||||
RewardsAccountParams::new(lane, *b"test", RewardsAccountOwner::ThisChain);
|
||||
let relayer: T::AccountId = whitelisted_caller();
|
||||
let reward = T::Reward::from(REWARD_AMOUNT);
|
||||
|
||||
T::prepare_rewards_account(account_params, reward);
|
||||
RelayerRewards::<T>::insert(&relayer, account_params, reward);
|
||||
}: _(RawOrigin::Signed(relayer), account_params)
|
||||
verify {
|
||||
// we can't check anything here, because `PaymentProcedure` is responsible for
|
||||
// payment logic, so we assume that if call has succeeded, the procedure has
|
||||
// also completed successfully
|
||||
}
|
||||
|
||||
// Benchmark `register` call.
|
||||
register {
|
||||
let relayer: T::AccountId = whitelisted_caller();
|
||||
let valid_till = frame_system::Pallet::<T>::block_number()
|
||||
.saturating_add(crate::Pallet::<T>::required_registration_lease())
|
||||
.saturating_add(One::one())
|
||||
.saturating_add(One::one());
|
||||
|
||||
T::deposit_account(relayer.clone(), crate::Pallet::<T>::required_stake());
|
||||
}: _(RawOrigin::Signed(relayer.clone()), valid_till)
|
||||
verify {
|
||||
assert!(crate::Pallet::<T>::is_registration_active(&relayer));
|
||||
}
|
||||
|
||||
// Benchmark `deregister` call.
|
||||
deregister {
|
||||
let relayer: T::AccountId = whitelisted_caller();
|
||||
let valid_till = frame_system::Pallet::<T>::block_number()
|
||||
.saturating_add(crate::Pallet::<T>::required_registration_lease())
|
||||
.saturating_add(One::one())
|
||||
.saturating_add(One::one());
|
||||
T::deposit_account(relayer.clone(), crate::Pallet::<T>::required_stake());
|
||||
crate::Pallet::<T>::register(RawOrigin::Signed(relayer.clone()).into(), valid_till).unwrap();
|
||||
|
||||
frame_system::Pallet::<T>::set_block_number(valid_till.saturating_add(One::one()));
|
||||
}: _(RawOrigin::Signed(relayer.clone()))
|
||||
verify {
|
||||
assert!(!crate::Pallet::<T>::is_registration_active(&relayer));
|
||||
}
|
||||
|
||||
// Benchmark `slash_and_deregister` method of the pallet. We are adding this weight to
|
||||
// the weight of message delivery call if `RefundBridgedParachainMessages` signed extension
|
||||
// is deployed at runtime level.
|
||||
slash_and_deregister {
|
||||
// prepare and register relayer account
|
||||
let relayer: T::AccountId = whitelisted_caller();
|
||||
let valid_till = frame_system::Pallet::<T>::block_number()
|
||||
.saturating_add(crate::Pallet::<T>::required_registration_lease())
|
||||
.saturating_add(One::one())
|
||||
.saturating_add(One::one());
|
||||
T::deposit_account(relayer.clone(), crate::Pallet::<T>::required_stake());
|
||||
crate::Pallet::<T>::register(RawOrigin::Signed(relayer.clone()).into(), valid_till).unwrap();
|
||||
|
||||
// create slash destination account
|
||||
let lane = LaneId([0, 0, 0, 0]);
|
||||
let slash_destination = RewardsAccountParams::new(lane, *b"test", RewardsAccountOwner::ThisChain);
|
||||
T::prepare_rewards_account(slash_destination, Zero::zero());
|
||||
}: {
|
||||
crate::Pallet::<T>::slash_and_deregister(&relayer, slash_destination)
|
||||
}
|
||||
verify {
|
||||
assert!(!crate::Pallet::<T>::is_registration_active(&relayer));
|
||||
}
|
||||
|
||||
// Benchmark `register_relayer_reward` method of the pallet. We are adding this weight to
|
||||
// the weight of message delivery call if `RefundBridgedParachainMessages` signed extension
|
||||
// is deployed at runtime level.
|
||||
register_relayer_reward {
|
||||
let lane = LaneId([0, 0, 0, 0]);
|
||||
let relayer: T::AccountId = whitelisted_caller();
|
||||
let account_params =
|
||||
RewardsAccountParams::new(lane, *b"test", RewardsAccountOwner::ThisChain);
|
||||
}: {
|
||||
crate::Pallet::<T>::register_relayer_reward(account_params, &relayer, One::one());
|
||||
}
|
||||
verify {
|
||||
assert_eq!(RelayerRewards::<T>::get(relayer, &account_params), Some(One::one()));
|
||||
}
|
||||
|
||||
impl_benchmark_test_suite!(Pallet, crate::mock::new_test_ext(), crate::mock::TestRuntime)
|
||||
}
|
||||
@@ -1,922 +0,0 @@
|
||||
// Copyright (C) Parity Technologies (UK) Ltd.
|
||||
// This file is part of Parity Bridges Common.
|
||||
|
||||
// Parity Bridges Common is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// (at your option) any later version.
|
||||
|
||||
// Parity Bridges Common is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with Parity Bridges Common. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
//! Runtime module that is used to store relayer rewards and (in the future) to
|
||||
//! coordinate relations between relayers.
|
||||
|
||||
#![cfg_attr(not(feature = "std"), no_std)]
|
||||
#![warn(missing_docs)]
|
||||
|
||||
use bp_relayers::{
|
||||
PaymentProcedure, Registration, RelayerRewardsKeyProvider, RewardsAccountParams, StakeAndSlash,
|
||||
};
|
||||
use bp_runtime::StorageDoubleMapKeyProvider;
|
||||
use frame_support::fail;
|
||||
use sp_arithmetic::traits::{AtLeast32BitUnsigned, Zero};
|
||||
use sp_runtime::{traits::CheckedSub, Saturating};
|
||||
use sp_std::marker::PhantomData;
|
||||
|
||||
pub use pallet::*;
|
||||
pub use payment_adapter::DeliveryConfirmationPaymentsAdapter;
|
||||
pub use stake_adapter::StakeAndSlashNamed;
|
||||
pub use weights::WeightInfo;
|
||||
pub use weights_ext::WeightInfoExt;
|
||||
|
||||
pub mod benchmarking;
|
||||
|
||||
mod mock;
|
||||
mod payment_adapter;
|
||||
mod stake_adapter;
|
||||
mod weights_ext;
|
||||
|
||||
pub mod weights;
|
||||
|
||||
/// The target that will be used when publishing logs related to this pallet.
|
||||
pub const LOG_TARGET: &str = "runtime::bridge-relayers";
|
||||
|
||||
#[frame_support::pallet]
|
||||
pub mod pallet {
|
||||
use super::*;
|
||||
use frame_support::pallet_prelude::*;
|
||||
use frame_system::pallet_prelude::*;
|
||||
|
||||
/// `RelayerRewardsKeyProvider` for given configuration.
|
||||
type RelayerRewardsKeyProviderOf<T> =
|
||||
RelayerRewardsKeyProvider<<T as frame_system::Config>::AccountId, <T as Config>::Reward>;
|
||||
|
||||
#[pallet::config]
|
||||
pub trait Config: frame_system::Config {
|
||||
/// The overarching event type.
|
||||
type RuntimeEvent: From<Event<Self>> + IsType<<Self as frame_system::Config>::RuntimeEvent>;
|
||||
/// Type of relayer reward.
|
||||
type Reward: AtLeast32BitUnsigned + Copy + Parameter + MaxEncodedLen;
|
||||
/// Pay rewards scheme.
|
||||
type PaymentProcedure: PaymentProcedure<Self::AccountId, Self::Reward>;
|
||||
/// Stake and slash scheme.
|
||||
type StakeAndSlash: StakeAndSlash<Self::AccountId, BlockNumberFor<Self>, Self::Reward>;
|
||||
/// Pallet call weights.
|
||||
type WeightInfo: WeightInfoExt;
|
||||
}
|
||||
|
||||
#[pallet::pallet]
|
||||
pub struct Pallet<T>(PhantomData<T>);
|
||||
|
||||
#[pallet::call]
|
||||
impl<T: Config> Pallet<T> {
|
||||
/// Claim accumulated rewards.
|
||||
#[pallet::call_index(0)]
|
||||
#[pallet::weight(T::WeightInfo::claim_rewards())]
|
||||
pub fn claim_rewards(
|
||||
origin: OriginFor<T>,
|
||||
rewards_account_params: RewardsAccountParams,
|
||||
) -> DispatchResult {
|
||||
let relayer = ensure_signed(origin)?;
|
||||
|
||||
RelayerRewards::<T>::try_mutate_exists(
|
||||
&relayer,
|
||||
rewards_account_params,
|
||||
|maybe_reward| -> DispatchResult {
|
||||
let reward = maybe_reward.take().ok_or(Error::<T>::NoRewardForRelayer)?;
|
||||
T::PaymentProcedure::pay_reward(&relayer, rewards_account_params, reward)
|
||||
.map_err(|e| {
|
||||
log::trace!(
|
||||
target: LOG_TARGET,
|
||||
"Failed to pay {:?} rewards to {:?}: {:?}",
|
||||
rewards_account_params,
|
||||
relayer,
|
||||
e,
|
||||
);
|
||||
Error::<T>::FailedToPayReward
|
||||
})?;
|
||||
|
||||
Self::deposit_event(Event::<T>::RewardPaid {
|
||||
relayer: relayer.clone(),
|
||||
rewards_account_params,
|
||||
reward,
|
||||
});
|
||||
Ok(())
|
||||
},
|
||||
)
|
||||
}
|
||||
|
||||
/// Register relayer or update its registration.
|
||||
///
|
||||
/// Registration allows relayer to get priority boost for its message delivery transactions.
|
||||
#[pallet::call_index(1)]
|
||||
#[pallet::weight(T::WeightInfo::register())]
|
||||
pub fn register(origin: OriginFor<T>, valid_till: BlockNumberFor<T>) -> DispatchResult {
|
||||
let relayer = ensure_signed(origin)?;
|
||||
|
||||
// valid till must be larger than the current block number and the lease must be larger
|
||||
// than the `RequiredRegistrationLease`
|
||||
let lease = valid_till.saturating_sub(frame_system::Pallet::<T>::block_number());
|
||||
ensure!(
|
||||
lease > Pallet::<T>::required_registration_lease(),
|
||||
Error::<T>::InvalidRegistrationLease
|
||||
);
|
||||
|
||||
RegisteredRelayers::<T>::try_mutate(&relayer, |maybe_registration| -> DispatchResult {
|
||||
let mut registration = maybe_registration
|
||||
.unwrap_or_else(|| Registration { valid_till, stake: Zero::zero() });
|
||||
|
||||
// new `valid_till` must be larger (or equal) than the old one
|
||||
ensure!(
|
||||
valid_till >= registration.valid_till,
|
||||
Error::<T>::CannotReduceRegistrationLease,
|
||||
);
|
||||
registration.valid_till = valid_till;
|
||||
|
||||
// regarding stake, there are three options:
|
||||
// - if relayer stake is larger than required stake, we may do unreserve
|
||||
// - if relayer stake equals to required stake, we do nothing
|
||||
// - if relayer stake is smaller than required stake, we do additional reserve
|
||||
let required_stake = Pallet::<T>::required_stake();
|
||||
if let Some(to_unreserve) = registration.stake.checked_sub(&required_stake) {
|
||||
Self::do_unreserve(&relayer, to_unreserve)?;
|
||||
} else if let Some(to_reserve) = required_stake.checked_sub(®istration.stake) {
|
||||
T::StakeAndSlash::reserve(&relayer, to_reserve).map_err(|e| {
|
||||
log::trace!(
|
||||
target: LOG_TARGET,
|
||||
"Failed to reserve {:?} on relayer {:?} account: {:?}",
|
||||
to_reserve,
|
||||
relayer,
|
||||
e,
|
||||
);
|
||||
|
||||
Error::<T>::FailedToReserve
|
||||
})?;
|
||||
}
|
||||
registration.stake = required_stake;
|
||||
|
||||
log::trace!(target: LOG_TARGET, "Successfully registered relayer: {:?}", relayer);
|
||||
Self::deposit_event(Event::<T>::RegistrationUpdated {
|
||||
relayer: relayer.clone(),
|
||||
registration,
|
||||
});
|
||||
|
||||
*maybe_registration = Some(registration);
|
||||
|
||||
Ok(())
|
||||
})
|
||||
}
|
||||
|
||||
/// `Deregister` relayer.
|
||||
///
|
||||
/// After this call, message delivery transactions of the relayer won't get any priority
|
||||
/// boost.
|
||||
#[pallet::call_index(2)]
|
||||
#[pallet::weight(T::WeightInfo::deregister())]
|
||||
pub fn deregister(origin: OriginFor<T>) -> DispatchResult {
|
||||
let relayer = ensure_signed(origin)?;
|
||||
|
||||
RegisteredRelayers::<T>::try_mutate(&relayer, |maybe_registration| -> DispatchResult {
|
||||
let registration = match maybe_registration.take() {
|
||||
Some(registration) => registration,
|
||||
None => fail!(Error::<T>::NotRegistered),
|
||||
};
|
||||
|
||||
// we can't deregister until `valid_till + 1`
|
||||
ensure!(
|
||||
registration.valid_till < frame_system::Pallet::<T>::block_number(),
|
||||
Error::<T>::RegistrationIsStillActive,
|
||||
);
|
||||
|
||||
// if stake is non-zero, we should do unreserve
|
||||
if !registration.stake.is_zero() {
|
||||
Self::do_unreserve(&relayer, registration.stake)?;
|
||||
}
|
||||
|
||||
log::trace!(target: LOG_TARGET, "Successfully deregistered relayer: {:?}", relayer);
|
||||
Self::deposit_event(Event::<T>::Deregistered { relayer: relayer.clone() });
|
||||
|
||||
*maybe_registration = None;
|
||||
|
||||
Ok(())
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
impl<T: Config> Pallet<T> {
|
||||
/// Returns true if given relayer registration is active at current block.
|
||||
///
|
||||
/// This call respects both `RequiredStake` and `RequiredRegistrationLease`, meaning that
|
||||
/// it'll return false if registered stake is lower than required or if remaining lease
|
||||
/// is less than `RequiredRegistrationLease`.
|
||||
pub fn is_registration_active(relayer: &T::AccountId) -> bool {
|
||||
let registration = match Self::registered_relayer(relayer) {
|
||||
Some(registration) => registration,
|
||||
None => return false,
|
||||
};
|
||||
|
||||
// registration is inactive if relayer stake is less than required
|
||||
if registration.stake < Self::required_stake() {
|
||||
return false
|
||||
}
|
||||
|
||||
// registration is inactive if it ends soon
|
||||
let remaining_lease = registration
|
||||
.valid_till
|
||||
.saturating_sub(frame_system::Pallet::<T>::block_number());
|
||||
if remaining_lease <= Self::required_registration_lease() {
|
||||
return false
|
||||
}
|
||||
|
||||
true
|
||||
}
|
||||
|
||||
/// Slash and `deregister` relayer. This function slashes all staked balance.
|
||||
///
|
||||
/// It may fail inside, but error is swallowed and we only log it.
|
||||
pub fn slash_and_deregister(
|
||||
relayer: &T::AccountId,
|
||||
slash_destination: RewardsAccountParams,
|
||||
) {
|
||||
let registration = match RegisteredRelayers::<T>::take(relayer) {
|
||||
Some(registration) => registration,
|
||||
None => {
|
||||
log::trace!(
|
||||
target: crate::LOG_TARGET,
|
||||
"Cannot slash unregistered relayer {:?}",
|
||||
relayer,
|
||||
);
|
||||
|
||||
return
|
||||
},
|
||||
};
|
||||
|
||||
match T::StakeAndSlash::repatriate_reserved(
|
||||
relayer,
|
||||
slash_destination,
|
||||
registration.stake,
|
||||
) {
|
||||
Ok(failed_to_slash) if failed_to_slash.is_zero() => {
|
||||
log::trace!(
|
||||
target: crate::LOG_TARGET,
|
||||
"Relayer account {:?} has been slashed for {:?}. Funds were deposited to {:?}",
|
||||
relayer,
|
||||
registration.stake,
|
||||
slash_destination,
|
||||
);
|
||||
},
|
||||
Ok(failed_to_slash) => {
|
||||
log::trace!(
|
||||
target: crate::LOG_TARGET,
|
||||
"Relayer account {:?} has been partially slashed for {:?}. Funds were deposited to {:?}. \
|
||||
Failed to slash: {:?}",
|
||||
relayer,
|
||||
registration.stake,
|
||||
slash_destination,
|
||||
failed_to_slash,
|
||||
);
|
||||
},
|
||||
Err(e) => {
|
||||
// TODO: document this. Where?
|
||||
|
||||
// it may fail if there's no beneficiary account. For us it means that this
|
||||
// account must exists before we'll deploy the bridge
|
||||
log::debug!(
|
||||
target: crate::LOG_TARGET,
|
||||
"Failed to slash relayer account {:?}: {:?}. Maybe beneficiary account doesn't exist? \
|
||||
Beneficiary: {:?}, amount: {:?}, failed to slash: {:?}",
|
||||
relayer,
|
||||
e,
|
||||
slash_destination,
|
||||
registration.stake,
|
||||
registration.stake,
|
||||
);
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
/// Register reward for given relayer.
|
||||
pub fn register_relayer_reward(
|
||||
rewards_account_params: RewardsAccountParams,
|
||||
relayer: &T::AccountId,
|
||||
reward: T::Reward,
|
||||
) {
|
||||
if reward.is_zero() {
|
||||
return
|
||||
}
|
||||
|
||||
RelayerRewards::<T>::mutate(
|
||||
relayer,
|
||||
rewards_account_params,
|
||||
|old_reward: &mut Option<T::Reward>| {
|
||||
let new_reward = old_reward.unwrap_or_else(Zero::zero).saturating_add(reward);
|
||||
*old_reward = Some(new_reward);
|
||||
|
||||
log::trace!(
|
||||
target: crate::LOG_TARGET,
|
||||
"Relayer {:?} can now claim reward for serving payer {:?}: {:?}",
|
||||
relayer,
|
||||
rewards_account_params,
|
||||
new_reward,
|
||||
);
|
||||
|
||||
Self::deposit_event(Event::<T>::RewardRegistered {
|
||||
relayer: relayer.clone(),
|
||||
rewards_account_params,
|
||||
reward,
|
||||
});
|
||||
},
|
||||
);
|
||||
}
|
||||
|
||||
/// Return required registration lease.
|
||||
pub(crate) fn required_registration_lease() -> BlockNumberFor<T> {
|
||||
<T::StakeAndSlash as StakeAndSlash<
|
||||
T::AccountId,
|
||||
BlockNumberFor<T>,
|
||||
T::Reward,
|
||||
>>::RequiredRegistrationLease::get()
|
||||
}
|
||||
|
||||
/// Return required stake.
|
||||
pub(crate) fn required_stake() -> T::Reward {
|
||||
<T::StakeAndSlash as StakeAndSlash<
|
||||
T::AccountId,
|
||||
BlockNumberFor<T>,
|
||||
T::Reward,
|
||||
>>::RequiredStake::get()
|
||||
}
|
||||
|
||||
/// `Unreserve` given amount on relayer account.
|
||||
fn do_unreserve(relayer: &T::AccountId, amount: T::Reward) -> DispatchResult {
|
||||
let failed_to_unreserve = T::StakeAndSlash::unreserve(relayer, amount);
|
||||
if !failed_to_unreserve.is_zero() {
|
||||
log::trace!(
|
||||
target: LOG_TARGET,
|
||||
"Failed to unreserve {:?}/{:?} on relayer {:?} account",
|
||||
failed_to_unreserve,
|
||||
amount,
|
||||
relayer,
|
||||
);
|
||||
|
||||
fail!(Error::<T>::FailedToUnreserve)
|
||||
}
|
||||
|
||||
Ok(())
|
||||
}
|
||||
}
|
||||
|
||||
#[pallet::event]
|
||||
#[pallet::generate_deposit(pub(super) fn deposit_event)]
|
||||
pub enum Event<T: Config> {
|
||||
/// Relayer reward has been registered and may be claimed later.
|
||||
RewardRegistered {
|
||||
/// Relayer account that can claim reward.
|
||||
relayer: T::AccountId,
|
||||
/// Relayer can claim reward from this account.
|
||||
rewards_account_params: RewardsAccountParams,
|
||||
/// Reward amount.
|
||||
reward: T::Reward,
|
||||
},
|
||||
/// Reward has been paid to the relayer.
|
||||
RewardPaid {
|
||||
/// Relayer account that has been rewarded.
|
||||
relayer: T::AccountId,
|
||||
/// Relayer has received reward from this account.
|
||||
rewards_account_params: RewardsAccountParams,
|
||||
/// Reward amount.
|
||||
reward: T::Reward,
|
||||
},
|
||||
/// Relayer registration has been added or updated.
|
||||
RegistrationUpdated {
|
||||
/// Relayer account that has been registered.
|
||||
relayer: T::AccountId,
|
||||
/// Relayer registration.
|
||||
registration: Registration<BlockNumberFor<T>, T::Reward>,
|
||||
},
|
||||
/// Relayer has been `deregistered`.
|
||||
Deregistered {
|
||||
/// Relayer account that has been `deregistered`.
|
||||
relayer: T::AccountId,
|
||||
},
|
||||
/// Relayer has been slashed and `deregistered`.
|
||||
SlashedAndDeregistered {
|
||||
/// Relayer account that has been `deregistered`.
|
||||
relayer: T::AccountId,
|
||||
/// Registration that was removed.
|
||||
registration: Registration<BlockNumberFor<T>, T::Reward>,
|
||||
},
|
||||
}
|
||||
|
||||
#[pallet::error]
|
||||
pub enum Error<T> {
|
||||
/// No reward can be claimed by given relayer.
|
||||
NoRewardForRelayer,
|
||||
/// Reward payment procedure has failed.
|
||||
FailedToPayReward,
|
||||
/// The relayer has tried to register for past block or registration lease
|
||||
/// is too short.
|
||||
InvalidRegistrationLease,
|
||||
/// New registration lease is less than the previous one.
|
||||
CannotReduceRegistrationLease,
|
||||
/// Failed to reserve enough funds on relayer account.
|
||||
FailedToReserve,
|
||||
/// Failed to `unreserve` enough funds on relayer account.
|
||||
FailedToUnreserve,
|
||||
/// Cannot `deregister` if not registered.
|
||||
NotRegistered,
|
||||
/// Failed to `deregister` relayer, because lease is still active.
|
||||
RegistrationIsStillActive,
|
||||
}
|
||||
|
||||
/// Map of the relayer => accumulated reward.
|
||||
#[pallet::storage]
|
||||
#[pallet::getter(fn relayer_reward)]
|
||||
pub type RelayerRewards<T: Config> = StorageDoubleMap<
|
||||
_,
|
||||
<RelayerRewardsKeyProviderOf<T> as StorageDoubleMapKeyProvider>::Hasher1,
|
||||
<RelayerRewardsKeyProviderOf<T> as StorageDoubleMapKeyProvider>::Key1,
|
||||
<RelayerRewardsKeyProviderOf<T> as StorageDoubleMapKeyProvider>::Hasher2,
|
||||
<RelayerRewardsKeyProviderOf<T> as StorageDoubleMapKeyProvider>::Key2,
|
||||
<RelayerRewardsKeyProviderOf<T> as StorageDoubleMapKeyProvider>::Value,
|
||||
OptionQuery,
|
||||
>;
|
||||
|
||||
/// Relayers that have reserved some of their balance to get free priority boost
|
||||
/// for their message delivery transactions.
|
||||
///
|
||||
/// Other relayers may submit transactions as well, but they will have default
|
||||
/// priority and will be rejected (without significant tip) in case if registered
|
||||
/// relayer is present.
|
||||
#[pallet::storage]
|
||||
#[pallet::getter(fn registered_relayer)]
|
||||
pub type RegisteredRelayers<T: Config> = StorageMap<
|
||||
_,
|
||||
Blake2_128Concat,
|
||||
T::AccountId,
|
||||
Registration<BlockNumberFor<T>, T::Reward>,
|
||||
OptionQuery,
|
||||
>;
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
use mock::{RuntimeEvent as TestEvent, *};
|
||||
|
||||
use crate::Event::{RewardPaid, RewardRegistered};
|
||||
use bp_messages::LaneId;
|
||||
use bp_relayers::RewardsAccountOwner;
|
||||
use frame_support::{
|
||||
assert_noop, assert_ok,
|
||||
traits::fungible::{Inspect, Mutate},
|
||||
};
|
||||
use frame_system::{EventRecord, Pallet as System, Phase};
|
||||
use sp_runtime::DispatchError;
|
||||
|
||||
fn get_ready_for_events() {
|
||||
System::<TestRuntime>::set_block_number(1);
|
||||
System::<TestRuntime>::reset_events();
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn register_relayer_reward_emit_event() {
|
||||
run_test(|| {
|
||||
get_ready_for_events();
|
||||
|
||||
Pallet::<TestRuntime>::register_relayer_reward(
|
||||
TEST_REWARDS_ACCOUNT_PARAMS,
|
||||
®ULAR_RELAYER,
|
||||
100,
|
||||
);
|
||||
|
||||
// Check if the `RewardRegistered` event was emitted.
|
||||
assert_eq!(
|
||||
System::<TestRuntime>::events().last(),
|
||||
Some(&EventRecord {
|
||||
phase: Phase::Initialization,
|
||||
event: TestEvent::Relayers(RewardRegistered {
|
||||
relayer: REGULAR_RELAYER,
|
||||
rewards_account_params: TEST_REWARDS_ACCOUNT_PARAMS,
|
||||
reward: 100
|
||||
}),
|
||||
topics: vec![],
|
||||
}),
|
||||
);
|
||||
});
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn root_cant_claim_anything() {
|
||||
run_test(|| {
|
||||
assert_noop!(
|
||||
Pallet::<TestRuntime>::claim_rewards(
|
||||
RuntimeOrigin::root(),
|
||||
TEST_REWARDS_ACCOUNT_PARAMS
|
||||
),
|
||||
DispatchError::BadOrigin,
|
||||
);
|
||||
});
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn relayer_cant_claim_if_no_reward_exists() {
|
||||
run_test(|| {
|
||||
assert_noop!(
|
||||
Pallet::<TestRuntime>::claim_rewards(
|
||||
RuntimeOrigin::signed(REGULAR_RELAYER),
|
||||
TEST_REWARDS_ACCOUNT_PARAMS
|
||||
),
|
||||
Error::<TestRuntime>::NoRewardForRelayer,
|
||||
);
|
||||
});
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn relayer_cant_claim_if_payment_procedure_fails() {
|
||||
run_test(|| {
|
||||
RelayerRewards::<TestRuntime>::insert(
|
||||
FAILING_RELAYER,
|
||||
TEST_REWARDS_ACCOUNT_PARAMS,
|
||||
100,
|
||||
);
|
||||
assert_noop!(
|
||||
Pallet::<TestRuntime>::claim_rewards(
|
||||
RuntimeOrigin::signed(FAILING_RELAYER),
|
||||
TEST_REWARDS_ACCOUNT_PARAMS
|
||||
),
|
||||
Error::<TestRuntime>::FailedToPayReward,
|
||||
);
|
||||
});
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn relayer_can_claim_reward() {
|
||||
run_test(|| {
|
||||
get_ready_for_events();
|
||||
|
||||
RelayerRewards::<TestRuntime>::insert(
|
||||
REGULAR_RELAYER,
|
||||
TEST_REWARDS_ACCOUNT_PARAMS,
|
||||
100,
|
||||
);
|
||||
assert_ok!(Pallet::<TestRuntime>::claim_rewards(
|
||||
RuntimeOrigin::signed(REGULAR_RELAYER),
|
||||
TEST_REWARDS_ACCOUNT_PARAMS
|
||||
));
|
||||
assert_eq!(
|
||||
RelayerRewards::<TestRuntime>::get(REGULAR_RELAYER, TEST_REWARDS_ACCOUNT_PARAMS),
|
||||
None
|
||||
);
|
||||
|
||||
// Check if the `RewardPaid` event was emitted.
|
||||
assert_eq!(
|
||||
System::<TestRuntime>::events().last(),
|
||||
Some(&EventRecord {
|
||||
phase: Phase::Initialization,
|
||||
event: TestEvent::Relayers(RewardPaid {
|
||||
relayer: REGULAR_RELAYER,
|
||||
rewards_account_params: TEST_REWARDS_ACCOUNT_PARAMS,
|
||||
reward: 100
|
||||
}),
|
||||
topics: vec![],
|
||||
}),
|
||||
);
|
||||
});
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn pay_reward_from_account_actually_pays_reward() {
|
||||
type Balances = pallet_balances::Pallet<TestRuntime>;
|
||||
type PayLaneRewardFromAccount = bp_relayers::PayRewardFromAccount<Balances, AccountId>;
|
||||
|
||||
run_test(|| {
|
||||
let in_lane_0 = RewardsAccountParams::new(
|
||||
LaneId([0, 0, 0, 0]),
|
||||
*b"test",
|
||||
RewardsAccountOwner::ThisChain,
|
||||
);
|
||||
let out_lane_1 = RewardsAccountParams::new(
|
||||
LaneId([0, 0, 0, 1]),
|
||||
*b"test",
|
||||
RewardsAccountOwner::BridgedChain,
|
||||
);
|
||||
|
||||
let in_lane0_rewards_account = PayLaneRewardFromAccount::rewards_account(in_lane_0);
|
||||
let out_lane1_rewards_account = PayLaneRewardFromAccount::rewards_account(out_lane_1);
|
||||
|
||||
Balances::mint_into(&in_lane0_rewards_account, 100).unwrap();
|
||||
Balances::mint_into(&out_lane1_rewards_account, 100).unwrap();
|
||||
assert_eq!(Balances::balance(&in_lane0_rewards_account), 100);
|
||||
assert_eq!(Balances::balance(&out_lane1_rewards_account), 100);
|
||||
assert_eq!(Balances::balance(&1), 0);
|
||||
|
||||
PayLaneRewardFromAccount::pay_reward(&1, in_lane_0, 100).unwrap();
|
||||
assert_eq!(Balances::balance(&in_lane0_rewards_account), 0);
|
||||
assert_eq!(Balances::balance(&out_lane1_rewards_account), 100);
|
||||
assert_eq!(Balances::balance(&1), 100);
|
||||
|
||||
PayLaneRewardFromAccount::pay_reward(&1, out_lane_1, 100).unwrap();
|
||||
assert_eq!(Balances::balance(&in_lane0_rewards_account), 0);
|
||||
assert_eq!(Balances::balance(&out_lane1_rewards_account), 0);
|
||||
assert_eq!(Balances::balance(&1), 200);
|
||||
});
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn register_fails_if_valid_till_is_a_past_block() {
|
||||
run_test(|| {
|
||||
System::<TestRuntime>::set_block_number(100);
|
||||
|
||||
assert_noop!(
|
||||
Pallet::<TestRuntime>::register(RuntimeOrigin::signed(REGISTER_RELAYER), 50),
|
||||
Error::<TestRuntime>::InvalidRegistrationLease,
|
||||
);
|
||||
});
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn register_fails_if_valid_till_lease_is_less_than_required() {
|
||||
run_test(|| {
|
||||
System::<TestRuntime>::set_block_number(100);
|
||||
|
||||
assert_noop!(
|
||||
Pallet::<TestRuntime>::register(
|
||||
RuntimeOrigin::signed(REGISTER_RELAYER),
|
||||
99 + Lease::get()
|
||||
),
|
||||
Error::<TestRuntime>::InvalidRegistrationLease,
|
||||
);
|
||||
});
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn register_works() {
|
||||
run_test(|| {
|
||||
get_ready_for_events();
|
||||
|
||||
assert_ok!(Pallet::<TestRuntime>::register(
|
||||
RuntimeOrigin::signed(REGISTER_RELAYER),
|
||||
150
|
||||
));
|
||||
assert_eq!(Balances::reserved_balance(REGISTER_RELAYER), Stake::get());
|
||||
assert_eq!(
|
||||
Pallet::<TestRuntime>::registered_relayer(REGISTER_RELAYER),
|
||||
Some(Registration { valid_till: 150, stake: Stake::get() }),
|
||||
);
|
||||
|
||||
assert_eq!(
|
||||
System::<TestRuntime>::events().last(),
|
||||
Some(&EventRecord {
|
||||
phase: Phase::Initialization,
|
||||
event: TestEvent::Relayers(Event::RegistrationUpdated {
|
||||
relayer: REGISTER_RELAYER,
|
||||
registration: Registration { valid_till: 150, stake: Stake::get() },
|
||||
}),
|
||||
topics: vec![],
|
||||
}),
|
||||
);
|
||||
});
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn register_fails_if_new_valid_till_is_lesser_than_previous() {
|
||||
run_test(|| {
|
||||
assert_ok!(Pallet::<TestRuntime>::register(
|
||||
RuntimeOrigin::signed(REGISTER_RELAYER),
|
||||
150
|
||||
));
|
||||
|
||||
assert_noop!(
|
||||
Pallet::<TestRuntime>::register(RuntimeOrigin::signed(REGISTER_RELAYER), 125),
|
||||
Error::<TestRuntime>::CannotReduceRegistrationLease,
|
||||
);
|
||||
});
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn register_fails_if_it_cant_unreserve_some_balance_if_required_stake_decreases() {
|
||||
run_test(|| {
|
||||
RegisteredRelayers::<TestRuntime>::insert(
|
||||
REGISTER_RELAYER,
|
||||
Registration { valid_till: 150, stake: Stake::get() + 1 },
|
||||
);
|
||||
|
||||
assert_noop!(
|
||||
Pallet::<TestRuntime>::register(RuntimeOrigin::signed(REGISTER_RELAYER), 150),
|
||||
Error::<TestRuntime>::FailedToUnreserve,
|
||||
);
|
||||
});
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn register_unreserves_some_balance_if_required_stake_decreases() {
|
||||
run_test(|| {
|
||||
get_ready_for_events();
|
||||
|
||||
RegisteredRelayers::<TestRuntime>::insert(
|
||||
REGISTER_RELAYER,
|
||||
Registration { valid_till: 150, stake: Stake::get() + 1 },
|
||||
);
|
||||
TestStakeAndSlash::reserve(®ISTER_RELAYER, Stake::get() + 1).unwrap();
|
||||
assert_eq!(Balances::reserved_balance(REGISTER_RELAYER), Stake::get() + 1);
|
||||
let free_balance = Balances::free_balance(REGISTER_RELAYER);
|
||||
|
||||
assert_ok!(Pallet::<TestRuntime>::register(
|
||||
RuntimeOrigin::signed(REGISTER_RELAYER),
|
||||
150
|
||||
));
|
||||
assert_eq!(Balances::reserved_balance(REGISTER_RELAYER), Stake::get());
|
||||
assert_eq!(Balances::free_balance(REGISTER_RELAYER), free_balance + 1);
|
||||
assert_eq!(
|
||||
Pallet::<TestRuntime>::registered_relayer(REGISTER_RELAYER),
|
||||
Some(Registration { valid_till: 150, stake: Stake::get() }),
|
||||
);
|
||||
|
||||
assert_eq!(
|
||||
System::<TestRuntime>::events().last(),
|
||||
Some(&EventRecord {
|
||||
phase: Phase::Initialization,
|
||||
event: TestEvent::Relayers(Event::RegistrationUpdated {
|
||||
relayer: REGISTER_RELAYER,
|
||||
registration: Registration { valid_till: 150, stake: Stake::get() }
|
||||
}),
|
||||
topics: vec![],
|
||||
}),
|
||||
);
|
||||
});
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn register_fails_if_it_cant_reserve_some_balance() {
|
||||
run_test(|| {
|
||||
Balances::set_balance(®ISTER_RELAYER, 0);
|
||||
assert_noop!(
|
||||
Pallet::<TestRuntime>::register(RuntimeOrigin::signed(REGISTER_RELAYER), 150),
|
||||
Error::<TestRuntime>::FailedToReserve,
|
||||
);
|
||||
});
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn register_fails_if_it_cant_reserve_some_balance_if_required_stake_increases() {
|
||||
run_test(|| {
|
||||
RegisteredRelayers::<TestRuntime>::insert(
|
||||
REGISTER_RELAYER,
|
||||
Registration { valid_till: 150, stake: Stake::get() - 1 },
|
||||
);
|
||||
Balances::set_balance(®ISTER_RELAYER, 0);
|
||||
|
||||
assert_noop!(
|
||||
Pallet::<TestRuntime>::register(RuntimeOrigin::signed(REGISTER_RELAYER), 150),
|
||||
Error::<TestRuntime>::FailedToReserve,
|
||||
);
|
||||
});
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn register_reserves_some_balance_if_required_stake_increases() {
|
||||
run_test(|| {
|
||||
get_ready_for_events();
|
||||
|
||||
RegisteredRelayers::<TestRuntime>::insert(
|
||||
REGISTER_RELAYER,
|
||||
Registration { valid_till: 150, stake: Stake::get() - 1 },
|
||||
);
|
||||
TestStakeAndSlash::reserve(®ISTER_RELAYER, Stake::get() - 1).unwrap();
|
||||
|
||||
let free_balance = Balances::free_balance(REGISTER_RELAYER);
|
||||
assert_ok!(Pallet::<TestRuntime>::register(
|
||||
RuntimeOrigin::signed(REGISTER_RELAYER),
|
||||
150
|
||||
));
|
||||
assert_eq!(Balances::reserved_balance(REGISTER_RELAYER), Stake::get());
|
||||
assert_eq!(Balances::free_balance(REGISTER_RELAYER), free_balance - 1);
|
||||
assert_eq!(
|
||||
Pallet::<TestRuntime>::registered_relayer(REGISTER_RELAYER),
|
||||
Some(Registration { valid_till: 150, stake: Stake::get() }),
|
||||
);
|
||||
|
||||
assert_eq!(
|
||||
System::<TestRuntime>::events().last(),
|
||||
Some(&EventRecord {
|
||||
phase: Phase::Initialization,
|
||||
event: TestEvent::Relayers(Event::RegistrationUpdated {
|
||||
relayer: REGISTER_RELAYER,
|
||||
registration: Registration { valid_till: 150, stake: Stake::get() }
|
||||
}),
|
||||
topics: vec![],
|
||||
}),
|
||||
);
|
||||
});
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn deregister_fails_if_not_registered() {
|
||||
run_test(|| {
|
||||
assert_noop!(
|
||||
Pallet::<TestRuntime>::deregister(RuntimeOrigin::signed(REGISTER_RELAYER)),
|
||||
Error::<TestRuntime>::NotRegistered,
|
||||
);
|
||||
});
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn deregister_fails_if_registration_is_still_active() {
|
||||
run_test(|| {
|
||||
assert_ok!(Pallet::<TestRuntime>::register(
|
||||
RuntimeOrigin::signed(REGISTER_RELAYER),
|
||||
150
|
||||
));
|
||||
|
||||
System::<TestRuntime>::set_block_number(100);
|
||||
|
||||
assert_noop!(
|
||||
Pallet::<TestRuntime>::deregister(RuntimeOrigin::signed(REGISTER_RELAYER)),
|
||||
Error::<TestRuntime>::RegistrationIsStillActive,
|
||||
);
|
||||
});
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn deregister_works() {
|
||||
run_test(|| {
|
||||
get_ready_for_events();
|
||||
|
||||
assert_ok!(Pallet::<TestRuntime>::register(
|
||||
RuntimeOrigin::signed(REGISTER_RELAYER),
|
||||
150
|
||||
));
|
||||
|
||||
System::<TestRuntime>::set_block_number(151);
|
||||
|
||||
let reserved_balance = Balances::reserved_balance(REGISTER_RELAYER);
|
||||
let free_balance = Balances::free_balance(REGISTER_RELAYER);
|
||||
assert_ok!(Pallet::<TestRuntime>::deregister(RuntimeOrigin::signed(REGISTER_RELAYER)));
|
||||
assert_eq!(
|
||||
Balances::reserved_balance(REGISTER_RELAYER),
|
||||
reserved_balance - Stake::get()
|
||||
);
|
||||
assert_eq!(Balances::free_balance(REGISTER_RELAYER), free_balance + Stake::get());
|
||||
|
||||
assert_eq!(
|
||||
System::<TestRuntime>::events().last(),
|
||||
Some(&EventRecord {
|
||||
phase: Phase::Initialization,
|
||||
event: TestEvent::Relayers(Event::Deregistered { relayer: REGISTER_RELAYER }),
|
||||
topics: vec![],
|
||||
}),
|
||||
);
|
||||
});
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn is_registration_active_is_false_for_unregistered_relayer() {
|
||||
run_test(|| {
|
||||
assert!(!Pallet::<TestRuntime>::is_registration_active(®ISTER_RELAYER));
|
||||
});
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn is_registration_active_is_false_when_stake_is_too_low() {
|
||||
run_test(|| {
|
||||
RegisteredRelayers::<TestRuntime>::insert(
|
||||
REGISTER_RELAYER,
|
||||
Registration { valid_till: 150, stake: Stake::get() - 1 },
|
||||
);
|
||||
assert!(!Pallet::<TestRuntime>::is_registration_active(®ISTER_RELAYER));
|
||||
});
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn is_registration_active_is_false_when_remaining_lease_is_too_low() {
|
||||
run_test(|| {
|
||||
System::<TestRuntime>::set_block_number(150 - Lease::get());
|
||||
|
||||
RegisteredRelayers::<TestRuntime>::insert(
|
||||
REGISTER_RELAYER,
|
||||
Registration { valid_till: 150, stake: Stake::get() },
|
||||
);
|
||||
assert!(!Pallet::<TestRuntime>::is_registration_active(®ISTER_RELAYER));
|
||||
});
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn is_registration_active_is_true_when_relayer_is_properly_registeered() {
|
||||
run_test(|| {
|
||||
System::<TestRuntime>::set_block_number(150 - Lease::get());
|
||||
|
||||
RegisteredRelayers::<TestRuntime>::insert(
|
||||
REGISTER_RELAYER,
|
||||
Registration { valid_till: 151, stake: Stake::get() },
|
||||
);
|
||||
assert!(Pallet::<TestRuntime>::is_registration_active(®ISTER_RELAYER));
|
||||
});
|
||||
}
|
||||
}
|
||||
@@ -1,149 +0,0 @@
|
||||
// Copyright (C) Parity Technologies (UK) Ltd.
|
||||
// This file is part of Parity Bridges Common.
|
||||
|
||||
// Parity Bridges Common is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// (at your option) any later version.
|
||||
|
||||
// Parity Bridges Common is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with Parity Bridges Common. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
#![cfg(test)]
|
||||
|
||||
use crate as pallet_bridge_relayers;
|
||||
|
||||
use bp_messages::LaneId;
|
||||
use bp_relayers::{
|
||||
PayRewardFromAccount, PaymentProcedure, RewardsAccountOwner, RewardsAccountParams,
|
||||
};
|
||||
use frame_support::{
|
||||
derive_impl, parameter_types, traits::fungible::Mutate, weights::RuntimeDbWeight,
|
||||
};
|
||||
use sp_runtime::BuildStorage;
|
||||
|
||||
pub type AccountId = u64;
|
||||
pub type Balance = u64;
|
||||
pub type BlockNumber = u64;
|
||||
|
||||
pub type TestStakeAndSlash = pallet_bridge_relayers::StakeAndSlashNamed<
|
||||
AccountId,
|
||||
BlockNumber,
|
||||
Balances,
|
||||
ReserveId,
|
||||
Stake,
|
||||
Lease,
|
||||
>;
|
||||
|
||||
type Block = frame_system::mocking::MockBlock<TestRuntime>;
|
||||
|
||||
frame_support::construct_runtime! {
|
||||
pub enum TestRuntime
|
||||
{
|
||||
System: frame_system::{Pallet, Call, Config<T>, Storage, Event<T>},
|
||||
Balances: pallet_balances::{Pallet, Event<T>},
|
||||
Relayers: pallet_bridge_relayers::{Pallet, Call, Event<T>},
|
||||
}
|
||||
}
|
||||
|
||||
parameter_types! {
|
||||
pub const DbWeight: RuntimeDbWeight = RuntimeDbWeight { read: 1, write: 2 };
|
||||
pub const ExistentialDeposit: Balance = 1;
|
||||
pub const ReserveId: [u8; 8] = *b"brdgrlrs";
|
||||
pub const Stake: Balance = 1_000;
|
||||
pub const Lease: BlockNumber = 8;
|
||||
}
|
||||
|
||||
#[derive_impl(frame_system::config_preludes::TestDefaultConfig)]
|
||||
impl frame_system::Config for TestRuntime {
|
||||
type Block = Block;
|
||||
type AccountData = pallet_balances::AccountData<Balance>;
|
||||
type DbWeight = DbWeight;
|
||||
}
|
||||
|
||||
#[derive_impl(pallet_balances::config_preludes::TestDefaultConfig)]
|
||||
impl pallet_balances::Config for TestRuntime {
|
||||
type ReserveIdentifier = [u8; 8];
|
||||
type AccountStore = System;
|
||||
}
|
||||
|
||||
impl pallet_bridge_relayers::Config for TestRuntime {
|
||||
type RuntimeEvent = RuntimeEvent;
|
||||
type Reward = Balance;
|
||||
type PaymentProcedure = TestPaymentProcedure;
|
||||
type StakeAndSlash = TestStakeAndSlash;
|
||||
type WeightInfo = ();
|
||||
}
|
||||
|
||||
#[cfg(feature = "runtime-benchmarks")]
|
||||
impl pallet_bridge_relayers::benchmarking::Config for TestRuntime {
|
||||
fn prepare_rewards_account(account_params: RewardsAccountParams, reward: Balance) {
|
||||
let rewards_account =
|
||||
bp_relayers::PayRewardFromAccount::<Balances, AccountId>::rewards_account(
|
||||
account_params,
|
||||
);
|
||||
Self::deposit_account(rewards_account, reward);
|
||||
}
|
||||
|
||||
fn deposit_account(account: Self::AccountId, balance: Self::Reward) {
|
||||
Balances::mint_into(&account, balance.saturating_add(ExistentialDeposit::get())).unwrap();
|
||||
}
|
||||
}
|
||||
|
||||
/// Message lane that we're using in tests.
|
||||
pub const TEST_REWARDS_ACCOUNT_PARAMS: RewardsAccountParams =
|
||||
RewardsAccountParams::new(LaneId([0, 0, 0, 0]), *b"test", RewardsAccountOwner::ThisChain);
|
||||
|
||||
/// Regular relayer that may receive rewards.
|
||||
pub const REGULAR_RELAYER: AccountId = 1;
|
||||
|
||||
/// Relayer that can't receive rewards.
|
||||
pub const FAILING_RELAYER: AccountId = 2;
|
||||
|
||||
/// Relayer that is able to register.
|
||||
pub const REGISTER_RELAYER: AccountId = 42;
|
||||
|
||||
/// Payment procedure that rejects payments to the `FAILING_RELAYER`.
|
||||
pub struct TestPaymentProcedure;
|
||||
|
||||
impl TestPaymentProcedure {
|
||||
pub fn rewards_account(params: RewardsAccountParams) -> AccountId {
|
||||
PayRewardFromAccount::<(), AccountId>::rewards_account(params)
|
||||
}
|
||||
}
|
||||
|
||||
impl PaymentProcedure<AccountId, Balance> for TestPaymentProcedure {
|
||||
type Error = ();
|
||||
|
||||
fn pay_reward(
|
||||
relayer: &AccountId,
|
||||
_lane_id: RewardsAccountParams,
|
||||
_reward: Balance,
|
||||
) -> Result<(), Self::Error> {
|
||||
match *relayer {
|
||||
FAILING_RELAYER => Err(()),
|
||||
_ => Ok(()),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// Return test externalities to use in tests.
|
||||
pub fn new_test_ext() -> sp_io::TestExternalities {
|
||||
let t = frame_system::GenesisConfig::<TestRuntime>::default().build_storage().unwrap();
|
||||
sp_io::TestExternalities::new(t)
|
||||
}
|
||||
|
||||
/// Run pallet test.
|
||||
pub fn run_test<T>(test: impl FnOnce() -> T) -> T {
|
||||
new_test_ext().execute_with(|| {
|
||||
Balances::mint_into(®ISTER_RELAYER, ExistentialDeposit::get() + 10 * Stake::get())
|
||||
.unwrap();
|
||||
|
||||
test()
|
||||
})
|
||||
}
|
||||
@@ -1,158 +0,0 @@
|
||||
// Copyright (C) Parity Technologies (UK) Ltd.
|
||||
// This file is part of Parity Bridges Common.
|
||||
|
||||
// Parity Bridges Common is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// (at your option) any later version.
|
||||
|
||||
// Parity Bridges Common is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with Parity Bridges Common. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
//! Code that allows relayers pallet to be used as a payment mechanism for the messages pallet.
|
||||
|
||||
use crate::{Config, Pallet};
|
||||
|
||||
use bp_messages::{
|
||||
source_chain::{DeliveryConfirmationPayments, RelayersRewards},
|
||||
LaneId, MessageNonce,
|
||||
};
|
||||
use bp_relayers::{RewardsAccountOwner, RewardsAccountParams};
|
||||
use frame_support::{sp_runtime::SaturatedConversion, traits::Get};
|
||||
use sp_arithmetic::traits::{Saturating, Zero};
|
||||
use sp_std::{collections::vec_deque::VecDeque, marker::PhantomData, ops::RangeInclusive};
|
||||
|
||||
/// Adapter that allows relayers pallet to be used as a delivery+dispatch payment mechanism
|
||||
/// for the messages pallet.
|
||||
pub struct DeliveryConfirmationPaymentsAdapter<T, MI, DeliveryReward>(
|
||||
PhantomData<(T, MI, DeliveryReward)>,
|
||||
);
|
||||
|
||||
impl<T, MI, DeliveryReward> DeliveryConfirmationPayments<T::AccountId>
|
||||
for DeliveryConfirmationPaymentsAdapter<T, MI, DeliveryReward>
|
||||
where
|
||||
T: Config + pallet_bridge_messages::Config<MI>,
|
||||
MI: 'static,
|
||||
DeliveryReward: Get<T::Reward>,
|
||||
{
|
||||
type Error = &'static str;
|
||||
|
||||
fn pay_reward(
|
||||
lane_id: LaneId,
|
||||
messages_relayers: VecDeque<bp_messages::UnrewardedRelayer<T::AccountId>>,
|
||||
confirmation_relayer: &T::AccountId,
|
||||
received_range: &RangeInclusive<bp_messages::MessageNonce>,
|
||||
) -> MessageNonce {
|
||||
let relayers_rewards =
|
||||
bp_messages::calc_relayers_rewards::<T::AccountId>(messages_relayers, received_range);
|
||||
let rewarded_relayers = relayers_rewards.len();
|
||||
|
||||
register_relayers_rewards::<T>(
|
||||
confirmation_relayer,
|
||||
relayers_rewards,
|
||||
RewardsAccountParams::new(
|
||||
lane_id,
|
||||
T::BridgedChainId::get(),
|
||||
RewardsAccountOwner::BridgedChain,
|
||||
),
|
||||
DeliveryReward::get(),
|
||||
);
|
||||
|
||||
rewarded_relayers as _
|
||||
}
|
||||
}
|
||||
|
||||
// Update rewards to given relayers, optionally rewarding confirmation relayer.
|
||||
fn register_relayers_rewards<T: Config>(
|
||||
confirmation_relayer: &T::AccountId,
|
||||
relayers_rewards: RelayersRewards<T::AccountId>,
|
||||
lane_id: RewardsAccountParams,
|
||||
delivery_fee: T::Reward,
|
||||
) {
|
||||
// reward every relayer except `confirmation_relayer`
|
||||
let mut confirmation_relayer_reward = T::Reward::zero();
|
||||
for (relayer, messages) in relayers_rewards {
|
||||
// sane runtime configurations guarantee that the number of messages will be below
|
||||
// `u32::MAX`
|
||||
let relayer_reward = T::Reward::saturated_from(messages).saturating_mul(delivery_fee);
|
||||
|
||||
if relayer != *confirmation_relayer {
|
||||
Pallet::<T>::register_relayer_reward(lane_id, &relayer, relayer_reward);
|
||||
} else {
|
||||
confirmation_relayer_reward =
|
||||
confirmation_relayer_reward.saturating_add(relayer_reward);
|
||||
}
|
||||
}
|
||||
|
||||
// finally - pay reward to confirmation relayer
|
||||
Pallet::<T>::register_relayer_reward(
|
||||
lane_id,
|
||||
confirmation_relayer,
|
||||
confirmation_relayer_reward,
|
||||
);
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
use crate::{mock::*, RelayerRewards};
|
||||
|
||||
const RELAYER_1: AccountId = 1;
|
||||
const RELAYER_2: AccountId = 2;
|
||||
const RELAYER_3: AccountId = 3;
|
||||
|
||||
fn relayers_rewards() -> RelayersRewards<AccountId> {
|
||||
vec![(RELAYER_1, 2), (RELAYER_2, 3)].into_iter().collect()
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn confirmation_relayer_is_rewarded_if_it_has_also_delivered_messages() {
|
||||
run_test(|| {
|
||||
register_relayers_rewards::<TestRuntime>(
|
||||
&RELAYER_2,
|
||||
relayers_rewards(),
|
||||
TEST_REWARDS_ACCOUNT_PARAMS,
|
||||
50,
|
||||
);
|
||||
|
||||
assert_eq!(
|
||||
RelayerRewards::<TestRuntime>::get(RELAYER_1, TEST_REWARDS_ACCOUNT_PARAMS),
|
||||
Some(100)
|
||||
);
|
||||
assert_eq!(
|
||||
RelayerRewards::<TestRuntime>::get(RELAYER_2, TEST_REWARDS_ACCOUNT_PARAMS),
|
||||
Some(150)
|
||||
);
|
||||
});
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn confirmation_relayer_is_not_rewarded_if_it_has_not_delivered_any_messages() {
|
||||
run_test(|| {
|
||||
register_relayers_rewards::<TestRuntime>(
|
||||
&RELAYER_3,
|
||||
relayers_rewards(),
|
||||
TEST_REWARDS_ACCOUNT_PARAMS,
|
||||
50,
|
||||
);
|
||||
|
||||
assert_eq!(
|
||||
RelayerRewards::<TestRuntime>::get(RELAYER_1, TEST_REWARDS_ACCOUNT_PARAMS),
|
||||
Some(100)
|
||||
);
|
||||
assert_eq!(
|
||||
RelayerRewards::<TestRuntime>::get(RELAYER_2, TEST_REWARDS_ACCOUNT_PARAMS),
|
||||
Some(150)
|
||||
);
|
||||
assert_eq!(
|
||||
RelayerRewards::<TestRuntime>::get(RELAYER_3, TEST_REWARDS_ACCOUNT_PARAMS),
|
||||
None
|
||||
);
|
||||
});
|
||||
}
|
||||
}
|
||||
@@ -1,186 +0,0 @@
|
||||
// Copyright (C) Parity Technologies (UK) Ltd.
|
||||
// This file is part of Parity Bridges Common.
|
||||
|
||||
// Parity Bridges Common is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// (at your option) any later version.
|
||||
|
||||
// Parity Bridges Common is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with Parity Bridges Common. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
//! Code that allows `NamedReservableCurrency` to be used as a `StakeAndSlash`
|
||||
//! mechanism of the relayers pallet.
|
||||
|
||||
use bp_relayers::{PayRewardFromAccount, RewardsAccountParams, StakeAndSlash};
|
||||
use codec::Codec;
|
||||
use frame_support::traits::{tokens::BalanceStatus, NamedReservableCurrency};
|
||||
use sp_runtime::{traits::Get, DispatchError, DispatchResult};
|
||||
use sp_std::{fmt::Debug, marker::PhantomData};
|
||||
|
||||
/// `StakeAndSlash` that works with `NamedReservableCurrency` and uses named
|
||||
/// reservations.
|
||||
///
|
||||
/// **WARNING**: this implementation assumes that the relayers pallet is configured to
|
||||
/// use the [`bp_relayers::PayRewardFromAccount`] as its relayers payment scheme.
|
||||
pub struct StakeAndSlashNamed<AccountId, BlockNumber, Currency, ReserveId, Stake, Lease>(
|
||||
PhantomData<(AccountId, BlockNumber, Currency, ReserveId, Stake, Lease)>,
|
||||
);
|
||||
|
||||
impl<AccountId, BlockNumber, Currency, ReserveId, Stake, Lease>
|
||||
StakeAndSlash<AccountId, BlockNumber, Currency::Balance>
|
||||
for StakeAndSlashNamed<AccountId, BlockNumber, Currency, ReserveId, Stake, Lease>
|
||||
where
|
||||
AccountId: Codec + Debug,
|
||||
Currency: NamedReservableCurrency<AccountId>,
|
||||
ReserveId: Get<Currency::ReserveIdentifier>,
|
||||
Stake: Get<Currency::Balance>,
|
||||
Lease: Get<BlockNumber>,
|
||||
{
|
||||
type RequiredStake = Stake;
|
||||
type RequiredRegistrationLease = Lease;
|
||||
|
||||
fn reserve(relayer: &AccountId, amount: Currency::Balance) -> DispatchResult {
|
||||
Currency::reserve_named(&ReserveId::get(), relayer, amount)
|
||||
}
|
||||
|
||||
fn unreserve(relayer: &AccountId, amount: Currency::Balance) -> Currency::Balance {
|
||||
Currency::unreserve_named(&ReserveId::get(), relayer, amount)
|
||||
}
|
||||
|
||||
fn repatriate_reserved(
|
||||
relayer: &AccountId,
|
||||
beneficiary: RewardsAccountParams,
|
||||
amount: Currency::Balance,
|
||||
) -> Result<Currency::Balance, DispatchError> {
|
||||
let beneficiary_account =
|
||||
PayRewardFromAccount::<(), AccountId>::rewards_account(beneficiary);
|
||||
Currency::repatriate_reserved_named(
|
||||
&ReserveId::get(),
|
||||
relayer,
|
||||
&beneficiary_account,
|
||||
amount,
|
||||
BalanceStatus::Free,
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
use crate::mock::*;
|
||||
|
||||
use frame_support::traits::fungible::Mutate;
|
||||
|
||||
fn test_stake() -> Balance {
|
||||
Stake::get()
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn reserve_works() {
|
||||
run_test(|| {
|
||||
assert!(TestStakeAndSlash::reserve(&1, test_stake()).is_err());
|
||||
assert_eq!(Balances::free_balance(1), 0);
|
||||
assert_eq!(Balances::reserved_balance(1), 0);
|
||||
|
||||
Balances::mint_into(&2, test_stake() - 1).unwrap();
|
||||
assert!(TestStakeAndSlash::reserve(&2, test_stake()).is_err());
|
||||
assert_eq!(Balances::free_balance(2), test_stake() - 1);
|
||||
assert_eq!(Balances::reserved_balance(2), 0);
|
||||
|
||||
Balances::mint_into(&3, test_stake() * 2).unwrap();
|
||||
assert_eq!(TestStakeAndSlash::reserve(&3, test_stake()), Ok(()));
|
||||
assert_eq!(Balances::free_balance(3), test_stake());
|
||||
assert_eq!(Balances::reserved_balance(3), test_stake());
|
||||
})
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn unreserve_works() {
|
||||
run_test(|| {
|
||||
assert_eq!(TestStakeAndSlash::unreserve(&1, test_stake()), test_stake());
|
||||
assert_eq!(Balances::free_balance(1), 0);
|
||||
assert_eq!(Balances::reserved_balance(1), 0);
|
||||
|
||||
Balances::mint_into(&2, test_stake() * 2).unwrap();
|
||||
TestStakeAndSlash::reserve(&2, test_stake() / 3).unwrap();
|
||||
assert_eq!(
|
||||
TestStakeAndSlash::unreserve(&2, test_stake()),
|
||||
test_stake() - test_stake() / 3
|
||||
);
|
||||
assert_eq!(Balances::free_balance(2), test_stake() * 2);
|
||||
assert_eq!(Balances::reserved_balance(2), 0);
|
||||
|
||||
Balances::mint_into(&3, test_stake() * 2).unwrap();
|
||||
TestStakeAndSlash::reserve(&3, test_stake()).unwrap();
|
||||
assert_eq!(TestStakeAndSlash::unreserve(&3, test_stake()), 0);
|
||||
assert_eq!(Balances::free_balance(3), test_stake() * 2);
|
||||
assert_eq!(Balances::reserved_balance(3), 0);
|
||||
})
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn repatriate_reserved_works() {
|
||||
run_test(|| {
|
||||
let beneficiary = TEST_REWARDS_ACCOUNT_PARAMS;
|
||||
let beneficiary_account = TestPaymentProcedure::rewards_account(beneficiary);
|
||||
|
||||
let mut expected_balance = ExistentialDeposit::get();
|
||||
Balances::mint_into(&beneficiary_account, expected_balance).unwrap();
|
||||
|
||||
assert_eq!(
|
||||
TestStakeAndSlash::repatriate_reserved(&1, beneficiary, test_stake()),
|
||||
Ok(test_stake())
|
||||
);
|
||||
assert_eq!(Balances::free_balance(1), 0);
|
||||
assert_eq!(Balances::reserved_balance(1), 0);
|
||||
assert_eq!(Balances::free_balance(beneficiary_account), expected_balance);
|
||||
assert_eq!(Balances::reserved_balance(beneficiary_account), 0);
|
||||
|
||||
expected_balance += test_stake() / 3;
|
||||
Balances::mint_into(&2, test_stake() * 2).unwrap();
|
||||
TestStakeAndSlash::reserve(&2, test_stake() / 3).unwrap();
|
||||
assert_eq!(
|
||||
TestStakeAndSlash::repatriate_reserved(&2, beneficiary, test_stake()),
|
||||
Ok(test_stake() - test_stake() / 3)
|
||||
);
|
||||
assert_eq!(Balances::free_balance(2), test_stake() * 2 - test_stake() / 3);
|
||||
assert_eq!(Balances::reserved_balance(2), 0);
|
||||
assert_eq!(Balances::free_balance(beneficiary_account), expected_balance);
|
||||
assert_eq!(Balances::reserved_balance(beneficiary_account), 0);
|
||||
|
||||
expected_balance += test_stake();
|
||||
Balances::mint_into(&3, test_stake() * 2).unwrap();
|
||||
TestStakeAndSlash::reserve(&3, test_stake()).unwrap();
|
||||
assert_eq!(
|
||||
TestStakeAndSlash::repatriate_reserved(&3, beneficiary, test_stake()),
|
||||
Ok(0)
|
||||
);
|
||||
assert_eq!(Balances::free_balance(3), test_stake());
|
||||
assert_eq!(Balances::reserved_balance(3), 0);
|
||||
assert_eq!(Balances::free_balance(beneficiary_account), expected_balance);
|
||||
assert_eq!(Balances::reserved_balance(beneficiary_account), 0);
|
||||
})
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn repatriate_reserved_doesnt_work_when_beneficiary_account_is_missing() {
|
||||
run_test(|| {
|
||||
let beneficiary = TEST_REWARDS_ACCOUNT_PARAMS;
|
||||
let beneficiary_account = TestPaymentProcedure::rewards_account(beneficiary);
|
||||
|
||||
Balances::mint_into(&3, test_stake() * 2).unwrap();
|
||||
TestStakeAndSlash::reserve(&3, test_stake()).unwrap();
|
||||
assert!(TestStakeAndSlash::repatriate_reserved(&3, beneficiary, test_stake()).is_err());
|
||||
assert_eq!(Balances::free_balance(3), test_stake());
|
||||
assert_eq!(Balances::reserved_balance(3), test_stake());
|
||||
assert_eq!(Balances::free_balance(beneficiary_account), 0);
|
||||
assert_eq!(Balances::reserved_balance(beneficiary_account), 0);
|
||||
});
|
||||
}
|
||||
}
|
||||
@@ -1,259 +0,0 @@
|
||||
// Copyright (C) Parity Technologies (UK) Ltd.
|
||||
// This file is part of Parity Bridges Common.
|
||||
|
||||
// Parity Bridges Common is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// (at your option) any later version.
|
||||
|
||||
// Parity Bridges Common is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with Parity Bridges Common. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
//! Autogenerated weights for pallet_bridge_relayers
|
||||
//!
|
||||
//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev
|
||||
//! DATE: 2023-04-28, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]`
|
||||
//! WORST CASE MAP SIZE: `1000000`
|
||||
//! HOSTNAME: `covid`, CPU: `11th Gen Intel(R) Core(TM) i7-11800H @ 2.30GHz`
|
||||
//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("dev"), DB CACHE: 1024
|
||||
|
||||
// Executed Command:
|
||||
// target/release/rip-bridge-node
|
||||
// benchmark
|
||||
// pallet
|
||||
// --chain=dev
|
||||
// --steps=50
|
||||
// --repeat=20
|
||||
// --pallet=pallet_bridge_relayers
|
||||
// --extrinsic=*
|
||||
// --execution=wasm
|
||||
// --wasm-execution=Compiled
|
||||
// --heap-pages=4096
|
||||
// --output=./modules/relayers/src/weights.rs
|
||||
// --template=./.maintain/bridge-weight-template.hbs
|
||||
|
||||
#![allow(clippy::all)]
|
||||
#![allow(unused_parens)]
|
||||
#![allow(unused_imports)]
|
||||
#![allow(missing_docs)]
|
||||
|
||||
use frame_support::{
|
||||
traits::Get,
|
||||
weights::{constants::RocksDbWeight, Weight},
|
||||
};
|
||||
use sp_std::marker::PhantomData;
|
||||
|
||||
/// Weight functions needed for pallet_bridge_relayers.
|
||||
pub trait WeightInfo {
|
||||
fn claim_rewards() -> Weight;
|
||||
fn register() -> Weight;
|
||||
fn deregister() -> Weight;
|
||||
fn slash_and_deregister() -> Weight;
|
||||
fn register_relayer_reward() -> Weight;
|
||||
}
|
||||
|
||||
/// Weights for `pallet_bridge_relayers` that are generated using one of the Bridge testnets.
|
||||
///
|
||||
/// Those weights are test only and must never be used in production.
|
||||
pub struct BridgeWeight<T>(PhantomData<T>);
|
||||
impl<T: frame_system::Config> WeightInfo for BridgeWeight<T> {
|
||||
/// Storage: BridgeRelayers RelayerRewards (r:1 w:1)
|
||||
///
|
||||
/// Proof: BridgeRelayers RelayerRewards (max_values: None, max_size: Some(65), added: 2540,
|
||||
/// mode: MaxEncodedLen)
|
||||
///
|
||||
/// Storage: Balances TotalIssuance (r:1 w:0)
|
||||
///
|
||||
/// Proof: Balances TotalIssuance (max_values: Some(1), max_size: Some(8), added: 503, mode:
|
||||
/// MaxEncodedLen)
|
||||
///
|
||||
/// Storage: System Account (r:1 w:1)
|
||||
///
|
||||
/// Proof: System Account (max_values: None, max_size: Some(104), added: 2579, mode:
|
||||
/// MaxEncodedLen)
|
||||
fn claim_rewards() -> Weight {
|
||||
// Proof Size summary in bytes:
|
||||
// Measured: `294`
|
||||
// Estimated: `8592`
|
||||
// Minimum execution time: 77_614 nanoseconds.
|
||||
Weight::from_parts(79_987_000, 8592)
|
||||
.saturating_add(T::DbWeight::get().reads(3_u64))
|
||||
.saturating_add(T::DbWeight::get().writes(2_u64))
|
||||
}
|
||||
/// Storage: BridgeRelayers RegisteredRelayers (r:1 w:1)
|
||||
///
|
||||
/// Proof: BridgeRelayers RegisteredRelayers (max_values: None, max_size: Some(64), added: 2539,
|
||||
/// mode: MaxEncodedLen)
|
||||
///
|
||||
/// Storage: Balances Reserves (r:1 w:1)
|
||||
///
|
||||
/// Proof: Balances Reserves (max_values: None, max_size: Some(849), added: 3324, mode:
|
||||
/// MaxEncodedLen)
|
||||
fn register() -> Weight {
|
||||
// Proof Size summary in bytes:
|
||||
// Measured: `87`
|
||||
// Estimated: `7843`
|
||||
// Minimum execution time: 39_590 nanoseconds.
|
||||
Weight::from_parts(40_546_000, 7843)
|
||||
.saturating_add(T::DbWeight::get().reads(2_u64))
|
||||
.saturating_add(T::DbWeight::get().writes(2_u64))
|
||||
}
|
||||
/// Storage: BridgeRelayers RegisteredRelayers (r:1 w:1)
|
||||
///
|
||||
/// Proof: BridgeRelayers RegisteredRelayers (max_values: None, max_size: Some(64), added: 2539,
|
||||
/// mode: MaxEncodedLen)
|
||||
///
|
||||
/// Storage: Balances Reserves (r:1 w:1)
|
||||
///
|
||||
/// Proof: Balances Reserves (max_values: None, max_size: Some(849), added: 3324, mode:
|
||||
/// MaxEncodedLen)
|
||||
fn deregister() -> Weight {
|
||||
// Proof Size summary in bytes:
|
||||
// Measured: `264`
|
||||
// Estimated: `7843`
|
||||
// Minimum execution time: 43_332 nanoseconds.
|
||||
Weight::from_parts(45_087_000, 7843)
|
||||
.saturating_add(T::DbWeight::get().reads(2_u64))
|
||||
.saturating_add(T::DbWeight::get().writes(2_u64))
|
||||
}
|
||||
/// Storage: BridgeRelayers RegisteredRelayers (r:1 w:1)
|
||||
///
|
||||
/// Proof: BridgeRelayers RegisteredRelayers (max_values: None, max_size: Some(64), added: 2539,
|
||||
/// mode: MaxEncodedLen)
|
||||
///
|
||||
/// Storage: Balances Reserves (r:1 w:1)
|
||||
///
|
||||
/// Proof: Balances Reserves (max_values: None, max_size: Some(849), added: 3324, mode:
|
||||
/// MaxEncodedLen)
|
||||
///
|
||||
/// Storage: System Account (r:1 w:1)
|
||||
///
|
||||
/// Proof: System Account (max_values: None, max_size: Some(104), added: 2579, mode:
|
||||
/// MaxEncodedLen)
|
||||
fn slash_and_deregister() -> Weight {
|
||||
// Proof Size summary in bytes:
|
||||
// Measured: `380`
|
||||
// Estimated: `11412`
|
||||
// Minimum execution time: 42_358 nanoseconds.
|
||||
Weight::from_parts(43_539_000, 11412)
|
||||
.saturating_add(T::DbWeight::get().reads(3_u64))
|
||||
.saturating_add(T::DbWeight::get().writes(3_u64))
|
||||
}
|
||||
/// Storage: BridgeRelayers RelayerRewards (r:1 w:1)
|
||||
///
|
||||
/// Proof: BridgeRelayers RelayerRewards (max_values: None, max_size: Some(65), added: 2540,
|
||||
/// mode: MaxEncodedLen)
|
||||
fn register_relayer_reward() -> Weight {
|
||||
// Proof Size summary in bytes:
|
||||
// Measured: `12`
|
||||
// Estimated: `3530`
|
||||
// Minimum execution time: 6_338 nanoseconds.
|
||||
Weight::from_parts(6_526_000, 3530)
|
||||
.saturating_add(T::DbWeight::get().reads(1_u64))
|
||||
.saturating_add(T::DbWeight::get().writes(1_u64))
|
||||
}
|
||||
}
|
||||
|
||||
// For backwards compatibility and tests
|
||||
impl WeightInfo for () {
|
||||
/// Storage: BridgeRelayers RelayerRewards (r:1 w:1)
|
||||
///
|
||||
/// Proof: BridgeRelayers RelayerRewards (max_values: None, max_size: Some(65), added: 2540,
|
||||
/// mode: MaxEncodedLen)
|
||||
///
|
||||
/// Storage: Balances TotalIssuance (r:1 w:0)
|
||||
///
|
||||
/// Proof: Balances TotalIssuance (max_values: Some(1), max_size: Some(8), added: 503, mode:
|
||||
/// MaxEncodedLen)
|
||||
///
|
||||
/// Storage: System Account (r:1 w:1)
|
||||
///
|
||||
/// Proof: System Account (max_values: None, max_size: Some(104), added: 2579, mode:
|
||||
/// MaxEncodedLen)
|
||||
fn claim_rewards() -> Weight {
|
||||
// Proof Size summary in bytes:
|
||||
// Measured: `294`
|
||||
// Estimated: `8592`
|
||||
// Minimum execution time: 77_614 nanoseconds.
|
||||
Weight::from_parts(79_987_000, 8592)
|
||||
.saturating_add(RocksDbWeight::get().reads(3_u64))
|
||||
.saturating_add(RocksDbWeight::get().writes(2_u64))
|
||||
}
|
||||
/// Storage: BridgeRelayers RegisteredRelayers (r:1 w:1)
|
||||
///
|
||||
/// Proof: BridgeRelayers RegisteredRelayers (max_values: None, max_size: Some(64), added: 2539,
|
||||
/// mode: MaxEncodedLen)
|
||||
///
|
||||
/// Storage: Balances Reserves (r:1 w:1)
|
||||
///
|
||||
/// Proof: Balances Reserves (max_values: None, max_size: Some(849), added: 3324, mode:
|
||||
/// MaxEncodedLen)
|
||||
fn register() -> Weight {
|
||||
// Proof Size summary in bytes:
|
||||
// Measured: `87`
|
||||
// Estimated: `7843`
|
||||
// Minimum execution time: 39_590 nanoseconds.
|
||||
Weight::from_parts(40_546_000, 7843)
|
||||
.saturating_add(RocksDbWeight::get().reads(2_u64))
|
||||
.saturating_add(RocksDbWeight::get().writes(2_u64))
|
||||
}
|
||||
/// Storage: BridgeRelayers RegisteredRelayers (r:1 w:1)
|
||||
///
|
||||
/// Proof: BridgeRelayers RegisteredRelayers (max_values: None, max_size: Some(64), added: 2539,
|
||||
/// mode: MaxEncodedLen)
|
||||
///
|
||||
/// Storage: Balances Reserves (r:1 w:1)
|
||||
///
|
||||
/// Proof: Balances Reserves (max_values: None, max_size: Some(849), added: 3324, mode:
|
||||
/// MaxEncodedLen)
|
||||
fn deregister() -> Weight {
|
||||
// Proof Size summary in bytes:
|
||||
// Measured: `264`
|
||||
// Estimated: `7843`
|
||||
// Minimum execution time: 43_332 nanoseconds.
|
||||
Weight::from_parts(45_087_000, 7843)
|
||||
.saturating_add(RocksDbWeight::get().reads(2_u64))
|
||||
.saturating_add(RocksDbWeight::get().writes(2_u64))
|
||||
}
|
||||
/// Storage: BridgeRelayers RegisteredRelayers (r:1 w:1)
|
||||
///
|
||||
/// Proof: BridgeRelayers RegisteredRelayers (max_values: None, max_size: Some(64), added: 2539,
|
||||
/// mode: MaxEncodedLen)
|
||||
///
|
||||
/// Storage: Balances Reserves (r:1 w:1)
|
||||
///
|
||||
/// Proof: Balances Reserves (max_values: None, max_size: Some(849), added: 3324, mode:
|
||||
/// MaxEncodedLen)
|
||||
///
|
||||
/// Storage: System Account (r:1 w:1)
|
||||
///
|
||||
/// Proof: System Account (max_values: None, max_size: Some(104), added: 2579, mode:
|
||||
/// MaxEncodedLen)
|
||||
fn slash_and_deregister() -> Weight {
|
||||
// Proof Size summary in bytes:
|
||||
// Measured: `380`
|
||||
// Estimated: `11412`
|
||||
// Minimum execution time: 42_358 nanoseconds.
|
||||
Weight::from_parts(43_539_000, 11412)
|
||||
.saturating_add(RocksDbWeight::get().reads(3_u64))
|
||||
.saturating_add(RocksDbWeight::get().writes(3_u64))
|
||||
}
|
||||
/// Storage: BridgeRelayers RelayerRewards (r:1 w:1)
|
||||
///
|
||||
/// Proof: BridgeRelayers RelayerRewards (max_values: None, max_size: Some(65), added: 2540,
|
||||
/// mode: MaxEncodedLen)
|
||||
fn register_relayer_reward() -> Weight {
|
||||
// Proof Size summary in bytes:
|
||||
// Measured: `12`
|
||||
// Estimated: `3530`
|
||||
// Minimum execution time: 6_338 nanoseconds.
|
||||
Weight::from_parts(6_526_000, 3530)
|
||||
.saturating_add(RocksDbWeight::get().reads(1_u64))
|
||||
.saturating_add(RocksDbWeight::get().writes(1_u64))
|
||||
}
|
||||
}
|
||||
@@ -1,49 +0,0 @@
|
||||
// Copyright (C) Parity Technologies (UK) Ltd.
|
||||
// This file is part of Parity Bridges Common.
|
||||
|
||||
// Parity Bridges Common is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// (at your option) any later version.
|
||||
|
||||
// Parity Bridges Common is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with Parity Bridges Common. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
//! Weight-related utilities.
|
||||
|
||||
use crate::weights::WeightInfo;
|
||||
|
||||
use frame_support::pallet_prelude::Weight;
|
||||
|
||||
/// Extended weight info.
|
||||
pub trait WeightInfoExt: WeightInfo {
|
||||
/// Returns weight, that needs to be added to the pre-dispatch weight of message delivery call,
|
||||
/// if `RefundBridgedParachainMessages` signed extension is deployed at runtime level.
|
||||
fn receive_messages_proof_overhead_from_runtime() -> Weight {
|
||||
Self::slash_and_deregister().max(Self::register_relayer_reward())
|
||||
}
|
||||
|
||||
/// Returns weight, that needs to be added to the pre-dispatch weight of message delivery
|
||||
/// confirmation call, if `RefundBridgedParachainMessages` signed extension is deployed at
|
||||
/// runtime level.
|
||||
fn receive_messages_delivery_proof_overhead_from_runtime() -> Weight {
|
||||
Self::register_relayer_reward()
|
||||
}
|
||||
|
||||
/// Returns weight that we need to deduct from the message delivery call weight that has
|
||||
/// completed successfully.
|
||||
///
|
||||
/// Usually, the weight of `slash_and_deregister` is larger than the weight of the
|
||||
/// `register_relayer_reward`. So if relayer has been rewarded, we want to deduct the difference
|
||||
/// to get the actual post-dispatch weight.
|
||||
fn extra_weight_of_successful_receive_messages_proof_call() -> Weight {
|
||||
Self::slash_and_deregister().saturating_sub(Self::register_relayer_reward())
|
||||
}
|
||||
}
|
||||
|
||||
impl<T: WeightInfo> WeightInfoExt for T {}
|
||||
Reference in New Issue
Block a user