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)]
12pub enum RequiredSignature {
13 None,
15 NativeEcdsa,
17 Witness(String),
19 WitnessWithPath(String, Vec<String>),
21}
22
23impl RequiredSignature {
24 pub fn witness_with_path<I>(name: &str, path: I) -> Self
26 where
27 I: IntoIterator,
28 I::Item: AsRef<str>,
29 {
30 RequiredSignature::WitnessWithPath(
31 name.to_string(),
32 path.into_iter().map(|s| s.as_ref().to_string()).collect(),
33 )
34 }
35}
36
37#[derive(Debug, Clone)]
39pub struct PartialInput {
40 pub witness_txid: Txid,
42 pub witness_output_index: u32,
44 pub witness_utxo: TxOut,
46 pub sequence: Sequence,
48 pub locktime: LockTime,
50 pub amount: Option<u64>,
53 pub asset: Option<AssetId>,
55 pub secrets: Option<TxOutSecrets>,
58}
59
60#[derive(Clone)]
62pub struct ProgramInput {
63 pub program: Box<dyn ProgramTrait>,
65 pub witness: Box<dyn WitnessTrait>,
67}
68
69#[derive(Clone, Debug)]
71pub enum IssuanceInput {
72 Issuance {
74 issuance_amount: u64,
76 inflation_amount: u64,
78 asset_entropy: [u8; 32],
80 },
81 Reissuance {
83 issuance_amount: u64,
85 asset_entropy: [u8; 32],
87 },
88}
89
90impl PartialInput {
91 #[must_use]
94 pub fn new(utxo: UTXO) -> Self {
95 let amount = match utxo.txout.value {
96 Value::Explicit(value) => Some(value),
97 _ => None,
98 };
99 let asset = match utxo.txout.asset {
100 Asset::Explicit(asset) => Some(asset),
101 _ => None,
102 };
103
104 Self {
105 witness_txid: utxo.outpoint.txid,
106 witness_output_index: utxo.outpoint.vout,
107 witness_utxo: utxo.txout,
108 sequence: Sequence::default(),
109 locktime: LockTime::ZERO,
110 amount,
111 asset,
112 secrets: utxo.secrets,
113 }
114 }
115
116 #[must_use]
118 pub fn with_sequence(mut self, sequence: Sequence) -> Self {
119 self.sequence = sequence;
120
121 self
122 }
123
124 #[must_use]
126 pub fn with_locktime(mut self, locktime: LockTime) -> Self {
127 self.locktime = locktime;
128
129 self
130 }
131
132 #[must_use]
134 pub fn outpoint(&self) -> OutPoint {
135 OutPoint {
136 txid: self.witness_txid,
137 vout: self.witness_output_index,
138 }
139 }
140
141 #[must_use]
143 pub fn to_input(&self) -> Input {
144 let time_locktime = match self.locktime {
145 LockTime::Seconds(value) => Some(value),
146 LockTime::Blocks(_) => None,
147 };
148 let height_locktime = match self.locktime {
150 LockTime::Blocks(value) => Some(value),
151 LockTime::Seconds(_) => None,
152 };
153
154 Input {
155 previous_txid: self.witness_txid,
156 previous_output_index: self.witness_output_index,
157 witness_utxo: Some(self.witness_utxo.clone()),
158 sequence: Some(self.sequence),
159 required_time_locktime: time_locktime,
160 required_height_locktime: height_locktime,
161 amount: self.amount,
162 asset: self.asset,
163 ..Default::default()
164 }
165 }
166}
167
168impl ProgramInput {
169 #[must_use]
171 pub fn new(program: Box<dyn ProgramTrait>, witness: Box<dyn WitnessTrait>) -> Self {
172 Self { program, witness }
173 }
174}
175
176impl IssuanceInput {
177 #[must_use]
179 pub fn new_issuance(issuance_amount: u64, inflation_amount: u64, asset_entropy: [u8; 32]) -> Self {
180 Self::Issuance {
181 issuance_amount,
182 inflation_amount,
183 asset_entropy,
184 }
185 }
186
187 #[must_use]
189 pub fn new_reissuance(issuance_amount: u64, asset_entropy: [u8; 32]) -> Self {
190 Self::Reissuance {
191 issuance_amount,
192 asset_entropy,
193 }
194 }
195
196 #[must_use]
198 pub fn to_input(&self) -> Input {
199 let (issuance_amount, asset_entropy, inflation_amount) = match self {
200 Self::Issuance {
201 issuance_amount,
202 inflation_amount,
203 asset_entropy,
204 } => {
205 let inflation_amount = (*inflation_amount > 0).then_some(*inflation_amount);
206
207 (*issuance_amount, *asset_entropy, inflation_amount)
208 }
209 Self::Reissuance {
210 issuance_amount,
211 asset_entropy,
212 } => (*issuance_amount, *asset_entropy, None),
213 };
214
215 Input {
216 issuance_value_amount: Some(issuance_amount),
217 issuance_asset_entropy: Some(asset_entropy),
218 issuance_inflation_keys: inflation_amount,
219 blinded_issuance: Some(0x00),
220 ..Default::default()
221 }
222 }
223}