1use super::definitions::*;
2use super::types::TryFromParser;
3use super::types::{
4 AccountId, Amount, Blob, Hash128, Hash160, Hash192, Hash256, Issue, PathSet, STObject,
5 Vector256, XChainBridge,
6};
7use crate::core::binarycodec::exceptions::XRPLBinaryCodecException;
8use crate::core::binarycodec::utils::*;
9use crate::core::exceptions::XRPLCoreException;
10use crate::core::exceptions::XRPLCoreResult;
11use crate::utils::ToBytes;
12use crate::XRPLSerdeJsonError;
13use alloc::borrow::ToOwned;
14use alloc::string::String;
15use alloc::string::ToString;
16use alloc::vec;
17use alloc::vec::Vec;
18use core::convert::TryFrom;
19use core::convert::TryInto;
20use hex::ToHex;
21use serde::Serialize;
22use serde_json::{Map, Value};
23
24pub type BinarySerializer = Vec<u8>;
26
27#[derive(Debug, Clone)]
45pub struct BinaryParser(Vec<u8>);
46
47fn _encode_variable_length_prefix(length: &usize) -> XRPLCoreResult<Vec<u8>> {
60 if length <= &MAX_SINGLE_BYTE_LENGTH {
61 Ok([*length as u8].to_vec())
62 } else if length < &MAX_DOUBLE_BYTE_LENGTH {
63 let mut bytes = vec![];
64 let b_length = *length - (MAX_SINGLE_BYTE_LENGTH + 1);
65 let val_a: u8 = ((b_length >> 8) + (MAX_SINGLE_BYTE_LENGTH + 1))
66 .try_into()
67 .map_err(XRPLBinaryCodecException::TryFromIntError)?;
68 let val_b: u8 = (b_length & 0xFF)
69 .try_into()
70 .map_err(XRPLBinaryCodecException::TryFromIntError)?;
71
72 bytes.extend_from_slice(&[val_a]);
73 bytes.extend_from_slice(&[val_b]);
74
75 Ok(bytes)
76 } else if length <= &MAX_LENGTH_VALUE {
77 let mut bytes = vec![];
78 let b_length = *length - MAX_DOUBLE_BYTE_LENGTH;
79 let val_a: u8 = ((MAX_SECOND_BYTE_VALUE + 1) + (b_length >> 16))
80 .try_into()
81 .map_err(XRPLBinaryCodecException::TryFromIntError)?;
82 let val_b: u8 = ((b_length >> 8) & 0xFF)
83 .try_into()
84 .map_err(XRPLBinaryCodecException::TryFromIntError)?;
85 let val_c: u8 = (b_length & 0xFF)
86 .try_into()
87 .map_err(XRPLBinaryCodecException::TryFromIntError)?;
88
89 bytes.extend_from_slice(&[val_a]);
90 bytes.extend_from_slice(&[val_b]);
91 bytes.extend_from_slice(&[val_c]);
92
93 Ok(bytes)
94 } else {
95 Err(XRPLBinaryCodecException::InvalidVariableLengthTooLarge {
96 max: MAX_LENGTH_VALUE,
97 }
98 .into())
99 }
100}
101
102pub trait Parser {
103 fn peek(&self) -> Option<[u8; 1]>;
121
122 fn skip_bytes(&mut self, n: usize) -> XRPLCoreResult<&Self>;
149
150 fn read(&mut self, n: usize) -> XRPLCoreResult<Vec<u8>>;
177
178 fn read_uint8(&mut self) -> XRPLCoreResult<u8>;
205
206 fn read_uint16(&mut self) -> XRPLCoreResult<u16>;
233
234 fn read_uint32(&mut self) -> XRPLCoreResult<u32>;
261
262 fn is_end(&self, custom_end: Option<usize>) -> bool;
302
303 fn read_length_prefix(&mut self) -> XRPLCoreResult<usize>;
333
334 fn read_field_header(&mut self) -> XRPLCoreResult<FieldHeader>;
337
338 fn read_field(&mut self) -> XRPLCoreResult<FieldInstance>;
343
344 fn read_type<T: TryFromParser>(&mut self) -> XRPLCoreResult<T, T::Error>;
346
347 fn read_field_value<T: TryFromParser>(
350 &mut self,
351 field: &FieldInstance,
352 ) -> XRPLCoreResult<T, T::Error>
353 where
354 T::Error: From<XRPLCoreException>;
355}
356
357pub trait Serialization {
358 fn append(&mut self, bytes: &[u8]) -> &Self;
375
376 fn write_length_encoded(&mut self, value: &[u8], encode_value: bool) -> &Self;
395
396 fn write_field_and_value(
431 &mut self,
432 field: FieldInstance,
433 value: &[u8],
434 is_unl_modify_workaround: bool,
435 ) -> &Self;
436}
437
438impl Serialization for BinarySerializer {
439 fn append(&mut self, bytes: &[u8]) -> &Self {
440 self.extend_from_slice(bytes);
441 self
442 }
443
444 fn write_length_encoded(&mut self, value: &[u8], encode_value: bool) -> &Self {
445 let mut byte_object: Vec<u8> = Vec::new();
446 if encode_value {
447 byte_object.extend_from_slice(value);
449 }
450 let length_prefix = _encode_variable_length_prefix(&byte_object.len()).unwrap();
452
453 self.extend_from_slice(&length_prefix);
454 self.extend_from_slice(&byte_object);
455
456 self
457 }
458
459 fn write_field_and_value(
460 &mut self,
461 field: FieldInstance,
462 value: &[u8],
463 is_unl_modify_workaround: bool,
464 ) -> &Self {
465 self.extend_from_slice(&field.header.to_bytes());
466
467 if field.is_vl_encoded {
468 self.write_length_encoded(value, !is_unl_modify_workaround);
469 } else {
470 self.extend_from_slice(value);
471 }
472
473 self
474 }
475}
476
477impl Parser for BinaryParser {
479 fn peek(&self) -> Option<[u8; 1]> {
480 if !self.0.is_empty() {
481 Some(self.0[0].to_be_bytes())
482 } else {
483 None
484 }
485 }
486
487 fn skip_bytes(&mut self, n: usize) -> XRPLCoreResult<&Self> {
488 if n > self.0.len() {
489 Err(XRPLBinaryCodecException::UnexpectedParserSkipOverflow {
490 max: self.0.len(),
491 found: n,
492 }
493 .into())
494 } else {
495 self.0 = self.0[n..].to_vec();
496 Ok(self)
497 }
498 }
499
500 fn read(&mut self, n: usize) -> XRPLCoreResult<Vec<u8>> {
501 let first_n_bytes = self.0[..n].to_owned();
502
503 self.skip_bytes(n)?;
504 Ok(first_n_bytes)
505 }
506
507 fn read_uint8(&mut self) -> XRPLCoreResult<u8> {
508 let result = self.read(1)?;
509 Ok(u8::from_be_bytes(result.try_into().or(Err(
510 XRPLBinaryCodecException::InvalidReadFromBytesValue,
511 ))?))
512 }
513
514 fn read_uint16(&mut self) -> XRPLCoreResult<u16> {
515 let result = self.read(2)?;
516 Ok(u16::from_be_bytes(result.try_into().or(Err(
517 XRPLBinaryCodecException::InvalidReadFromBytesValue,
518 ))?))
519 }
520
521 fn read_uint32(&mut self) -> XRPLCoreResult<u32> {
522 let result = self.read(4)?;
523 Ok(u32::from_be_bytes(result.try_into().or(Err(
524 XRPLBinaryCodecException::InvalidReadFromBytesValue,
525 ))?))
526 }
527
528 fn is_end(&self, custom_end: Option<usize>) -> bool {
529 if let Some(end) = custom_end {
530 self.0.len() <= end
531 } else {
532 self.0.is_empty()
533 }
534 }
535
536 fn read_length_prefix(&mut self) -> XRPLCoreResult<usize> {
537 let byte1: usize = self.read_uint8()? as usize;
538
539 match byte1 {
540 x if x <= MAX_SINGLE_BYTE_LENGTH => Ok(byte1),
543 x if x <= MAX_SECOND_BYTE_VALUE => {
548 let byte2: usize = self.read_uint8()? as usize;
549 Ok((MAX_SINGLE_BYTE_LENGTH + 1)
550 + ((byte1 - (MAX_SINGLE_BYTE_LENGTH + 1)) * MAX_BYTE_VALUE)
551 + byte2)
552 }
553 x if x <= 254 => {
558 let byte2: usize = self.read_uint8()? as usize;
559 let byte3: usize = self.read_uint8()? as usize;
560
561 Ok(MAX_DOUBLE_BYTE_LENGTH
562 + ((byte1 - (MAX_SECOND_BYTE_VALUE + 1)) * MAX_DOUBLE_BYTE_VALUE)
563 + (byte2 * MAX_BYTE_VALUE)
564 + byte3)
565 }
566 _ => {
567 Err(XRPLBinaryCodecException::UnexpectedLengthPrefixRange { min: 1, max: 3 }.into())
568 }
569 }
570 }
571
572 fn read_field_header(&mut self) -> XRPLCoreResult<FieldHeader> {
573 let mut type_code: i16 = self.read_uint8()? as i16;
574 let mut field_code: i16 = type_code & 15;
575
576 type_code >>= 4;
577
578 if type_code == 0 {
579 type_code = self.read_uint8()? as i16;
580
581 if type_code == 0 || type_code < 16 {
582 return Err(
583 XRPLBinaryCodecException::UnexpectedTypeCodeRange { min: 1, max: 16 }.into(),
584 );
585 };
586 };
587
588 if field_code == 0 {
589 field_code = self.read_uint8()? as i16;
590
591 if field_code == 0 || field_code < 16 {
592 return Err(
593 XRPLBinaryCodecException::UnexpectedFieldCodeRange { min: 1, max: 16 }.into(),
594 );
595 };
596 };
597
598 Ok(FieldHeader {
599 type_code,
600 field_code,
601 })
602 }
603
604 fn read_field(&mut self) -> XRPLCoreResult<FieldInstance> {
605 let field_header = self.read_field_header()?;
606 let field_name = get_field_name_from_header(&field_header);
607
608 if let Some(name) = field_name {
609 if let Some(instance) = get_field_instance(name) {
610 return Ok(instance);
611 };
612 };
613
614 Err(XRPLBinaryCodecException::UnknownFieldName.into())
615 }
616
617 fn read_type<T: TryFromParser>(&mut self) -> XRPLCoreResult<T, T::Error> {
618 T::from_parser(self, None)
619 }
620
621 fn read_field_value<T: TryFromParser>(
622 &mut self,
623 field: &FieldInstance,
624 ) -> XRPLCoreResult<T, T::Error>
625 where
626 T::Error: From<XRPLCoreException>,
627 {
628 if field.is_vl_encoded {
629 let length = self.read_length_prefix()?;
630 T::from_parser(self, Some(length))
631 } else {
632 T::from_parser(self, None)
633 }
634 }
635}
636
637impl From<&[u8]> for BinaryParser {
638 fn from(hex_bytes: &[u8]) -> Self {
639 BinaryParser(hex_bytes.to_vec())
640 }
641}
642
643impl From<Vec<u8>> for BinaryParser {
644 fn from(hex_bytes: Vec<u8>) -> Self {
645 BinaryParser(hex_bytes)
646 }
647}
648
649impl TryFrom<&str> for BinaryParser {
650 type Error = XRPLCoreException;
651
652 fn try_from(hex_bytes: &str) -> XRPLCoreResult<Self, Self::Error> {
653 Ok(BinaryParser(hex::decode(hex_bytes)?))
654 }
655}
656
657impl PartialEq<[u8]> for BinaryParser {
658 fn eq(&self, bytes: &[u8]) -> bool {
659 self.0 == bytes
660 }
661}
662
663impl PartialEq<Vec<u8>> for BinaryParser {
664 fn eq(&self, bytes: &Vec<u8>) -> bool {
665 &self.0 == bytes
666 }
667}
668
669impl ExactSizeIterator for BinaryParser {
670 fn len(&self) -> usize {
671 self.0.len()
672 }
673}
674
675impl Iterator for BinaryParser {
676 type Item = u8;
677
678 fn next(&mut self) -> Option<Self::Item> {
679 if self.is_end(None) {
680 None
681 } else {
682 Some(self.read_uint8().expect("BinaryParser::next"))
683 }
684 }
685}
686
687pub(crate) const TRANSACTION_SIGNATURE_PREFIX: i32 = 0x53545800;
693pub(crate) const TRANSACTION_MULTISIG_PREFIX: [u8; 4] = (0x534D5400u32).to_be_bytes();
694pub(crate) const PAYMENT_CHANNEL_CLAIM_PREFIX: [u8; 4] = (0x434C4D00u32).to_be_bytes();
695pub(crate) const BATCH_PREFIX: [u8; 4] = (0x42434800u32).to_be_bytes();
696
697pub(crate) const BASE10_UINT64_FIELDS: &[&str] = &[
699 "MaximumAmount",
700 "OutstandingAmount",
701 "MPTAmount",
702 "LockedAmount",
703 "ConfidentialOutstandingAmount",
704];
705
706pub(crate) fn serialize_json<T>(
708 prepared_transaction: &T,
709 prefix: Option<&[u8]>,
710 suffix: Option<&[u8]>,
711 signing_only: bool,
712) -> XRPLCoreResult<String>
713where
714 T: Serialize,
715{
716 let mut buffer = Vec::new();
717 if let Some(p) = prefix {
718 buffer.extend(p);
719 }
720
721 let json_value =
722 serde_json::to_value(prepared_transaction).map_err(XRPLSerdeJsonError::from)?;
723 let st_object = STObject::try_from_value(json_value, signing_only)?;
724 buffer.extend(st_object.as_ref());
725
726 if let Some(s) = suffix {
727 buffer.extend(s);
728 }
729 let hex_string = buffer.encode_hex_upper::<String>();
730
731 Ok(hex_string)
732}
733
734fn decode_field_value(parser: &mut BinaryParser, field: &FieldInstance) -> XRPLCoreResult<Value> {
737 let type_name = field.associated_type.as_str();
738
739 let length = if field.is_vl_encoded {
741 Some(parser.read_length_prefix()?)
742 } else {
743 None
744 };
745
746 match type_name {
747 "AccountID" => {
748 let account = AccountId::from_parser(parser, length)?;
749 Ok(serde_json::to_value(&account).map_err(XRPLSerdeJsonError::from)?)
750 }
751 "Amount" => {
752 let amount = Amount::from_parser(parser, length)?;
753 Ok(serde_json::to_value(&amount).map_err(XRPLSerdeJsonError::from)?)
754 }
755 "Blob" => {
756 let blob = Blob::from_parser(parser, length)?;
757 Ok(serde_json::to_value(&blob).map_err(XRPLSerdeJsonError::from)?)
758 }
759 "Hash128" => {
760 let hash = Hash128::from_parser(parser, length)?;
761 Ok(serde_json::to_value(&hash).map_err(XRPLSerdeJsonError::from)?)
762 }
763 "Hash160" => {
764 let hash = Hash160::from_parser(parser, length)?;
765 Ok(serde_json::to_value(&hash).map_err(XRPLSerdeJsonError::from)?)
766 }
767 "Hash192" => {
768 let hash = Hash192::from_parser(parser, length)?;
769 Ok(serde_json::to_value(&hash).map_err(XRPLSerdeJsonError::from)?)
770 }
771 "Hash256" => {
772 let hash = Hash256::from_parser(parser, length)?;
773 Ok(serde_json::to_value(&hash).map_err(XRPLSerdeJsonError::from)?)
774 }
775 "UInt8" => {
776 let val = parser.read_uint8()?;
777 if field.name == "TransactionResult" {
778 let code = val as i16;
779 if let Some(name) = get_transaction_result_name(&code) {
780 return Ok(Value::String(name.clone()));
781 }
782 }
783 Ok(Value::Number(val.into()))
784 }
785 "UInt16" => {
786 let val = parser.read_uint16()?;
787 if field.name == "TransactionType" {
788 let code = val as i16;
789 if let Some(name) = get_transaction_type_name(&code) {
790 return Ok(Value::String(name.clone()));
791 }
792 } else if field.name == "LedgerEntryType" {
793 let code = val as i16;
794 if let Some(name) = get_ledger_entry_type_name(&code) {
795 return Ok(Value::String(name.clone()));
796 }
797 } else if field.name == "TransactionResult" {
798 let code = val as i16;
799 if let Some(name) = get_transaction_result_name(&code) {
800 return Ok(Value::String(name.clone()));
801 }
802 }
803 Ok(Value::Number(val.into()))
804 }
805 "UInt32" => {
806 let val = parser.read_uint32()?;
807 if field.name == "PermissionValue" {
808 let code = val as i32;
809 if let Some(name) = get_delegatable_permission_name(&code) {
810 return Ok(Value::String(name.clone()));
811 }
812 }
813 Ok(Value::Number(val.into()))
814 }
815 "UInt64" => {
816 let bytes = parser.read(8)?;
817 if BASE10_UINT64_FIELDS.contains(&field.name.as_str()) {
818 let val = u64::from_be_bytes(
819 bytes
820 .as_slice()
821 .try_into()
822 .map_err(|_| XRPLBinaryCodecException::InvalidReadFromBytesValue)?,
823 );
824 Ok(Value::String(val.to_string()))
825 } else {
826 Ok(Value::String(hex::encode_upper(&bytes)))
827 }
828 }
829 "Int32" => {
830 let bytes = parser.read(4)?;
831 let val = i32::from_be_bytes(
832 bytes
833 .as_slice()
834 .try_into()
835 .map_err(|_| XRPLBinaryCodecException::InvalidReadFromBytesValue)?,
836 );
837 Ok(Value::Number(val.into()))
838 }
839 "STObject" => decode_st_object(parser),
840 "STArray" => decode_st_array(parser),
841 "PathSet" => {
842 let path_set = PathSet::from_parser(parser, length)?;
843 Ok(serde_json::to_value(&path_set).map_err(XRPLSerdeJsonError::from)?)
844 }
845 "Vector256" => {
846 let vector = Vector256::from_parser(parser, length)?;
847 Ok(serde_json::to_value(&vector).map_err(XRPLSerdeJsonError::from)?)
848 }
849 "Currency" => {
850 let currency = crate::core::binarycodec::types::Currency::from_parser(parser, length)?;
851 Ok(serde_json::to_value(¤cy).map_err(XRPLSerdeJsonError::from)?)
852 }
853 "Issue" => {
854 let issue = Issue::from_parser(parser, length)?;
855 Ok(serde_json::to_value(&issue).map_err(XRPLSerdeJsonError::from)?)
856 }
857 "XChainBridge" => {
858 let bridge = XChainBridge::from_parser(parser, length)?;
859 Ok(serde_json::to_value(&bridge).map_err(XRPLSerdeJsonError::from)?)
860 }
861 "Number" => {
862 let number = crate::core::binarycodec::types::Number::from_parser(parser, length)?;
863 Ok(serde_json::to_value(&number).map_err(XRPLSerdeJsonError::from)?)
864 }
865 _ => {
866 if let Some(len) = length {
867 let bytes = parser.read(len)?;
868 Ok(Value::String(hex::encode_upper(&bytes)))
869 } else {
870 Err(XRPLCoreException::XRPLUtilsError(alloc::format!(
871 "Unknown field type '{}' with no length prefix",
872 field.associated_type
873 )))
874 }
875 }
876 }
877}
878
879pub(crate) fn decode_st_object(parser: &mut BinaryParser) -> XRPLCoreResult<Value> {
882 let mut accumulator = Map::new();
883
884 while !parser.is_end(None) {
885 let field = parser.read_field()?;
886
887 if field.name == "ObjectEndMarker" {
888 break;
889 }
890
891 let value = decode_field_value(parser, &field)?;
892 accumulator.insert(field.name, value);
893 }
894
895 Ok(Value::Object(accumulator))
896}
897
898fn decode_st_array(parser: &mut BinaryParser) -> XRPLCoreResult<Value> {
901 let mut result: Vec<Value> = Vec::new();
902
903 while !parser.is_end(None) {
904 let field = parser.read_field()?;
905
906 if field.name == "ArrayEndMarker" {
907 break;
908 }
909
910 let inner = decode_st_object(parser)?;
911 let mut wrapper = Map::new();
912 wrapper.insert(field.name, inner);
913 result.push(Value::Object(wrapper));
914 }
915
916 Ok(Value::Array(result))
917}
918
919pub(crate) fn decode_ledger_data_inner(hex_string: &str) -> XRPLCoreResult<Value> {
921 let mut parser = BinaryParser::try_from(hex_string)?;
922
923 let ledger_index = parser.read_uint32()?;
924
925 let coins_bytes = parser.read(8)?;
926 let total_coins = u64::from_be_bytes(
927 coins_bytes
928 .as_slice()
929 .try_into()
930 .map_err(|_| XRPLBinaryCodecException::InvalidReadFromBytesValue)?,
931 );
932
933 let parent_hash_bytes = parser.read(32)?;
934 let transaction_hash_bytes = parser.read(32)?;
935 let account_hash_bytes = parser.read(32)?;
936
937 let parent_close_time = parser.read_uint32()?;
938 let close_time = parser.read_uint32()?;
939 let close_time_resolution = parser.read_uint8()?;
940 let close_flags = parser.read_uint8()?;
941
942 let mut map = Map::new();
943 map.insert("ledger_index".into(), Value::Number(ledger_index.into()));
944 map.insert("total_coins".into(), Value::String(total_coins.to_string()));
945 map.insert(
946 "parent_hash".into(),
947 Value::String(hex::encode_upper(&parent_hash_bytes)),
948 );
949 map.insert(
950 "transaction_hash".into(),
951 Value::String(hex::encode_upper(&transaction_hash_bytes)),
952 );
953 map.insert(
954 "account_hash".into(),
955 Value::String(hex::encode_upper(&account_hash_bytes)),
956 );
957 map.insert(
958 "parent_close_time".into(),
959 Value::Number(parent_close_time.into()),
960 );
961 map.insert("close_time".into(), Value::Number(close_time.into()));
962 map.insert(
963 "close_time_resolution".into(),
964 Value::Number(close_time_resolution.into()),
965 );
966 map.insert("close_flags".into(), Value::Number(close_flags.into()));
967
968 Ok(Value::Object(map))
969}
970
971#[cfg(test)]
972mod test {
973 use super::*;
974 use crate::alloc::string::ToString;
975 use alloc::string::String;
976
977 const TEST_HEX: &str = "00112233445566";
978
979 #[test]
980 fn test_binaryparser_from() {
981 let test_bytes: Vec<u8> = hex::decode(TEST_HEX).expect("");
982 let ref_bytes: &[u8] = test_bytes.as_ref();
983 let slice_parser = BinaryParser::from(ref_bytes);
984 let vec_parser = BinaryParser::from(test_bytes.to_owned());
985
986 assert_eq!(slice_parser, test_bytes[..]);
987 assert_eq!(vec_parser, test_bytes[..]);
988 }
989
990 #[test]
991 fn test_binaryparser_try_from() {
992 let test_bytes: Vec<u8> = hex::decode(TEST_HEX).expect("");
993 let string_parser = BinaryParser::try_from(TEST_HEX).unwrap();
994
995 assert_eq!(string_parser, test_bytes[..]);
996 }
997
998 #[test]
999 fn test_peek() {
1000 let test_bytes: Vec<u8> = hex::decode(TEST_HEX).expect("");
1001 let binary_parser = BinaryParser::from(test_bytes.as_ref());
1002
1003 assert_eq!(binary_parser.peek(), Some([test_bytes[0]; 1]));
1004 }
1005
1006 #[test]
1007 fn test_skip_bytes() {
1008 let test_bytes: Vec<u8> = hex::decode(TEST_HEX).expect("");
1009 let mut binary_parser = BinaryParser::from(test_bytes.as_ref());
1010
1011 assert!(binary_parser.skip_bytes(4).is_ok());
1012 assert_eq!(binary_parser, test_bytes[4..]);
1013 }
1014
1015 #[test]
1016 fn test_read() {
1017 let test_bytes: Vec<u8> = hex::decode(TEST_HEX).expect("");
1018 let mut binary_parser = BinaryParser::from(test_bytes.as_ref());
1019 let result = binary_parser.read(5);
1020
1021 assert!(result.is_ok());
1022 assert_eq!(result.unwrap(), test_bytes[..5]);
1023 }
1024
1025 #[test]
1026 fn test_read_uint8() {
1027 let test_hex: &str = "01000200000003";
1028 let test_bytes: Vec<u8> = hex::decode(test_hex).expect("");
1029 let mut binary_parser = BinaryParser::from(test_bytes.as_ref());
1030 let result = binary_parser.read_uint8();
1031
1032 assert!(result.is_ok());
1033 assert_eq!(result, Ok(1));
1034 }
1035
1036 #[test]
1037 fn test_read_uint16() {
1038 let test_hex: &str = "000200000003";
1039 let test_bytes: Vec<u8> = hex::decode(test_hex).expect("");
1040 let mut binary_parser = BinaryParser::from(test_bytes.as_ref());
1041 let result = binary_parser.read_uint16();
1042
1043 assert!(result.is_ok());
1044 assert_eq!(result, Ok(2));
1045 }
1046
1047 #[test]
1048 fn test_read_uint32() {
1049 let test_hex: &str = "00000003";
1050 let test_bytes: Vec<u8> = hex::decode(test_hex).expect("");
1051 let mut binary_parser = BinaryParser::from(test_bytes.as_ref());
1052 let result = binary_parser.read_uint32();
1053
1054 assert!(result.is_ok());
1055 assert_eq!(result, Ok(3));
1056 }
1057
1058 #[test]
1059 fn test_read_length_prefix() {
1060 let test_bytes: Vec<u8> = hex::decode(TEST_HEX).expect("");
1061 let mut binary_parser = BinaryParser::from(test_bytes.as_ref());
1062 let result = binary_parser.read_length_prefix();
1063
1064 assert!(result.is_ok());
1065 assert_eq!(result, Ok(0));
1066 }
1067
1068 #[test]
1070 fn test_read_field_header() {}
1071
1072 #[test]
1073 fn test_read_field_value() {}
1074
1075 #[test]
1076 fn test_read_field_and_value() {}
1077
1078 #[test]
1079 fn test_read_type() {}
1080
1081 #[test]
1082 fn accept_peek_skip_read() {
1083 let test_bytes: Vec<u8> = hex::decode(TEST_HEX).expect("");
1084 let mut binary_parser = BinaryParser::from(test_bytes.as_ref());
1085
1086 assert_eq!(binary_parser.peek(), Some([test_bytes[0]; 1]));
1087 assert!(binary_parser.skip_bytes(3).is_ok());
1088 assert_eq!(binary_parser, test_bytes[3..]);
1089
1090 let result = binary_parser.read(2);
1091
1092 assert!(result.is_ok());
1093 assert_eq!(result.unwrap(), test_bytes[3..5]);
1094 }
1095
1096 #[test]
1097 fn test_binaryserializer_write_field_and_value() {
1098 let field_header = FieldHeader {
1099 type_code: -2,
1100 field_code: 0,
1101 };
1102
1103 let field_info = FieldInfo {
1104 nth: 0,
1105 is_vl_encoded: false,
1106 is_serialized: false,
1107 is_signing_field: false,
1108 r#type: "Unknown".to_string(),
1109 };
1110
1111 let field_instance = FieldInstance::new(&field_info, "Generic", field_header);
1112 let expected: Vec<u8> = [224, 0, 17, 34].to_vec();
1113 let test_bytes: Vec<u8> = [0, 17, 34].to_vec();
1114 let mut serializer: BinarySerializer = BinarySerializer::new();
1115
1116 serializer.write_field_and_value(field_instance, &test_bytes, false);
1117 assert_eq!(expected, serializer);
1118 }
1119
1120 #[test]
1124 fn test_decode_field_value_unknown_type_no_length_errors() {
1125 use super::decode_field_value;
1126 use crate::core::binarycodec::definitions::{FieldHeader, FieldInfo, FieldInstance};
1127
1128 let field_info = FieldInfo {
1129 nth: 1,
1130 is_vl_encoded: false,
1131 is_serialized: true,
1132 is_signing_field: true,
1133 r#type: "FutureType".to_string(),
1134 };
1135 let field_header = FieldHeader {
1136 type_code: 99,
1137 field_code: 1,
1138 };
1139 let field = FieldInstance::new(&field_info, "FutureField", field_header);
1140
1141 let mut parser = BinaryParser::from(&[0xAB, 0xCD][..]);
1142 let result = decode_field_value(&mut parser, &field);
1143
1144 assert!(
1145 result.is_err(),
1146 "Expected error for unknown type with no length prefix"
1147 );
1148 let err_msg = result.unwrap_err().to_string();
1149 assert!(
1150 err_msg.contains("Unknown field type 'FutureType'"),
1151 "Error should mention the unknown type name, got: {}",
1152 err_msg
1153 );
1154 assert_eq!(
1156 parser.0.len(),
1157 2,
1158 "Parser should not have consumed any bytes"
1159 );
1160 }
1161
1162 #[test]
1165 fn test_decode_field_value_unknown_type_with_vl_returns_hex() {
1166 use super::decode_field_value;
1167 use crate::core::binarycodec::definitions::{FieldHeader, FieldInfo, FieldInstance};
1168
1169 let field_info = FieldInfo {
1170 nth: 1,
1171 is_vl_encoded: true,
1172 is_serialized: true,
1173 is_signing_field: true,
1174 r#type: "FutureVLType".to_string(),
1175 };
1176 let field_header = FieldHeader {
1177 type_code: 99,
1178 field_code: 1,
1179 };
1180 let field = FieldInstance::new(&field_info, "FutureVLField", field_header);
1181
1182 let mut parser = BinaryParser::from(&[0x03, 0xAA, 0xBB, 0xCC][..]);
1184 let result = decode_field_value(&mut parser, &field);
1185
1186 assert!(result.is_ok(), "VL-encoded unknown type should succeed");
1187 assert_eq!(
1188 result.unwrap(),
1189 serde_json::Value::String("AABBCC".to_string())
1190 );
1191 assert!(parser.0.is_empty(), "Parser should have consumed all bytes");
1192 }
1193
1194 #[test]
1198 fn test_encode_variable_length_prefix() {
1199 for case in [100_usize, 1000, 20_000] {
1200 let blob = (0..case).map(|_| "A2").collect::<String>();
1201 let mut binary_serializer: BinarySerializer = BinarySerializer::new();
1202
1203 binary_serializer.write_length_encoded(&hex::decode(blob).expect(""), true);
1204
1205 let mut binary_parser: BinaryParser = BinaryParser::from(binary_serializer.as_ref());
1206 let decoded_length = binary_parser.read_length_prefix();
1207
1208 assert!(decoded_length.is_ok());
1209 assert_eq!(decoded_length, Ok(case));
1210 }
1211 }
1212
1213 #[test]
1214 fn confidential_outstanding_amount_serializes_base10() {
1215 use crate::core::binarycodec::{decode, encode};
1216 let binary = "11007E3020000000000001234570232102ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB702C2102ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB";
1217 let json = decode(binary).expect("decode");
1218 assert_eq!(
1219 json["LedgerEntryType"],
1220 serde_json::json!("MPTokenIssuance")
1221 );
1222 assert_eq!(
1223 json["ConfidentialOutstandingAmount"],
1224 serde_json::json!("74565")
1225 );
1226 let reencoded = encode(&json).expect("encode");
1227 assert_eq!(reencoded.to_uppercase(), binary.to_uppercase());
1228 }
1229}