partner_chains_cardano_offchain/
assemble_and_submit_tx.rs

1use 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
10/// Adds `witnesses` to `transaction` and submits it with `ogmios_client`.
11pub 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}