Skip to content

Commit 8ee0d21

Browse files
authored
Merge branch 'master' into oty-fix-bencher
2 parents 95ba3a6 + 9a8061e commit 8ee0d21

File tree

10 files changed

+1326
-1082
lines changed

10 files changed

+1326
-1082
lines changed

bridges/modules/relayers/src/benchmarking.rs

+79-53
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,7 @@
2020

2121
use crate::*;
2222

23-
use frame_benchmarking::{
24-
benchmarks_instance_pallet, whitelisted_caller, BenchmarkError, BenchmarkResult,
25-
};
23+
use frame_benchmarking::v2::*;
2624
use frame_support::{assert_ok, weights::Weight};
2725
use frame_system::RawOrigin;
2826
use sp_runtime::traits::One;
@@ -52,121 +50,149 @@ fn assert_last_event<T: Config<I>, I: 'static>(
5250
frame_system::Pallet::<T>::assert_last_event(generic_event.into());
5351
}
5452

55-
benchmarks_instance_pallet! {
56-
where_clause { where
53+
#[instance_benchmarks(
54+
where
5755
BeneficiaryOf<T, I>: From<<T as frame_system::Config>::AccountId>,
58-
}
56+
)]
57+
mod benchmarks {
58+
use super::*;
5959

60-
// Benchmark `claim_rewards` call.
61-
claim_rewards {
62-
let reward_kind = T::bench_reward();
60+
#[benchmark]
61+
fn claim_rewards() {
6362
let relayer: T::AccountId = whitelisted_caller();
63+
let reward_kind = T::bench_reward();
6464
let reward_balance = T::RewardBalance::from(REWARD_AMOUNT);
65-
6665
let _ = T::prepare_rewards_account(reward_kind, reward_balance);
6766
RelayerRewards::<T, I>::insert(&relayer, reward_kind, reward_balance);
68-
}: _(RawOrigin::Signed(relayer.clone()), reward_kind)
69-
verify {
67+
68+
#[extrinsic_call]
69+
_(RawOrigin::Signed(relayer.clone()), reward_kind);
70+
7071
// we can't check anything here, because `PaymentProcedure` is responsible for
7172
// payment logic, so we assume that if call has succeeded, the procedure has
7273
// also completed successfully
73-
assert_last_event::<T, I>(Event::RewardPaid {
74-
relayer: relayer.clone(),
75-
reward_kind,
76-
reward_balance,
77-
beneficiary: relayer.into(),
78-
}.into());
74+
assert_last_event::<T, I>(
75+
Event::RewardPaid {
76+
relayer: relayer.clone(),
77+
reward_kind,
78+
reward_balance,
79+
beneficiary: relayer.into(),
80+
}
81+
.into(),
82+
);
7983
}
8084

81-
// Benchmark `claim_rewards_to` call.
82-
claim_rewards_to {
83-
let reward_kind = T::bench_reward();
85+
#[benchmark]
86+
fn claim_rewards_to() -> Result<(), BenchmarkError> {
8487
let relayer: T::AccountId = whitelisted_caller();
88+
let reward_kind = T::bench_reward();
8589
let reward_balance = T::RewardBalance::from(REWARD_AMOUNT);
8690

87-
let Some(alternative_beneficiary) = T::prepare_rewards_account(reward_kind, reward_balance) else {
91+
let Some(alternative_beneficiary) = T::prepare_rewards_account(reward_kind, reward_balance)
92+
else {
8893
return Err(BenchmarkError::Override(BenchmarkResult::from_weight(Weight::MAX)));
8994
};
9095
RelayerRewards::<T, I>::insert(&relayer, reward_kind, reward_balance);
91-
}: _(RawOrigin::Signed(relayer.clone()), reward_kind, alternative_beneficiary.clone())
92-
verify {
96+
97+
#[extrinsic_call]
98+
_(RawOrigin::Signed(relayer.clone()), reward_kind, alternative_beneficiary.clone());
99+
93100
// we can't check anything here, because `PaymentProcedure` is responsible for
94101
// payment logic, so we assume that if call has succeeded, the procedure has
95102
// also completed successfully
96-
assert_last_event::<T, I>(Event::RewardPaid {
97-
relayer,
98-
reward_kind,
99-
reward_balance,
100-
beneficiary: alternative_beneficiary,
101-
}.into());
103+
assert_last_event::<T, I>(
104+
Event::RewardPaid {
105+
relayer: relayer.clone(),
106+
reward_kind,
107+
reward_balance,
108+
beneficiary: alternative_beneficiary,
109+
}
110+
.into(),
111+
);
112+
113+
Ok(())
102114
}
103115

104-
// Benchmark `register` call.
105-
register {
116+
#[benchmark]
117+
fn register() {
106118
let relayer: T::AccountId = whitelisted_caller();
107119
let valid_till = frame_system::Pallet::<T>::block_number()
108120
.saturating_add(crate::Pallet::<T, I>::required_registration_lease())
109121
.saturating_add(One::one())
110122
.saturating_add(One::one());
111-
112123
T::deposit_account(relayer.clone(), crate::Pallet::<T, I>::required_stake());
113-
}: _(RawOrigin::Signed(relayer.clone()), valid_till)
114-
verify {
124+
125+
#[extrinsic_call]
126+
_(RawOrigin::Signed(relayer.clone()), valid_till);
127+
115128
assert!(crate::Pallet::<T, I>::is_registration_active(&relayer));
116129
}
117130

118-
// Benchmark `deregister` call.
119-
deregister {
131+
#[benchmark]
132+
fn deregister() {
120133
let relayer: T::AccountId = whitelisted_caller();
121134
let valid_till = frame_system::Pallet::<T>::block_number()
122135
.saturating_add(crate::Pallet::<T, I>::required_registration_lease())
123136
.saturating_add(One::one())
124137
.saturating_add(One::one());
125138
T::deposit_account(relayer.clone(), crate::Pallet::<T, I>::required_stake());
126-
crate::Pallet::<T, I>::register(RawOrigin::Signed(relayer.clone()).into(), valid_till).unwrap();
127-
139+
crate::Pallet::<T, I>::register(RawOrigin::Signed(relayer.clone()).into(), valid_till)
140+
.unwrap();
128141
frame_system::Pallet::<T>::set_block_number(valid_till.saturating_add(One::one()));
129-
}: _(RawOrigin::Signed(relayer.clone()))
130-
verify {
142+
143+
#[extrinsic_call]
144+
_(RawOrigin::Signed(relayer.clone()));
145+
131146
assert!(!crate::Pallet::<T, I>::is_registration_active(&relayer));
132147
}
133148

134149
// Benchmark `slash_and_deregister` method of the pallet. We are adding this weight to
135150
// the weight of message delivery call if `BridgeRelayersTransactionExtension` signed extension
136151
// is deployed at runtime level.
137-
slash_and_deregister {
152+
#[benchmark]
153+
fn slash_and_deregister() {
138154
// prepare and register relayer account
139155
let relayer: T::AccountId = whitelisted_caller();
140156
let valid_till = frame_system::Pallet::<T>::block_number()
141157
.saturating_add(crate::Pallet::<T, I>::required_registration_lease())
142158
.saturating_add(One::one())
143159
.saturating_add(One::one());
144160
T::deposit_account(relayer.clone(), crate::Pallet::<T, I>::required_stake());
145-
assert_ok!(crate::Pallet::<T, I>::register(RawOrigin::Signed(relayer.clone()).into(), valid_till));
161+
assert_ok!(crate::Pallet::<T, I>::register(
162+
RawOrigin::Signed(relayer.clone()).into(),
163+
valid_till
164+
));
146165

147166
// create slash destination account
148167
let slash_destination: T::AccountId = whitelisted_caller();
149168
T::deposit_account(slash_destination.clone(), Zero::zero());
150-
}: {
151-
crate::Pallet::<T, I>::slash_and_deregister(&relayer, bp_relayers::ExplicitOrAccountParams::Explicit::<_, ()>(slash_destination))
152-
}
153-
verify {
169+
170+
#[block]
171+
{
172+
crate::Pallet::<T, I>::slash_and_deregister(
173+
&relayer,
174+
bp_relayers::ExplicitOrAccountParams::Explicit::<_, ()>(slash_destination),
175+
);
176+
}
177+
154178
assert!(!crate::Pallet::<T, I>::is_registration_active(&relayer));
155179
}
156180

157181
// Benchmark `register_relayer_reward` method of the pallet. We are adding this weight to
158182
// the weight of message delivery call if `BridgeRelayersTransactionExtension` signed extension
159183
// is deployed at runtime level.
160-
register_relayer_reward {
184+
#[benchmark]
185+
fn register_relayer_reward() {
161186
let reward_kind = T::bench_reward();
162187
let relayer: T::AccountId = whitelisted_caller();
163188

164-
}: {
165-
crate::Pallet::<T, I>::register_relayer_reward(reward_kind, &relayer, One::one());
166-
}
167-
verify {
189+
#[block]
190+
{
191+
crate::Pallet::<T, I>::register_relayer_reward(reward_kind, &relayer, One::one());
192+
}
193+
168194
assert_eq!(RelayerRewards::<T, I>::get(relayer, &reward_kind), Some(One::one()));
169195
}
170196

171-
impl_benchmark_test_suite!(Pallet, crate::mock::new_test_ext(), crate::mock::TestRuntime)
197+
impl_benchmark_test_suite!(Pallet, crate::mock::new_test_ext(), crate::mock::TestRuntime);
172198
}

bridges/modules/relayers/src/lib.rs

+44-1
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@
1818
//! coordinate relations between relayers.
1919
2020
#![cfg_attr(not(feature = "std"), no_std)]
21-
#![warn(missing_docs)]
2221

2322
extern crate alloc;
2423

@@ -367,6 +366,11 @@ pub mod pallet {
367366
);
368367
},
369368
}
369+
370+
Self::deposit_event(Event::<T, I>::SlashedAndDeregistered {
371+
relayer: relayer.clone(),
372+
registration,
373+
});
370374
}
371375

372376
/// Register reward for given relayer.
@@ -553,6 +557,8 @@ mod tests {
553557
use super::*;
554558
use mock::{RuntimeEvent as TestEvent, *};
555559

560+
use bp_messages::{HashedLaneId, LaneIdType};
561+
use bp_relayers::{RewardsAccountOwner, RewardsAccountParams};
556562
use frame_support::{assert_noop, assert_ok, traits::fungible::Mutate};
557563
use frame_system::{EventRecord, Pallet as System, Phase};
558564
use sp_runtime::DispatchError;
@@ -589,6 +595,43 @@ mod tests {
589595
});
590596
}
591597

598+
#[test]
599+
fn slash_and_deregister_works() {
600+
run_test(|| {
601+
get_ready_for_events();
602+
603+
// register
604+
assert_ok!(Pallet::<TestRuntime>::register(
605+
RuntimeOrigin::signed(REGISTER_RELAYER),
606+
150,
607+
));
608+
// check if registered
609+
let registration = Pallet::<TestRuntime>::registered_relayer(REGISTER_RELAYER).unwrap();
610+
assert_eq!(registration, Registration { valid_till: 150, stake: Stake::get() });
611+
612+
// slash and deregister
613+
let slash_destination = RewardsAccountParams::new(
614+
HashedLaneId::try_new(1, 2).unwrap(),
615+
*b"test",
616+
RewardsAccountOwner::ThisChain,
617+
);
618+
let slash_destination = bp_relayers::ExplicitOrAccountParams::Params(slash_destination);
619+
Pallet::<TestRuntime>::slash_and_deregister(&REGISTER_RELAYER, slash_destination);
620+
// check if event emitted
621+
assert_eq!(
622+
System::<TestRuntime>::events().last(),
623+
Some(&EventRecord {
624+
phase: Phase::Initialization,
625+
event: TestEvent::BridgeRelayers(Event::SlashedAndDeregistered {
626+
relayer: REGISTER_RELAYER,
627+
registration,
628+
}),
629+
topics: vec![],
630+
})
631+
)
632+
});
633+
}
634+
592635
#[test]
593636
fn root_cant_claim_anything() {
594637
run_test(|| {

docs/sdk/src/guides/your_first_node.rs

+9-3
Original file line numberDiff line numberDiff line change
@@ -256,9 +256,14 @@ mod tests {
256256

257257
let expected_blocks = (10_000 / block_time).saturating_div(2);
258258
assert!(expected_blocks > 0, "test configuration is bad, should give it more time");
259-
assert!(String::from_utf8(output.stderr)
260-
.unwrap()
261-
.contains(format!("Imported #{}", expected_blocks).to_string().as_str()));
259+
let output = String::from_utf8(output.stderr).unwrap();
260+
let want = format!("Imported #{}", expected_blocks);
261+
if !output.contains(&want) {
262+
panic!(
263+
"Output did not contain the pattern:\n\npattern: {}\n\noutput: {}\n",
264+
want, output
265+
);
266+
}
262267
}
263268

264269
#[test]
@@ -282,6 +287,7 @@ mod tests {
282287
}
283288

284289
#[test]
290+
#[ignore]
285291
fn parachain_runtime_works() {
286292
// TODO: None doesn't work. But maybe it should? it would be misleading as many users might
287293
// use it.

0 commit comments

Comments
 (0)