[Complex Relayers] Deduplicate l2r and r2l logic (#1535)

* [Complex Relayers] Deduplicate l2r and r2l logic

Signed-off-by: Serban Iorga <serban@parity.io>

* Renamings
This commit is contained in:
Serban Iorga
2022-08-03 14:10:23 +03:00
committed by Bastian Köcher
parent e7a7396616
commit 1723c1e004
4 changed files with 276 additions and 230 deletions
@@ -29,7 +29,7 @@ mod relay_to_relay;
mod relay_to_parachain;
use async_trait::async_trait;
use std::sync::Arc;
use std::{marker::PhantomData, sync::Arc};
use structopt::StructOpt;
use strum::VariantNames;
@@ -55,6 +55,7 @@ use crate::{
},
declare_chain_cli_schema,
};
use bp_messages::LaneId;
use bp_runtime::{BalanceOf, BlockNumberOf};
use messages_relay::relay_strategy::MixStrategy;
use relay_substrate_client::{
@@ -63,7 +64,8 @@ use relay_substrate_client::{
use relay_utils::metrics::MetricsParams;
use sp_core::Pair;
use substrate_relay_helper::{
messages_lane::MessagesRelayParams, on_demand::OnDemandRelay, TaggedAccount, TransactionParams,
messages_lane::MessagesRelayParams, messages_metrics::StandaloneMessagesMetrics,
on_demand::OnDemandRelay, TaggedAccount, TransactionParams,
};
/// Maximal allowed conversion rate error ratio (abs(real - stored) / stored) that we allow.
@@ -95,20 +97,155 @@ pub struct Full2WayBridgeCommonParams<
Right: TransactionSignScheme + CliChain,
> {
pub shared: HeadersAndMessagesSharedParams,
pub left: BridgeEndCommonParams<Left>,
pub right: BridgeEndCommonParams<Right>,
pub left: Client<Left>,
// default signer, which is always used to sign messages relay transactions on the left chain
pub left_sign: AccountKeyPairOf<Left>,
pub left_transactions_mortality: Option<u32>,
pub left_messages_pallet_owner: Option<AccountKeyPairOf<Left>>,
pub at_left_accounts: Vec<TaggedAccount<AccountIdOf<Left>>>,
pub metrics_params: MetricsParams,
pub left_to_right_metrics: StandaloneMessagesMetrics<Left, Right>,
pub right_to_left_metrics: StandaloneMessagesMetrics<Right, Left>,
}
pub right: Client<Right>,
// default signer, which is always used to sign messages relay transactions on the right chain
pub right_sign: AccountKeyPairOf<Right>,
pub right_transactions_mortality: Option<u32>,
pub right_messages_pallet_owner: Option<AccountKeyPairOf<Right>>,
pub at_right_accounts: Vec<TaggedAccount<AccountIdOf<Right>>>,
impl<Left: TransactionSignScheme + CliChain, Right: TransactionSignScheme + CliChain>
Full2WayBridgeCommonParams<Left, Right>
{
pub fn new<L2R: MessagesCliBridge<Source = Left, Target = Right>>(
shared: HeadersAndMessagesSharedParams,
left: BridgeEndCommonParams<Left>,
right: BridgeEndCommonParams<Right>,
) -> anyhow::Result<Self> {
// Create metrics registry.
let metrics_params = shared.prometheus_params.clone().into();
let metrics_params = relay_utils::relay_metrics(metrics_params).into_params();
let left_to_right_metrics = substrate_relay_helper::messages_metrics::standalone_metrics::<
L2R::MessagesLane,
>(left.client.clone(), right.client.clone())?;
let right_to_left_metrics = left_to_right_metrics.clone().reverse();
Ok(Self {
shared,
left,
right,
metrics_params,
left_to_right_metrics,
right_to_left_metrics,
})
}
}
pub struct BridgeEndCommonParams<Chain: TransactionSignScheme + CliChain> {
pub client: Client<Chain>,
pub sign: AccountKeyPairOf<Chain>,
pub transactions_mortality: Option<u32>,
pub messages_pallet_owner: Option<AccountKeyPairOf<Chain>>,
pub accounts: Vec<TaggedAccount<AccountIdOf<Chain>>>,
}
struct FullBridge<
'a,
Source: TransactionSignScheme + CliChain,
Target: TransactionSignScheme + CliChain,
Bridge: MessagesCliBridge<Source = Source, Target = Target>,
> {
shared: &'a HeadersAndMessagesSharedParams,
source: &'a mut BridgeEndCommonParams<Source>,
target: &'a mut BridgeEndCommonParams<Target>,
metrics_params: &'a MetricsParams,
metrics: &'a StandaloneMessagesMetrics<Source, Target>,
_phantom_data: PhantomData<Bridge>,
}
impl<
'a,
Source: TransactionSignScheme<Chain = Source> + CliChain,
Target: TransactionSignScheme<Chain = Target> + CliChain,
Bridge: MessagesCliBridge<Source = Source, Target = Target>,
> FullBridge<'a, Source, Target, Bridge>
where
AccountIdOf<Source>: From<<AccountKeyPairOf<Source> as Pair>::Public>,
AccountIdOf<Target>: From<<AccountKeyPairOf<Target> as Pair>::Public>,
BalanceOf<Source>: TryFrom<BalanceOf<Target>> + Into<u128>,
{
fn new(
shared: &'a HeadersAndMessagesSharedParams,
source: &'a mut BridgeEndCommonParams<Source>,
target: &'a mut BridgeEndCommonParams<Target>,
metrics_params: &'a MetricsParams,
metrics: &'a StandaloneMessagesMetrics<Source, Target>,
) -> Self {
Self { shared, source, target, metrics_params, metrics, _phantom_data: Default::default() }
}
fn start_conversion_rate_update_loop(&mut self) -> anyhow::Result<()> {
if let Some(ref messages_pallet_owner) = self.source.messages_pallet_owner {
let format_err = || {
anyhow::format_err!(
"Cannon run conversion rate updater: {} -> {}",
Target::NAME,
Source::NAME
)
};
substrate_relay_helper::conversion_rate_update::run_conversion_rate_update_loop::<
Bridge::MessagesLane,
Source,
>(
self.source.client.clone(),
TransactionParams {
signer: messages_pallet_owner.clone(),
mortality: self.source.transactions_mortality,
},
self.metrics
.target_to_source_conversion_rate
.as_ref()
.ok_or_else(format_err)?
.shared_value_ref(),
self.metrics
.target_to_base_conversion_rate
.as_ref()
.ok_or_else(format_err)?
.shared_value_ref(),
self.metrics
.source_to_base_conversion_rate
.as_ref()
.ok_or_else(format_err)?
.shared_value_ref(),
CONVERSION_RATE_ALLOWED_DIFFERENCE_RATIO,
);
self.source.accounts.push(TaggedAccount::MessagesPalletOwner {
id: messages_pallet_owner.public().into(),
bridged_chain: Target::NAME.to_string(),
});
}
Ok(())
}
fn messages_relay_params(
&self,
source_to_target_headers_relay: Arc<dyn OnDemandRelay<BlockNumberOf<Source>>>,
target_to_source_headers_relay: Arc<dyn OnDemandRelay<BlockNumberOf<Target>>>,
lane_id: LaneId,
) -> MessagesRelayParams<Bridge::MessagesLane> {
let relayer_mode = self.shared.relayer_mode.into();
let relay_strategy = MixStrategy::new(relayer_mode);
MessagesRelayParams {
source_client: self.source.client.clone(),
source_transaction_params: TransactionParams {
signer: self.source.sign.clone(),
mortality: self.source.transactions_mortality,
},
target_client: self.target.client.clone(),
target_transaction_params: TransactionParams {
signer: self.target.sign.clone(),
mortality: self.target.transactions_mortality,
},
source_to_target_headers_relay: Some(source_to_target_headers_relay),
target_to_source_headers_relay: Some(target_to_source_headers_relay),
lane_id,
metrics_params: self.metrics_params.clone().disable(),
standalone_metrics: Some(self.metrics.clone()),
relay_strategy,
}
}
}
// All supported chains.
@@ -179,195 +316,97 @@ where
fn mut_base(&mut self) -> &mut Self::Base;
fn left_to_right(&mut self) -> FullBridge<Self::Left, Self::Right, Self::L2R> {
let common = self.mut_base().mut_common();
FullBridge::<_, _, Self::L2R>::new(
&common.shared,
&mut common.left,
&mut common.right,
&common.metrics_params,
&common.left_to_right_metrics,
)
}
fn right_to_left(&mut self) -> FullBridge<Self::Right, Self::Left, Self::R2L> {
let common = self.mut_base().mut_common();
FullBridge::<_, _, Self::R2L>::new(
&common.shared,
&mut common.right,
&mut common.left,
&common.metrics_params,
&common.right_to_left_metrics,
)
}
async fn run(&mut self) -> anyhow::Result<()> {
let left_client = self.base().common().left.clone();
let left_transactions_mortality = self.base().common().left_transactions_mortality;
let left_sign = self.base().common().left_sign.clone();
let left_messages_pallet_owner = self.base().common().left_messages_pallet_owner.clone();
let right_client = self.base().common().right.clone();
let right_transactions_mortality = self.base().common().right_transactions_mortality;
let right_sign = self.base().common().right_sign.clone();
let right_messages_pallet_owner = self.base().common().right_messages_pallet_owner.clone();
let lanes = self.base().common().shared.lane.clone();
let relayer_mode = self.base().common().shared.relayer_mode.into();
let relay_strategy = MixStrategy::new(relayer_mode);
// create metrics registry and register standalone metrics
let metrics_params: MetricsParams =
self.base().common().shared.prometheus_params.clone().into();
let metrics_params = relay_utils::relay_metrics(metrics_params).into_params();
let left_to_right_metrics = substrate_relay_helper::messages_metrics::standalone_metrics::<
<Self::L2R as MessagesCliBridge>::MessagesLane,
>(left_client.clone(), right_client.clone())?;
let right_to_left_metrics = left_to_right_metrics.clone().reverse();
self.mut_base().mut_common().at_left_accounts.push(TaggedAccount::Messages {
id: left_sign.public().into(),
bridged_chain: Self::Right::NAME.to_string(),
});
self.mut_base().mut_common().at_right_accounts.push(TaggedAccount::Messages {
id: right_sign.public().into(),
bridged_chain: Self::Left::NAME.to_string(),
});
// Register standalone metrics.
{
let common = self.mut_base().mut_common();
common.left.accounts.push(TaggedAccount::Messages {
id: common.left.sign.public().into(),
bridged_chain: Self::Right::NAME.to_string(),
});
common.right.accounts.push(TaggedAccount::Messages {
id: common.right.sign.public().into(),
bridged_chain: Self::Left::NAME.to_string(),
});
}
// start conversion rate update loops for left/right chains
if let Some(left_messages_pallet_owner) = left_messages_pallet_owner.clone() {
let left_client = left_client.clone();
let format_err = || {
anyhow::format_err!(
"Cannon run conversion rate updater: {} -> {}",
Self::Right::NAME,
Self::Left::NAME
)
};
substrate_relay_helper::conversion_rate_update::run_conversion_rate_update_loop::<
<Self::L2R as MessagesCliBridge>::MessagesLane,
Self::Left,
>(
left_client,
TransactionParams {
signer: left_messages_pallet_owner.clone(),
mortality: left_transactions_mortality,
},
left_to_right_metrics
.target_to_source_conversion_rate
.as_ref()
.ok_or_else(format_err)?
.shared_value_ref(),
left_to_right_metrics
.target_to_base_conversion_rate
.as_ref()
.ok_or_else(format_err)?
.shared_value_ref(),
left_to_right_metrics
.source_to_base_conversion_rate
.as_ref()
.ok_or_else(format_err)?
.shared_value_ref(),
CONVERSION_RATE_ALLOWED_DIFFERENCE_RATIO,
);
self.mut_base().mut_common().at_left_accounts.push(
TaggedAccount::MessagesPalletOwner {
id: left_messages_pallet_owner.public().into(),
bridged_chain: Self::Right::NAME.to_string(),
},
);
}
if let Some(right_messages_pallet_owner) = right_messages_pallet_owner.clone() {
let right_client = right_client.clone();
let format_err = || {
anyhow::format_err!(
"Cannon run conversion rate updater: {} -> {}",
Self::Left::NAME,
Self::Right::NAME
)
};
substrate_relay_helper::conversion_rate_update::run_conversion_rate_update_loop::<
<Self::R2L as MessagesCliBridge>::MessagesLane,
Self::Right,
>(
right_client,
TransactionParams {
signer: right_messages_pallet_owner.clone(),
mortality: right_transactions_mortality,
},
right_to_left_metrics
.target_to_source_conversion_rate
.as_ref()
.ok_or_else(format_err)?
.shared_value_ref(),
right_to_left_metrics
.target_to_base_conversion_rate
.as_ref()
.ok_or_else(format_err)?
.shared_value_ref(),
right_to_left_metrics
.source_to_base_conversion_rate
.as_ref()
.ok_or_else(format_err)?
.shared_value_ref(),
CONVERSION_RATE_ALLOWED_DIFFERENCE_RATIO,
);
self.mut_base().mut_common().at_right_accounts.push(
TaggedAccount::MessagesPalletOwner {
id: right_messages_pallet_owner.public().into(),
bridged_chain: Self::Left::NAME.to_string(),
},
);
}
self.left_to_right().start_conversion_rate_update_loop()?;
self.right_to_left().start_conversion_rate_update_loop()?;
// start on-demand header relays
let (left_to_right_on_demand_headers, right_to_left_on_demand_headers) =
self.mut_base().start_on_demand_headers_relayers().await?;
// add balance-related metrics
let metrics_params = substrate_relay_helper::messages_metrics::add_relay_balances_metrics(
left_client.clone(),
metrics_params,
&self.base().common().at_left_accounts,
)
.await?;
let metrics_params = substrate_relay_helper::messages_metrics::add_relay_balances_metrics(
right_client.clone(),
metrics_params,
&self.base().common().at_right_accounts,
)
.await?;
{
let common = self.mut_base().mut_common();
substrate_relay_helper::messages_metrics::add_relay_balances_metrics(
common.left.client.clone(),
&mut common.metrics_params,
&common.left.accounts,
)
.await?;
substrate_relay_helper::messages_metrics::add_relay_balances_metrics(
common.right.client.clone(),
&mut common.metrics_params,
&common.right.accounts,
)
.await?;
}
let lanes = self.base().common().shared.lane.clone();
// Need 2x capacity since we consider both directions for each lane
let mut message_relays = Vec::with_capacity(lanes.len() * 2);
for lane in lanes {
let lane = lane.into();
let left_to_right_messages = substrate_relay_helper::messages_lane::run::<
<Self::L2R as MessagesCliBridge>::MessagesLane,
>(MessagesRelayParams {
source_client: left_client.clone(),
source_transaction_params: TransactionParams {
signer: left_sign.clone(),
mortality: left_transactions_mortality,
},
target_client: right_client.clone(),
target_transaction_params: TransactionParams {
signer: right_sign.clone(),
mortality: right_transactions_mortality,
},
source_to_target_headers_relay: Some(left_to_right_on_demand_headers.clone()),
target_to_source_headers_relay: Some(right_to_left_on_demand_headers.clone()),
lane_id: lane,
metrics_params: metrics_params.clone().disable(),
standalone_metrics: Some(left_to_right_metrics.clone()),
relay_strategy: relay_strategy.clone(),
})
>(self.left_to_right().messages_relay_params(
left_to_right_on_demand_headers.clone(),
right_to_left_on_demand_headers.clone(),
lane,
))
.map_err(|e| anyhow::format_err!("{}", e))
.boxed();
message_relays.push(left_to_right_messages);
let right_to_left_messages = substrate_relay_helper::messages_lane::run::<
<Self::R2L as MessagesCliBridge>::MessagesLane,
>(MessagesRelayParams {
source_client: right_client.clone(),
source_transaction_params: TransactionParams {
signer: right_sign.clone(),
mortality: right_transactions_mortality,
},
target_client: left_client.clone(),
target_transaction_params: TransactionParams {
signer: left_sign.clone(),
mortality: left_transactions_mortality,
},
source_to_target_headers_relay: Some(right_to_left_on_demand_headers.clone()),
target_to_source_headers_relay: Some(left_to_right_on_demand_headers.clone()),
lane_id: lane,
metrics_params: metrics_params.clone().disable(),
standalone_metrics: Some(right_to_left_metrics.clone()),
relay_strategy: relay_strategy.clone(),
})
>(self.right_to_left().messages_relay_params(
right_to_left_on_demand_headers.clone(),
left_to_right_on_demand_headers.clone(),
lane,
))
.map_err(|e| anyhow::format_err!("{}", e))
.boxed();
message_relays.push(left_to_right_messages);
message_relays.push(right_to_left_messages);
}
relay_utils::relay_metrics(metrics_params)
relay_utils::relay_metrics(self.base().common().metrics_params.clone())
.expose()
.await
.map_err(|e| anyhow::format_err!("{}", e))?;
@@ -106,19 +106,23 @@ macro_rules! declare_relay_to_parachain_bridge_schema {
self,
) -> anyhow::Result<RelayToParachainBridge<L2R, R2L>> {
Ok(RelayToParachainBridge {
common: Full2WayBridgeCommonParams {
shared: self.shared,
left: self.left.into_client::<Left>().await?,
left_sign: self.left_sign.to_keypair::<Left>()?,
left_transactions_mortality: self.left_sign.transactions_mortality()?,
left_messages_pallet_owner: self.left_messages_pallet_owner.to_keypair::<Left>()?,
at_left_accounts: vec![],
right: self.right.into_client::<Right>().await?,
right_sign: self.right_sign.to_keypair::<Right>()?,
right_transactions_mortality: self.right_sign.transactions_mortality()?,
right_messages_pallet_owner: self.right_messages_pallet_owner.to_keypair::<Right>()?,
at_right_accounts: vec![],
},
common: Full2WayBridgeCommonParams::new::<L2R>(
self.shared,
BridgeEndCommonParams {
client: self.left.into_client::<Left>().await?,
sign: self.left_sign.to_keypair::<Left>()?,
transactions_mortality: self.left_sign.transactions_mortality()?,
messages_pallet_owner: self.left_messages_pallet_owner.to_keypair::<Left>()?,
accounts: vec![],
},
BridgeEndCommonParams {
client: self.right.into_client::<Right>().await?,
sign: self.right_sign.to_keypair::<Right>()?,
transactions_mortality: self.right_sign.transactions_mortality()?,
messages_pallet_owner: self.right_messages_pallet_owner.to_keypair::<Right>()?,
accounts: vec![],
},
)?,
right_relay: self.right_relay.into_client::<RightRelay>().await?,
right_headers_to_left_transaction_params: self
.right_relay_headers_to_left_sign_override
@@ -178,43 +182,43 @@ where
Arc<dyn OnDemandRelay<BlockNumberOf<Self::Left>>>,
Arc<dyn OnDemandRelay<BlockNumberOf<Self::Right>>>,
)> {
self.common.at_left_accounts.push(TaggedAccount::Headers {
self.common.left.accounts.push(TaggedAccount::Headers {
id: self.right_headers_to_left_transaction_params.signer.public().into(),
bridged_chain: RightRelay::NAME.to_string(),
});
self.common.at_left_accounts.push(TaggedAccount::Parachains {
self.common.left.accounts.push(TaggedAccount::Parachains {
id: self.right_parachains_to_left_transaction_params.signer.public().into(),
bridged_chain: RightRelay::NAME.to_string(),
});
self.common.at_right_accounts.push(TaggedAccount::Headers {
self.common.right.accounts.push(TaggedAccount::Headers {
id: self.left_headers_to_right_transaction_params.signer.public().into(),
bridged_chain: Left::NAME.to_string(),
});
<L2R as RelayToRelayHeadersCliBridge>::Finality::start_relay_guards(
&self.common.right,
&self.common.right.client,
&self.left_headers_to_right_transaction_params,
self.common.right.can_start_version_guard(),
self.common.right.client.can_start_version_guard(),
)
.await?;
<R2L as ParachainToRelayHeadersCliBridge>::RelayFinality::start_relay_guards(
&self.common.left,
&self.common.left.client,
&self.right_headers_to_left_transaction_params,
self.common.left.can_start_version_guard(),
self.common.left.client.can_start_version_guard(),
)
.await?;
let left_to_right_on_demand_headers =
OnDemandHeadersRelay::new::<<L2R as RelayToRelayHeadersCliBridge>::Finality>(
self.common.left.clone(),
self.common.right.clone(),
self.common.left.client.clone(),
self.common.right.client.clone(),
self.left_headers_to_right_transaction_params.clone(),
self.common.shared.only_mandatory_headers,
);
let right_relay_to_left_on_demand_headers =
OnDemandHeadersRelay::new::<<R2L as ParachainToRelayHeadersCliBridge>::RelayFinality>(
self.right_relay.clone(),
self.common.left.clone(),
self.common.left.client.clone(),
self.right_headers_to_left_transaction_params.clone(),
self.common.shared.only_mandatory_headers,
);
@@ -222,7 +226,7 @@ where
<R2L as ParachainToRelayHeadersCliBridge>::ParachainFinality,
>(
self.right_relay.clone(),
self.common.left.clone(),
self.common.left.client.clone(),
self.right_parachains_to_left_transaction_params.clone(),
Arc::new(right_relay_to_left_on_demand_headers),
);
@@ -85,20 +85,23 @@ macro_rules! declare_relay_to_relay_bridge_schema {
self,
) -> anyhow::Result<RelayToRelayBridge<L2R, R2L>> {
Ok(RelayToRelayBridge {
common: Full2WayBridgeCommonParams {
shared: self.shared,
left: self.left.into_client::<Left>().await?,
left_sign: self.left_sign.to_keypair::<Left>()?,
left_transactions_mortality: self.left_sign.transactions_mortality()?,
left_messages_pallet_owner: self.left_messages_pallet_owner.to_keypair::<Left>()?,
at_left_accounts: vec![],
right: self.right.into_client::<Right>().await?,
right_sign: self.right_sign.to_keypair::<Right>()?,
right_transactions_mortality: self.right_sign.transactions_mortality()?,
right_messages_pallet_owner: self.right_messages_pallet_owner.to_keypair::<Right>()?,
at_right_accounts: vec![],
},
common: Full2WayBridgeCommonParams::new::<L2R>(
self.shared,
BridgeEndCommonParams {
client: self.left.into_client::<Left>().await?,
sign: self.left_sign.to_keypair::<Left>()?,
transactions_mortality: self.left_sign.transactions_mortality()?,
messages_pallet_owner: self.left_messages_pallet_owner.to_keypair::<Left>()?,
accounts: vec![],
},
BridgeEndCommonParams {
client: self.right.into_client::<Right>().await?,
sign: self.right_sign.to_keypair::<Right>()?,
transactions_mortality: self.right_sign.transactions_mortality()?,
messages_pallet_owner: self.right_messages_pallet_owner.to_keypair::<Right>()?,
accounts: vec![],
},
)?,
right_to_left_transaction_params: self
.right_headers_to_left_sign_override
.transaction_params_or::<Left, _>(&self.left_sign)?,
@@ -145,39 +148,39 @@ where
Arc<dyn OnDemandRelay<BlockNumberOf<Self::Left>>>,
Arc<dyn OnDemandRelay<BlockNumberOf<Self::Right>>>,
)> {
self.common.at_right_accounts.push(TaggedAccount::Headers {
self.common.right.accounts.push(TaggedAccount::Headers {
id: self.left_to_right_transaction_params.signer.public().into(),
bridged_chain: Self::Left::NAME.to_string(),
});
self.common.at_left_accounts.push(TaggedAccount::Headers {
self.common.left.accounts.push(TaggedAccount::Headers {
id: self.right_to_left_transaction_params.signer.public().into(),
bridged_chain: Self::Right::NAME.to_string(),
});
<L2R as RelayToRelayHeadersCliBridge>::Finality::start_relay_guards(
&self.common.right,
&self.common.right.client,
&self.left_to_right_transaction_params,
self.common.right.can_start_version_guard(),
self.common.right.client.can_start_version_guard(),
)
.await?;
<R2L as RelayToRelayHeadersCliBridge>::Finality::start_relay_guards(
&self.common.left,
&self.common.left.client,
&self.right_to_left_transaction_params,
self.common.left.can_start_version_guard(),
self.common.left.client.can_start_version_guard(),
)
.await?;
let left_to_right_on_demand_headers =
OnDemandHeadersRelay::new::<<L2R as RelayToRelayHeadersCliBridge>::Finality>(
self.common.left.clone(),
self.common.right.clone(),
self.common.left.client.clone(),
self.common.right.client.clone(),
self.left_to_right_transaction_params.clone(),
self.common.shared.only_mandatory_headers,
);
let right_to_left_on_demand_headers =
OnDemandHeadersRelay::new::<<R2L as RelayToRelayHeadersCliBridge>::Finality>(
self.common.right.clone(),
self.common.left.clone(),
self.common.right.client.clone(),
self.common.left.client.clone(),
self.right_to_left_transaction_params.clone(),
self.common.shared.only_mandatory_headers,
);
@@ -273,14 +273,14 @@ pub fn standalone_metrics<P: SubstrateMessageLane>(
/// Add relay accounts balance metrics.
pub async fn add_relay_balances_metrics<C: ChainWithBalances>(
client: Client<C>,
metrics: MetricsParams,
metrics: &mut MetricsParams,
relay_accounts: &Vec<TaggedAccount<AccountIdOf<C>>>,
) -> anyhow::Result<MetricsParams>
) -> anyhow::Result<()>
where
BalanceOf<C>: Into<u128> + std::fmt::Debug,
{
if relay_accounts.is_empty() {
return Ok(metrics)
return Ok(())
}
// if `tokenDecimals` is missing from system properties, we'll be using
@@ -317,7 +317,7 @@ where
relay_account_balance_metric.register_and_spawn(&metrics.registry)?;
}
Ok(metrics)
Ok(())
}
/// Adapter for `FloatStorageValueMetric` to decode account free balance.