partner_chains_cardano_offchain/
assemble_and_submit_tx.rs1use crate::await_tx::AwaitTx;
2use anyhow::anyhow;
3use cardano_serialization_lib::{Transaction, Vkeywitness, Vkeywitnesses};
4use ogmios_client::query_ledger_state::QueryUtxoByUtxoId;
5use ogmios_client::{
6 query_ledger_state::QueryLedgerState, query_network::QueryNetwork, transactions::Transactions,
7};
8use sidechain_domain::{McTxHash, UtxoId};
9
10pub async fn assemble_and_submit_tx<
12 C: QueryLedgerState + QueryNetwork + Transactions + QueryUtxoByUtxoId,
13 A: AwaitTx,
14>(
15 transaction: Transaction,
16 witnesses: Vec<Vkeywitness>,
17 ogmios_client: &C,
18 await_tx: &A,
19) -> anyhow::Result<McTxHash> {
20 let mut witness_set = transaction.witness_set();
21
22 let mut vk = witness_set.vkeys().unwrap_or_else(Vkeywitnesses::new);
23
24 for w in witnesses.iter() {
25 vk.add(w);
26 }
27 witness_set.set_vkeys(&vk);
28
29 let new_tx = Transaction::new(&transaction.body(), &witness_set, transaction.auxiliary_data());
30
31 let res = ogmios_client.submit_transaction(&new_tx.to_bytes()).await.map_err(|e| {
32 anyhow!(
33 "Submit assembled transaction request failed: {}, bytes: {}",
34 e,
35 hex::encode(new_tx.to_bytes())
36 )
37 })?;
38 let tx_id = McTxHash(res.transaction.id);
39 log::info!("Transaction submitted: {}", hex::encode(tx_id.0));
40
41 await_tx.await_tx_output(ogmios_client, UtxoId::new(tx_id.0, 0)).await?;
42
43 Ok(tx_id)
44}