1use super::cbor_encodings::*;
5use super::*;
6use cbor_event::de::Deserializer;
7use cbor_event::se::Serializer;
8use cml_core::error::*;
9use cml_core::serialization::*;
10use std::collections::BTreeMap;
11use std::io::{BufRead, Seek, SeekFrom, Write};
12
13use crate::utils::{read_bounded_bytes, write_bounded_bytes};
15
16impl Serialize for CostModels {
17 fn serialize<'se, W: Write>(
18 &self,
19 serializer: &'se mut Serializer<W>,
20 force_canonical: bool,
21 ) -> cbor_event::Result<&'se mut Serializer<W>> {
22 serializer.write_map_sz(
23 self.encodings
24 .as_ref()
25 .map(|encs| encs.inner_encoding)
26 .unwrap_or_default()
27 .to_len_sz(self.inner.len() as u64, force_canonical),
28 )?;
29 let mut key_order = self
30 .inner
31 .iter()
32 .map(|(k, v)| {
33 let mut buf = cbor_event::se::Serializer::new_vec();
34 let inner_key_encoding = self
35 .encodings
36 .as_ref()
37 .and_then(|encs| encs.inner_key_encodings.get(k))
38 .cloned()
39 .unwrap_or_default();
40 buf.write_unsigned_integer_sz(*k, fit_sz(*k, inner_key_encoding, force_canonical))?;
41 Ok((buf.finalize(), k, v))
42 })
43 .collect::<Result<Vec<(Vec<u8>, &_, &_)>, cbor_event::Error>>()?;
44 if force_canonical {
45 key_order.sort_by(|(lhs_bytes, _, _), (rhs_bytes, _, _)| {
46 match lhs_bytes.len().cmp(&rhs_bytes.len()) {
47 std::cmp::Ordering::Equal => lhs_bytes.cmp(rhs_bytes),
48 diff_ord => diff_ord,
49 }
50 });
51 }
52 for (key_bytes, key, value) in key_order {
53 serializer.write_raw_bytes(&key_bytes)?;
54 let (inner_value_encoding, inner_value_elem_encodings) = self
55 .encodings
56 .as_ref()
57 .and_then(|encs| encs.inner_value_encodings.get(key))
58 .cloned()
59 .unwrap_or_else(|| (LenEncoding::default(), Vec::new()));
60 serializer.write_array_sz(
61 inner_value_encoding.to_len_sz(value.len() as u64, force_canonical),
62 )?;
63 for (i, element) in value.iter().enumerate() {
64 let inner_value_elem_encoding = inner_value_elem_encodings
65 .get(i)
66 .cloned()
67 .unwrap_or_default();
68 if *element >= 0 {
69 serializer.write_unsigned_integer_sz(
70 *element as u64,
71 fit_sz(*element as u64, inner_value_elem_encoding, force_canonical),
72 )?;
73 } else {
74 serializer.write_negative_integer_sz(
75 *element as i128,
76 fit_sz(
77 (*element + 1).unsigned_abs(),
78 inner_value_elem_encoding,
79 force_canonical,
80 ),
81 )?;
82 }
83 }
84 inner_value_encoding.end(serializer, force_canonical)?;
85 }
86 self.encodings
87 .as_ref()
88 .map(|encs| encs.inner_encoding)
89 .unwrap_or_default()
90 .end(serializer, force_canonical)
91 }
92}
93
94impl Deserialize for CostModels {
95 fn deserialize<R: BufRead + Seek>(raw: &mut Deserializer<R>) -> Result<Self, DeserializeError> {
96 let mut inner_table = OrderedHashMap::new();
97 let inner_len = raw.map_sz()?;
98 let inner_encoding = inner_len.into();
99 let mut inner_key_encodings = BTreeMap::new();
100 let mut inner_value_encodings = BTreeMap::new();
101 while match inner_len {
102 cbor_event::LenSz::Len(n, _) => (inner_table.len() as u64) < n,
103 cbor_event::LenSz::Indefinite => true,
104 } {
105 if raw.cbor_type()? == cbor_event::Type::Special {
106 assert_eq!(raw.special()?, cbor_event::Special::Break);
107 break;
108 }
109 let (inner_key, inner_key_encoding) =
110 raw.unsigned_integer_sz().map(|(x, enc)| (x, Some(enc)))?;
111 let mut inner_value_arr = Vec::new();
112 let len = raw.array_sz()?;
113 let inner_value_encoding = len.into();
114 let mut inner_value_elem_encodings = Vec::new();
115 while match len {
116 cbor_event::LenSz::Len(n, _) => (inner_value_arr.len() as u64) < n,
117 cbor_event::LenSz::Indefinite => true,
118 } {
119 if raw.cbor_type()? == cbor_event::Type::Special {
120 assert_eq!(raw.special()?, cbor_event::Special::Break);
121 break;
122 }
123 let (inner_value_elem, inner_value_elem_encoding) = match raw.cbor_type()? {
124 cbor_event::Type::UnsignedInteger => {
125 let (x, enc) = raw.unsigned_integer_sz()?;
126 (x as i64, Some(enc))
127 }
128 _ => {
129 let (x, enc) = raw.negative_integer_sz()?;
130 (x as i64, Some(enc))
131 }
132 };
133 inner_value_arr.push(inner_value_elem);
134 inner_value_elem_encodings.push(inner_value_elem_encoding);
135 }
136 let (inner_value, inner_value_encoding, inner_value_elem_encodings) = (
137 inner_value_arr,
138 inner_value_encoding,
139 inner_value_elem_encodings,
140 );
141 if inner_table.insert(inner_key, inner_value).is_some() {
142 return Err(DeserializeFailure::DuplicateKey(Key::Uint(inner_key)).into());
143 }
144 inner_key_encodings.insert(inner_key, inner_key_encoding);
145 inner_value_encodings.insert(
146 inner_key,
147 (inner_value_encoding, inner_value_elem_encodings),
148 );
149 }
150 let (inner, inner_encoding, inner_key_encodings, inner_value_encodings) = (
151 inner_table,
152 inner_encoding,
153 inner_key_encodings,
154 inner_value_encodings,
155 );
156 Ok(Self {
157 inner,
158 encodings: Some(CostModelsEncoding {
159 inner_encoding,
160 inner_key_encodings,
161 inner_value_encodings,
162 }),
163 })
164 }
165}
166
167impl Serialize for ExUnitPrices {
168 fn serialize<'se, W: Write>(
169 &self,
170 serializer: &'se mut Serializer<W>,
171 force_canonical: bool,
172 ) -> cbor_event::Result<&'se mut Serializer<W>> {
173 serializer.write_array_sz(
174 self.encodings
175 .as_ref()
176 .map(|encs| encs.len_encoding)
177 .unwrap_or_default()
178 .to_len_sz(2, force_canonical),
179 )?;
180 self.mem_price.serialize(serializer, force_canonical)?;
181 self.step_price.serialize(serializer, force_canonical)?;
182 self.encodings
183 .as_ref()
184 .map(|encs| encs.len_encoding)
185 .unwrap_or_default()
186 .end(serializer, force_canonical)
187 }
188}
189
190impl Deserialize for ExUnitPrices {
191 fn deserialize<R: BufRead + Seek>(raw: &mut Deserializer<R>) -> Result<Self, DeserializeError> {
192 let len = raw.array_sz()?;
193 let len_encoding: LenEncoding = len.into();
194 let mut read_len = CBORReadLen::new(len);
195 read_len.read_elems(2)?;
196 read_len.finish()?;
197 (|| -> Result<_, DeserializeError> {
198 let mem_price = Rational::deserialize(raw)
199 .map_err(|e: DeserializeError| e.annotate("mem_price"))?;
200 let step_price = Rational::deserialize(raw)
201 .map_err(|e: DeserializeError| e.annotate("step_price"))?;
202 match len {
203 cbor_event::LenSz::Len(_, _) => (),
204 cbor_event::LenSz::Indefinite => match raw.special()? {
205 cbor_event::Special::Break => (),
206 _ => return Err(DeserializeFailure::EndingBreakMissing.into()),
207 },
208 }
209 Ok(ExUnitPrices {
210 mem_price,
211 step_price,
212 encodings: Some(ExUnitPricesEncoding { len_encoding }),
213 })
214 })()
215 .map_err(|e| e.annotate("ExUnitPrices"))
216 }
217}
218
219impl Serialize for ExUnits {
220 fn serialize<'se, W: Write>(
221 &self,
222 serializer: &'se mut Serializer<W>,
223 force_canonical: bool,
224 ) -> cbor_event::Result<&'se mut Serializer<W>> {
225 serializer.write_array_sz(
226 self.encodings
227 .as_ref()
228 .map(|encs| encs.len_encoding)
229 .unwrap_or_default()
230 .to_len_sz(2, force_canonical),
231 )?;
232 serializer.write_unsigned_integer_sz(
233 self.mem,
234 fit_sz(
235 self.mem,
236 self.encodings
237 .as_ref()
238 .map(|encs| encs.mem_encoding)
239 .unwrap_or_default(),
240 force_canonical,
241 ),
242 )?;
243 serializer.write_unsigned_integer_sz(
244 self.steps,
245 fit_sz(
246 self.steps,
247 self.encodings
248 .as_ref()
249 .map(|encs| encs.steps_encoding)
250 .unwrap_or_default(),
251 force_canonical,
252 ),
253 )?;
254 self.encodings
255 .as_ref()
256 .map(|encs| encs.len_encoding)
257 .unwrap_or_default()
258 .end(serializer, force_canonical)
259 }
260}
261
262impl Deserialize for ExUnits {
263 fn deserialize<R: BufRead + Seek>(raw: &mut Deserializer<R>) -> Result<Self, DeserializeError> {
264 let len = raw.array_sz()?;
265 let len_encoding: LenEncoding = len.into();
266 let mut read_len = CBORReadLen::new(len);
267 read_len.read_elems(2)?;
268 read_len.finish()?;
269 (|| -> Result<_, DeserializeError> {
270 let (mem, mem_encoding) = raw
271 .unsigned_integer_sz()
272 .map_err(Into::<DeserializeError>::into)
273 .map(|(x, enc)| (x, Some(enc)))
274 .map_err(|e: DeserializeError| e.annotate("mem"))?;
275 let (steps, steps_encoding) = raw
276 .unsigned_integer_sz()
277 .map_err(Into::<DeserializeError>::into)
278 .map(|(x, enc)| (x, Some(enc)))
279 .map_err(|e: DeserializeError| e.annotate("steps"))?;
280 match len {
281 cbor_event::LenSz::Len(_, _) => (),
282 cbor_event::LenSz::Indefinite => match raw.special()? {
283 cbor_event::Special::Break => (),
284 _ => return Err(DeserializeFailure::EndingBreakMissing.into()),
285 },
286 }
287 Ok(ExUnits {
288 mem,
289 steps,
290 encodings: Some(ExUnitsEncoding {
291 len_encoding,
292 mem_encoding,
293 steps_encoding,
294 }),
295 })
296 })()
297 .map_err(|e| e.annotate("ExUnits"))
298 }
299}
300
301impl Serialize for LegacyRedeemer {
302 fn serialize<'se, W: Write>(
303 &self,
304 serializer: &'se mut Serializer<W>,
305 force_canonical: bool,
306 ) -> cbor_event::Result<&'se mut Serializer<W>> {
307 serializer.write_array_sz(
308 self.encodings
309 .as_ref()
310 .map(|encs| encs.len_encoding)
311 .unwrap_or_default()
312 .to_len_sz(4, force_canonical),
313 )?;
314 match &self.tag {
315 RedeemerTag::Spend => serializer.write_unsigned_integer_sz(
316 0u64,
317 fit_sz(
318 0u64,
319 self.encodings
320 .as_ref()
321 .map(|encs| encs.tag_encoding)
322 .unwrap_or_default(),
323 force_canonical,
324 ),
325 ),
326 RedeemerTag::Mint => serializer.write_unsigned_integer_sz(
327 1u64,
328 fit_sz(
329 1u64,
330 self.encodings
331 .as_ref()
332 .map(|encs| encs.tag_encoding)
333 .unwrap_or_default(),
334 force_canonical,
335 ),
336 ),
337 RedeemerTag::Cert => serializer.write_unsigned_integer_sz(
338 2u64,
339 fit_sz(
340 2u64,
341 self.encodings
342 .as_ref()
343 .map(|encs| encs.tag_encoding)
344 .unwrap_or_default(),
345 force_canonical,
346 ),
347 ),
348 RedeemerTag::Reward => serializer.write_unsigned_integer_sz(
349 3u64,
350 fit_sz(
351 3u64,
352 self.encodings
353 .as_ref()
354 .map(|encs| encs.tag_encoding)
355 .unwrap_or_default(),
356 force_canonical,
357 ),
358 ),
359 RedeemerTag::Voting => serializer.write_unsigned_integer_sz(
360 4u64,
361 fit_sz(
362 4u64,
363 self.encodings
364 .as_ref()
365 .map(|encs| encs.tag_encoding)
366 .unwrap_or_default(),
367 force_canonical,
368 ),
369 ),
370 RedeemerTag::Proposing => serializer.write_unsigned_integer_sz(
371 5u64,
372 fit_sz(
373 5u64,
374 self.encodings
375 .as_ref()
376 .map(|encs| encs.tag_encoding)
377 .unwrap_or_default(),
378 force_canonical,
379 ),
380 ),
381 }?;
382 serializer.write_unsigned_integer_sz(
383 self.index,
384 fit_sz(
385 self.index,
386 self.encodings
387 .as_ref()
388 .map(|encs| encs.index_encoding)
389 .unwrap_or_default(),
390 force_canonical,
391 ),
392 )?;
393 self.data.serialize(serializer, force_canonical)?;
394 self.ex_units.serialize(serializer, force_canonical)?;
395 self.encodings
396 .as_ref()
397 .map(|encs| encs.len_encoding)
398 .unwrap_or_default()
399 .end(serializer, force_canonical)
400 }
401}
402
403impl Deserialize for LegacyRedeemer {
404 fn deserialize<R: BufRead + Seek>(raw: &mut Deserializer<R>) -> Result<Self, DeserializeError> {
405 let len = raw.array_sz()?;
406 let len_encoding: LenEncoding = len.into();
407 let mut read_len = CBORReadLen::new(len);
408 read_len.read_elems(4)?;
409 read_len.finish()?;
410 (|| -> Result<_, DeserializeError> {
411 let (tag, tag_encoding) = (|| -> Result<_, DeserializeError> {
412 let initial_position = raw.as_mut_ref().stream_position().unwrap();
413 let deser_variant = (|raw: &mut Deserializer<_>| -> Result<_, DeserializeError> {
414 let (spend_value, spend_encoding) = raw.unsigned_integer_sz()?;
415 if spend_value != 0 {
416 return Err(DeserializeFailure::FixedValueMismatch {
417 found: Key::Uint(spend_value),
418 expected: Key::Uint(0),
419 }
420 .into());
421 }
422 Ok(Some(spend_encoding))
423 })(raw);
424 match deser_variant {
425 Ok(tag_encoding) => return Ok((RedeemerTag::Spend, tag_encoding)),
426 Err(_) => raw
427 .as_mut_ref()
428 .seek(SeekFrom::Start(initial_position))
429 .unwrap(),
430 };
431 let deser_variant = (|raw: &mut Deserializer<_>| -> Result<_, DeserializeError> {
432 let (mint_value, mint_encoding) = raw.unsigned_integer_sz()?;
433 if mint_value != 1 {
434 return Err(DeserializeFailure::FixedValueMismatch {
435 found: Key::Uint(mint_value),
436 expected: Key::Uint(1),
437 }
438 .into());
439 }
440 Ok(Some(mint_encoding))
441 })(raw);
442 match deser_variant {
443 Ok(tag_encoding) => return Ok((RedeemerTag::Mint, tag_encoding)),
444 Err(_) => raw
445 .as_mut_ref()
446 .seek(SeekFrom::Start(initial_position))
447 .unwrap(),
448 };
449 let deser_variant = (|raw: &mut Deserializer<_>| -> Result<_, DeserializeError> {
450 let (cert_value, cert_encoding) = raw.unsigned_integer_sz()?;
451 if cert_value != 2 {
452 return Err(DeserializeFailure::FixedValueMismatch {
453 found: Key::Uint(cert_value),
454 expected: Key::Uint(2),
455 }
456 .into());
457 }
458 Ok(Some(cert_encoding))
459 })(raw);
460 match deser_variant {
461 Ok(tag_encoding) => return Ok((RedeemerTag::Cert, tag_encoding)),
462 Err(_) => raw
463 .as_mut_ref()
464 .seek(SeekFrom::Start(initial_position))
465 .unwrap(),
466 };
467 let deser_variant = (|raw: &mut Deserializer<_>| -> Result<_, DeserializeError> {
468 let (reward_value, reward_encoding) = raw.unsigned_integer_sz()?;
469 if reward_value != 3 {
470 return Err(DeserializeFailure::FixedValueMismatch {
471 found: Key::Uint(reward_value),
472 expected: Key::Uint(3),
473 }
474 .into());
475 }
476 Ok(Some(reward_encoding))
477 })(raw);
478 match deser_variant {
479 Ok(tag_encoding) => return Ok((RedeemerTag::Reward, tag_encoding)),
480 Err(_) => raw
481 .as_mut_ref()
482 .seek(SeekFrom::Start(initial_position))
483 .unwrap(),
484 };
485 let deser_variant = (|raw: &mut Deserializer<_>| -> Result<_, DeserializeError> {
486 let (voting_value, voting_encoding) = raw.unsigned_integer_sz()?;
487 if voting_value != 4 {
488 return Err(DeserializeFailure::FixedValueMismatch {
489 found: Key::Uint(voting_value),
490 expected: Key::Uint(4),
491 }
492 .into());
493 }
494 Ok(Some(voting_encoding))
495 })(raw);
496 match deser_variant {
497 Ok(tag_encoding) => return Ok((RedeemerTag::Voting, tag_encoding)),
498 Err(_) => raw
499 .as_mut_ref()
500 .seek(SeekFrom::Start(initial_position))
501 .unwrap(),
502 };
503 let deser_variant = (|raw: &mut Deserializer<_>| -> Result<_, DeserializeError> {
504 let (proposing_value, proposing_encoding) = raw.unsigned_integer_sz()?;
505 if proposing_value != 5 {
506 return Err(DeserializeFailure::FixedValueMismatch {
507 found: Key::Uint(proposing_value),
508 expected: Key::Uint(5),
509 }
510 .into());
511 }
512 Ok(Some(proposing_encoding))
513 })(raw);
514 match deser_variant {
515 Ok(tag_encoding) => return Ok((RedeemerTag::Proposing, tag_encoding)),
516 Err(_) => raw
517 .as_mut_ref()
518 .seek(SeekFrom::Start(initial_position))
519 .unwrap(),
520 };
521 Err(DeserializeError::new(
522 "RedeemerTag",
523 DeserializeFailure::NoVariantMatched,
524 ))
525 })()
526 .map_err(|e| e.annotate("tag"))?;
527 let (index, index_encoding) = raw
528 .unsigned_integer_sz()
529 .map_err(Into::<DeserializeError>::into)
530 .map(|(x, enc)| (x, Some(enc)))
531 .map_err(|e: DeserializeError| e.annotate("index"))?;
532 let data =
533 PlutusData::deserialize(raw).map_err(|e: DeserializeError| e.annotate("data"))?;
534 let ex_units =
535 ExUnits::deserialize(raw).map_err(|e: DeserializeError| e.annotate("ex_units"))?;
536 match len {
537 cbor_event::LenSz::Len(_, _) => (),
538 cbor_event::LenSz::Indefinite => match raw.special()? {
539 cbor_event::Special::Break => (),
540 _ => return Err(DeserializeFailure::EndingBreakMissing.into()),
541 },
542 }
543 Ok(LegacyRedeemer {
544 tag,
545 index,
546 data,
547 ex_units,
548 encodings: Some(LegacyRedeemerEncoding {
549 len_encoding,
550 tag_encoding,
551 index_encoding,
552 }),
553 })
554 })()
555 .map_err(|e| e.annotate("LegacyRedeemer"))
556 }
557}
558
559impl Serialize for PlutusData {
560 fn serialize<'se, W: Write>(
561 &self,
562 serializer: &'se mut Serializer<W>,
563 force_canonical: bool,
564 ) -> cbor_event::Result<&'se mut Serializer<W>> {
565 match self {
566 PlutusData::ConstrPlutusData(constr_plutus_data) => {
567 constr_plutus_data.serialize(serializer, force_canonical)
568 }
569 PlutusData::Map(map) => map.serialize(serializer, force_canonical),
570 PlutusData::List {
571 list,
572 list_encoding,
573 } => {
574 serializer
575 .write_array_sz(list_encoding.to_len_sz(list.len() as u64, force_canonical))?;
576 for element in list.iter() {
577 element.serialize(serializer, force_canonical)?;
578 }
579 list_encoding.end(serializer, force_canonical)
580 }
581 PlutusData::Integer(big_int) => big_int.serialize(serializer, force_canonical),
582 PlutusData::Bytes {
584 bytes,
585 bytes_encoding,
586 } => write_bounded_bytes(serializer, bytes, bytes_encoding, force_canonical),
587 }
588 }
589}
590
591impl Deserialize for PlutusData {
592 fn deserialize<R: BufRead + Seek>(raw: &mut Deserializer<R>) -> Result<Self, DeserializeError> {
593 (|| -> Result<_, DeserializeError> {
594 match raw.cbor_type()? {
598 cbor_event::Type::Tag => {
599 let initial_position = raw.as_mut_ref().stream_position().unwrap();
601 let tag = raw.tag()?;
602 raw.as_mut_ref()
603 .seek(SeekFrom::Start(initial_position))
604 .unwrap();
605 if tag == 2 || tag == 3 {
606 BigInteger::deserialize(raw)
607 .map(Self::Integer)
608 .map_err(|e| e.annotate("Integer"))
609 } else {
610 ConstrPlutusData::deserialize(raw)
611 .map(Self::ConstrPlutusData)
612 .map_err(|e| e.annotate("ConstrPlutusData"))
613 }
614 }
615 cbor_event::Type::Map => PlutusMap::deserialize(raw)
616 .map(Self::Map)
617 .map_err(|e| e.annotate("Map")),
618 cbor_event::Type::Array => {
619 (|raw: &mut Deserializer<_>| -> Result<_, DeserializeError> {
620 let mut list_arr = Vec::new();
621 let len = raw.array_sz()?;
622 let list_encoding = len.into();
623 while match len {
624 cbor_event::LenSz::Len(n, _) => (list_arr.len() as u64) < n,
625 cbor_event::LenSz::Indefinite => true,
626 } {
627 if raw.cbor_type()? == cbor_event::Type::Special {
628 assert_eq!(raw.special()?, cbor_event::Special::Break);
629 break;
630 }
631 list_arr.push(PlutusData::deserialize(raw)?);
632 }
633 Ok(Self::List {
634 list: list_arr,
635 list_encoding,
636 })
637 })(raw)
638 .map_err(|e| e.annotate("List"))
639 }
640 cbor_event::Type::UnsignedInteger | cbor_event::Type::NegativeInteger => {
641 BigInteger::deserialize(raw)
642 .map(Self::Integer)
643 .map_err(|e| e.annotate("Integer"))
644 }
645 cbor_event::Type::Bytes => read_bounded_bytes(raw)
647 .map(|(bytes, bytes_encoding)| Self::Bytes {
648 bytes,
649 bytes_encoding,
650 })
651 .map_err(|e| e.annotate("Bytes")),
652 _ => Err(DeserializeFailure::NoVariantMatched.into()),
653 }
654 })()
655 .map_err(|e| e.annotate("PlutusData"))
656 }
657}
658
659impl Serialize for PlutusV1Script {
660 fn serialize<'se, W: Write>(
661 &self,
662 serializer: &'se mut Serializer<W>,
663 force_canonical: bool,
664 ) -> cbor_event::Result<&'se mut Serializer<W>> {
665 serializer.write_bytes_sz(
666 &self.inner,
667 self.encodings
668 .as_ref()
669 .map(|encs| encs.inner_encoding.clone())
670 .unwrap_or_default()
671 .to_str_len_sz(self.inner.len() as u64, force_canonical),
672 )
673 }
674}
675
676impl Deserialize for PlutusV1Script {
677 fn deserialize<R: BufRead + Seek>(raw: &mut Deserializer<R>) -> Result<Self, DeserializeError> {
678 let (inner, inner_encoding) = raw
679 .bytes_sz()
680 .map(|(bytes, enc)| (bytes, StringEncoding::from(enc)))?;
681 Ok(Self {
682 inner,
683 encodings: Some(PlutusV1ScriptEncoding { inner_encoding }),
684 })
685 }
686}
687
688impl Serialize for PlutusV2Script {
689 fn serialize<'se, W: Write>(
690 &self,
691 serializer: &'se mut Serializer<W>,
692 force_canonical: bool,
693 ) -> cbor_event::Result<&'se mut Serializer<W>> {
694 serializer.write_bytes_sz(
695 &self.inner,
696 self.encodings
697 .as_ref()
698 .map(|encs| encs.inner_encoding.clone())
699 .unwrap_or_default()
700 .to_str_len_sz(self.inner.len() as u64, force_canonical),
701 )
702 }
703}
704
705impl Deserialize for PlutusV2Script {
706 fn deserialize<R: BufRead + Seek>(raw: &mut Deserializer<R>) -> Result<Self, DeserializeError> {
707 let (inner, inner_encoding) = raw
708 .bytes_sz()
709 .map(|(bytes, enc)| (bytes, StringEncoding::from(enc)))?;
710 Ok(Self {
711 inner,
712 encodings: Some(PlutusV2ScriptEncoding { inner_encoding }),
713 })
714 }
715}
716
717impl Serialize for PlutusV3Script {
718 fn serialize<'se, W: Write>(
719 &self,
720 serializer: &'se mut Serializer<W>,
721 force_canonical: bool,
722 ) -> cbor_event::Result<&'se mut Serializer<W>> {
723 serializer.write_bytes_sz(
724 &self.inner,
725 self.encodings
726 .as_ref()
727 .map(|encs| encs.inner_encoding.clone())
728 .unwrap_or_default()
729 .to_str_len_sz(self.inner.len() as u64, force_canonical),
730 )
731 }
732}
733
734impl Deserialize for PlutusV3Script {
735 fn deserialize<R: BufRead + Seek>(raw: &mut Deserializer<R>) -> Result<Self, DeserializeError> {
736 let (inner, inner_encoding) = raw
737 .bytes_sz()
738 .map(|(bytes, enc)| (bytes, StringEncoding::from(enc)))?;
739 Ok(Self {
740 inner,
741 encodings: Some(PlutusV3ScriptEncoding { inner_encoding }),
742 })
743 }
744}
745
746impl Serialize for RedeemerKey {
747 fn serialize<'se, W: Write>(
748 &self,
749 serializer: &'se mut Serializer<W>,
750 force_canonical: bool,
751 ) -> cbor_event::Result<&'se mut Serializer<W>> {
752 serializer.write_array_sz(
753 self.encodings
754 .as_ref()
755 .map(|encs| encs.len_encoding)
756 .unwrap_or_default()
757 .to_len_sz(2, force_canonical),
758 )?;
759 match &self.tag {
760 RedeemerTag::Spend => serializer.write_unsigned_integer_sz(
761 0u64,
762 fit_sz(
763 0u64,
764 self.encodings
765 .as_ref()
766 .map(|encs| encs.tag_encoding)
767 .unwrap_or_default(),
768 force_canonical,
769 ),
770 ),
771 RedeemerTag::Mint => serializer.write_unsigned_integer_sz(
772 1u64,
773 fit_sz(
774 1u64,
775 self.encodings
776 .as_ref()
777 .map(|encs| encs.tag_encoding)
778 .unwrap_or_default(),
779 force_canonical,
780 ),
781 ),
782 RedeemerTag::Cert => serializer.write_unsigned_integer_sz(
783 2u64,
784 fit_sz(
785 2u64,
786 self.encodings
787 .as_ref()
788 .map(|encs| encs.tag_encoding)
789 .unwrap_or_default(),
790 force_canonical,
791 ),
792 ),
793 RedeemerTag::Reward => serializer.write_unsigned_integer_sz(
794 3u64,
795 fit_sz(
796 3u64,
797 self.encodings
798 .as_ref()
799 .map(|encs| encs.tag_encoding)
800 .unwrap_or_default(),
801 force_canonical,
802 ),
803 ),
804 RedeemerTag::Voting => serializer.write_unsigned_integer_sz(
805 4u64,
806 fit_sz(
807 4u64,
808 self.encodings
809 .as_ref()
810 .map(|encs| encs.tag_encoding)
811 .unwrap_or_default(),
812 force_canonical,
813 ),
814 ),
815 RedeemerTag::Proposing => serializer.write_unsigned_integer_sz(
816 5u64,
817 fit_sz(
818 5u64,
819 self.encodings
820 .as_ref()
821 .map(|encs| encs.tag_encoding)
822 .unwrap_or_default(),
823 force_canonical,
824 ),
825 ),
826 }?;
827 serializer.write_unsigned_integer_sz(
828 self.index,
829 fit_sz(
830 self.index,
831 self.encodings
832 .as_ref()
833 .map(|encs| encs.index_encoding)
834 .unwrap_or_default(),
835 force_canonical,
836 ),
837 )?;
838 self.encodings
839 .as_ref()
840 .map(|encs| encs.len_encoding)
841 .unwrap_or_default()
842 .end(serializer, force_canonical)
843 }
844}
845
846impl Deserialize for RedeemerKey {
847 fn deserialize<R: BufRead + Seek>(raw: &mut Deserializer<R>) -> Result<Self, DeserializeError> {
848 let len = raw.array_sz()?;
849 let len_encoding: LenEncoding = len.into();
850 let mut read_len = CBORReadLen::new(len);
851 read_len.read_elems(2)?;
852 read_len.finish()?;
853 (|| -> Result<_, DeserializeError> {
854 let (tag, tag_encoding) = (|| -> Result<_, DeserializeError> {
855 let initial_position = raw.as_mut_ref().stream_position().unwrap();
856 let deser_variant = (|raw: &mut Deserializer<_>| -> Result<_, DeserializeError> {
857 let (spend_value, spend_encoding) = raw.unsigned_integer_sz()?;
858 if spend_value != 0 {
859 return Err(DeserializeFailure::FixedValueMismatch {
860 found: Key::Uint(spend_value),
861 expected: Key::Uint(0),
862 }
863 .into());
864 }
865 Ok(Some(spend_encoding))
866 })(raw);
867 match deser_variant {
868 Ok(tag_encoding) => return Ok((RedeemerTag::Spend, tag_encoding)),
869 Err(_) => raw
870 .as_mut_ref()
871 .seek(SeekFrom::Start(initial_position))
872 .unwrap(),
873 };
874 let deser_variant = (|raw: &mut Deserializer<_>| -> Result<_, DeserializeError> {
875 let (mint_value, mint_encoding) = raw.unsigned_integer_sz()?;
876 if mint_value != 1 {
877 return Err(DeserializeFailure::FixedValueMismatch {
878 found: Key::Uint(mint_value),
879 expected: Key::Uint(1),
880 }
881 .into());
882 }
883 Ok(Some(mint_encoding))
884 })(raw);
885 match deser_variant {
886 Ok(tag_encoding) => return Ok((RedeemerTag::Mint, tag_encoding)),
887 Err(_) => raw
888 .as_mut_ref()
889 .seek(SeekFrom::Start(initial_position))
890 .unwrap(),
891 };
892 let deser_variant = (|raw: &mut Deserializer<_>| -> Result<_, DeserializeError> {
893 let (cert_value, cert_encoding) = raw.unsigned_integer_sz()?;
894 if cert_value != 2 {
895 return Err(DeserializeFailure::FixedValueMismatch {
896 found: Key::Uint(cert_value),
897 expected: Key::Uint(2),
898 }
899 .into());
900 }
901 Ok(Some(cert_encoding))
902 })(raw);
903 match deser_variant {
904 Ok(tag_encoding) => return Ok((RedeemerTag::Cert, tag_encoding)),
905 Err(_) => raw
906 .as_mut_ref()
907 .seek(SeekFrom::Start(initial_position))
908 .unwrap(),
909 };
910 let deser_variant = (|raw: &mut Deserializer<_>| -> Result<_, DeserializeError> {
911 let (reward_value, reward_encoding) = raw.unsigned_integer_sz()?;
912 if reward_value != 3 {
913 return Err(DeserializeFailure::FixedValueMismatch {
914 found: Key::Uint(reward_value),
915 expected: Key::Uint(3),
916 }
917 .into());
918 }
919 Ok(Some(reward_encoding))
920 })(raw);
921 match deser_variant {
922 Ok(tag_encoding) => return Ok((RedeemerTag::Reward, tag_encoding)),
923 Err(_) => raw
924 .as_mut_ref()
925 .seek(SeekFrom::Start(initial_position))
926 .unwrap(),
927 };
928 let deser_variant = (|raw: &mut Deserializer<_>| -> Result<_, DeserializeError> {
929 let (voting_value, voting_encoding) = raw.unsigned_integer_sz()?;
930 if voting_value != 4 {
931 return Err(DeserializeFailure::FixedValueMismatch {
932 found: Key::Uint(voting_value),
933 expected: Key::Uint(4),
934 }
935 .into());
936 }
937 Ok(Some(voting_encoding))
938 })(raw);
939 match deser_variant {
940 Ok(tag_encoding) => return Ok((RedeemerTag::Voting, tag_encoding)),
941 Err(_) => raw
942 .as_mut_ref()
943 .seek(SeekFrom::Start(initial_position))
944 .unwrap(),
945 };
946 let deser_variant = (|raw: &mut Deserializer<_>| -> Result<_, DeserializeError> {
947 let (proposing_value, proposing_encoding) = raw.unsigned_integer_sz()?;
948 if proposing_value != 5 {
949 return Err(DeserializeFailure::FixedValueMismatch {
950 found: Key::Uint(proposing_value),
951 expected: Key::Uint(5),
952 }
953 .into());
954 }
955 Ok(Some(proposing_encoding))
956 })(raw);
957 match deser_variant {
958 Ok(tag_encoding) => return Ok((RedeemerTag::Proposing, tag_encoding)),
959 Err(_) => raw
960 .as_mut_ref()
961 .seek(SeekFrom::Start(initial_position))
962 .unwrap(),
963 };
964 Err(DeserializeError::new(
965 "RedeemerTag",
966 DeserializeFailure::NoVariantMatched,
967 ))
968 })()
969 .map_err(|e| e.annotate("tag"))?;
970 let (index, index_encoding) = raw
971 .unsigned_integer_sz()
972 .map_err(Into::<DeserializeError>::into)
973 .map(|(x, enc)| (x, Some(enc)))
974 .map_err(|e: DeserializeError| e.annotate("index"))?;
975 match len {
976 cbor_event::LenSz::Len(_, _) => (),
977 cbor_event::LenSz::Indefinite => match raw.special()? {
978 cbor_event::Special::Break => (),
979 _ => return Err(DeserializeFailure::EndingBreakMissing.into()),
980 },
981 }
982 Ok(RedeemerKey {
983 tag,
984 index,
985 encodings: Some(RedeemerKeyEncoding {
986 len_encoding,
987 tag_encoding,
988 index_encoding,
989 }),
990 })
991 })()
992 .map_err(|e| e.annotate("RedeemerKey"))
993 }
994}
995
996impl Serialize for RedeemerVal {
997 fn serialize<'se, W: Write>(
998 &self,
999 serializer: &'se mut Serializer<W>,
1000 force_canonical: bool,
1001 ) -> cbor_event::Result<&'se mut Serializer<W>> {
1002 serializer.write_array_sz(
1003 self.encodings
1004 .as_ref()
1005 .map(|encs| encs.len_encoding)
1006 .unwrap_or_default()
1007 .to_len_sz(2, force_canonical),
1008 )?;
1009 self.data.serialize(serializer, force_canonical)?;
1010 self.ex_units.serialize(serializer, force_canonical)?;
1011 self.encodings
1012 .as_ref()
1013 .map(|encs| encs.len_encoding)
1014 .unwrap_or_default()
1015 .end(serializer, force_canonical)
1016 }
1017}
1018
1019impl Deserialize for RedeemerVal {
1020 fn deserialize<R: BufRead + Seek>(raw: &mut Deserializer<R>) -> Result<Self, DeserializeError> {
1021 let len = raw.array_sz()?;
1022 let len_encoding: LenEncoding = len.into();
1023 let mut read_len = CBORReadLen::new(len);
1024 read_len.read_elems(2)?;
1025 read_len.finish()?;
1026 (|| -> Result<_, DeserializeError> {
1027 let data =
1028 PlutusData::deserialize(raw).map_err(|e: DeserializeError| e.annotate("data"))?;
1029 let ex_units =
1030 ExUnits::deserialize(raw).map_err(|e: DeserializeError| e.annotate("ex_units"))?;
1031 match len {
1032 cbor_event::LenSz::Len(_, _) => (),
1033 cbor_event::LenSz::Indefinite => match raw.special()? {
1034 cbor_event::Special::Break => (),
1035 _ => return Err(DeserializeFailure::EndingBreakMissing.into()),
1036 },
1037 }
1038 Ok(RedeemerVal {
1039 data,
1040 ex_units,
1041 encodings: Some(RedeemerValEncoding { len_encoding }),
1042 })
1043 })()
1044 .map_err(|e| e.annotate("RedeemerVal"))
1045 }
1046}
1047
1048impl Serialize for Redeemers {
1049 fn serialize<'se, W: Write>(
1050 &self,
1051 serializer: &'se mut Serializer<W>,
1052 force_canonical: bool,
1053 ) -> cbor_event::Result<&'se mut Serializer<W>> {
1054 match self {
1055 Redeemers::ArrLegacyRedeemer {
1056 arr_legacy_redeemer,
1057 arr_legacy_redeemer_encoding,
1058 } => {
1059 serializer.write_array_sz(
1060 arr_legacy_redeemer_encoding
1061 .to_len_sz(arr_legacy_redeemer.len() as u64, force_canonical),
1062 )?;
1063 for element in arr_legacy_redeemer.iter() {
1064 element.serialize(serializer, force_canonical)?;
1065 }
1066 arr_legacy_redeemer_encoding.end(serializer, force_canonical)
1067 }
1068 Redeemers::MapRedeemerKeyToRedeemerVal {
1069 map_redeemer_key_to_redeemer_val,
1070 map_redeemer_key_to_redeemer_val_encoding,
1071 } => {
1072 serializer.write_map_sz(map_redeemer_key_to_redeemer_val_encoding.to_len_sz(
1073 map_redeemer_key_to_redeemer_val.len() as u64,
1074 force_canonical,
1075 ))?;
1076 let mut key_order = map_redeemer_key_to_redeemer_val
1077 .iter()
1078 .map(|(k, v)| {
1079 let mut buf = cbor_event::se::Serializer::new_vec();
1080 k.serialize(&mut buf, force_canonical)?;
1081 Ok((buf.finalize(), k, v))
1082 })
1083 .collect::<Result<Vec<(Vec<u8>, &_, &_)>, cbor_event::Error>>()?;
1084 if force_canonical {
1085 key_order.sort_by(|(lhs_bytes, _, _), (rhs_bytes, _, _)| {
1086 match lhs_bytes.len().cmp(&rhs_bytes.len()) {
1087 std::cmp::Ordering::Equal => lhs_bytes.cmp(rhs_bytes),
1088 diff_ord => diff_ord,
1089 }
1090 });
1091 }
1092 for (key_bytes, _key, value) in key_order {
1093 serializer.write_raw_bytes(&key_bytes)?;
1094 value.serialize(serializer, force_canonical)?;
1095 }
1096 map_redeemer_key_to_redeemer_val_encoding.end(serializer, force_canonical)
1097 }
1098 }
1099 }
1100}
1101
1102impl Deserialize for Redeemers {
1103 fn deserialize<R: BufRead + Seek>(raw: &mut Deserializer<R>) -> Result<Self, DeserializeError> {
1104 (|| -> Result<_, DeserializeError> {
1105 match raw.cbor_type()? {
1106 cbor_event::Type::Array => {
1107 let mut arr_legacy_redeemer_arr = Vec::new();
1108 let len = raw.array_sz()?;
1109 let arr_legacy_redeemer_encoding = len.into();
1110 while match len {
1111 cbor_event::LenSz::Len(n, _) => (arr_legacy_redeemer_arr.len() as u64) < n,
1112 cbor_event::LenSz::Indefinite => true,
1113 } {
1114 if raw.cbor_type()? == cbor_event::Type::Special {
1115 assert_eq!(raw.special()?, cbor_event::Special::Break);
1116 break;
1117 }
1118 arr_legacy_redeemer_arr.push(LegacyRedeemer::deserialize(raw)?);
1119 }
1120 let (arr_legacy_redeemer, arr_legacy_redeemer_encoding) =
1121 (arr_legacy_redeemer_arr, arr_legacy_redeemer_encoding);
1122 Ok(Self::ArrLegacyRedeemer {
1123 arr_legacy_redeemer,
1124 arr_legacy_redeemer_encoding,
1125 })
1126 }
1127 cbor_event::Type::Map => {
1128 let mut map_redeemer_key_to_redeemer_val_table = OrderedHashMap::new();
1129 let map_redeemer_key_to_redeemer_val_len = raw.map_sz()?;
1130 let map_redeemer_key_to_redeemer_val_encoding =
1131 map_redeemer_key_to_redeemer_val_len.into();
1132 while match map_redeemer_key_to_redeemer_val_len {
1133 cbor_event::LenSz::Len(n, _) => {
1134 (map_redeemer_key_to_redeemer_val_table.len() as u64) < n
1135 }
1136 cbor_event::LenSz::Indefinite => true,
1137 } {
1138 if raw.cbor_type()? == cbor_event::Type::Special {
1139 assert_eq!(raw.special()?, cbor_event::Special::Break);
1140 break;
1141 }
1142 let map_redeemer_key_to_redeemer_val_key = RedeemerKey::deserialize(raw)?;
1143 let map_redeemer_key_to_redeemer_val_value = RedeemerVal::deserialize(raw)?;
1144 if map_redeemer_key_to_redeemer_val_table
1145 .insert(
1146 map_redeemer_key_to_redeemer_val_key.clone(),
1147 map_redeemer_key_to_redeemer_val_value,
1148 )
1149 .is_some()
1150 {
1151 return Err(DeserializeFailure::DuplicateKey(Key::Str(String::from(
1152 "some complicated/unsupported type",
1153 )))
1154 .into());
1155 }
1156 }
1157 let (
1158 map_redeemer_key_to_redeemer_val,
1159 map_redeemer_key_to_redeemer_val_encoding,
1160 ) = (
1161 map_redeemer_key_to_redeemer_val_table,
1162 map_redeemer_key_to_redeemer_val_encoding,
1163 );
1164 Ok(Self::MapRedeemerKeyToRedeemerVal {
1165 map_redeemer_key_to_redeemer_val,
1166 map_redeemer_key_to_redeemer_val_encoding,
1167 })
1168 }
1169 _ => Err(DeserializeError::new(
1170 "Redeemers",
1171 DeserializeFailure::NoVariantMatched,
1172 )),
1173 }
1174 })()
1175 .map_err(|e| e.annotate("Redeemers"))
1176 }
1177}