use bitcoin::ScriptBuf;
use ddk_messages::{AcceptDlc, DlcInput, FundingInput, OfferDlc};
use super::accept::create_dlc_transactions;
use super::context::contract_id_from_transactions;
use super::error::ContractError;
use super::types::{random_serial_id, Party};
pub const DLC_INPUT_MAX_WITNESS_LEN: u16 = 220;
pub fn create_dlc_splice_input(
prev_offer: &OfferDlc,
prev_accept: &AcceptDlc,
local_party: Party,
input_serial_id: Option<u64>,
max_witness_len: u16,
) -> Result<FundingInput, ContractError> {
if max_witness_len as usize <= 108 {
return Err(ContractError::InvalidFundingInput(
"DLC input max witness length must be greater than 108".to_string(),
));
}
let transactions = create_dlc_transactions(prev_offer, prev_accept)?;
let fund_vout = transactions.get_fund_output_index() as u32;
let contract_id =
contract_id_from_transactions(&transactions, &prev_offer.temporary_contract_id);
let (local_fund_pubkey, remote_fund_pubkey) = match local_party {
Party::Offer => (prev_offer.funding_pubkey, prev_accept.funding_pubkey),
Party::Accept => (prev_accept.funding_pubkey, prev_offer.funding_pubkey),
};
Ok(FundingInput {
input_serial_id: input_serial_id.unwrap_or_else(random_serial_id),
prev_tx: bitcoin::consensus::serialize(&transactions.fund),
prev_tx_vout: fund_vout,
sequence: u32::MAX,
max_witness_len,
redeem_script: ScriptBuf::new(),
dlc_input: Some(DlcInput {
local_fund_pubkey,
remote_fund_pubkey,
contract_id,
}),
})
}