use crate::keys::PublicKey;
use crate::zcash::{
Error, LOCKTIME_THRESHOLD, Multisig2of2, MultisigSpend, Network, TransparentAddress, TxOptions, Txid, Utxo,
build_multisig_spend,
};
#[derive(Debug, Clone, Copy)]
pub struct AdaptorSpendsRequest<'a> {
pub network: Network,
pub taker_pubkey: &'a PublicKey,
pub maker_pubkey: &'a PublicKey,
pub funding_txid: Txid,
pub funding_vout: u32,
pub amount_zat: u64,
pub refund_height: u32,
pub refund_address: &'a TransparentAddress,
pub claim_to: &'a TransparentAddress,
pub branch_id: u32,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct AdaptorSpends {
pub refund: MultisigSpend,
pub claim: MultisigSpend,
}
pub fn adaptor_spends(req: &AdaptorSpendsRequest<'_>) -> Result<AdaptorSpends, Error> {
if !(1..LOCKTIME_THRESHOLD).contains(&req.refund_height) {
return Err(Error::RefundHeightOutOfRange(req.refund_height));
}
let multisig = Multisig2of2::new(req.taker_pubkey, req.maker_pubkey, req.network)?;
let utxo = Utxo {
txid: req.funding_txid,
vout: req.funding_vout,
value: req.amount_zat,
script_pubkey: multisig.script_pubkey().to_vec(),
};
let options = TxOptions::new(req.branch_id, req.network);
Ok(AdaptorSpends {
refund: build_multisig_spend(&multisig, &utxo, req.refund_address, req.refund_height, &options)?,
claim: build_multisig_spend(&multisig, &utxo, req.claim_to, 0, &options)?,
})
}