diff --git a/polkadot/node/service/src/chain_spec.rs b/polkadot/node/service/src/chain_spec.rs index d0f2c8699594f4b89c5d7ebb48a99e7739686a66..614acbd0d3150dba53b52ccc0bea8b9bc90a4c7f 100644 --- a/polkadot/node/service/src/chain_spec.rs +++ b/polkadot/node/service/src/chain_spec.rs @@ -1045,22 +1045,22 @@ fn rococo_staging_testnet_config_genesis(wasm_binary: &[u8]) -> rococo_runtime:: }, xcm_pallet: Default::default(), transaction_payment: Default::default(), - // bridge_rococo_grandpa: rococo_runtime::BridgeRococoGrandpaConfig { - // owner: Some(endowed_accounts[0].clone()), - // ..Default::default() - // }, - // bridge_wococo_grandpa: rococo_runtime::BridgeWococoGrandpaConfig { - // owner: Some(endowed_accounts[0].clone()), - // ..Default::default() - // }, - // bridge_rococo_messages: rococo_runtime::BridgeRococoMessagesConfig { - // owner: Some(endowed_accounts[0].clone()), - // ..Default::default() - // }, - // bridge_wococo_messages: rococo_runtime::BridgeWococoMessagesConfig { - // owner: Some(endowed_accounts[0].clone()), - // ..Default::default() - // }, + bridge_rococo_grandpa: rococo_runtime::BridgeRococoGrandpaConfig { + owner: Some(endowed_accounts[0].clone()), + ..Default::default() + }, + bridge_wococo_grandpa: rococo_runtime::BridgeWococoGrandpaConfig { + owner: Some(endowed_accounts[0].clone()), + ..Default::default() + }, + bridge_rococo_messages: rococo_runtime::BridgeRococoMessagesConfig { + owner: Some(endowed_accounts[0].clone()), + ..Default::default() + }, + bridge_wococo_messages: rococo_runtime::BridgeWococoMessagesConfig { + owner: Some(endowed_accounts[0].clone()), + ..Default::default() + }, } } @@ -1555,22 +1555,22 @@ pub fn rococo_testnet_genesis( }, xcm_pallet: Default::default(), transaction_payment: Default::default(), - // bridge_rococo_grandpa: rococo_runtime::BridgeRococoGrandpaConfig { - // owner: Some(root_key.clone()), - // ..Default::default() - // }, - // bridge_wococo_grandpa: rococo_runtime::BridgeWococoGrandpaConfig { - // owner: Some(root_key.clone()), - // ..Default::default() - // }, - // bridge_rococo_messages: rococo_runtime::BridgeRococoMessagesConfig { - // owner: Some(root_key.clone()), - // ..Default::default() - // }, - // bridge_wococo_messages: rococo_runtime::BridgeWococoMessagesConfig { - // owner: Some(root_key.clone()), - // ..Default::default() - // }, + bridge_rococo_grandpa: rococo_runtime::BridgeRococoGrandpaConfig { + owner: Some(root_key.clone()), + ..Default::default() + }, + bridge_wococo_grandpa: rococo_runtime::BridgeWococoGrandpaConfig { + owner: Some(root_key.clone()), + ..Default::default() + }, + bridge_rococo_messages: rococo_runtime::BridgeRococoMessagesConfig { + owner: Some(root_key.clone()), + ..Default::default() + }, + bridge_wococo_messages: rococo_runtime::BridgeWococoMessagesConfig { + owner: Some(root_key.clone()), + ..Default::default() + }, } } diff --git a/polkadot/runtime/rococo/src/bridge_messages.rs b/polkadot/runtime/rococo/src/bridge_messages.rs index 0eef37056843b5699381b0f049f20f925c7901ab..31568f5c51bc67b734c34ee60d5a8e9f58cd36f7 100644 --- a/polkadot/runtime/rococo/src/bridge_messages.rs +++ b/polkadot/runtime/rococo/src/bridge_messages.rs @@ -208,7 +208,7 @@ where B::ThisChain: ChainWithMessages<AccountId = crate::AccountId>, B::BridgedChain: ChainWithMessages<Hash = crate::Hash>, GI: 'static, - crate::Runtime: pallet_bridge_grandpa::Config<GI> + pallet_bridge_messages::Config<B::BridgedMessagesInstance>, + crate::Runtime: pallet_bridge_grandpa::Config<GI>, <<crate::Runtime as pallet_bridge_grandpa::Config<GI>>::BridgedChain as bp_runtime::Chain>::Hash: From<crate::Hash>, { type Error = &'static str; @@ -230,7 +230,7 @@ where B: MessageBridge, B::BridgedChain: ChainWithMessages<Balance = crate::Balance, Hash = crate::Hash>, GI: 'static, - crate::Runtime: pallet_bridge_grandpa::Config<GI> + pallet_bridge_messages::Config<B::BridgedMessagesInstance>, + crate::Runtime: pallet_bridge_grandpa::Config<GI>, <<crate::Runtime as pallet_bridge_grandpa::Config<GI>>::BridgedChain as bp_runtime::Chain>::Hash: From<crate::Hash>, { type Error = &'static str; @@ -240,10 +240,24 @@ where proof: Self::MessagesProof, messages_count: u32, ) -> Result<ProvedMessages<Message<crate::Balance>>, Self::Error> { - messages_target::verify_messages_proof::<B, crate::Runtime, GI>(proof, messages_count) + messages_target::verify_messages_proof::<B, crate::Runtime, GI>(proof, messages_count).and_then(verify_inbound_messages_lane) } } +/// Error that happens when we are receiving incoming message via unexpected lane. +const INBOUND_LANE_DISABLED: &str = "The inbound message lane is disabled."; + +/// Verify that lanes of inbound messages are enabled. +fn verify_inbound_messages_lane( + messages: ProvedMessages<Message<crate::Balance>>, +) -> Result<ProvedMessages<Message<crate::Balance>>, &'static str> { + let allowed_incoming_lanes = [[0, 0, 0, 0]]; + if messages.keys().any(|lane_id| !allowed_incoming_lanes.contains(lane_id)) { + return Err(INBOUND_LANE_DISABLED) + } + Ok(messages) +} + /// The cost of delivery confirmation transaction. pub struct GetDeliveryConfirmationTransactionFee; @@ -267,10 +281,11 @@ mod at_rococo { const THIS_CHAIN_ID: ChainId = ROCOCO_CHAIN_ID; const BRIDGED_CHAIN_ID: ChainId = WOCOCO_CHAIN_ID; const RELAYER_FEE_PERCENT: u32 = 10; + const BRIDGED_MESSAGES_PALLET_NAME: &'static str = + bp_wococo::WITH_ROCOCO_MESSAGES_PALLET_NAME; type ThisChain = RococoAtRococo; type BridgedChain = WococoAtRococo; - type BridgedMessagesInstance = crate::AtWococoWithRococoMessagesInstance; fn bridged_balance_to_this_balance( bridged_balance: bp_wococo::Balance, @@ -316,10 +331,11 @@ mod at_wococo { const THIS_CHAIN_ID: ChainId = WOCOCO_CHAIN_ID; const BRIDGED_CHAIN_ID: ChainId = ROCOCO_CHAIN_ID; const RELAYER_FEE_PERCENT: u32 = 10; + const BRIDGED_MESSAGES_PALLET_NAME: &'static str = + bp_rococo::WITH_WOCOCO_MESSAGES_PALLET_NAME; type ThisChain = WococoAtWococo; type BridgedChain = RococoAtWococo; - type BridgedMessagesInstance = crate::AtRococoWithWococoMessagesInstance; fn bridged_balance_to_this_balance( bridged_balance: bp_rococo::Balance, @@ -356,6 +372,7 @@ mod at_wococo { #[cfg(test)] mod tests { use super::*; + use bp_messages::{target_chain::ProvedLaneMessages, MessageData, MessageKey}; use bridge_runtime_common::messages; use parity_scale_codec::Encode; @@ -377,6 +394,7 @@ mod tests { ADDITIONAL_MESSAGE_BYTE_DELIVERY_WEIGHT, MAX_SINGLE_MESSAGE_DELIVERY_CONFIRMATION_TX_WEIGHT, PAY_INBOUND_DISPATCH_FEE_WEIGHT, + crate::RocksDbWeight::get(), ); let max_incoming_message_proof_size = bp_rococo::EXTRA_STORAGE_PROOF_SIZE.saturating_add( @@ -404,6 +422,7 @@ mod tests { max_incoming_inbound_lane_data_proof_size, bp_rococo::MAX_UNREWARDED_RELAYER_ENTRIES_AT_INBOUND_LANE, bp_rococo::MAX_UNCONFIRMED_MESSAGES_AT_INBOUND_LANE, + crate::RocksDbWeight::get(), ); } @@ -440,4 +459,41 @@ mod tests { extra_bytes_in_transaction, ); } + + fn proved_messages(lane_id: LaneId) -> ProvedMessages<Message<crate::Balance>> { + vec![( + lane_id, + ProvedLaneMessages { + lane_state: None, + messages: vec![Message { + key: MessageKey { lane_id, nonce: 0 }, + data: MessageData { payload: vec![], fee: 0 }, + }], + }, + )] + .into_iter() + .collect() + } + + #[test] + fn verify_inbound_messages_lane_succeeds() { + assert_eq!( + verify_inbound_messages_lane(proved_messages([0, 0, 0, 0])), + Ok(proved_messages([0, 0, 0, 0])), + ); + } + + #[test] + fn verify_inbound_messages_lane_fails() { + assert_eq!( + verify_inbound_messages_lane(proved_messages([0, 0, 0, 1])), + Err(INBOUND_LANE_DISABLED), + ); + + let proved_messages = proved_messages([0, 0, 0, 0]) + .into_iter() + .chain(proved_messages([0, 0, 0, 1])) + .collect(); + assert_eq!(verify_inbound_messages_lane(proved_messages), Err(INBOUND_LANE_DISABLED),); + } } diff --git a/polkadot/runtime/rococo/src/lib.rs b/polkadot/runtime/rococo/src/lib.rs index 996e0042bddcedef97d825f440a2f3f298220cc0..8e4d75ec34b740f1a242aa3ea7df86127fb6f607 100644 --- a/polkadot/runtime/rococo/src/lib.rs +++ b/polkadot/runtime/rococo/src/lib.rs @@ -73,9 +73,9 @@ use runtime_parachains::{ session_info as parachains_session_info, shared as parachains_shared, ump as parachains_ump, }; -// use bridge_runtime_common::messages::{ -// source::estimate_message_dispatch_and_delivery_fee, MessageBridge, -// }; +use bridge_runtime_common::messages::{ + source::estimate_message_dispatch_and_delivery_fee, MessageBridge, +}; pub use pallet_balances::Call as BalancesCall; @@ -92,7 +92,7 @@ use xcm_builder::{ }; use xcm_executor::XcmExecutor; -//mod bridge_messages; +mod bridge_messages; /// Constant values used within the runtime. pub mod constants; mod validator_manager; @@ -255,21 +255,21 @@ construct_runtime! { Beefy: pallet_beefy, MmrLeaf: pallet_beefy_mmr, + // Validator Manager pallet. + ValidatorManager: validator_manager, + // It might seem strange that we add both sides of the bridge to the same runtime. We do this because this // runtime as shared by both the Rococo and Wococo chains. When running as Rococo we only use // `BridgeWococoGrandpa`, and vice versa. - // BridgeRococoGrandpa: pallet_bridge_grandpa::{Pallet, Call, Storage, Config<T>} = 40, - // BridgeWococoGrandpa: pallet_bridge_grandpa::<Instance1>::{Pallet, Call, Storage, Config<T>} = 41, - - // Validator Manager pallet. - ValidatorManager: validator_manager, + BridgeRococoGrandpa: pallet_bridge_grandpa::{Pallet, Call, Storage, Config<T>} = 40, + BridgeWococoGrandpa: pallet_bridge_grandpa::<Instance1>::{Pallet, Call, Storage, Config<T>} = 41, // Bridge messages support. The same story as with the bridge grandpa pallet above ^^^ - when we're // running as Rococo we only use `BridgeWococoMessages`/`BridgeWococoMessagesDispatch`, and vice versa. - // BridgeRococoMessages: pallet_bridge_messages::{Pallet, Call, Storage, Event<T>, Config<T>} = 43, - // BridgeWococoMessages: pallet_bridge_messages::<Instance1>::{Pallet, Call, Storage, Event<T>, Config<T>} = 44, - // BridgeRococoMessagesDispatch: pallet_bridge_dispatch::{Pallet, Event<T>} = 45, - // BridgeWococoMessagesDispatch: pallet_bridge_dispatch::<Instance1>::{Pallet, Event<T>} = 46, + BridgeRococoMessages: pallet_bridge_messages::{Pallet, Call, Storage, Event<T>, Config<T>} = 43, + BridgeWococoMessages: pallet_bridge_messages::<Instance1>::{Pallet, Call, Storage, Event<T>, Config<T>} = 44, + BridgeRococoMessagesDispatch: pallet_bridge_dispatch::{Pallet, Event<T>} = 45, + BridgeWococoMessagesDispatch: pallet_bridge_dispatch::<Instance1>::{Pallet, Event<T>} = 46, // A "council" Collective: pallet_collective = 80, @@ -873,144 +873,152 @@ impl pallet_beefy_mmr::Config for Runtime { type ParachainHeads = ParasProvider; } -// parameter_types! { -// /// This is a pretty unscientific cap. -// /// -// /// Note that once this is hit the pallet will essentially throttle incoming requests down to one -// /// call per block. -// pub const MaxRequests: u32 = 4 * HOURS as u32; - -// /// Number of headers to keep. -// /// -// /// Assuming the worst case of every header being finalized, we will keep headers at least for a -// /// week. -// pub const HeadersToKeep: u32 = 7 * DAYS as u32; -// } - -// pub type RococoGrandpaInstance = (); -// impl pallet_bridge_grandpa::Config for Runtime { -// type BridgedChain = bp_rococo::Rococo; -// type MaxRequests = MaxRequests; -// type HeadersToKeep = HeadersToKeep; - -// type WeightInfo = pallet_bridge_grandpa::weights::RialtoWeight<Runtime>; -// } - -// pub type WococoGrandpaInstance = pallet_bridge_grandpa::Instance1; -// impl pallet_bridge_grandpa::Config<WococoGrandpaInstance> for Runtime { -// type BridgedChain = bp_wococo::Wococo; -// type MaxRequests = MaxRequests; -// type HeadersToKeep = HeadersToKeep; - -// type WeightInfo = pallet_bridge_grandpa::weights::RialtoWeight<Runtime>; -// } - -// // Instance that is "deployed" at Wococo chain. Responsible for dispatching Rococo -> Wococo messages. -// pub type AtWococoFromRococoMessagesDispatch = pallet_bridge_dispatch::DefaultInstance; -// impl pallet_bridge_dispatch::Config<AtWococoFromRococoMessagesDispatch> for Runtime { -// type Event = Event; -// type MessageId = (bp_messages::LaneId, bp_messages::MessageNonce); -// type Call = Call; -// type CallFilter = frame_support::traits::Everything; -// type EncodedCall = bridge_messages::FromRococoEncodedCall; -// type SourceChainAccountId = bp_wococo::AccountId; -// type TargetChainAccountPublic = sp_runtime::MultiSigner; -// type TargetChainSignature = sp_runtime::MultiSignature; -// type AccountIdConverter = bp_rococo::AccountIdConverter; -// } - -// // Instance that is "deployed" at Rococo chain. Responsible for dispatching Wococo -> Rococo messages. -// pub type AtRococoFromWococoMessagesDispatch = pallet_bridge_dispatch::Instance1; -// impl pallet_bridge_dispatch::Config<AtRococoFromWococoMessagesDispatch> for Runtime { -// type Event = Event; -// type MessageId = (bp_messages::LaneId, bp_messages::MessageNonce); -// type Call = Call; -// type CallFilter = frame_support::traits::Everything; -// type EncodedCall = bridge_messages::FromWococoEncodedCall; -// type SourceChainAccountId = bp_rococo::AccountId; -// type TargetChainAccountPublic = sp_runtime::MultiSigner; -// type TargetChainSignature = sp_runtime::MultiSignature; -// type AccountIdConverter = bp_wococo::AccountIdConverter; -// } - -// parameter_types! { -// pub const MaxMessagesToPruneAtOnce: bp_messages::MessageNonce = 8; -// pub const MaxUnrewardedRelayerEntriesAtInboundLane: bp_messages::MessageNonce = -// bp_rococo::MAX_UNREWARDED_RELAYER_ENTRIES_AT_INBOUND_LANE; -// pub const MaxUnconfirmedMessagesAtInboundLane: bp_messages::MessageNonce = -// bp_rococo::MAX_UNCONFIRMED_MESSAGES_AT_INBOUND_LANE; -// pub const RootAccountForPayments: Option<AccountId> = None; -// } - -// // Instance that is "deployed" at Wococo chain. Responsible for sending Wococo -> Rococo messages -// // and receiving Rococo -> Wococo messages. -// pub type AtWococoWithRococoMessagesInstance = pallet_bridge_messages::DefaultInstance; -// impl pallet_bridge_messages::Config<AtWococoWithRococoMessagesInstance> for Runtime { -// type Event = Event; -// type WeightInfo = pallet_bridge_messages::weights::RialtoWeight<Runtime>; -// type Parameter = (); -// type MaxMessagesToPruneAtOnce = MaxMessagesToPruneAtOnce; -// type MaxUnrewardedRelayerEntriesAtInboundLane = MaxUnrewardedRelayerEntriesAtInboundLane; -// type MaxUnconfirmedMessagesAtInboundLane = MaxUnconfirmedMessagesAtInboundLane; - -// type OutboundPayload = crate::bridge_messages::ToRococoMessagePayload; -// type OutboundMessageFee = bp_wococo::Balance; - -// type InboundPayload = crate::bridge_messages::FromRococoMessagePayload; -// type InboundMessageFee = bp_rococo::Balance; -// type InboundRelayer = bp_rococo::AccountId; - -// type AccountIdConverter = bp_wococo::AccountIdConverter; - -// type TargetHeaderChain = crate::bridge_messages::RococoAtWococo; -// type LaneMessageVerifier = crate::bridge_messages::ToRococoMessageVerifier; -// type MessageDeliveryAndDispatchPayment = -// pallet_bridge_messages::instant_payments::InstantCurrencyPayments< -// Runtime, -// pallet_balances::Pallet<Runtime>, -// crate::bridge_messages::GetDeliveryConfirmationTransactionFee, -// RootAccountForPayments, -// >; -// type OnDeliveryConfirmed = (); - -// type SourceHeaderChain = crate::bridge_messages::RococoAtWococo; -// type MessageDispatch = crate::bridge_messages::FromRococoMessageDispatch; -// } - -// // Instance that is "deployed" at Rococo chain. Responsible for sending Rococo -> Wococo messages -// // and receiving Wococo -> Rococo messages. -// pub type AtRococoWithWococoMessagesInstance = pallet_bridge_messages::Instance1; -// impl pallet_bridge_messages::Config<AtRococoWithWococoMessagesInstance> for Runtime { -// type Event = Event; -// type WeightInfo = pallet_bridge_messages::weights::RialtoWeight<Runtime>; -// type Parameter = (); -// type MaxMessagesToPruneAtOnce = MaxMessagesToPruneAtOnce; -// type MaxUnrewardedRelayerEntriesAtInboundLane = MaxUnrewardedRelayerEntriesAtInboundLane; -// type MaxUnconfirmedMessagesAtInboundLane = MaxUnconfirmedMessagesAtInboundLane; - -// type OutboundPayload = crate::bridge_messages::ToWococoMessagePayload; -// type OutboundMessageFee = bp_rococo::Balance; - -// type InboundPayload = crate::bridge_messages::FromWococoMessagePayload; -// type InboundMessageFee = bp_wococo::Balance; -// type InboundRelayer = bp_wococo::AccountId; - -// type AccountIdConverter = bp_rococo::AccountIdConverter; - -// type TargetHeaderChain = crate::bridge_messages::WococoAtRococo; -// type LaneMessageVerifier = crate::bridge_messages::ToWococoMessageVerifier; -// type MessageDeliveryAndDispatchPayment = -// pallet_bridge_messages::instant_payments::InstantCurrencyPayments< -// Runtime, -// pallet_balances::Pallet<Runtime>, -// crate::bridge_messages::GetDeliveryConfirmationTransactionFee, -// RootAccountForPayments, -// >; -// type OnDeliveryConfirmed = (); - -// type SourceHeaderChain = crate::bridge_messages::WococoAtRococo; -// type MessageDispatch = crate::bridge_messages::FromWococoMessageDispatch; -// } +parameter_types! { + /// This is a pretty unscientific cap. + /// + /// Note that once this is hit the pallet will essentially throttle incoming requests down to one + /// call per block. + pub const MaxRequests: u32 = 4 * HOURS as u32; + + /// Number of headers to keep. + /// + /// Assuming the worst case of every header being finalized, we will keep headers at least for a + /// week. + pub const HeadersToKeep: u32 = 7 * DAYS as u32; +} + +pub type RococoGrandpaInstance = (); +impl pallet_bridge_grandpa::Config for Runtime { + type BridgedChain = bp_rococo::Rococo; + type MaxRequests = MaxRequests; + type HeadersToKeep = HeadersToKeep; + + type WeightInfo = pallet_bridge_grandpa::weights::RialtoWeight<Runtime>; +} + +pub type WococoGrandpaInstance = pallet_bridge_grandpa::Instance1; +impl pallet_bridge_grandpa::Config<WococoGrandpaInstance> for Runtime { + type BridgedChain = bp_wococo::Wococo; + type MaxRequests = MaxRequests; + type HeadersToKeep = HeadersToKeep; + + type WeightInfo = pallet_bridge_grandpa::weights::RialtoWeight<Runtime>; +} + +// Instance that is "deployed" at Wococo chain. Responsible for dispatching Rococo -> Wococo messages. +pub type AtWococoFromRococoMessagesDispatch = (); +impl pallet_bridge_dispatch::Config<AtWococoFromRococoMessagesDispatch> for Runtime { + type Event = Event; + type BridgeMessageId = (bp_messages::LaneId, bp_messages::MessageNonce); + type Call = Call; + type CallFilter = frame_support::traits::Everything; + type EncodedCall = bridge_messages::FromRococoEncodedCall; + type SourceChainAccountId = bp_wococo::AccountId; + type TargetChainAccountPublic = sp_runtime::MultiSigner; + type TargetChainSignature = sp_runtime::MultiSignature; + type AccountIdConverter = bp_rococo::AccountIdConverter; +} + +// Instance that is "deployed" at Rococo chain. Responsible for dispatching Wococo -> Rococo messages. +pub type AtRococoFromWococoMessagesDispatch = pallet_bridge_dispatch::Instance1; +impl pallet_bridge_dispatch::Config<AtRococoFromWococoMessagesDispatch> for Runtime { + type Event = Event; + type BridgeMessageId = (bp_messages::LaneId, bp_messages::MessageNonce); + type Call = Call; + type CallFilter = frame_support::traits::Everything; + type EncodedCall = bridge_messages::FromWococoEncodedCall; + type SourceChainAccountId = bp_rococo::AccountId; + type TargetChainAccountPublic = sp_runtime::MultiSigner; + type TargetChainSignature = sp_runtime::MultiSignature; + type AccountIdConverter = bp_wococo::AccountIdConverter; +} + +parameter_types! { + pub const MaxMessagesToPruneAtOnce: bp_messages::MessageNonce = 8; + pub const MaxUnrewardedRelayerEntriesAtInboundLane: bp_messages::MessageNonce = + bp_rococo::MAX_UNREWARDED_RELAYER_ENTRIES_AT_INBOUND_LANE; + pub const MaxUnconfirmedMessagesAtInboundLane: bp_messages::MessageNonce = + bp_rococo::MAX_UNCONFIRMED_MESSAGES_AT_INBOUND_LANE; + pub const RootAccountForPayments: Option<AccountId> = None; + pub const RococoChainId: bp_runtime::ChainId = bp_runtime::ROCOCO_CHAIN_ID; + pub const WococoChainId: bp_runtime::ChainId = bp_runtime::WOCOCO_CHAIN_ID; +} + +// Instance that is "deployed" at Wococo chain. Responsible for sending Wococo -> Rococo messages +// and receiving Rococo -> Wococo messages. +pub type AtWococoWithRococoMessagesInstance = (); +impl pallet_bridge_messages::Config<AtWococoWithRococoMessagesInstance> for Runtime { + type Event = Event; + type BridgedChainId = RococoChainId; + type WeightInfo = pallet_bridge_messages::weights::RialtoWeight<Runtime>; + type Parameter = (); + type MaxMessagesToPruneAtOnce = MaxMessagesToPruneAtOnce; + type MaxUnrewardedRelayerEntriesAtInboundLane = MaxUnrewardedRelayerEntriesAtInboundLane; + type MaxUnconfirmedMessagesAtInboundLane = MaxUnconfirmedMessagesAtInboundLane; + + type OutboundPayload = crate::bridge_messages::ToRococoMessagePayload; + type OutboundMessageFee = bp_wococo::Balance; + + type InboundPayload = crate::bridge_messages::FromRococoMessagePayload; + type InboundMessageFee = bp_rococo::Balance; + type InboundRelayer = bp_rococo::AccountId; + + type AccountIdConverter = bp_wococo::AccountIdConverter; + + type TargetHeaderChain = crate::bridge_messages::RococoAtWococo; + type LaneMessageVerifier = crate::bridge_messages::ToRococoMessageVerifier; + type MessageDeliveryAndDispatchPayment = + pallet_bridge_messages::instant_payments::InstantCurrencyPayments< + Runtime, + AtWococoWithRococoMessagesInstance, + pallet_balances::Pallet<Runtime>, + crate::bridge_messages::GetDeliveryConfirmationTransactionFee, + RootAccountForPayments, + >; + type OnDeliveryConfirmed = (); + type OnMessageAccepted = (); + + type SourceHeaderChain = crate::bridge_messages::RococoAtWococo; + type MessageDispatch = crate::bridge_messages::FromRococoMessageDispatch; +} + +// Instance that is "deployed" at Rococo chain. Responsible for sending Rococo -> Wococo messages +// and receiving Wococo -> Rococo messages. +pub type AtRococoWithWococoMessagesInstance = pallet_bridge_messages::Instance1; +impl pallet_bridge_messages::Config<AtRococoWithWococoMessagesInstance> for Runtime { + type Event = Event; + type BridgedChainId = WococoChainId; + type WeightInfo = pallet_bridge_messages::weights::RialtoWeight<Runtime>; + type Parameter = (); + type MaxMessagesToPruneAtOnce = MaxMessagesToPruneAtOnce; + type MaxUnrewardedRelayerEntriesAtInboundLane = MaxUnrewardedRelayerEntriesAtInboundLane; + type MaxUnconfirmedMessagesAtInboundLane = MaxUnconfirmedMessagesAtInboundLane; + + type OutboundPayload = crate::bridge_messages::ToWococoMessagePayload; + type OutboundMessageFee = bp_rococo::Balance; + + type InboundPayload = crate::bridge_messages::FromWococoMessagePayload; + type InboundMessageFee = bp_wococo::Balance; + type InboundRelayer = bp_wococo::AccountId; + + type AccountIdConverter = bp_rococo::AccountIdConverter; + + type TargetHeaderChain = crate::bridge_messages::WococoAtRococo; + type LaneMessageVerifier = crate::bridge_messages::ToWococoMessageVerifier; + type MessageDeliveryAndDispatchPayment = + pallet_bridge_messages::instant_payments::InstantCurrencyPayments< + Runtime, + AtRococoWithWococoMessagesInstance, + pallet_balances::Pallet<Runtime>, + crate::bridge_messages::GetDeliveryConfirmationTransactionFee, + RootAccountForPayments, + >; + type OnDeliveryConfirmed = (); + type OnMessageAccepted = (); + + type SourceHeaderChain = crate::bridge_messages::WococoAtRococo; + type MessageDispatch = crate::bridge_messages::FromWococoMessageDispatch; +} impl Randomness<Hash, BlockNumber> for ParentHashRandomness { fn random(subject: &[u8]) -> (Hash, BlockNumber) { @@ -1500,137 +1508,137 @@ sp_api::impl_runtime_apis! { } } - // impl bp_rococo::RococoFinalityApi<Block> for Runtime { - // fn best_finalized() -> (bp_rococo::BlockNumber, bp_rococo::Hash) { - // let header = BridgeRococoGrandpa::best_finalized(); - // (header.number, header.hash()) - // } - - // fn is_known_header(hash: bp_rococo::Hash) -> bool { - // BridgeRococoGrandpa::is_known_header(hash) - // } - // } - - // impl bp_wococo::WococoFinalityApi<Block> for Runtime { - // fn best_finalized() -> (bp_wococo::BlockNumber, bp_wococo::Hash) { - // let header = BridgeWococoGrandpa::best_finalized(); - // (header.number, header.hash()) - // } - - // fn is_known_header(hash: bp_wococo::Hash) -> bool { - // BridgeWococoGrandpa::is_known_header(hash) - // } - // } - - // impl bp_rococo::ToRococoOutboundLaneApi<Block, Balance, bridge_messages::ToRococoMessagePayload> for Runtime { - // fn estimate_message_delivery_and_dispatch_fee( - // _lane_id: bp_messages::LaneId, - // payload: bridge_messages::ToWococoMessagePayload, - // ) -> Option<Balance> { - // estimate_message_dispatch_and_delivery_fee::<bridge_messages::AtWococoWithRococoMessageBridge>( - // &payload, - // bridge_messages::AtWococoWithRococoMessageBridge::RELAYER_FEE_PERCENT, - // ).ok() - // } - - // fn message_details( - // lane: bp_messages::LaneId, - // begin: bp_messages::MessageNonce, - // end: bp_messages::MessageNonce, - // ) -> Vec<bp_messages::MessageDetails<Balance>> { - // (begin..=end).filter_map(|nonce| { - // let message_data = BridgeRococoMessages::outbound_message_data(lane, nonce)?; - // let decoded_payload = bridge_messages::ToRococoMessagePayload::decode( - // &mut &message_data.payload[..] - // ).ok()?; - // Some(bp_messages::MessageDetails { - // nonce, - // dispatch_weight: decoded_payload.weight, - // size: message_data.payload.len() as _, - // delivery_and_dispatch_fee: message_data.fee, - // dispatch_fee_payment: decoded_payload.dispatch_fee_payment, - // }) - // }) - // .collect() - // } - - // fn latest_received_nonce(lane: bp_messages::LaneId) -> bp_messages::MessageNonce { - // BridgeRococoMessages::outbound_latest_received_nonce(lane) - // } - - // fn latest_generated_nonce(lane: bp_messages::LaneId) -> bp_messages::MessageNonce { - // BridgeRococoMessages::outbound_latest_generated_nonce(lane) - // } - // } - - // impl bp_rococo::FromRococoInboundLaneApi<Block> for Runtime { - // fn latest_received_nonce(lane: bp_messages::LaneId) -> bp_messages::MessageNonce { - // BridgeRococoMessages::inbound_latest_received_nonce(lane) - // } - - // fn latest_confirmed_nonce(lane: bp_messages::LaneId) -> bp_messages::MessageNonce { - // BridgeRococoMessages::inbound_latest_confirmed_nonce(lane) - // } - - // fn unrewarded_relayers_state(lane: bp_messages::LaneId) -> bp_messages::UnrewardedRelayersState { - // BridgeRococoMessages::inbound_unrewarded_relayers_state(lane) - // } - // } - - // impl bp_wococo::ToWococoOutboundLaneApi<Block, Balance, bridge_messages::ToWococoMessagePayload> for Runtime { - // fn estimate_message_delivery_and_dispatch_fee( - // _lane_id: bp_messages::LaneId, - // payload: bridge_messages::ToWococoMessagePayload, - // ) -> Option<Balance> { - // estimate_message_dispatch_and_delivery_fee::<bridge_messages::AtRococoWithWococoMessageBridge>( - // &payload, - // bridge_messages::AtRococoWithWococoMessageBridge::RELAYER_FEE_PERCENT, - // ).ok() - // } - - // fn message_details( - // lane: bp_messages::LaneId, - // begin: bp_messages::MessageNonce, - // end: bp_messages::MessageNonce, - // ) -> Vec<bp_messages::MessageDetails<Balance>> { - // (begin..=end).filter_map(|nonce| { - // let message_data = BridgeWococoMessages::outbound_message_data(lane, nonce)?; - // let decoded_payload = bridge_messages::ToWococoMessagePayload::decode( - // &mut &message_data.payload[..] - // ).ok()?; - // Some(bp_messages::MessageDetails { - // nonce, - // dispatch_weight: decoded_payload.weight, - // size: message_data.payload.len() as _, - // delivery_and_dispatch_fee: message_data.fee, - // dispatch_fee_payment: decoded_payload.dispatch_fee_payment, - // }) - // }) - // .collect() - // } - - // fn latest_received_nonce(lane: bp_messages::LaneId) -> bp_messages::MessageNonce { - // BridgeWococoMessages::outbound_latest_received_nonce(lane) - // } - - // fn latest_generated_nonce(lane: bp_messages::LaneId) -> bp_messages::MessageNonce { - // BridgeWococoMessages::outbound_latest_generated_nonce(lane) - // } - // } - - // impl bp_wococo::FromWococoInboundLaneApi<Block> for Runtime { - // fn latest_received_nonce(lane: bp_messages::LaneId) -> bp_messages::MessageNonce { - // BridgeWococoMessages::inbound_latest_received_nonce(lane) - // } - - // fn latest_confirmed_nonce(lane: bp_messages::LaneId) -> bp_messages::MessageNonce { - // BridgeWococoMessages::inbound_latest_confirmed_nonce(lane) - // } - - // fn unrewarded_relayers_state(lane: bp_messages::LaneId) -> bp_messages::UnrewardedRelayersState { - // BridgeWococoMessages::inbound_unrewarded_relayers_state(lane) - // } - // } + impl bp_rococo::RococoFinalityApi<Block> for Runtime { + fn best_finalized() -> (bp_rococo::BlockNumber, bp_rococo::Hash) { + let header = BridgeRococoGrandpa::best_finalized(); + (header.number, header.hash()) + } + + fn is_known_header(hash: bp_rococo::Hash) -> bool { + BridgeRococoGrandpa::is_known_header(hash) + } + } + + impl bp_wococo::WococoFinalityApi<Block> for Runtime { + fn best_finalized() -> (bp_wococo::BlockNumber, bp_wococo::Hash) { + let header = BridgeWococoGrandpa::best_finalized(); + (header.number, header.hash()) + } + + fn is_known_header(hash: bp_wococo::Hash) -> bool { + BridgeWococoGrandpa::is_known_header(hash) + } + } + + impl bp_rococo::ToRococoOutboundLaneApi<Block, Balance, bridge_messages::ToRococoMessagePayload> for Runtime { + fn estimate_message_delivery_and_dispatch_fee( + _lane_id: bp_messages::LaneId, + payload: bridge_messages::ToWococoMessagePayload, + ) -> Option<Balance> { + estimate_message_dispatch_and_delivery_fee::<bridge_messages::AtWococoWithRococoMessageBridge>( + &payload, + bridge_messages::AtWococoWithRococoMessageBridge::RELAYER_FEE_PERCENT, + ).ok() + } + + fn message_details( + lane: bp_messages::LaneId, + begin: bp_messages::MessageNonce, + end: bp_messages::MessageNonce, + ) -> Vec<bp_messages::MessageDetails<Balance>> { + (begin..=end).filter_map(|nonce| { + let message_data = BridgeRococoMessages::outbound_message_data(lane, nonce)?; + let decoded_payload = bridge_messages::ToRococoMessagePayload::decode( + &mut &message_data.payload[..] + ).ok()?; + Some(bp_messages::MessageDetails { + nonce, + dispatch_weight: decoded_payload.weight, + size: message_data.payload.len() as _, + delivery_and_dispatch_fee: message_data.fee, + dispatch_fee_payment: decoded_payload.dispatch_fee_payment, + }) + }) + .collect() + } + + fn latest_received_nonce(lane: bp_messages::LaneId) -> bp_messages::MessageNonce { + BridgeRococoMessages::outbound_latest_received_nonce(lane) + } + + fn latest_generated_nonce(lane: bp_messages::LaneId) -> bp_messages::MessageNonce { + BridgeRococoMessages::outbound_latest_generated_nonce(lane) + } + } + + impl bp_rococo::FromRococoInboundLaneApi<Block> for Runtime { + fn latest_received_nonce(lane: bp_messages::LaneId) -> bp_messages::MessageNonce { + BridgeRococoMessages::inbound_latest_received_nonce(lane) + } + + fn latest_confirmed_nonce(lane: bp_messages::LaneId) -> bp_messages::MessageNonce { + BridgeRococoMessages::inbound_latest_confirmed_nonce(lane) + } + + fn unrewarded_relayers_state(lane: bp_messages::LaneId) -> bp_messages::UnrewardedRelayersState { + BridgeRococoMessages::inbound_unrewarded_relayers_state(lane) + } + } + + impl bp_wococo::ToWococoOutboundLaneApi<Block, Balance, bridge_messages::ToWococoMessagePayload> for Runtime { + fn estimate_message_delivery_and_dispatch_fee( + _lane_id: bp_messages::LaneId, + payload: bridge_messages::ToWococoMessagePayload, + ) -> Option<Balance> { + estimate_message_dispatch_and_delivery_fee::<bridge_messages::AtRococoWithWococoMessageBridge>( + &payload, + bridge_messages::AtRococoWithWococoMessageBridge::RELAYER_FEE_PERCENT, + ).ok() + } + + fn message_details( + lane: bp_messages::LaneId, + begin: bp_messages::MessageNonce, + end: bp_messages::MessageNonce, + ) -> Vec<bp_messages::MessageDetails<Balance>> { + (begin..=end).filter_map(|nonce| { + let message_data = BridgeWococoMessages::outbound_message_data(lane, nonce)?; + let decoded_payload = bridge_messages::ToWococoMessagePayload::decode( + &mut &message_data.payload[..] + ).ok()?; + Some(bp_messages::MessageDetails { + nonce, + dispatch_weight: decoded_payload.weight, + size: message_data.payload.len() as _, + delivery_and_dispatch_fee: message_data.fee, + dispatch_fee_payment: decoded_payload.dispatch_fee_payment, + }) + }) + .collect() + } + + fn latest_received_nonce(lane: bp_messages::LaneId) -> bp_messages::MessageNonce { + BridgeWococoMessages::outbound_latest_received_nonce(lane) + } + + fn latest_generated_nonce(lane: bp_messages::LaneId) -> bp_messages::MessageNonce { + BridgeWococoMessages::outbound_latest_generated_nonce(lane) + } + } + + impl bp_wococo::FromWococoInboundLaneApi<Block> for Runtime { + fn latest_received_nonce(lane: bp_messages::LaneId) -> bp_messages::MessageNonce { + BridgeWococoMessages::inbound_latest_received_nonce(lane) + } + + fn latest_confirmed_nonce(lane: bp_messages::LaneId) -> bp_messages::MessageNonce { + BridgeWococoMessages::inbound_latest_confirmed_nonce(lane) + } + + fn unrewarded_relayers_state(lane: bp_messages::LaneId) -> bp_messages::UnrewardedRelayersState { + BridgeWococoMessages::inbound_unrewarded_relayers_state(lane) + } + } impl frame_system_rpc_runtime_api::AccountNonceApi<Block, AccountId, Nonce> for Runtime { fn account_nonce(account: AccountId) -> Nonce {