diff --git a/bridges/relays/bin-substrate/src/chains/millau_messages_to_rialto.rs b/bridges/relays/bin-substrate/src/chains/millau_messages_to_rialto.rs index 8f621eeca7..4195e452d9 100644 --- a/bridges/relays/bin-substrate/src/chains/millau_messages_to_rialto.rs +++ b/bridges/relays/bin-substrate/src/chains/millau_messages_to_rialto.rs @@ -147,10 +147,10 @@ impl SubstrateMessageLane for MillauMessagesToRialto { } /// Millau node as messages source. -type MillauSourceClient = SubstrateMessagesSource; +type MillauSourceClient = SubstrateMessagesSource; /// Rialto node as messages target. -type RialtoTargetClient = SubstrateMessagesTarget; +type RialtoTargetClient = SubstrateMessagesTarget; /// Run Millau-to-Rialto messages sync. pub async fn run( diff --git a/bridges/relays/bin-substrate/src/chains/rialto_messages_to_millau.rs b/bridges/relays/bin-substrate/src/chains/rialto_messages_to_millau.rs index f0ec60864d..6fc7ee5b08 100644 --- a/bridges/relays/bin-substrate/src/chains/rialto_messages_to_millau.rs +++ b/bridges/relays/bin-substrate/src/chains/rialto_messages_to_millau.rs @@ -147,10 +147,10 @@ impl SubstrateMessageLane for RialtoMessagesToMillau { } /// Rialto node as messages source. -type RialtoSourceClient = SubstrateMessagesSource; +type RialtoSourceClient = SubstrateMessagesSource; /// Millau node as messages target. -type MillauTargetClient = SubstrateMessagesTarget; +type MillauTargetClient = SubstrateMessagesTarget; /// Run Rialto-to-Millau messages sync. pub async fn run( diff --git a/bridges/relays/bin-substrate/src/chains/rococo_messages_to_wococo.rs b/bridges/relays/bin-substrate/src/chains/rococo_messages_to_wococo.rs index 7cc4d0f725..9fa0677052 100644 --- a/bridges/relays/bin-substrate/src/chains/rococo_messages_to_wococo.rs +++ b/bridges/relays/bin-substrate/src/chains/rococo_messages_to_wococo.rs @@ -148,10 +148,10 @@ impl SubstrateMessageLane for RococoMessagesToWococo { } /// Rococo node as messages source. -type RococoSourceClient = SubstrateMessagesSource; +type RococoSourceClient = SubstrateMessagesSource; /// Wococo node as messages target. -type WococoTargetClient = SubstrateMessagesTarget; +type WococoTargetClient = SubstrateMessagesTarget; /// Run Rococo-to-Wococo messages sync. pub async fn run( diff --git a/bridges/relays/bin-substrate/src/chains/wococo_messages_to_rococo.rs b/bridges/relays/bin-substrate/src/chains/wococo_messages_to_rococo.rs index 16a8858ac9..6e03d752f0 100644 --- a/bridges/relays/bin-substrate/src/chains/wococo_messages_to_rococo.rs +++ b/bridges/relays/bin-substrate/src/chains/wococo_messages_to_rococo.rs @@ -147,10 +147,10 @@ impl SubstrateMessageLane for WococoMessagesToRococo { } /// Wococo node as messages source. -type WococoSourceClient = SubstrateMessagesSource; +type WococoSourceClient = SubstrateMessagesSource; /// Rococo node as messages target. -type RococoTargetClient = SubstrateMessagesTarget; +type RococoTargetClient = SubstrateMessagesTarget; /// Run Wococo-to-Rococo messages sync. pub async fn run( diff --git a/bridges/relays/client-substrate/src/chain.rs b/bridges/relays/client-substrate/src/chain.rs index 39d122a72b..7bc5f711f0 100644 --- a/bridges/relays/client-substrate/src/chain.rs +++ b/bridges/relays/client-substrate/src/chain.rs @@ -79,6 +79,11 @@ pub trait Chain: ChainBase + Clone { + std::convert::TryFrom; } +/// Balance type used by the chain +pub type BalanceOf = ::Balance; +/// Index type used by the chain +pub type IndexOf = ::Index; + /// Substrate-based chain with `frame_system::Config::AccountData` set to /// the `pallet_balances::AccountData`. pub trait ChainWithBalances: Chain { diff --git a/bridges/relays/client-substrate/src/lib.rs b/bridges/relays/client-substrate/src/lib.rs index 2648fc4ff2..6aa319c036 100644 --- a/bridges/relays/client-substrate/src/lib.rs +++ b/bridges/relays/client-substrate/src/lib.rs @@ -31,7 +31,7 @@ pub mod metrics; use std::time::Duration; -pub use crate::chain::{BlockWithJustification, Chain, ChainWithBalances, TransactionSignScheme}; +pub use crate::chain::{BalanceOf, BlockWithJustification, Chain, ChainWithBalances, IndexOf, TransactionSignScheme}; pub use crate::client::{Client, JustificationsSubscription, OpaqueGrandpaAuthoritiesSet}; pub use crate::error::{Error, Result}; pub use crate::sync_header::SyncHeader; diff --git a/bridges/relays/lib-substrate-relay/src/messages_source.rs b/bridges/relays/lib-substrate-relay/src/messages_source.rs index 3924c6d3a5..9a98b9b1d4 100644 --- a/bridges/relays/lib-substrate-relay/src/messages_source.rs +++ b/bridges/relays/lib-substrate-relay/src/messages_source.rs @@ -38,7 +38,9 @@ use messages_relay::{ }, }; use num_traits::{Bounded, Zero}; -use relay_substrate_client::{Chain, Client, Error as SubstrateError, HashOf, HeaderIdOf}; +use relay_substrate_client::{ + BalanceOf, BlockNumberOf, Chain, Client, Error as SubstrateError, HashOf, HeaderIdOf, HeaderOf, IndexOf, +}; use relay_utils::{relay_loop::Client as RelayClient, BlockNumberBase, HeaderId}; use sp_core::Bytes; use sp_runtime::{traits::Header as HeaderT, DeserializeOwned}; @@ -50,20 +52,20 @@ use std::ops::RangeInclusive; pub type SubstrateMessagesProof = (Weight, FromBridgedChainMessagesProof>); /// Substrate client as Substrate messages source. -pub struct SubstrateMessagesSource { - client: Client, +pub struct SubstrateMessagesSource { + client: Client, lane: P, lane_id: LaneId, - target_to_source_headers_relay: Option>, + target_to_source_headers_relay: Option>, } -impl SubstrateMessagesSource { +impl SubstrateMessagesSource

