whisky_csl/tx_builder/
mod.rs1mod core_csl;
2pub use core_csl::*;
3mod buildable;
4
5use crate::{CSLParser, WhiskyCSL};
6use whisky_common::*;
7
8impl WhiskyCSL {
9 pub fn new(params: Option<Protocol>) -> Result<Self, WError> {
18 let whisky = WhiskyCSL {
19 core: CoreCSL::new(params)?,
20 parser: CSLParser::new(),
21 tx_builder_body: TxBuilderBody::new(),
22 tx_evaluation_multiplier_percentage: 110,
23 tx_hex: String::new(),
24 };
25
26 Ok(whisky)
27 }
28
29 pub fn add_all_signing_keys(&mut self, signing_keys: &[&str]) -> Result<(), WError> {
37 if !signing_keys.is_empty() {
38 self.core.add_signing_keys(signing_keys)?;
39 }
40 Ok(())
41 }
42
43 pub fn add_all_inputs(&mut self) -> Result<&mut Self, WError> {
48 let inputs = self.tx_builder_body.inputs.clone();
49 for input in inputs {
50 match input {
51 TxIn::PubKeyTxIn(pub_key_tx_in) => self.core.add_tx_in(pub_key_tx_in)?,
52 TxIn::SimpleScriptTxIn(simple_script_tx_in) => {
53 self.core.add_simple_script_tx_in(simple_script_tx_in)?
54 }
55 TxIn::ScriptTxIn(script_tx_in) => self.core.add_script_tx_in(script_tx_in)?,
56 };
57 }
58 self.core
59 .tx_builder
60 .set_inputs(&self.core.tx_inputs_builder);
61 Ok(self)
62 }
63
64 pub fn add_all_outputs(&mut self) -> Result<&mut Self, WError> {
68 let outputs = self.tx_builder_body.outputs.clone();
69 for output in outputs {
70 self.core.add_output(output)?;
71 }
72 Ok(self)
73 }
74
75 pub fn add_all_collaterals(&mut self) -> Result<&mut Self, WError> {
79 let collaterals = self.tx_builder_body.collaterals.clone();
80 for collateral in collaterals {
81 self.core.add_collateral(collateral)?
82 }
83 self.core
84 .tx_builder
85 .set_collateral(&self.core.collateral_builder);
86 Ok(self)
87 }
88
89 pub fn add_all_reference_inputs(&mut self) -> Result<&mut Self, WError> {
93 let ref_inputs = self.tx_builder_body.reference_inputs.clone();
94 for ref_input in ref_inputs {
95 self.core.add_reference_input(ref_input)?;
96 }
97 Ok(self)
98 }
99
100 pub fn add_all_withdrawals(&mut self) -> Result<&mut Self, WError> {
104 let withdrawals = self.tx_builder_body.withdrawals.clone();
105 for withdrawal in withdrawals {
106 match withdrawal {
107 Withdrawal::PubKeyWithdrawal(pub_key_withdrawal) => {
108 self.core.add_pub_key_withdrawal(pub_key_withdrawal)?
109 }
110 Withdrawal::PlutusScriptWithdrawal(plutus_script_withdrawal) => {
111 self.core.add_plutus_withdrawal(plutus_script_withdrawal)?
112 }
113 Withdrawal::SimpleScriptWithdrawal(simple_script_withdrawal) => self
114 .core
115 .add_simple_script_withdrawal(simple_script_withdrawal)?,
116 }
117 }
118 self.core
119 .tx_builder
120 .set_withdrawals_builder(&self.core.tx_withdrawals_builder);
121 Ok(self)
122 }
123
124 pub fn add_all_mints(&mut self) -> Result<&mut Self, WError> {
128 let mints = self.tx_builder_body.mints.clone();
129 for (index, mint) in mints.into_iter().enumerate() {
130 match mint {
131 MintItem::ScriptMint(script_mint) => {
132 self.core.add_plutus_mint(script_mint, index as u64)?
133 }
134 MintItem::SimpleScriptMint(simple_script_mint) => {
135 self.core.add_native_mint(simple_script_mint)?
136 }
137 };
138 }
139 self.core
140 .tx_builder
141 .set_mint_builder(&self.core.mint_builder);
142 Ok(self)
143 }
144
145 pub fn add_all_certificates(&mut self) -> Result<&mut Self, WError> {
149 let certificates = self.tx_builder_body.certificates.clone();
150 for (index, cert) in certificates.into_iter().enumerate() {
151 self.core.add_cert(cert, index as u64)?
152 }
153 self.core
154 .tx_builder
155 .set_certs_builder(&self.core.certificates_builder);
156 Ok(self)
157 }
158
159 pub fn add_all_votes(&mut self) -> Result<&mut Self, WError> {
163 let votes = self.tx_builder_body.votes.clone();
164 for (index, vote) in votes.into_iter().enumerate() {
165 self.core.add_vote(vote, index as u64)?
166 }
167 self.core
168 .tx_builder
169 .set_voting_builder(&self.core.vote_builder);
170 Ok(self)
171 }
172
173 pub fn add_validity_range(&mut self) -> Result<&mut Self, WError> {
177 let validity_range = self.tx_builder_body.validity_range.clone();
178 if validity_range.invalid_before.is_some() {
179 self.core
180 .add_invalid_before(validity_range.invalid_before.unwrap())?;
181 };
182 if validity_range.invalid_hereafter.is_some() {
183 self.core
184 .add_invalid_hereafter(validity_range.invalid_hereafter.unwrap())?;
185 };
186 Ok(self)
187 }
188
189 pub fn add_all_required_signature(&mut self) -> Result<&mut Self, WError> {
193 let required_signatures = self
194 .tx_builder_body
195 .required_signatures
196 .iter()
197 .map(|s| s.as_str())
198 .collect::<Vec<&str>>();
199 for pub_key_hash in required_signatures {
200 self.core
201 .add_required_signature(pub_key_hash)
202 .map_err(WError::from_err("add_all_required_signature"))?;
203 }
204 Ok(self)
205 }
206
207 pub fn add_all_metadata(&mut self) -> Result<&mut Self, WError> {
211 let all_metadata = self.tx_builder_body.metadata.clone();
212 for metadata in all_metadata {
213 self.core
214 .add_metadata(metadata)
215 .map_err(WError::from_err("add_all_metadata"))?;
216 }
217 Ok(self)
218 }
219
220 pub fn add_script_hash(&mut self) -> Result<&mut Self, WError> {
224 match self.tx_builder_body.network.clone() {
225 Some(current_network) => self.core.add_script_hash(current_network)?,
226 None => self.core.add_script_hash(Network::Mainnet)?,
227 };
228 Ok(self)
229 }
230
231 pub fn set_fee_if_needed(&mut self) -> Result<&mut Self, WError> {
235 if self.tx_builder_body.fee.is_some() {
236 self.set_fee(self.tx_builder_body.fee.clone().unwrap());
237 }
238 Ok(self)
239 }
240
241 pub fn add_change_utxo(&mut self) -> Result<&mut Self, WError> {
242 self.core.add_change(
243 self.tx_builder_body.change_address.clone(),
244 self.tx_builder_body.change_datum.clone(),
245 )?;
246 Ok(self)
247 }
248
249 pub fn add_collateral_return(&mut self) -> Result<&mut Self, WError> {
250 if self.tx_builder_body.total_collateral.is_some() {
251 match self.tx_builder_body.collateral_return_address.clone() {
252 Some(address) => {
253 self.set_total_collateral_and_return(
254 self.tx_builder_body.total_collateral.clone().unwrap(),
255 address,
256 )?;
257 }
258 None => {
259 self.set_total_collateral_and_return(
260 self.tx_builder_body.total_collateral.clone().unwrap(),
261 self.tx_builder_body.change_address.clone(),
262 )?;
263 }
264 }
265 }
266 Ok(self)
267 }
268
269 pub fn set_fee(&mut self, fee: String) {
270 self.core.set_fee(fee);
271 }
272
273 pub fn set_total_collateral_and_return(
274 &mut self,
275 total_collateral: String,
276 collateral_return_address: String,
277 ) -> Result<&mut Self, WError> {
278 self.core
279 .set_total_collateral_and_return(total_collateral, collateral_return_address)?;
280 Ok(self)
281 }
282}
283
284