Skip to main content

smplx_sdk/transaction/
partial_input.rs

1use simplicityhl::elements::confidential::{Asset, Value};
2use simplicityhl::elements::pset::Input;
3use simplicityhl::elements::{AssetId, LockTime, OutPoint, Sequence, TxOut, TxOutSecrets, Txid};
4
5use crate::program::ProgramTrait;
6use crate::program::WitnessTrait;
7
8use super::UTXO;
9
10#[derive(Debug, Clone)]
11pub enum RequiredSignature {
12    None,
13    NativeEcdsa,
14    Witness(String),
15}
16
17#[derive(Debug, Clone)]
18pub struct PartialInput {
19    pub witness_txid: Txid,
20    pub witness_output_index: u32,
21    pub witness_utxo: TxOut,
22    pub sequence: Sequence,
23    pub locktime: LockTime,
24    // if utxo is explicit, amount and asset are Some
25    pub amount: Option<u64>,
26    pub asset: Option<AssetId>,
27    // if utxo is confidential, secrets are Some
28    pub secrets: Option<TxOutSecrets>,
29}
30
31#[derive(Clone)]
32pub struct ProgramInput {
33    pub program: Box<dyn ProgramTrait>,
34    pub witness: Box<dyn WitnessTrait>,
35}
36
37#[derive(Clone)]
38pub struct IssuanceInput {
39    pub issuance_amount: u64,
40    pub asset_entropy: [u8; 32],
41}
42
43impl PartialInput {
44    pub fn new(utxo: UTXO) -> Self {
45        let amount = match utxo.txout.value {
46            Value::Explicit(value) => Some(value),
47            _ => None,
48        };
49        let asset = match utxo.txout.asset {
50            Asset::Explicit(asset) => Some(asset),
51            _ => None,
52        };
53
54        Self {
55            witness_txid: utxo.outpoint.txid,
56            witness_output_index: utxo.outpoint.vout,
57            witness_utxo: utxo.txout,
58            sequence: Sequence::default(),
59            locktime: LockTime::ZERO,
60            amount,
61            asset,
62            secrets: utxo.secrets,
63        }
64    }
65
66    pub fn with_sequence(mut self, sequence: Sequence) -> Self {
67        self.sequence = sequence;
68
69        self
70    }
71
72    pub fn with_locktime(mut self, locktime: LockTime) -> Self {
73        self.locktime = locktime;
74
75        self
76    }
77
78    pub fn outpoint(&self) -> OutPoint {
79        OutPoint {
80            txid: self.witness_txid,
81            vout: self.witness_output_index,
82        }
83    }
84
85    pub fn to_input(&self) -> Input {
86        let time_locktime = match self.locktime {
87            LockTime::Seconds(value) => Some(value),
88            _ => None,
89        };
90        // zero height locktime is essentially ignored
91        let height_locktime = match self.locktime {
92            LockTime::Blocks(value) => Some(value),
93            _ => None,
94        };
95
96        Input {
97            previous_txid: self.witness_txid,
98            previous_output_index: self.witness_output_index,
99            witness_utxo: Some(self.witness_utxo.clone()),
100            sequence: Some(self.sequence),
101            required_time_locktime: time_locktime,
102            required_height_locktime: height_locktime,
103            amount: self.amount,
104            asset: self.asset,
105            ..Default::default()
106        }
107    }
108}
109
110impl ProgramInput {
111    pub fn new(program: Box<dyn ProgramTrait>, witness: Box<dyn WitnessTrait>) -> Self {
112        Self { program, witness }
113    }
114}
115
116impl IssuanceInput {
117    pub fn new(issuance_amount: u64, asset_entropy: [u8; 32]) -> Self {
118        Self {
119            issuance_amount,
120            asset_entropy,
121        }
122    }
123
124    pub fn to_input(&self) -> Input {
125        Input {
126            issuance_value_amount: Some(self.issuance_amount),
127            issuance_asset_entropy: Some(self.asset_entropy),
128            issuance_inflation_keys: None,
129            blinded_issuance: Some(0x00),
130            ..Default::default()
131        }
132    }
133}