1use bp_header_chain::ChainWithGrandpa;
23use bp_messages::{ChainWithMessages, InboundLaneData, MessageNonce};
24use bp_runtime::{AccountIdOf, Chain};
25use codec::Encode;
26use frame_support::{storage::generator::StorageValue, traits::Get, weights::Weight};
27use frame_system::limits;
28use pallet_bridge_messages::{ThisChainOf, WeightInfoExt as _};
29
30#[doc(hidden)]
32pub mod __private {
33 pub use static_assertions;
34}
35
36#[macro_export]
39macro_rules! assert_chain_types(
40 ( runtime: $r:path, this_chain: $this:path ) => {
41 {
42 use frame_system::{Config as SystemConfig, pallet_prelude::{BlockNumberFor, HeaderFor}};
43 use $crate::integrity::__private::static_assertions::assert_type_eq_all;
44
45 assert_type_eq_all!(<$r as SystemConfig>::Nonce, bp_runtime::NonceOf<$this>);
50 assert_type_eq_all!(BlockNumberFor<$r>, bp_runtime::BlockNumberOf<$this>);
51 assert_type_eq_all!(<$r as SystemConfig>::Hash, bp_runtime::HashOf<$this>);
52 assert_type_eq_all!(<$r as SystemConfig>::Hashing, bp_runtime::HasherOf<$this>);
53 assert_type_eq_all!(<$r as SystemConfig>::AccountId, bp_runtime::AccountIdOf<$this>);
54 assert_type_eq_all!(HeaderFor<$r>, bp_runtime::HeaderOf<$this>);
55 }
56 }
57);
58
59#[macro_export]
62macro_rules! assert_bridge_messages_pallet_types(
63 (
64 runtime: $r:path,
65 with_bridged_chain_messages_instance: $i:path,
66 this_chain: $this:path,
67 bridged_chain: $bridged:path,
68 expected_payload_type: $payload:path,
69 ) => {
70 {
71 use $crate::integrity::__private::static_assertions::assert_type_eq_all;
72 use bp_messages::ChainWithMessages;
73 use bp_runtime::Chain;
74 use pallet_bridge_messages::Config as BridgeMessagesConfig;
75
76 assert_type_eq_all!(<$r as BridgeMessagesConfig<$i>>::ThisChain, $this);
81 assert_type_eq_all!(<$r as BridgeMessagesConfig<$i>>::BridgedChain, $bridged);
82
83 assert_type_eq_all!(<$r as BridgeMessagesConfig<$i>>::OutboundPayload, $payload);
84 assert_type_eq_all!(<$r as BridgeMessagesConfig<$i>>::InboundPayload, $payload);
85 }
86 }
87);
88
89#[macro_export]
93macro_rules! assert_complete_bridge_types(
94 (
95 runtime: $r:path,
96 with_bridged_chain_messages_instance: $mi:path,
97 this_chain: $this:path,
98 bridged_chain: $bridged:path,
99 expected_payload_type: $payload:path,
100 ) => {
101 $crate::assert_chain_types!(runtime: $r, this_chain: $this);
102 $crate::assert_bridge_messages_pallet_types!(
103 runtime: $r,
104 with_bridged_chain_messages_instance: $mi,
105 this_chain: $this,
106 bridged_chain: $bridged,
107 expected_payload_type: $payload,
108 );
109 }
110);
111
112#[derive(Debug)]
114pub struct AssertChainConstants {
115 pub block_length: limits::BlockLength,
117 pub block_weights: limits::BlockWeights,
119}
120
121pub fn assert_chain_constants<R>(params: AssertChainConstants)
128where
129 R: frame_system::Config,
130{
131 assert_eq!(
141 R::BlockLength::get().encode(),
142 params.block_length.encode(),
143 "BlockLength from runtime ({:?}) differ from hardcoded: {:?}",
144 R::BlockLength::get(),
145 params.block_length,
146 );
147 assert_eq!(
149 R::BlockWeights::get().encode(),
150 params.block_weights.encode(),
151 "BlockWeights from runtime ({:?}) differ from hardcoded: {:?}",
152 R::BlockWeights::get(),
153 params.block_weights,
154 );
155}
156
157pub fn assert_bridge_grandpa_pallet_constants<R, GI>()
159where
160 R: pallet_bridge_grandpa::Config<GI>,
161 GI: 'static,
162{
163 assert!(
164 R::HeadersToKeep::get() > 0,
165 "HeadersToKeep ({}) must be larger than zero",
166 R::HeadersToKeep::get(),
167 );
168}
169
170pub fn assert_bridge_messages_pallet_constants<R, MI>()
172where
173 R: pallet_bridge_messages::Config<MI>,
174 MI: 'static,
175{
176 assert!(
177 pallet_bridge_messages::BridgedChainOf::<R, MI>::MAX_UNREWARDED_RELAYERS_IN_CONFIRMATION_TX
178 <= pallet_bridge_messages::BridgedChainOf::<R, MI>::MAX_UNCONFIRMED_MESSAGES_IN_CONFIRMATION_TX,
179 "MAX_UNREWARDED_RELAYERS_IN_CONFIRMATION_TX ({}) of {:?} is larger than \
180 its MAX_UNCONFIRMED_MESSAGES_IN_CONFIRMATION_TX ({}). This makes \
181 no sense",
182 pallet_bridge_messages::BridgedChainOf::<R, MI>::MAX_UNREWARDED_RELAYERS_IN_CONFIRMATION_TX,
183 pallet_bridge_messages::BridgedChainOf::<R, MI>::ID,
184 pallet_bridge_messages::BridgedChainOf::<R, MI>::MAX_UNCONFIRMED_MESSAGES_IN_CONFIRMATION_TX,
185 );
186}
187
188#[derive(Debug)]
190struct AssertBridgeGrandpaPalletNames<'a> {
191 pub with_bridged_chain_grandpa_pallet_name: &'a str,
194}
195
196fn assert_bridge_grandpa_pallet_names<R, GI>(params: AssertBridgeGrandpaPalletNames)
199where
200 R: pallet_bridge_grandpa::Config<GI>,
201 GI: 'static,
202{
203 assert_eq!(
205 pallet_bridge_grandpa::PalletOwner::<R, GI>::storage_value_final_key().to_vec(),
206 bp_runtime::storage_value_key(
207 params.with_bridged_chain_grandpa_pallet_name,
208 "PalletOwner",
209 )
210 .0,
211 );
212 assert_eq!(
213 pallet_bridge_grandpa::PalletOperatingMode::<R, GI>::storage_value_final_key().to_vec(),
214 bp_runtime::storage_value_key(
215 params.with_bridged_chain_grandpa_pallet_name,
216 "PalletOperatingMode",
217 )
218 .0,
219 );
220}
221
222#[derive(Debug)]
224struct AssertBridgeMessagesPalletNames<'a> {
225 pub with_bridged_chain_messages_pallet_name: &'a str,
228}
229
230fn assert_bridge_messages_pallet_names<R, MI>(params: AssertBridgeMessagesPalletNames)
233where
234 R: pallet_bridge_messages::Config<MI>,
235 MI: 'static,
236{
237 assert_eq!(
239 pallet_bridge_messages::PalletOwner::<R, MI>::storage_value_final_key().to_vec(),
240 bp_runtime::storage_value_key(
241 params.with_bridged_chain_messages_pallet_name,
242 "PalletOwner",
243 )
244 .0,
245 );
246 assert_eq!(
247 pallet_bridge_messages::PalletOperatingMode::<R, MI>::storage_value_final_key().to_vec(),
248 bp_runtime::storage_value_key(
249 params.with_bridged_chain_messages_pallet_name,
250 "PalletOperatingMode",
251 )
252 .0,
253 );
254}
255
256#[derive(Debug)]
258pub struct AssertCompleteBridgeConstants {
259 pub this_chain_constants: AssertChainConstants,
261}
262
263pub fn assert_complete_with_relay_chain_bridge_constants<R, GI, MI>(
266 params: AssertCompleteBridgeConstants,
267) where
268 R: frame_system::Config
269 + pallet_bridge_grandpa::Config<GI>
270 + pallet_bridge_messages::Config<MI>,
271 GI: 'static,
272 MI: 'static,
273{
274 assert_chain_constants::<R>(params.this_chain_constants);
275 assert_bridge_grandpa_pallet_constants::<R, GI>();
276 assert_bridge_messages_pallet_constants::<R, MI>();
277 assert_bridge_grandpa_pallet_names::<R, GI>(AssertBridgeGrandpaPalletNames {
278 with_bridged_chain_grandpa_pallet_name:
279 <R as pallet_bridge_grandpa::Config<GI>>::BridgedChain::WITH_CHAIN_GRANDPA_PALLET_NAME,
280 });
281 assert_bridge_messages_pallet_names::<R, MI>(AssertBridgeMessagesPalletNames {
282 with_bridged_chain_messages_pallet_name:
283 <R as pallet_bridge_messages::Config<MI>>::BridgedChain::WITH_CHAIN_MESSAGES_PALLET_NAME,
284 });
285}
286
287pub fn assert_complete_with_parachain_bridge_constants<R, PI, MI>(
290 params: AssertCompleteBridgeConstants,
291) where
292 R: frame_system::Config
293 + pallet_bridge_parachains::Config<PI>
294 + pallet_bridge_messages::Config<MI>,
295 <R as pallet_bridge_parachains::BoundedBridgeGrandpaConfig<R::BridgesGrandpaPalletInstance>>::BridgedRelayChain: ChainWithGrandpa,
296 PI: 'static,
297 MI: 'static,
298{
299 assert_chain_constants::<R>(params.this_chain_constants);
300 assert_bridge_grandpa_pallet_constants::<R, R::BridgesGrandpaPalletInstance>();
301 assert_bridge_messages_pallet_constants::<R, MI>();
302 assert_bridge_grandpa_pallet_names::<R, R::BridgesGrandpaPalletInstance>(
303 AssertBridgeGrandpaPalletNames {
304 with_bridged_chain_grandpa_pallet_name:
305 <<R as pallet_bridge_parachains::BoundedBridgeGrandpaConfig<
306 R::BridgesGrandpaPalletInstance,
307 >>::BridgedRelayChain>::WITH_CHAIN_GRANDPA_PALLET_NAME,
308 },
309 );
310 assert_bridge_messages_pallet_names::<R, MI>(AssertBridgeMessagesPalletNames {
311 with_bridged_chain_messages_pallet_name:
312 <R as pallet_bridge_messages::Config<MI>>::BridgedChain::WITH_CHAIN_MESSAGES_PALLET_NAME,
313 });
314}
315
316pub fn assert_standalone_messages_bridge_constants<R, MI>(params: AssertCompleteBridgeConstants)
319where
320 R: frame_system::Config + pallet_bridge_messages::Config<MI>,
321 MI: 'static,
322{
323 assert_chain_constants::<R>(params.this_chain_constants);
324 assert_bridge_messages_pallet_constants::<R, MI>();
325 assert_bridge_messages_pallet_names::<R, MI>(AssertBridgeMessagesPalletNames {
326 with_bridged_chain_messages_pallet_name:
327 <R as pallet_bridge_messages::Config<MI>>::BridgedChain::WITH_CHAIN_MESSAGES_PALLET_NAME,
328 });
329}
330
331pub fn check_message_lane_weights<
333 C: ChainWithMessages,
334 T: frame_system::Config + pallet_bridge_messages::Config<MessagesPalletInstance>,
335 MessagesPalletInstance: 'static,
336>(
337 bridged_chain_extra_storage_proof_size: u32,
338 this_chain_max_unrewarded_relayers: MessageNonce,
339 this_chain_max_unconfirmed_messages: MessageNonce,
340 runtime_includes_refund_extension: bool,
345) {
346 type Weights<T, MI> = <T as pallet_bridge_messages::Config<MI>>::WeightInfo;
347
348 pallet_bridge_messages::ensure_weights_are_correct::<Weights<T, MessagesPalletInstance>>();
350
351 pallet_bridge_messages::ensure_maximal_message_dispatch::<Weights<T, MessagesPalletInstance>>(
353 C::maximal_incoming_message_size(),
354 C::maximal_incoming_message_dispatch_weight(),
355 );
356
357 let max_incoming_message_proof_size =
359 bridged_chain_extra_storage_proof_size.saturating_add(C::maximal_incoming_message_size());
360 pallet_bridge_messages::ensure_able_to_receive_message::<Weights<T, MessagesPalletInstance>>(
361 C::max_extrinsic_size(),
362 C::max_extrinsic_weight(),
363 max_incoming_message_proof_size,
364 C::maximal_incoming_message_dispatch_weight(),
365 );
366
367 let max_incoming_inbound_lane_data_proof_size = InboundLaneData::<
369 AccountIdOf<ThisChainOf<T, MessagesPalletInstance>>,
370 >::encoded_size_hint_u32(
371 this_chain_max_unrewarded_relayers as _
372 );
373 pallet_bridge_messages::ensure_able_to_receive_confirmation::<Weights<T, MessagesPalletInstance>>(
374 C::max_extrinsic_size(),
375 C::max_extrinsic_weight(),
376 max_incoming_inbound_lane_data_proof_size,
377 this_chain_max_unrewarded_relayers,
378 this_chain_max_unconfirmed_messages,
379 );
380
381 if runtime_includes_refund_extension {
388 assert_ne!(
389 Weights::<T, MessagesPalletInstance>::receive_messages_proof_overhead_from_runtime(),
390 Weight::zero()
391 );
392 assert_ne!(
393 Weights::<T, MessagesPalletInstance>::receive_messages_delivery_proof_overhead_from_runtime(),
394 Weight::zero()
395 );
396 }
397}