Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
51 changes: 51 additions & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ thiserror = "2.0"

# Terminal UI
colored = "3.0"
indicatif = "0.17"

# Additional utilities
sha2 = "0.10"
Expand Down
59 changes: 45 additions & 14 deletions src/cli/common.rs
Original file line number Diff line number Diff line change
Expand Up @@ -113,25 +113,15 @@ pub async fn get_incremented_nonce_with_client(
Ok(incremented_nonce)
}

/// Default function for transaction submission, waits until transaction is in the best block
/// Submit transaction with optional finalization check
///
/// By default (finalized=false), waits until transaction is in the best block (fast)
/// With finalized=true, waits until transaction is in a finalized block (slow in PoW chains)
pub async fn submit_transaction<Call>(
quantus_client: &crate::chain::client::QuantusClient,
from_keypair: &crate::wallet::QuantumKeyPair,
call: Call,
tip: Option<u128>,
) -> crate::error::Result<subxt::utils::H256>
where
Call: subxt::tx::Payload,
{
submit_transaction_with_finalization(quantus_client, from_keypair, call, tip, false).await
}

/// Helper function to submit transaction with an optional finalization check
pub async fn submit_transaction_with_finalization<Call>(
quantus_client: &crate::chain::client::QuantusClient,
from_keypair: &crate::wallet::QuantumKeyPair,
call: Call,
tip: Option<u128>,
finalized: bool,
) -> crate::error::Result<subxt::utils::H256>
where
Expand Down Expand Up @@ -332,23 +322,64 @@ async fn wait_tx_inclusion(
tx_progress: &mut TxProgress<ChainConfig, OnlineClient<ChainConfig>>,
finalized: bool,
) -> Result<()> {
use indicatif::{ProgressBar, ProgressStyle};

// Create spinner (only in non-verbose mode)
let spinner = if !crate::log::is_verbose() {
let pb = ProgressBar::new_spinner();
pb.set_style(
ProgressStyle::default_spinner()
.tick_chars("⠋⠙⠹⠸⠼⠴⠦⠧⠇⠏")
.template("{spinner:.cyan} {msg} {elapsed:.dim}")
.unwrap(),
);

if finalized {
pb.set_message("Waiting for finalized block...");
} else {
pb.set_message("Waiting for block inclusion...");
}

pb.enable_steady_tick(std::time::Duration::from_millis(100));
Some(pb)
} else {
None
};

while let Some(Ok(status)) = tx_progress.next().await {
crate::log_verbose!(" Transaction status: {:?}", status);

match status {
TxStatus::Validated =>
if let Some(ref pb) = spinner {
pb.set_message("Transaction validated ✓");
},
TxStatus::InBestBlock(block_hash) => {
crate::log_verbose!(" Transaction included in block: {:?}", block_hash);
if finalized {
if let Some(ref pb) = spinner {
pb.set_message("In best block, waiting for finalization...");
}
continue;
} else {
if let Some(pb) = spinner {
pb.finish_with_message("✅ Transaction included in block!");
}
break;
};
},
TxStatus::InFinalizedBlock(block_hash) => {
crate::log_verbose!(" Transaction finalized in block: {:?}", block_hash);
if let Some(pb) = spinner {
pb.finish_with_message("✅ Transaction finalized!");
}
break;
},
TxStatus::Error { message } | TxStatus::Invalid { message } => {
crate::log_error!(" Transaction error: {}", message);
if let Some(pb) = spinner {
pb.finish_with_message("❌ Transaction error!");
}
break;
},
_ => continue,
Expand Down
46 changes: 17 additions & 29 deletions src/cli/generic_call.rs
Original file line number Diff line number Diff line change
Expand Up @@ -165,14 +165,20 @@ async fn submit_balance_transfer(
subxt::ext::subxt_core::utils::MultiAddress::Id(to_account_id_subxt),
amount,
);
crate::cli::common::submit_transaction(quantus_client, from_keypair, transfer_call, tip)
.await
crate::cli::common::submit_transaction(
quantus_client,
from_keypair,
transfer_call,
tip,
finalized,
)
.await
} else {
let transfer_call = quantus_subxt::api::tx().balances().transfer_allow_death(
subxt::ext::subxt_core::utils::MultiAddress::Id(to_account_id_subxt),
amount,
);
crate::cli::common::submit_transaction_with_finalization(
crate::cli::common::submit_transaction(
quantus_client,
from_keypair,
transfer_call,
Expand Down Expand Up @@ -203,7 +209,7 @@ async fn submit_system_remark(

let remark_call = quantus_subxt::api::tx().system().remark(remark.as_bytes().to_vec());

crate::cli::common::submit_transaction_with_finalization(
crate::cli::common::submit_transaction(
quantus_client,
from_keypair,
remark_call,
Expand Down Expand Up @@ -259,14 +265,8 @@ async fn submit_tech_collective_add_member(
},
));

crate::cli::common::submit_transaction_with_finalization(
quantus_client,
from_keypair,
sudo_call,
None,
finalized,
)
.await
crate::cli::common::submit_transaction(quantus_client, from_keypair, sudo_call, None, finalized)
.await
}

/// Submit tech collective remove member
Expand Down Expand Up @@ -302,14 +302,8 @@ async fn submit_tech_collective_remove_member(
},
));

crate::cli::common::submit_transaction_with_finalization(
quantus_client,
from_keypair,
sudo_call,
None,
finalized,
)
.await
crate::cli::common::submit_transaction(quantus_client, from_keypair, sudo_call, None, finalized)
.await
}

/// Submit tech collective vote
Expand All @@ -330,14 +324,8 @@ async fn submit_tech_collective_vote(

let vote_call = quantus_subxt::api::tx().tech_collective().vote(referendum_index, aye);

crate::cli::common::submit_transaction_with_finalization(
quantus_client,
from_keypair,
vote_call,
None,
finalized,
)
.await
crate::cli::common::submit_transaction(quantus_client, from_keypair, vote_call, None, finalized)
.await
}

/// Submit reversible transfer
Expand Down Expand Up @@ -374,7 +362,7 @@ async fn submit_reversible_transfer(
amount,
);

crate::cli::common::submit_transaction_with_finalization(
crate::cli::common::submit_transaction(
quantus_client,
from_keypair,
schedule_call,
Expand Down
2 changes: 1 addition & 1 deletion src/cli/high_security.rs
Original file line number Diff line number Diff line change
Expand Up @@ -160,7 +160,7 @@ pub async fn handle_high_security_command(
.reversible_transfers()
.set_high_security(delay_value, interceptor_subxt);

let tx_hash = crate::cli::common::submit_transaction_with_finalization(
let tx_hash = crate::cli::common::submit_transaction(
&quantus_client,
&keypair,
tx_call,
Expand Down
18 changes: 12 additions & 6 deletions src/cli/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -272,19 +272,25 @@ pub async fn execute_command(
Commands::Scheduler(scheduler_cmd) =>
scheduler::handle_scheduler_command(scheduler_cmd, node_url, finalized).await,
Commands::Storage(storage_cmd) =>
storage::handle_storage_command(storage_cmd, node_url).await,
storage::handle_storage_command(storage_cmd, node_url, finalized).await,
Commands::TechCollective(tech_collective_cmd) =>
tech_collective::handle_tech_collective_command(tech_collective_cmd, node_url).await,
tech_collective::handle_tech_collective_command(
tech_collective_cmd,
node_url,
finalized,
)
.await,
Commands::Preimage(preimage_cmd) =>
preimage::handle_preimage_command(preimage_cmd, node_url, finalized).await,
Commands::TechReferenda(tech_referenda_cmd) =>
tech_referenda::handle_tech_referenda_command(tech_referenda_cmd, node_url).await,
tech_referenda::handle_tech_referenda_command(tech_referenda_cmd, node_url, finalized)
.await,
Commands::Referenda(referenda_cmd) =>
referenda::handle_referenda_command(referenda_cmd, node_url).await,
referenda::handle_referenda_command(referenda_cmd, node_url, finalized).await,
Commands::Treasury(treasury_cmd) =>
treasury::handle_treasury_command(treasury_cmd, node_url).await,
treasury::handle_treasury_command(treasury_cmd, node_url, finalized).await,
Commands::Runtime(runtime_cmd) =>
runtime::handle_runtime_command(runtime_cmd, node_url).await,
runtime::handle_runtime_command(runtime_cmd, node_url, finalized).await,
Commands::Call {
pallet,
call,
Expand Down
6 changes: 3 additions & 3 deletions src/cli/preimage.rs
Original file line number Diff line number Diff line change
Expand Up @@ -309,7 +309,7 @@ async fn request_preimage(
let request_call = quantus_subxt::api::tx().preimage().request_preimage(preimage_hash);

// Submit transaction
let tx_hash = crate::cli::common::submit_transaction_with_finalization(
let tx_hash = crate::cli::common::submit_transaction(
quantus_client,
&keypair,
request_call,
Expand Down Expand Up @@ -346,7 +346,7 @@ async fn note_preimage(
let note_call = quantus_subxt::api::tx().preimage().note_preimage(content);

// Submit transaction
let tx_hash = crate::cli::common::submit_transaction_with_finalization(
let tx_hash = crate::cli::common::submit_transaction(
quantus_client,
&keypair,
note_call,
Expand Down Expand Up @@ -410,7 +410,7 @@ async fn create_preimage(

log_print!("📝 Submitting preimage...");
let note_preimage_tx = quantus_subxt::api::tx().preimage().note_preimage(bounded_bytes);
let preimage_tx_hash = crate::cli::common::submit_transaction_with_finalization(
let preimage_tx_hash = crate::cli::common::submit_transaction(
quantus_client,
&keypair,
note_preimage_tx,
Expand Down
Loading