diff --git a/bridges/bin/millau/runtime/src/lib.rs b/bridges/bin/millau/runtime/src/lib.rs index 46921edd58..ff5b39439b 100644 --- a/bridges/bin/millau/runtime/src/lib.rs +++ b/bridges/bin/millau/runtime/src/lib.rs @@ -35,7 +35,6 @@ pub mod rialto_messages; use crate::rialto_messages::{ToRialtoMessagePayload, WithRialtoMessageBridge}; use bridge_runtime_common::messages::{source::estimate_message_dispatch_and_delivery_fee, MessageBridge}; -use codec::Decode; use pallet_grandpa::{fg_primitives, AuthorityId as GrandpaId, AuthorityList as GrandpaAuthorityList}; use pallet_transaction_payment::{FeeDetails, Multiplier, RuntimeDispatchInfo}; use sp_api::impl_runtime_apis; @@ -620,20 +619,11 @@ impl_runtime_apis! { begin: bp_messages::MessageNonce, end: bp_messages::MessageNonce, ) -> Vec> { - (begin..=end).filter_map(|nonce| { - let message_data = BridgeRialtoMessages::outbound_message_data(lane, nonce)?; - let decoded_payload = rialto_messages::ToRialtoMessagePayload::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() + bridge_runtime_common::messages_api::outbound_message_details::< + Runtime, + WithRialtoMessagesInstance, + WithRialtoMessageBridge, + >(lane, begin, end) } fn latest_received_nonce(lane: bp_messages::LaneId) -> bp_messages::MessageNonce { diff --git a/bridges/bin/rialto/runtime/src/lib.rs b/bridges/bin/rialto/runtime/src/lib.rs index fe503154c8..762ef17102 100644 --- a/bridges/bin/rialto/runtime/src/lib.rs +++ b/bridges/bin/rialto/runtime/src/lib.rs @@ -41,7 +41,6 @@ pub mod rialto_poa; use crate::millau_messages::{ToMillauMessagePayload, WithMillauMessageBridge}; use bridge_runtime_common::messages::{source::estimate_message_dispatch_and_delivery_fee, MessageBridge}; -use codec::Decode; use pallet_grandpa::{fg_primitives, AuthorityId as GrandpaId, AuthorityList as GrandpaAuthorityList}; use pallet_transaction_payment::{FeeDetails, Multiplier, RuntimeDispatchInfo}; use sp_api::impl_runtime_apis; @@ -839,20 +838,11 @@ impl_runtime_apis! { begin: bp_messages::MessageNonce, end: bp_messages::MessageNonce, ) -> Vec> { - (begin..=end).filter_map(|nonce| { - let message_data = BridgeMillauMessages::outbound_message_data(lane, nonce)?; - let decoded_payload = millau_messages::ToMillauMessagePayload::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() + bridge_runtime_common::messages_api::outbound_message_details::< + Runtime, + WithMillauMessagesInstance, + WithMillauMessageBridge, + >(lane, begin, end) } fn latest_received_nonce(lane: bp_messages::LaneId) -> bp_messages::MessageNonce { diff --git a/bridges/bin/runtime-common/src/lib.rs b/bridges/bin/runtime-common/src/lib.rs index ae7efb4a41..66f2c6c3a0 100644 --- a/bridges/bin/runtime-common/src/lib.rs +++ b/bridges/bin/runtime-common/src/lib.rs @@ -19,4 +19,5 @@ #![cfg_attr(not(feature = "std"), no_std)] pub mod messages; +pub mod messages_api; pub mod messages_benchmarking; diff --git a/bridges/bin/runtime-common/src/messages_api.rs b/bridges/bin/runtime-common/src/messages_api.rs new file mode 100644 index 0000000000..d0f4180b5c --- /dev/null +++ b/bridges/bin/runtime-common/src/messages_api.rs @@ -0,0 +1,52 @@ +// Copyright 2019-2021 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 . + +//! Helpers for implementing various message-related runtime API mthods. + +use crate::messages::{source::FromThisChainMessagePayload, MessageBridge}; + +use bp_messages::{LaneId, MessageDetails, MessageNonce}; +use codec::Decode; +use frame_support::traits::Instance; +use sp_std::vec::Vec; + +/// Implementation of the `To*OutboundLaneApi::message_details`. +pub fn outbound_message_details( + lane: LaneId, + begin: MessageNonce, + end: MessageNonce, +) -> Vec> +where + Runtime: pallet_bridge_messages::Config, + MessagesPalletInstance: Instance, + BridgeConfig: MessageBridge, +{ + (begin..=end) + .filter_map(|nonce| { + let message_data = + pallet_bridge_messages::Pallet::::outbound_message_data(lane, nonce)?; + let decoded_payload = + FromThisChainMessagePayload::::decode(&mut &message_data.payload[..]).ok()?; + Some(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() +}