Skip to content

Commit

Permalink
redeemers map deserialization fix
Browse files Browse the repository at this point in the history
  • Loading branch information
lisicky committed May 9, 2024
1 parent d4309cb commit 7e87578
Show file tree
Hide file tree
Showing 2 changed files with 50 additions and 2 deletions.
51 changes: 49 additions & 2 deletions pallas-primitives/src/babbage/model.rs
Original file line number Diff line number Diff line change
Expand Up @@ -467,7 +467,7 @@ pub struct WitnessSet {
pub plutus_data: Option<PlutusDatas>,

#[n(5)]
pub redeemer: Option<Vec<Redeemer>>,
pub redeemer: Option<Redeemers>,

#[n(6)]
pub plutus_v2_script: Option<PlutusV2Scripts>,
Expand Down Expand Up @@ -497,7 +497,7 @@ pub struct MintedWitnessSet<'b> {
pub plutus_data: Option<KeepRawPlutusDatas<'b>>,

#[n(5)]
pub redeemer: Option<Vec<Redeemer>>,
pub redeemer: Option<Redeemers>,

#[n(6)]
pub plutus_v2_script: Option<PlutusV2Scripts>,
Expand All @@ -514,6 +514,52 @@ create_struct_and_impls!(PlutusV2Scripts, PlutusV2Script, false);
create_struct_and_impls!(PlutusV3Scripts, PlutusV3Script, false);
create_struct_and_impls!(PlutusDatas, PlutusData, false);


#[derive(Serialize, Deserialize, Debug, PartialEq, Eq, Clone)]
pub struct Redeemers(Vec<Redeemer>);

#[derive(Serialize, Deserialize, Encode, Decode, Debug, PartialEq, Eq, Clone)]
struct RedeemerMapKey {
#[n(0)]
pub tag: RedeemerTag,

#[n(1)]
pub index: u32,
}

#[derive(Serialize, Deserialize, Encode, Decode, Debug, PartialEq, Eq, Clone)]
struct RedeemerMapValue {
#[n(0)]
pub data: PlutusData,

#[n(1)]
pub ex_units: ExUnits,
}

impl <'b, C> minicbor::decode::Decode<'b, C> for Redeemers {
fn decode(d: &mut minicbor::Decoder<'b>, ctx: &mut C) -> Result<Self, minicbor::decode::Error> {
if d.probe().map().is_ok() {
let redeemers_map : KeyValuePairs<RedeemerMapKey, RedeemerMapValue> = d.decode_with(ctx)?;
let array = redeemers_map.iter().map(|(k, v)| Redeemer {
tag: k.tag.clone(),
index: k.index.clone(),
data: v.data.clone(),
ex_units: v.ex_units.clone(),
}).collect();
Ok(Redeemers(array))
} else {
Ok(Redeemers(d.decode_with(ctx)?))
}
}
}

impl <'b, C> minicbor::encode::Encode<C> for Redeemers {
fn encode<W: minicbor::encode::Write>(&self, e: &mut minicbor::Encoder<W>, ctx: &mut C) -> Result<(), minicbor::encode::Error<W::Error>> {
e.encode_with(&self.0, ctx)?;
Ok(())
}
}

#[derive(Debug, PartialEq, Eq, Clone)]
pub struct KeepRawPlutusDatas<'b>(Vec<KeepRaw<'b, PlutusData>>);

Expand Down Expand Up @@ -873,6 +919,7 @@ mod tests {
include_str!("../../../test_data/conway1.block"),
include_str!("../../../test_data/conway2.block"),
include_str!("../../../test_data/conway3.block"),
include_str!("../../../test_data/conway4.block"),
];

