use guardian_shared::SignatureScheme;
use miden_client::assembly::CodeBuilder;
use miden_client::transaction::{TransactionRequest, TransactionRequestBuilder, TransactionScript};
use miden_protocol::{Felt, Word};
use miden_standards::account::auth::{AuthGuardedMultisig, MultisigAuthArgs};
use super::TransactionRequestBuilderExt;
use crate::error::{MultisigError, Result};
pub fn build_update_guardian_script(
new_guardian_pubkey: Word,
scheme: SignatureScheme,
) -> Result<TransactionScript> {
let scheme_id = scheme.auth_scheme_id();
let tx_script_code = format!(
"@transaction_script\npub proc main\n push.{new_guardian_pubkey}\n push.{scheme_id}\n call.::miden::standards::components::auth::guarded_multisig::update_guardian_public_key\n drop\n dropw\nend"
);
let tx_script = CodeBuilder::new()
.with_dynamically_linked_package(AuthGuardedMultisig::code())
.map_err(|e| MultisigError::TransactionExecution(format!("failed to link library: {}", e)))?
.compile_tx_script(&tx_script_code)
.map_err(|e| {
MultisigError::TransactionExecution(format!("failed to compile script: {}", e))
})?;
Ok(tx_script)
}
pub fn build_update_guardian_transaction_request<I>(
new_guardian_pubkey: Word,
scheme: SignatureScheme,
auth_args: &MultisigAuthArgs,
signature_advice: I,
) -> Result<TransactionRequest>
where
I: IntoIterator<Item = (Word, Vec<Felt>)>,
{
let script = build_update_guardian_script(new_guardian_pubkey, scheme)?;
let request = TransactionRequestBuilder::new()
.custom_script(script)
.extend_advice_map(signature_advice)
.multisig_auth_args(auth_args)
.build()?;
Ok(request)
}