mirror of
https://github.com/pezkuwichain/pezkuwi-subxt.git
synced 2026-06-15 18:31:05 +00:00
Per-lane rewards in pallet-bridge-relayers (#1665)
* per-lane rewards in pallet-bridge-relayers * add lane id to RewardPaid event * clippy * fix benchmarks
This commit is contained in:
committed by
Bastian Köcher
parent
c03d99cd09
commit
ea98118031
@@ -17,7 +17,7 @@
|
||||
//! Code that allows relayers pallet to be used as a delivery+dispatch payment mechanism
|
||||
//! for the messages pallet.
|
||||
|
||||
use crate::{Config, RelayerRewards};
|
||||
use crate::{Config, Pallet};
|
||||
|
||||
use bp_messages::source_chain::{MessageDeliveryAndDispatchPayment, RelayersRewards};
|
||||
use frame_support::sp_runtime::SaturatedConversion;
|
||||
@@ -39,7 +39,7 @@ where
|
||||
type Error = &'static str;
|
||||
|
||||
fn pay_relayers_rewards(
|
||||
_lane_id: bp_messages::LaneId,
|
||||
lane_id: bp_messages::LaneId,
|
||||
messages_relayers: VecDeque<bp_messages::UnrewardedRelayer<T::AccountId>>,
|
||||
confirmation_relayer: &T::AccountId,
|
||||
received_range: &RangeInclusive<bp_messages::MessageNonce>,
|
||||
@@ -52,8 +52,9 @@ where
|
||||
register_relayers_rewards::<T>(
|
||||
confirmation_relayer,
|
||||
relayers_rewards,
|
||||
lane_id,
|
||||
// TODO (https://github.com/paritytech/parity-bridges-common/issues/1318): this shall be fixed
|
||||
// in some way. ATM the future of the `register_relayers_rewards` is not yet known
|
||||
// in some way. ATM the future of the `register_relayer_reward` is not yet known
|
||||
100_000_u32.into(),
|
||||
10_000_u32.into(),
|
||||
);
|
||||
@@ -64,6 +65,7 @@ where
|
||||
fn register_relayers_rewards<T: Config>(
|
||||
confirmation_relayer: &T::AccountId,
|
||||
relayers_rewards: RelayersRewards<T::AccountId>,
|
||||
lane_id: bp_messages::LaneId,
|
||||
delivery_fee: T::Reward,
|
||||
confirmation_fee: T::Reward,
|
||||
) {
|
||||
@@ -87,7 +89,7 @@ fn register_relayers_rewards<T: Config>(
|
||||
relayer_reward = relayer_reward.saturating_sub(confirmation_reward);
|
||||
confirmation_relayer_reward =
|
||||
confirmation_relayer_reward.saturating_add(confirmation_reward);
|
||||
register_relayer_reward::<T>(&relayer, relayer_reward);
|
||||
Pallet::<T>::register_relayer_reward(lane_id, &relayer, relayer_reward);
|
||||
} else {
|
||||
// If delivery confirmation is submitted by this relayer, let's add confirmation fee
|
||||
// from other relayers to this relayer reward.
|
||||
@@ -97,32 +99,17 @@ fn register_relayers_rewards<T: Config>(
|
||||
}
|
||||
|
||||
// finally - pay reward to confirmation relayer
|
||||
register_relayer_reward::<T>(confirmation_relayer, confirmation_relayer_reward);
|
||||
}
|
||||
|
||||
/// Remember that the reward shall be paid to the relayer.
|
||||
fn register_relayer_reward<T: Config>(relayer: &T::AccountId, reward: T::Reward) {
|
||||
if reward.is_zero() {
|
||||
return
|
||||
}
|
||||
|
||||
RelayerRewards::<T>::mutate(relayer, |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: {:?}",
|
||||
relayer,
|
||||
new_reward,
|
||||
);
|
||||
});
|
||||
Pallet::<T>::register_relayer_reward(
|
||||
lane_id,
|
||||
confirmation_relayer,
|
||||
confirmation_relayer_reward,
|
||||
);
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
use crate::mock::*;
|
||||
use crate::{mock::*, RelayerRewards};
|
||||
|
||||
const RELAYER_1: AccountId = 1;
|
||||
const RELAYER_2: AccountId = 2;
|
||||
@@ -135,32 +122,50 @@ mod tests {
|
||||
#[test]
|
||||
fn confirmation_relayer_is_rewarded_if_it_has_also_delivered_messages() {
|
||||
run_test(|| {
|
||||
register_relayers_rewards::<TestRuntime>(&RELAYER_2, relayers_rewards(), 50, 10);
|
||||
register_relayers_rewards::<TestRuntime>(
|
||||
&RELAYER_2,
|
||||
relayers_rewards(),
|
||||
TEST_LANE_ID,
|
||||
50,
|
||||
10,
|
||||
);
|
||||
|
||||
assert_eq!(RelayerRewards::<TestRuntime>::get(RELAYER_1), Some(80));
|
||||
assert_eq!(RelayerRewards::<TestRuntime>::get(RELAYER_2), Some(170));
|
||||
assert_eq!(RelayerRewards::<TestRuntime>::get(RELAYER_1, TEST_LANE_ID), Some(80));
|
||||
assert_eq!(RelayerRewards::<TestRuntime>::get(RELAYER_2, TEST_LANE_ID), Some(170));
|
||||
});
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn confirmation_relayer_is_rewarded_if_it_has_not_delivered_any_delivered_messages() {
|
||||
run_test(|| {
|
||||
register_relayers_rewards::<TestRuntime>(&RELAYER_3, relayers_rewards(), 50, 10);
|
||||
register_relayers_rewards::<TestRuntime>(
|
||||
&RELAYER_3,
|
||||
relayers_rewards(),
|
||||
TEST_LANE_ID,
|
||||
50,
|
||||
10,
|
||||
);
|
||||
|
||||
assert_eq!(RelayerRewards::<TestRuntime>::get(RELAYER_1), Some(80));
|
||||
assert_eq!(RelayerRewards::<TestRuntime>::get(RELAYER_2), Some(120));
|
||||
assert_eq!(RelayerRewards::<TestRuntime>::get(RELAYER_3), Some(50));
|
||||
assert_eq!(RelayerRewards::<TestRuntime>::get(RELAYER_1, TEST_LANE_ID), Some(80));
|
||||
assert_eq!(RelayerRewards::<TestRuntime>::get(RELAYER_2, TEST_LANE_ID), Some(120));
|
||||
assert_eq!(RelayerRewards::<TestRuntime>::get(RELAYER_3, TEST_LANE_ID), Some(50));
|
||||
});
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn only_confirmation_relayer_is_rewarded_if_confirmation_fee_has_significantly_increased() {
|
||||
run_test(|| {
|
||||
register_relayers_rewards::<TestRuntime>(&RELAYER_3, relayers_rewards(), 50, 1000);
|
||||
register_relayers_rewards::<TestRuntime>(
|
||||
&RELAYER_3,
|
||||
relayers_rewards(),
|
||||
TEST_LANE_ID,
|
||||
50,
|
||||
1000,
|
||||
);
|
||||
|
||||
assert_eq!(RelayerRewards::<TestRuntime>::get(RELAYER_1), None);
|
||||
assert_eq!(RelayerRewards::<TestRuntime>::get(RELAYER_2), None);
|
||||
assert_eq!(RelayerRewards::<TestRuntime>::get(RELAYER_3), Some(250));
|
||||
assert_eq!(RelayerRewards::<TestRuntime>::get(RELAYER_1, TEST_LANE_ID), None);
|
||||
assert_eq!(RelayerRewards::<TestRuntime>::get(RELAYER_2, TEST_LANE_ID), None);
|
||||
assert_eq!(RelayerRewards::<TestRuntime>::get(RELAYER_3, TEST_LANE_ID), Some(250));
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user