Use specific error for case when para head is missing from the bridge pallet (#1829)

* use specific error for case when para head is missing from the bridge pallet

* fix match to support both error types
This commit is contained in:
Svyatoslav Nikolsky
2023-01-30 16:10:00 +03:00
committed by Bastian Köcher
parent 4689dfaf2c
commit 606768bc6a
3 changed files with 12 additions and 5 deletions
@@ -61,6 +61,9 @@ pub enum Error {
/// The bridge pallet is not yet initialized and all transactions will be rejected. /// The bridge pallet is not yet initialized and all transactions will be rejected.
#[error("Bridge pallet is not initialized.")] #[error("Bridge pallet is not initialized.")]
BridgePalletIsNotInitialized, BridgePalletIsNotInitialized,
/// There's no best head of the parachain at the `pallet-bridge-parachains` at the target side.
#[error("No head of the ParaId({0}) at the bridge parachains pallet at {1}.")]
NoParachainHeadAtTarget(u32, String),
/// An error has happened when we have tried to parse storage proof. /// An error has happened when we have tried to parse storage proof.
#[error("Error when parsing storage proof: {0:?}.")] #[error("Error when parsing storage proof: {0:?}.")]
StorageProofError(bp_runtime::StorageProofError), StorageProofError(bp_runtime::StorageProofError),
@@ -473,12 +473,13 @@ where
P::SourceParachain, P::SourceParachain,
>(target.client(), best_target_block_hash) >(target.client(), best_target_block_hash)
.await; .await;
// if there are no parachain heads at the target (`BridgePalletIsNotInitialized`), we'll need // if there are no parachain heads at the target (`NoParachainHeadAtTarget`), we'll need to
// to submit at least one. Otherwise the pallet will be treated as uninitialized and messages // submit at least one. Otherwise the pallet will be treated as uninitialized and messages
// sync will stall. // sync will stall.
let para_header_at_target = match para_header_at_target { let para_header_at_target = match para_header_at_target {
Ok(para_header_at_target) => Some(para_header_at_target.0), Ok(para_header_at_target) => Some(para_header_at_target.0),
Err(SubstrateError::BridgePalletIsNotInitialized) => None, Err(SubstrateError::BridgePalletIsNotInitialized) |
Err(SubstrateError::NoParachainHeadAtTarget(_, _)) => None,
Err(e) => return Err(map_target_err(e)), Err(e) => return Err(map_target_err(e)),
}; };
@@ -33,7 +33,7 @@ use parachains_relay::{
}; };
use relay_substrate_client::{ use relay_substrate_client::{
AccountIdOf, AccountKeyPairOf, BlockNumberOf, Chain, Client, Error as SubstrateError, HashOf, AccountIdOf, AccountKeyPairOf, BlockNumberOf, Chain, Client, Error as SubstrateError, HashOf,
HeaderIdOf, RelayChain, TransactionEra, TransactionTracker, UnsignedTransaction, HeaderIdOf, ParachainBase, RelayChain, TransactionEra, TransactionTracker, UnsignedTransaction,
}; };
use relay_utils::{relay_loop::Client as RelayClient, HeaderId}; use relay_utils::{relay_loop::Client as RelayClient, HeaderId};
use sp_core::{Bytes, Pair}; use sp_core::{Bytes, Pair};
@@ -110,7 +110,10 @@ where
) )
.map_err(SubstrateError::ResponseParseFailed)? .map_err(SubstrateError::ResponseParseFailed)?
.map(Ok) .map(Ok)
.unwrap_or(Err(SubstrateError::BridgePalletIsNotInitialized)) .unwrap_or(Err(SubstrateError::NoParachainHeadAtTarget(
P::SourceParachain::PARACHAIN_ID,
P::TargetChain::NAME.into(),
)))
} }
async fn parachain_head( async fn parachain_head(