use elements_miniscript::elements::{
pset::{self, raw, Input},
TxIn,
};
const PSET_IN_NON_WITNESS_UTXO: u8 = 0x00;
const PSET_IN_WITNESS_UTXO: u8 = 0x01;
const PSET_IN_PARTIAL_SIG: u8 = 0x02;
const PSET_IN_SIGHASH_TYPE: u8 = 0x03;
const PSET_IN_REDEEM_SCRIPT: u8 = 0x04;
const PSET_IN_WITNESS_SCRIPT: u8 = 0x05;
const PSET_IN_BIP32_DERIVATION: u8 = 0x06;
const PSET_IN_FINAL_SCRIPTSIG: u8 = 0x07;
const PSET_IN_FINAL_SCRIPTWITNESS: u8 = 0x08;
const PSET_IN_RIPEMD160: u8 = 0x0a;
const PSET_IN_SHA256: u8 = 0x0b;
const PSET_IN_HASH160: u8 = 0x0c;
const PSET_IN_HASH256: u8 = 0x0d;
const PSET_IN_PREVIOUS_TXID: u8 = 0x0e;
const PSET_IN_OUTPUT_INDEX: u8 = 0x0f;
const PSET_IN_SEQUENCE: u8 = 0x10;
const PSET_IN_REQUIRED_TIME_LOCKTIME: u8 = 0x11;
const PSET_IN_REQUIRED_HEIGHT_LOCKTIME: u8 = 0x12;
const PSBT_IN_TAP_KEY_SIG: u8 = 0x13;
const PSBT_IN_TAP_SCRIPT_SIG: u8 = 0x14;
const PSBT_IN_TAP_LEAF_SCRIPT: u8 = 0x15;
const PSBT_IN_TAP_BIP32_DERIVATION: u8 = 0x16;
const PSBT_IN_TAP_INTERNAL_KEY: u8 = 0x17;
const PSBT_IN_TAP_MERKLE_ROOT: u8 = 0x18;
const PSBT_ELEMENTS_IN_ISSUANCE_VALUE: u8 = 0x00;
const PSBT_ELEMENTS_IN_ISSUANCE_VALUE_COMMITMENT: u8 = 0x01;
const PSBT_ELEMENTS_IN_ISSUANCE_VALUE_RANGEPROOF: u8 = 0x02;
const PSBT_ELEMENTS_IN_ISSUANCE_KEYS_RANGEPROOF: u8 = 0x03;
const PSBT_ELEMENTS_IN_PEG_IN_TX: u8 = 0x04;
const PSBT_ELEMENTS_IN_PEG_IN_TXOUT_PROOF: u8 = 0x05;
const PSBT_ELEMENTS_IN_PEG_IN_GENESIS: u8 = 0x06;
const PSBT_ELEMENTS_IN_PEG_IN_CLAIM_SCRIPT: u8 = 0x07;
const PSBT_ELEMENTS_IN_PEG_IN_VALUE: u8 = 0x08;
const PSBT_ELEMENTS_IN_PEG_IN_WITNESS: u8 = 0x09;
const PSBT_ELEMENTS_IN_ISSUANCE_INFLATION_KEYS: u8 = 0x0a;
const PSBT_ELEMENTS_IN_ISSUANCE_INFLATION_KEYS_COMMITMENT: u8 = 0x0b;
const PSBT_ELEMENTS_IN_ISSUANCE_BLINDING_NONCE: u8 = 0x0c;
const PSBT_ELEMENTS_IN_ISSUANCE_ASSET_ENTROPY: u8 = 0x0d;
const PSBT_ELEMENTS_IN_UTXO_RANGEPROOF: u8 = 0x0e;
const PSBT_ELEMENTS_IN_ISSUANCE_BLIND_VALUE_PROOF: u8 = 0x0f;
const PSBT_ELEMENTS_IN_ISSUANCE_BLIND_INFLATION_KEYS_PROOF: u8 = 0x10;
const PSBT_ELEMENTS_IN_EXPLICIT_VALUE: u8 = 0x11;
const PSBT_ELEMENTS_IN_VALUE_PROOF: u8 = 0x12;
const PSBT_ELEMENTS_IN_EXPLICIT_ASSET: u8 = 0x13;
const PSBT_ELEMENTS_IN_ASSET_PROOF: u8 = 0x14;
const PSBT_ELEMENTS_IN_BLINDED_ISSUANCE: u8 = 0x15;
pub fn get_v2_input_pairs(input: &Input, _txin: &TxIn) -> Vec<raw::Pair> {
let mut rv: Vec<raw::Pair> = Default::default();
impl_pset_get_pair! {
rv.push(input.non_witness_utxo as <PSET_IN_NON_WITNESS_UTXO, _>)
}
impl_pset_get_pair! {
rv.push(input.witness_utxo as <PSET_IN_WITNESS_UTXO, _>)
}
impl_pset_get_pair! {
rv.push(input.partial_sigs as <PSET_IN_PARTIAL_SIG, PublicKey>)
}
impl_pset_get_pair! {
rv.push(input.sighash_type as <PSET_IN_SIGHASH_TYPE, _>)
}
impl_pset_get_pair! {
rv.push(input.redeem_script as <PSET_IN_REDEEM_SCRIPT, _>)
}
impl_pset_get_pair! {
rv.push(input.witness_script as <PSET_IN_WITNESS_SCRIPT, _>)
}
impl_pset_get_pair! {
rv.push(input.bip32_derivation as <PSET_IN_BIP32_DERIVATION, PublicKey>)
}
impl_pset_get_pair! {
rv.push(input.final_script_sig as <PSET_IN_FINAL_SCRIPTSIG, _>)
}
impl_pset_get_pair! {
rv.push(input.final_script_witness as <PSET_IN_FINAL_SCRIPTWITNESS, _>)
}
impl_pset_get_pair! {
rv.push(input.ripemd160_preimages as <PSET_IN_RIPEMD160, ripemd160::Hash>)
}
impl_pset_get_pair! {
rv.push(input.sha256_preimages as <PSET_IN_SHA256, sha256::Hash>)
}
impl_pset_get_pair! {
rv.push(input.hash160_preimages as <PSET_IN_HASH160, hash160::Hash>)
}
impl_pset_get_pair! {
rv.push(input.hash256_preimages as <PSET_IN_HASH256, sha256d::Hash>)
}
rv.push(raw::Pair {
key: raw::Key {
type_value: PSET_IN_PREVIOUS_TXID,
key: vec![],
},
value: pset::serialize::Serialize::serialize(&input.previous_txid),
});
rv.push(raw::Pair {
key: raw::Key {
type_value: PSET_IN_OUTPUT_INDEX,
key: vec![],
},
value: pset::serialize::Serialize::serialize(&input.previous_output_index),
});
impl_pset_get_pair! {
rv.push(input.sequence as <PSET_IN_SEQUENCE, _>)
}
impl_pset_get_pair! {
rv.push(input.required_time_locktime as <PSET_IN_REQUIRED_TIME_LOCKTIME, _>)
}
impl_pset_get_pair! {
rv.push(input.required_height_locktime as <PSET_IN_REQUIRED_HEIGHT_LOCKTIME, _>)
}
impl_pset_get_pair! {
rv.push(input.tap_key_sig as <PSBT_IN_TAP_KEY_SIG, _>)
}
impl_pset_get_pair! {
rv.push(input.tap_script_sigs as <PSBT_IN_TAP_SCRIPT_SIG, (schnorr::PublicKey, TapLeafHash)>)
}
impl_pset_get_pair! {
rv.push(input.tap_scripts as <PSBT_IN_TAP_LEAF_SCRIPT, ControlBlock>)
}
impl_pset_get_pair! {
rv.push(input.tap_key_origins as <PSBT_IN_TAP_BIP32_DERIVATION,
schnorr::PublicKey>)
}
impl_pset_get_pair! {
rv.push(input.tap_internal_key as <PSBT_IN_TAP_INTERNAL_KEY, _>)
}
impl_pset_get_pair! {
rv.push(input.tap_merkle_root as <PSBT_IN_TAP_MERKLE_ROOT, _>)
}
impl_pset_get_pair! {
rv.push_prop(input.issuance_value_amount as <PSBT_ELEMENTS_IN_ISSUANCE_VALUE, _>)
}
impl_pset_get_pair! {
rv.push_prop(input.issuance_value_comm as <PSBT_ELEMENTS_IN_ISSUANCE_VALUE_COMMITMENT, _>)
}
impl_pset_get_pair! {
rv.push_prop(input.issuance_value_rangeproof as <PSBT_ELEMENTS_IN_ISSUANCE_VALUE_RANGEPROOF, _>)
}
impl_pset_get_pair! {
rv.push_prop(input.issuance_keys_rangeproof as <PSBT_ELEMENTS_IN_ISSUANCE_KEYS_RANGEPROOF, _>)
}
impl_pset_get_pair! {
rv.push_prop(input.pegin_tx as <PSBT_ELEMENTS_IN_PEG_IN_TX, _>)
}
impl_pset_get_pair! {
rv.push_prop(input.pegin_txout_proof as <PSBT_ELEMENTS_IN_PEG_IN_TXOUT_PROOF, _>)
}
impl_pset_get_pair! {
rv.push_prop(input.pegin_genesis_hash as <PSBT_ELEMENTS_IN_PEG_IN_GENESIS, _>)
}
impl_pset_get_pair! {
rv.push_prop(input.pegin_claim_script as <PSBT_ELEMENTS_IN_PEG_IN_CLAIM_SCRIPT, _>)
}
impl_pset_get_pair! {
rv.push_prop(input.pegin_value as <PSBT_ELEMENTS_IN_PEG_IN_VALUE, _>)
}
impl_pset_get_pair! {
rv.push_prop(input.pegin_witness as <PSBT_ELEMENTS_IN_PEG_IN_WITNESS, _>)
}
impl_pset_get_pair! {
rv.push_prop(input.issuance_inflation_keys as <PSBT_ELEMENTS_IN_ISSUANCE_INFLATION_KEYS, _>)
}
impl_pset_get_pair! {
rv.push_prop(input.issuance_inflation_keys_comm as <PSBT_ELEMENTS_IN_ISSUANCE_INFLATION_KEYS_COMMITMENT, _>)
}
impl_pset_get_pair! {
rv.push_prop(input.issuance_blinding_nonce as <PSBT_ELEMENTS_IN_ISSUANCE_BLINDING_NONCE, _>)
}
impl_pset_get_pair! {
rv.push_prop(input.issuance_asset_entropy as <PSBT_ELEMENTS_IN_ISSUANCE_ASSET_ENTROPY, _>)
}
impl_pset_get_pair! {
rv.push_prop(input.in_utxo_rangeproof as <PSBT_ELEMENTS_IN_UTXO_RANGEPROOF, _>)
}
impl_pset_get_pair! {
rv.push_prop(input.in_issuance_blind_value_proof as <PSBT_ELEMENTS_IN_ISSUANCE_BLIND_VALUE_PROOF, _>)
}
impl_pset_get_pair! {
rv.push_prop(input.in_issuance_blind_inflation_keys_proof as <PSBT_ELEMENTS_IN_ISSUANCE_BLIND_INFLATION_KEYS_PROOF, _>)
}
impl_pset_get_pair! {
rv.push_prop(input.amount as <PSBT_ELEMENTS_IN_EXPLICIT_VALUE, _>)
}
impl_pset_get_pair! {
rv.push_prop(input.blind_value_proof as <PSBT_ELEMENTS_IN_VALUE_PROOF, _>)
}
impl_pset_get_pair! {
rv.push_prop(input.asset as <PSBT_ELEMENTS_IN_EXPLICIT_ASSET, _>)
}
impl_pset_get_pair! {
rv.push_prop(input.blind_asset_proof as <PSBT_ELEMENTS_IN_ASSET_PROOF, _>)
}
impl_pset_get_pair! {
rv.push_prop(input.blinded_issuance as <PSBT_ELEMENTS_IN_BLINDED_ISSUANCE, _>)
}
for (key, value) in input.proprietary.iter() {
rv.push(raw::Pair {
key: key.to_key(),
value: value.clone(),
});
}
for (key, value) in input.unknown.iter() {
rv.push(raw::Pair {
key: key.clone(),
value: value.clone(),
});
}
rv
}