use miden_client::transaction::{TransactionRequest, TransactionRequestBuilder};
use miden_lib::account::interface::AccountInterface;
use miden_lib::note::create_p2id_note;
use miden_objects::account::{Account, AccountId};
use miden_objects::asset::Asset;
use miden_objects::crypto::rand::RpoRandomCoin;
use miden_objects::note::NoteType;
use miden_objects::{Felt, Word};
use crate::error::{MultisigError, Result};
pub fn build_p2id_transaction_request<I>(
sender_account: &Account,
recipient: AccountId,
assets: Vec<Asset>,
salt: Word,
signature_advice: I,
) -> Result<TransactionRequest>
where
I: IntoIterator<Item = (Word, Vec<Felt>)>,
{
let mut rng = RpoRandomCoin::new(salt);
let note = create_p2id_note(
sender_account.id(),
recipient,
assets,
NoteType::Public,
Default::default(),
&mut rng,
)
.map_err(|e| {
MultisigError::TransactionExecution(format!("failed to create P2ID note: {}", e))
})?;
let account_interface = AccountInterface::from(sender_account);
let send_script = account_interface
.build_send_notes_script(&[note.clone().into()], None, false)
.map_err(|e| {
MultisigError::TransactionExecution(format!("failed to build send script: {}", e))
})?;
let request = TransactionRequestBuilder::new()
.custom_script(send_script)
.expected_output_recipients(vec![note.recipient().clone()])
.extend_advice_map(signature_advice)
.auth_arg(salt)
.build()?;
Ok(request)
}