Skip to content

Commit efaa6dd

Browse files
authored
Merge pull request #228 from SundaeSwap-finance/fix-plutus-list-serialization
Fix plutus list serialization
2 parents da6eba2 + 52956f0 commit efaa6dd

File tree

3 files changed

+39
-5
lines changed

3 files changed

+39
-5
lines changed

rust/src/plutus.rs

Lines changed: 33 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -988,10 +988,14 @@ impl Deserialize for PlutusData {
988988

989989
impl cbor_event::se::Serialize for PlutusList {
990990
fn serialize<'se, W: Write>(&self, serializer: &'se mut Serializer<W>) -> cbor_event::Result<&'se mut Serializer<W>> {
991-
serializer.write_array(cbor_event::Len::Len(self.0.len() as u64))?;
991+
if self.0.len() == 0 {
992+
return Ok(serializer.write_array(cbor_event::Len::Len(0))?);
993+
}
994+
serializer.write_array(cbor_event::Len::Indefinite)?;
992995
for element in &self.0 {
993996
element.serialize(serializer)?;
994997
}
998+
serializer.write_special(cbor_event::Special::Break)?;
995999
Ok(serializer)
9961000
}
9971001
}
@@ -1164,6 +1168,7 @@ impl Deserialize for Strings {
11641168
#[cfg(test)]
11651169
mod tests {
11661170
use super::*;
1171+
use hex::*;
11671172

11681173
#[test]
11691174
pub fn plutus_constr_data() {
@@ -1180,4 +1185,30 @@ mod tests {
11801185
let constr_1854_roundtrip = PlutusData::from_bytes(constr_1854.to_bytes()).unwrap();
11811186
assert_eq!(constr_1854, constr_1854_roundtrip);
11821187
}
1183-
}
1188+
1189+
#[test]
1190+
pub fn plutus_list_serialization_cli_compatibility() {
1191+
// mimic cardano-cli array encoding, see https://github.com/Emurgo/cardano-serialization-lib/issues/227
1192+
let datum_cli = "d8799f4100d8799fd8799fd8799f581cffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd8799fd8799fd8799f581cffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd87a80ff1a002625a0d8799fd879801a000f4240d87a80ffff";
1193+
let datum = PlutusData::from_bytes(Vec::from_hex(datum_cli).unwrap()).unwrap();
1194+
assert_eq!(datum_cli, hex::encode(datum.to_bytes()));
1195+
1196+
// encode empty arrays as fixed
1197+
assert_eq!("80", hex::encode(PlutusList::from_bytes(Vec::from_hex("9fff").unwrap()).unwrap().to_bytes()));
1198+
1199+
// encode arrays as indefinite length array
1200+
let mut list = PlutusList::new();
1201+
list.add(&PlutusData::new_integer(&BigInt::from_str("1").unwrap()));
1202+
assert_eq!("9f01ff", hex::encode(list.to_bytes()));
1203+
1204+
// witness_set should have fixed length array
1205+
let mut witness_set = TransactionWitnessSet::new();
1206+
witness_set.set_plutus_data(&list);
1207+
assert_eq!("a1048101", hex::encode(witness_set.to_bytes()));
1208+
1209+
list = PlutusList::new();
1210+
list.add(&datum);
1211+
witness_set.set_plutus_data(&list);
1212+
assert_eq!(format!("a10481{}", datum_cli), hex::encode(witness_set.to_bytes()));
1213+
}
1214+
}

rust/src/serialization.rs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1806,7 +1806,10 @@ impl cbor_event::se::Serialize for TransactionWitnessSet {
18061806
}
18071807
if let Some(field) = &self.plutus_data {
18081808
serializer.write_unsigned_integer(4)?;
1809-
field.serialize(serializer)?;
1809+
serializer.write_array(cbor_event::Len::Len(field.len() as u64))?;
1810+
for i in 0..field.len() {
1811+
field.get(i).serialize(serializer)?;
1812+
}
18101813
}
18111814
if let Some(field) = &self.redeemers {
18121815
serializer.write_unsigned_integer(5)?;
@@ -3514,4 +3517,4 @@ mod tests {
35143517
let block2 = Block::from_bytes(block.to_bytes()).unwrap();
35153518
assert_eq!(block.to_bytes(), block2.to_bytes());
35163519
}
3517-
}
3520+
}

rust/src/utils.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2169,7 +2169,7 @@ mod tests {
21692169

21702170
assert_eq!(
21712171
hex::encode(script_data_hash.to_bytes()),
2172-
"57240d358f8ab6128c4a66340271e4fec39b4971232add308f01a5809313adcf"
2172+
"4415e6667e6d6bbd992af5092d48e3c2ba9825200d0234d2470068f7f0f178b3"
21732173
);
21742174
}
21752175

0 commit comments

Comments
 (0)