for (idx, block_str) in test_blocks.iter().enumerate() {
Expand Down
1 change: 1 addition & 0 deletions test_data/conway4.block
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
820785828a1a0015434c1a01aafea058206fe5f4b9e2413aa08e01095e4107580a48f6ad6a61f71cf7f189ca9bbc41e94f5820b8792af8ab7f9e7eadcde767fb71aacfcc2b35a31eb2c854e16a0256cf8d731a5820cabb1f8e674f9682052511ebdfddf7983fe8ae39fea082bdffd9f2f74f14baf88258401272abf79fee2e86fc921306d560b79943013d804e01b170fef2804b3e73854961b497ebcc41be99367f566d3d79e6b3d1d22c508b2dd7bc0eb95632d360fee85850a3c4daef4207144abd88e2a4a1aa5f18dc823715d148e7de84236ef44ee3da59ca99387a4e635a4439baab148bbefbe83dbebafc0a5e853a61d5ffc768cf2cc8b6636748f1c0f9a5e204ac32dc5bfe0119051058209cb536a497046a677345d4801ab204a97b2f0eee37ba23a73d7061d65fe5179a8458202af370db255a0a08264d0eb107d3c7bde609b1ec737809f14063f2d7b1e9fbd50018ca58407d78501dfcfc4978bb6403d9efa2ca71155daf905a9d4976f68a44abcf9aeb7f641885e822d7a734288c6ea277118c706094b0c4fdd25115fb99c865c39b79048209005901c0653248f4a18c747eb1eb8c1c7b4bb408f28751cab966df5cdb8275bb0d04437d61225a8a502f6b3886f59683f6ee26fe6e6fa16a327783fa19a788cc9c5f440e454c4c66a7886263bfe4903e625e8e0e4a4e9d53a2c5c361f4f01bc2194206c7a6c7770a111863b0eeb26d209362a6c33c87a714d2e05701d830c2f8210ee563af43e5501c30cd495dc431b5c1003855640f66a08f8d0a38359663e1c75febdeb0a05b8fd52c93e71fffde534843e3223eb047d91caa0bb25e73081d5285d6ad8e75f2894f583022aa14252dd1fff3650783c2da2b8bdb98bd70756fd046c028828e9d1696d46bfd273eac142bdb69ed81494ce6451f9b70c9931b9e0199e53b1aa11c88f6bab0e57a2f5d02e466cfe394c9e7314a4cb274a23257c690debc6d506f62b31c4fce2508775cb5fed712dff154fa7efd4fdb9dfe3d9d495cea458839f2684820f5fe57979a23fb500b878e85ee9277ca28936579d9a2dc31300bf01ac2d47a3553573e5606c680e14e649304a7bd1e68e37e45ab5659cfd7ddc59bc091036c2985ccac22a70609c3c00a8683ce1c23e7939949813902b9ac2651aaa54595a82d31d4c079d32b377a17199206d2d0ac32cd078f1b1be102c8059a8e82a500d9010281825820bf2e368a288c2aa08674c715353a0ef767a47be2c715ef7d0f7f6fe86e874e6d01018282583900bb781d375c55a461f8153d29b3d7ec239170666c4a36a597b3a6ca0c85972e5e48d341a8d02f8dc58f2d0a05316c0661f312859c6e66e0e8821a0011e360a1581ce6911f8b6bae62fc20b96e55131bbf189334baab80d07f2964ca3b6da14a73746172666f726765300182583900b94923d57930df9ab4eca060b31f66a34625065a6ee4b1a256e8196c924a4924c51ef2af02cfa65f33750f467788a1d827fadfffbb7357c1821b0000001118d86650a1581ce6911f8b6bae62fc20b96e55131bbf189334baab80d07f2964ca3b6da14a73746172666f72676530190ecb021a0002ae05031a01ac852e075820ddbda0e3bc04982471f3cd4f8196b3dafd2be402d277c0fed7580fe83faee543aa00d9010281825820b82b25d8638c4f6322fe90f0cfc303f9c3f08e59634569d3ac35a0f6d856d522000dd9010281825820deed6c15c77ebc175c84dbeb1ab16e5930ea091f1dd20d9ff1e9ee7d4c0a33ef0012d90102818258200dce8569d216f1e887ef9b83c6f73f498a13efb222de4f541db22102b644fddc010182a300581d707a390b04f6458aba238ef1567bb36d46c68a3fe3ed0c544c10fc8bc101821a0018dbfca1581c32e6bd5b74dc17e10219eb6d38f4e381cea1f3b3f43f8b7f119f828ba158205eed0e1f74657374696e6700b82b25d8638c4f6322fe90f0cfc303f9c3f08e5901028201d8185868d8799f583097f1d3a73197d7942695638c4fa9ac0fc3688c4f9774b905a14e3a3f171bac586c55e83ff97a1aeffb3af00adb22c6bb58308d4c4cd782b68b18cedee7bdf7825a00dce24d6445ae7581390b750f05bc8268c786b268904e874c81cb4c09f70f510fff82581d606bee7cbe2b0fb87f40b9b857853cdc0600cff70bf53dbe0736556f721a1db0766f1082581d606bee7cbe2b0fb87f40b9b857853cdc0600cff70bf53dbe0736556f721a00462f60111a00061be0021a000412950ed9010282581c6bee7cbe2b0fb87f40b9b857853cdc0600cff70bf53dbe0736556f72581cc42c6750085fd31427327916e11b5c2161d885f48476aefef5de4c2509a1581c32e6bd5b74dc17e10219eb6d38f4e381cea1f3b3f43f8b7f119f828ba158205eed0e1f74657374696e6700b82b25d8638c4f6322fe90f0cfc303f9c3f08e59010b582057c2db76a33e926c4036bf4eb1f1196c9d9dab1041d2562b54a5f0e574a62c2482a100d901028182582099fdadf88fcf0b37f2ac0efef9b5ffec2c60d32fbb774a53888d589ca2bca99b5840a1c322f35fb00c4e8d6477e9beedd35652402ab5e76b8a52281c3d9db6c698f732e69e086af5e45ed390e370cc9a00a001de86394b0d3aea2dff5840d3fb9103a200d9010282825820cedcbfd2961383023e3ca1b6f95f272d5c467f545737c3a28cb4a7b36c39f1f95840208d5056d9aa33ae5289c8f74147540ec8a4f70db8181977ea1e94b306514f4976654cf139ffe24cad4fa6372d571be3e6d1a576b4f10a2137d2da36e1dcc10d825820928f691604793d53ea5b83da02b3e17b089c7dc38bc1df366404f9de30b1743e58404744253102fd274c6c64f393ec7ae9d402441d5a1eea1560398b9fa89482ced4910a48737faefc648c178c9e004386b9b5bbcffbe7105da90e58a8283f23580c05a1820100824774657374696e67821a00020b0d1a02df3217a100d90103a100a11902a2a1636d73678173434950203639206265666f7265204368616e6780

0 comments on commit 7e87578

Please sign in to comment.