1pub mod utils;
2
3use crate::utils::BigInteger;
7
8use super::{PlutusDataList, SubCoin};
9use crate::{LegacyRedeemerList, MapRedeemerKeyToRedeemerVal};
10pub use cml_chain::plutus::{Language, RedeemerTag};
11use cml_core_wasm::{impl_wasm_cbor_json_api, impl_wasm_conversions, impl_wasm_map};
12pub use utils::{ConstrPlutusData, PlutusMap};
13use wasm_bindgen::prelude::wasm_bindgen;
14
15impl_wasm_map!(
16 u64,
17 Vec<i64>,
18 u64,
19 Vec<i64>,
20 Vec<u64>,
21 MapU64ToArrI64,
22 true,
23 true,
24 true,
25 false
26);
27
28#[derive(Clone, Debug)]
29#[wasm_bindgen]
30pub struct CostModels(cml_chain::plutus::CostModels);
31
32impl_wasm_cbor_json_api!(CostModels);
33
34impl_wasm_conversions!(cml_chain::plutus::CostModels, CostModels);
35
36#[wasm_bindgen]
37impl CostModels {
38 pub fn inner(&self) -> MapU64ToArrI64 {
39 self.0.inner.clone().into()
40 }
41}
42
43#[derive(Clone, Debug)]
44#[wasm_bindgen]
45pub struct ExUnitPrices(cml_chain::plutus::ExUnitPrices);
46
47impl_wasm_cbor_json_api!(ExUnitPrices);
48
49impl_wasm_conversions!(cml_chain::plutus::ExUnitPrices, ExUnitPrices);
50
51#[wasm_bindgen]
52impl ExUnitPrices {
53 pub fn mem_price(&self) -> SubCoin {
54 self.0.mem_price.clone().into()
55 }
56
57 pub fn step_price(&self) -> SubCoin {
58 self.0.step_price.clone().into()
59 }
60
61 pub fn new(mem_price: &SubCoin, step_price: &SubCoin) -> Self {
62 Self(cml_chain::plutus::ExUnitPrices::new(
63 mem_price.clone().into(),
64 step_price.clone().into(),
65 ))
66 }
67}
68
69#[derive(Clone, Debug)]
70#[wasm_bindgen]
71pub struct ExUnits(cml_chain::plutus::ExUnits);
72
73impl_wasm_cbor_json_api!(ExUnits);
74
75impl_wasm_conversions!(cml_chain::plutus::ExUnits, ExUnits);
76
77#[wasm_bindgen]
78impl ExUnits {
79 pub fn mem(&self) -> u64 {
80 self.0.mem
81 }
82
83 pub fn steps(&self) -> u64 {
84 self.0.steps
85 }
86
87 pub fn new(mem: u64, steps: u64) -> Self {
88 Self(cml_chain::plutus::ExUnits::new(mem, steps))
89 }
90}
91
92#[derive(Clone, Debug)]
93#[wasm_bindgen]
94pub struct LegacyRedeemer(cml_chain::plutus::LegacyRedeemer);
95
96impl_wasm_cbor_json_api!(LegacyRedeemer);
97
98impl_wasm_conversions!(cml_chain::plutus::LegacyRedeemer, LegacyRedeemer);
99
100#[wasm_bindgen]
101impl LegacyRedeemer {
102 pub fn tag(&self) -> RedeemerTag {
103 self.0.tag
104 }
105
106 pub fn index(&self) -> u64 {
107 self.0.index
108 }
109
110 pub fn data(&self) -> PlutusData {
111 self.0.data.clone().into()
112 }
113
114 pub fn ex_units(&self) -> ExUnits {
115 self.0.ex_units.clone().into()
116 }
117
118 pub fn new(tag: RedeemerTag, index: u64, data: &PlutusData, ex_units: &ExUnits) -> Self {
119 Self(cml_chain::plutus::LegacyRedeemer::new(
120 tag,
121 index,
122 data.clone().into(),
123 ex_units.clone().into(),
124 ))
125 }
126}
127
128#[derive(Clone, Debug)]
129#[wasm_bindgen]
130pub struct PlutusData(cml_chain::plutus::PlutusData);
131
132impl_wasm_cbor_json_api!(PlutusData);
133
134impl_wasm_conversions!(cml_chain::plutus::PlutusData, PlutusData);
135
136#[wasm_bindgen]
137impl PlutusData {
138 pub fn new_constr_plutus_data(constr_plutus_data: &ConstrPlutusData) -> Self {
139 Self(cml_chain::plutus::PlutusData::new_constr_plutus_data(
140 constr_plutus_data.clone().into(),
141 ))
142 }
143
144 pub fn new_map(map: &PlutusMap) -> Self {
145 Self(cml_chain::plutus::PlutusData::new_map(map.clone().into()))
146 }
147
148 pub fn new_list(list: &PlutusDataList) -> Self {
149 Self(cml_chain::plutus::PlutusData::new_list(list.clone().into()))
150 }
151
152 pub fn new_integer(big_int: &BigInteger) -> Self {
153 Self(cml_chain::plutus::PlutusData::new_integer(
154 big_int.clone().into(),
155 ))
156 }
157
158 pub fn new_bytes(bytes: Vec<u8>) -> Self {
159 Self(cml_chain::plutus::PlutusData::new_bytes(bytes))
160 }
161
162 pub fn kind(&self) -> PlutusDataKind {
163 match &self.0 {
164 cml_chain::plutus::PlutusData::ConstrPlutusData(_) => PlutusDataKind::ConstrPlutusData,
165 cml_chain::plutus::PlutusData::Map { .. } => PlutusDataKind::Map,
166 cml_chain::plutus::PlutusData::List { .. } => PlutusDataKind::List,
167 cml_chain::plutus::PlutusData::Integer(_) => PlutusDataKind::Integer,
168 cml_chain::plutus::PlutusData::Bytes { .. } => PlutusDataKind::Bytes,
169 }
170 }
171
172 pub fn as_constr_plutus_data(&self) -> Option<ConstrPlutusData> {
173 match &self.0 {
174 cml_chain::plutus::PlutusData::ConstrPlutusData(constr_plutus_data) => {
175 Some(constr_plutus_data.clone().into())
176 }
177 _ => None,
178 }
179 }
180
181 pub fn as_map(&self) -> Option<PlutusMap> {
182 match &self.0 {
183 cml_chain::plutus::PlutusData::Map(map) => Some(map.clone().into()),
184 _ => None,
185 }
186 }
187
188 pub fn as_list(&self) -> Option<PlutusDataList> {
189 match &self.0 {
190 cml_chain::plutus::PlutusData::List { list, .. } => Some(list.clone().into()),
191 _ => None,
192 }
193 }
194
195 pub fn as_integer(&self) -> Option<BigInteger> {
196 match &self.0 {
197 cml_chain::plutus::PlutusData::Integer(big_int) => Some(big_int.clone().into()),
198 _ => None,
199 }
200 }
201
202 pub fn as_bytes(&self) -> Option<Vec<u8>> {
203 match &self.0 {
204 cml_chain::plutus::PlutusData::Bytes { bytes, .. } => Some(bytes.clone()),
205 _ => None,
206 }
207 }
208}
209
210#[wasm_bindgen]
211pub enum PlutusDataKind {
212 ConstrPlutusData,
213 Map,
214 List,
215 Integer,
216 Bytes,
217}
218
219#[derive(Clone, Debug)]
220#[wasm_bindgen]
221pub struct PlutusV1Script(cml_chain::plutus::PlutusV1Script);
222
223impl_wasm_cbor_json_api!(PlutusV1Script);
224
225impl_wasm_conversions!(cml_chain::plutus::PlutusV1Script, PlutusV1Script);
226
227#[derive(Clone, Debug)]
228#[wasm_bindgen]
229pub struct PlutusV2Script(cml_chain::plutus::PlutusV2Script);
230
231impl_wasm_cbor_json_api!(PlutusV2Script);
232
233impl_wasm_conversions!(cml_chain::plutus::PlutusV2Script, PlutusV2Script);
234
235#[derive(Clone, Debug)]
236#[wasm_bindgen]
237pub struct PlutusV3Script(cml_chain::plutus::PlutusV3Script);
238
239impl_wasm_cbor_json_api!(PlutusV3Script);
240
241impl_wasm_conversions!(cml_chain::plutus::PlutusV3Script, PlutusV3Script);
242
243#[derive(Clone, Debug)]
244#[wasm_bindgen]
245pub struct RedeemerKey(cml_chain::plutus::RedeemerKey);
246
247impl_wasm_cbor_json_api!(RedeemerKey);
248
249impl_wasm_conversions!(cml_chain::plutus::RedeemerKey, RedeemerKey);
250
251#[wasm_bindgen]
252impl RedeemerKey {
253 pub fn tag(&self) -> RedeemerTag {
254 self.0.tag
255 }
256
257 pub fn index(&self) -> u64 {
258 self.0.index
259 }
260
261 pub fn new(tag: RedeemerTag, index: u64) -> Self {
262 Self(cml_chain::plutus::RedeemerKey::new(tag, index))
263 }
264}
265
266#[derive(Clone, Debug)]
267#[wasm_bindgen]
268pub struct RedeemerVal(cml_chain::plutus::RedeemerVal);
269
270impl_wasm_cbor_json_api!(RedeemerVal);
271
272impl_wasm_conversions!(cml_chain::plutus::RedeemerVal, RedeemerVal);
273
274#[wasm_bindgen]
275impl RedeemerVal {
276 pub fn data(&self) -> PlutusData {
277 self.0.data.clone().into()
278 }
279
280 pub fn ex_units(&self) -> ExUnits {
281 self.0.ex_units.clone().into()
282 }
283
284 pub fn new(data: &PlutusData, ex_units: &ExUnits) -> Self {
285 Self(cml_chain::plutus::RedeemerVal::new(
286 data.clone().into(),
287 ex_units.clone().into(),
288 ))
289 }
290}
291
292#[derive(Clone, Debug)]
293#[wasm_bindgen]
294pub struct Redeemers(cml_chain::plutus::Redeemers);
295
296impl_wasm_cbor_json_api!(Redeemers);
297
298impl_wasm_conversions!(cml_chain::plutus::Redeemers, Redeemers);
299
300#[wasm_bindgen]
301impl Redeemers {
302 pub fn new_arr_legacy_redeemer(arr_legacy_redeemer: &LegacyRedeemerList) -> Self {
303 Self(cml_chain::plutus::Redeemers::new_arr_legacy_redeemer(
304 arr_legacy_redeemer.clone().into(),
305 ))
306 }
307
308 pub fn new_map_redeemer_key_to_redeemer_val(
309 map_redeemer_key_to_redeemer_val: &MapRedeemerKeyToRedeemerVal,
310 ) -> Self {
311 Self(
312 cml_chain::plutus::Redeemers::new_map_redeemer_key_to_redeemer_val(
313 map_redeemer_key_to_redeemer_val.clone().into(),
314 ),
315 )
316 }
317
318 pub fn kind(&self) -> RedeemersKind {
319 match &self.0 {
320 cml_chain::plutus::Redeemers::ArrLegacyRedeemer { .. } => {
321 RedeemersKind::ArrLegacyRedeemer
322 }
323 cml_chain::plutus::Redeemers::MapRedeemerKeyToRedeemerVal { .. } => {
324 RedeemersKind::MapRedeemerKeyToRedeemerVal
325 }
326 }
327 }
328
329 pub fn as_arr_legacy_redeemer(&self) -> Option<LegacyRedeemerList> {
330 match &self.0 {
331 cml_chain::plutus::Redeemers::ArrLegacyRedeemer {
332 arr_legacy_redeemer,
333 ..
334 } => Some(arr_legacy_redeemer.clone().into()),
335 _ => None,
336 }
337 }
338
339 pub fn as_map_redeemer_key_to_redeemer_val(&self) -> Option<MapRedeemerKeyToRedeemerVal> {
340 match &self.0 {
341 cml_chain::plutus::Redeemers::MapRedeemerKeyToRedeemerVal {
342 map_redeemer_key_to_redeemer_val,
343 ..
344 } => Some(map_redeemer_key_to_redeemer_val.clone().into()),
345 _ => None,
346 }
347 }
348}
349
350#[wasm_bindgen]
351pub enum RedeemersKind {
352 ArrLegacyRedeemer,
353 MapRedeemerKeyToRedeemerVal,
354}