Extract unsigned tx from the SignParam structure (#1561)

* change sign_transaction method

* clippy

* rustup update && clippy

* remove redudnant clone
This commit is contained in:
Svyatoslav Nikolsky
2022-08-30 13:58:37 +03:00
committed by Bastian Köcher
parent effe0f11c8
commit f35b4f4897
29 changed files with 434 additions and 402 deletions
@@ -23,18 +23,28 @@
use crate::{error::Error, finality::engine::Engine};
use relay_substrate_client::{Chain, Client, Error as SubstrateError};
use sp_core::Bytes;
use relay_substrate_client::{
Chain, Client, Error as SubstrateError, SignParam, TransactionSignScheme, UnsignedTransaction,
};
use sp_runtime::traits::Header as HeaderT;
/// Submit headers-bridge initialization transaction.
pub async fn initialize<E: Engine<SourceChain>, SourceChain: Chain, TargetChain: Chain, F>(
pub async fn initialize<
E: Engine<SourceChain>,
SourceChain: Chain,
TargetChain: Chain + TransactionSignScheme<Chain = TargetChain>,
F,
>(
source_client: Client<SourceChain>,
target_client: Client<TargetChain>,
target_transactions_signer: TargetChain::AccountId,
target_signing_data: SignParam<TargetChain>,
prepare_initialize_transaction: F,
) where
F: FnOnce(TargetChain::Index, E::InitializationData) -> Result<Bytes, SubstrateError>
F: FnOnce(
TargetChain::Index,
E::InitializationData,
) -> Result<UnsignedTransaction<TargetChain>, SubstrateError>
+ Send
+ 'static,
{
@@ -42,6 +52,7 @@ pub async fn initialize<E: Engine<SourceChain>, SourceChain: Chain, TargetChain:
source_client,
target_client,
target_transactions_signer,
target_signing_data,
prepare_initialize_transaction,
)
.await;
@@ -66,17 +77,26 @@ pub async fn initialize<E: Engine<SourceChain>, SourceChain: Chain, TargetChain:
}
/// Craft and submit initialization transaction, returning any error that may occur.
async fn do_initialize<E: Engine<SourceChain>, SourceChain: Chain, TargetChain: Chain, F>(
async fn do_initialize<
E: Engine<SourceChain>,
SourceChain: Chain,
TargetChain: Chain + TransactionSignScheme<Chain = TargetChain>,
F,
>(
source_client: Client<SourceChain>,
target_client: Client<TargetChain>,
target_transactions_signer: TargetChain::AccountId,
target_signing_data: SignParam<TargetChain>,
prepare_initialize_transaction: F,
) -> Result<
Option<TargetChain::Hash>,
Error<SourceChain::Hash, <SourceChain::Header as HeaderT>::Number>,
>
where
F: FnOnce(TargetChain::Index, E::InitializationData) -> Result<Bytes, SubstrateError>
F: FnOnce(
TargetChain::Index,
E::InitializationData,
) -> Result<UnsignedTransaction<TargetChain>, SubstrateError>
+ Send
+ 'static,
{
@@ -103,10 +123,15 @@ where
);
let initialization_tx_hash = target_client
.submit_signed_extrinsic(target_transactions_signer, move |_, transaction_nonce| {
prepare_initialize_transaction(transaction_nonce, initialization_data)
})
.submit_signed_extrinsic(
target_transactions_signer,
target_signing_data,
move |_, transaction_nonce| {
prepare_initialize_transaction(transaction_nonce, initialization_data)
},
)
.await
.map_err(|err| Error::SubmitTransaction(TargetChain::NAME, err))?;
Ok(Some(initialization_tx_hash))
}
@@ -194,7 +194,7 @@ where
stall_timeout: transaction_stall_timeout(
transaction_params.mortality,
P::TargetChain::AVERAGE_BLOCK_INTERVAL,
crate::STALL_TIMEOUT,
relay_utils::STALL_TIMEOUT,
),
only_mandatory_headers,
},
@@ -25,14 +25,13 @@ use crate::{
};
use async_trait::async_trait;
use codec::Encode;
use finality_relay::TargetClient;
use relay_substrate_client::{
AccountIdOf, AccountKeyPairOf, Chain, Client, Error, HeaderIdOf, HeaderOf, SignParam,
SyncHeader, TransactionEra, TransactionSignScheme, UnsignedTransaction,
};
use relay_utils::relay_loop::Client as RelayClient;
use sp_core::{Bytes, Pair};
use sp_core::Pair;
/// Substrate client as Substrate finality target.
pub struct SubstrateFinalityTarget<P: SubstrateFinalitySyncPipeline> {
@@ -119,18 +118,15 @@ where
self.client
.submit_signed_extrinsic(
self.transaction_params.signer.public().into(),
SignParam::<P::TransactionSignScheme> {
spec_version,
transaction_version,
genesis_hash,
signer: transaction_params.signer.clone(),
},
move |best_block_id, transaction_nonce| {
Ok(Bytes(
P::TransactionSignScheme::sign_transaction(SignParam {
spec_version,
transaction_version,
genesis_hash,
signer: transaction_params.signer.clone(),
era: TransactionEra::new(best_block_id, transaction_params.mortality),
unsigned: UnsignedTransaction::new(call.into(), transaction_nonce),
})?
.encode(),
))
Ok(UnsignedTransaction::new(call.into(), transaction_nonce)
.era(TransactionEra::new(best_block_id, transaction_params.mortality)))
},
)
.await