{ /// Create new Substrate headers source. pub fn new( - client: Client, + client: Client, lane: P, lane_id: LaneId, - target_to_source_headers_relay: Option>, + target_to_source_headers_relay: Option>, ) -> Self { SubstrateMessagesSource { client, @@ -74,7 +76,7 @@ impl SubstrateMessagesSource Clone for SubstrateMessagesSource { +impl Clone for SubstrateMessagesSource

{ fn clone(&self) -> Self { Self { client: self.client.clone(), @@ -86,12 +88,7 @@ impl Clone for SubstrateMessagesS } #[async_trait] -impl RelayClient for SubstrateMessagesSource -where - SC: Chain, - TC: Chain, - P: SubstrateMessageLane, -{ +impl RelayClient for SubstrateMessagesSource

{ type Error = SubstrateError; async fn reconnect(&mut self) -> Result<(), SubstrateError> { @@ -100,27 +97,27 @@ where } #[async_trait] -impl SourceClient for SubstrateMessagesSource +impl

SourceClient for SubstrateMessagesSource

where - SC: Chain< + P: SubstrateMessageLane, + P::SourceChain: Chain< Hash = ::SourceHeaderHash, BlockNumber = ::SourceHeaderNumber, Balance = ::SourceChainBalance, >, - SC::Hash: Copy, - SC::BlockNumber: Copy, - SC::Balance: Decode + Bounded, - SC::Header: DeserializeOwned, - SC::Index: DeserializeOwned, - SC::BlockNumber: BlockNumberBase, - TC: Chain< + BalanceOf: Decode + Bounded, + IndexOf: DeserializeOwned, + HashOf: Copy, + BlockNumberOf: BlockNumberBase + Copy, + HeaderOf: DeserializeOwned, + P::TargetChain: Chain< Hash = ::TargetHeaderHash, BlockNumber = ::TargetHeaderNumber, >, - P: SubstrateMessageLane, + P::MessageLane: MessageLane< - MessagesProof = SubstrateMessagesProof, - MessagesReceivingProof = SubstrateMessagesReceivingProof, + MessagesProof = SubstrateMessagesProof, + MessagesReceivingProof = SubstrateMessagesReceivingProof, >, ::TargetHeaderNumber: Decode, ::TargetHeaderHash: Decode, @@ -186,7 +183,7 @@ where ) .await?; - make_message_details_map::( + make_message_details_map::( Decode::decode(&mut &encoded_response.0[..]).map_err(SubstrateError::ResponseParseFailed)?, nonces, ) @@ -264,10 +261,10 @@ where .estimate_extrinsic_fee(self.lane.make_messages_receiving_proof_transaction( Zero::zero(), HeaderId(Default::default(), Default::default()), - prepare_dummy_messages_delivery_proof::(), + prepare_dummy_messages_delivery_proof::(), )) .await - .unwrap_or_else(|_| SC::Balance::max_value()) + .unwrap_or_else(|_| BalanceOf::::max_value()) } } diff --git a/bridges/relays/lib-substrate-relay/src/messages_target.rs b/bridges/relays/lib-substrate-relay/src/messages_target.rs index 3b8e749a60..8e46076915 100644 --- a/bridges/relays/lib-substrate-relay/src/messages_target.rs +++ b/bridges/relays/lib-substrate-relay/src/messages_target.rs @@ -24,6 +24,7 @@ use crate::on_demand_headers::OnDemandHeadersRelay; use async_trait::async_trait; use bp_messages::{LaneId, MessageNonce, UnrewardedRelayersState}; + use bridge_runtime_common::messages::{ source::FromBridgedChainMessagesDeliveryProof, target::FromBridgedChainMessagesProof, }; @@ -35,10 +36,12 @@ use messages_relay::{ message_lane_loop::{TargetClient, TargetClientState}, }; use num_traits::{Bounded, Zero}; -use relay_substrate_client::{Chain, Client, Error as SubstrateError, HashOf}; +use relay_substrate_client::{ + BalanceOf, BlockNumberOf, Chain, Client, Error as SubstrateError, HashOf, HeaderOf, IndexOf, +}; use relay_utils::{relay_loop::Client as RelayClient, BlockNumberBase, HeaderId}; use sp_core::Bytes; -use sp_runtime::{traits::Header as HeaderT, DeserializeOwned, FixedPointNumber, FixedU128}; +use sp_runtime::{DeserializeOwned, FixedPointNumber, FixedU128}; use std::{convert::TryFrom, ops::RangeInclusive}; /// Message receiving proof returned by the target Substrate node. @@ -48,22 +51,22 @@ pub type SubstrateMessagesReceivingProof = ( ); /// Substrate client as Substrate messages target. -pub struct SubstrateMessagesTarget { - client: Client, +pub struct SubstrateMessagesTarget { + client: Client, lane: P, lane_id: LaneId, metric_values: StandaloneMessagesMetrics, - source_to_target_headers_relay: Option>, + source_to_target_headers_relay: Option>, } -impl SubstrateMessagesTarget { +impl SubstrateMessagesTarget

{ /// Create new Substrate headers target. pub fn new( - client: Client, + client: Client, lane: P, lane_id: LaneId, metric_values: StandaloneMessagesMetrics, - source_to_target_headers_relay: Option>, + source_to_target_headers_relay: Option>, ) -> Self { SubstrateMessagesTarget { client, @@ -75,7 +78,7 @@ impl SubstrateMessagesTarget Clone for SubstrateMessagesTarget { +impl Clone for SubstrateMessagesTarget

{ fn clone(&self) -> Self { Self { client: self.client.clone(), @@ -88,12 +91,7 @@ impl Clone for SubstrateMessagesT } #[async_trait] -impl RelayClient for SubstrateMessagesTarget -where - SC: Chain, - TC: Chain, - P: SubstrateMessageLane, -{ +impl RelayClient for SubstrateMessagesTarget

{ type Error = SubstrateError; async fn reconnect(&mut self) -> Result<(), SubstrateError> { @@ -102,27 +100,28 @@ where } #[async_trait] -impl TargetClient for SubstrateMessagesTarget +impl

TargetClient for SubstrateMessagesTarget

where - SC: Chain< + P: SubstrateMessageLane, + P::SourceChain: Chain< Hash = ::SourceHeaderHash, BlockNumber = ::SourceHeaderNumber, Balance = ::SourceChainBalance, >, - SC::Balance: TryFrom + Bounded, - TC: Chain< + BalanceOf: TryFrom<::Balance> + Bounded, + P::TargetChain: Chain< Hash = ::TargetHeaderHash, BlockNumber = ::TargetHeaderNumber, >, - TC::Hash: Copy, - TC::BlockNumber: Copy, - TC::Header: DeserializeOwned, - TC::Index: DeserializeOwned, - ::Number: BlockNumberBase, - P: SubstrateMessageLane, + IndexOf: DeserializeOwned, + HashOf: Copy, + BlockNumberOf: Copy, + HeaderOf: DeserializeOwned, + BlockNumberOf: BlockNumberBase, + P::MessageLane: MessageLane< - MessagesProof = SubstrateMessagesProof, - MessagesReceivingProof = SubstrateMessagesReceivingProof, + MessagesProof = SubstrateMessagesProof, + MessagesReceivingProof = SubstrateMessagesReceivingProof, >, ::SourceHeaderNumber: Decode, ::SourceHeaderHash: Decode, @@ -255,29 +254,31 @@ where .ok_or_else(|| { SubstrateError::Custom(format!( "Failed to compute conversion rate from {} to {}", - TC::NAME, - SC::NAME, + P::TargetChain::NAME, + P::SourceChain::NAME, )) })?; log::trace!( target: "bridge", "Using conversion rate {} when converting from {} tokens to {} tokens", conversion_rate, - TC::NAME, - SC::NAME + P::TargetChain::NAME, + P::SourceChain::NAME, ); - Ok(convert_target_tokens_to_source_tokens::( - FixedU128::from_float(conversion_rate), - self.client - .estimate_extrinsic_fee(self.lane.make_messages_delivery_transaction( - Zero::zero(), - HeaderId(Default::default(), Default::default()), - nonces.clone(), - prepare_dummy_messages_proof::(nonces, total_dispatch_weight, total_size), - )) - .await - .unwrap_or_else(|_| TC::Balance::max_value()), - )) + Ok( + convert_target_tokens_to_source_tokens::( + FixedU128::from_float(conversion_rate), + self.client + .estimate_extrinsic_fee(self.lane.make_messages_delivery_transaction( + Zero::zero(), + HeaderId(Default::default(), Default::default()), + nonces.clone(), + prepare_dummy_messages_proof::(nonces, total_dispatch_weight, total_size), + )) + .await + .unwrap_or_else(|_| ::Balance::max_value()), + ), + ) } }