From 1a0fc322fa334a96fd859ff726d842c6a155003c Mon Sep 17 00:00:00 2001 From: Maico Leberle Date: Mon, 1 Apr 2024 13:49:14 -0300 Subject: [PATCH] feat(applying): add support for preview / preprod networks (#422) --- pallas-applying/README.md | 6 +- pallas-applying/src/alonzo.rs | 2 + pallas-applying/src/babbage.rs | 269 ++++++++++++++++++++++++------- pallas-applying/src/lib.rs | 11 +- pallas-applying/src/utils.rs | 6 +- pallas-applying/tests/alonzo.rs | 4 +- pallas-applying/tests/babbage.rs | 181 ++++++++++++++++++++- test_data/babbage12.tx | 1 + test_data/babbage13.tx | 1 + 9 files changed, 418 insertions(+), 63 deletions(-) create mode 100644 test_data/babbage12.tx create mode 100644 test_data/babbage13.tx diff --git a/pallas-applying/README.md b/pallas-applying/README.md index e1d43db..9b33c29 100644 --- a/pallas-applying/README.md +++ b/pallas-applying/README.md @@ -1,3 +1,7 @@ # Pallas Applying -Crate for performing transaction validation according to the Cardano protocol. +Crate for performing transaction validation according to the Cardano protocol. Generally speaking, this crate is structured in multiple modules, each one handling a specific Cardano era. These eras are: Byron, ShelleyMA, Alonzo and Babbage. + +Refer to *docs/.md* to see the mathematical specifications regarding **. + +Refer to *tests/README.md* for explanations regarding the test suite in any era. diff --git a/pallas-applying/src/alonzo.rs b/pallas-applying/src/alonzo.rs index 16937f4..3cf45cf 100644 --- a/pallas-applying/src/alonzo.rs +++ b/pallas-applying/src/alonzo.rs @@ -897,6 +897,8 @@ fn compute_script_integrity_hash(plutus_data: &[PlutusData], redeemer: &[Redeeme } fn cost_model_cbor() -> Vec { + // Mainnet, preprod and preview all have the same cost model during the Alonzo + // era. hex::decode( "a141005901d59f1a000302590001011a00060bc719026d00011a000249f01903e800011a000249f018201a0025cea81971f70419744d186419744d186419744d186419744d186419744d186419744d18641864186419744d18641a000249f018201a000249f018201a000249f018201a000249f01903e800011a000249f018201a000249f01903e800081a000242201a00067e2318760001011a000249f01903e800081a000249f01a0001b79818f7011a000249f0192710011a0002155e19052e011903e81a000249f01903e8011a000249f018201a000249f018201a000249f0182001011a000249f0011a000249f0041a000194af18f8011a000194af18f8011a0002377c190556011a0002bdea1901f1011a000249f018201a000249f018201a000249f018201a000249f018201a000249f018201a000249f018201a000242201a00067e23187600010119f04c192bd200011a000249f018201a000242201a00067e2318760001011a000242201a00067e2318760001011a0025cea81971f704001a000141bb041a000249f019138800011a000249f018201a000302590001011a000249f018201a000249f018201a000249f018201a000249f018201a000249f018201a000249f018201a000249f018201a00330da70101ff" ).unwrap() diff --git a/pallas-applying/src/babbage.rs b/pallas-applying/src/babbage.rs index 035702f..ba8a1c5 100644 --- a/pallas-applying/src/babbage.rs +++ b/pallas-applying/src/babbage.rs @@ -34,6 +34,7 @@ pub fn validate_babbage_tx( utxos: &UTxOs, prot_pps: &BabbageProtParams, block_slot: &u64, + network_magic: &u32, network_id: &u8, ) -> ValidationResult { let tx_body: &MintedTransactionBody = &mtx.transaction_body.clone(); @@ -51,9 +52,9 @@ pub fn validate_babbage_tx( check_minting(tx_body, mtx)?; check_well_formedness(tx_body, mtx)?; check_witness_set(mtx, utxos)?; - check_languages(mtx, utxos, block_slot)?; + check_languages(mtx, utxos, network_magic, network_id, block_slot)?; check_auxiliary_data(tx_body, mtx)?; - check_script_data_hash(tx_body, mtx, utxos, block_slot) + check_script_data_hash(tx_body, mtx, utxos, network_magic, network_id, block_slot) } // The set of transaction inputs is not empty. @@ -101,16 +102,16 @@ fn check_tx_validity_interval( tx_body: &MintedTransactionBody, block_slot: &u64, ) -> ValidationResult { - check_lower_bound(tx_body, block_slot)?; - check_upper_bound(tx_body, block_slot) + check_lower_bound(tx_body, *block_slot)?; + check_upper_bound(tx_body, *block_slot) } // If defined, the lower bound of the validity time interval does not exceed the // block slot. -fn check_lower_bound(tx_body: &MintedTransactionBody, block_slot: &u64) -> ValidationResult { +fn check_lower_bound(tx_body: &MintedTransactionBody, block_slot: u64) -> ValidationResult { match tx_body.validity_interval_start { Some(lower_bound) => { - if *block_slot < lower_bound { + if block_slot < lower_bound { Err(Babbage(BlockPrecedesValInt)) } else { Ok(()) @@ -122,10 +123,10 @@ fn check_lower_bound(tx_body: &MintedTransactionBody, block_slot: &u64) -> Valid // If defined, the upper bound of the validity time interval is not exceeded by // the block slot, and it is translatable to UTC time. -fn check_upper_bound(tx_body: &MintedTransactionBody, block_slot: &u64) -> ValidationResult { +fn check_upper_bound(tx_body: &MintedTransactionBody, block_slot: u64) -> ValidationResult { match tx_body.ttl { Some(upper_bound) => { - if upper_bound < *block_slot { + if upper_bound < block_slot { Err(Babbage(BlockExceedsValInt)) } else { // TODO: check that `upper_bound` is translatable to UTC time. @@ -786,7 +787,7 @@ fn check_datums( utxos: &UTxOs, option_plutus_data: &Option>>, ) -> ValidationResult { - let mut plutus_data_hash: Vec<(bool, Hash<32>)> = match option_plutus_data { + let mut plutus_data_hashes: Vec<(bool, Hash<32>)> = match option_plutus_data { Some(plutus_data) => plutus_data .iter() .map(|datum| { @@ -798,8 +799,8 @@ fn check_datums( .collect(), None => Vec::new(), }; - check_input_datum_hash_in_witness_set(tx_body, utxos, &mut plutus_data_hash)?; - check_remaining_datums(&plutus_data_hash, tx_body, utxos) + check_input_datum_hash_in_witness_set(tx_body, utxos, &mut plutus_data_hashes)?; + check_remaining_datums(&plutus_data_hashes, tx_body, utxos) } // Each datum hash in a Plutus script input matches the hash of a datum in the @@ -816,7 +817,7 @@ fn check_input_datum_hash_in_witness_set( { Some(output) => { if let Some(datum_hash) = get_datum_hash(output) { - find_datum_hash(&datum_hash, plutus_data_hash)? + find_plutus_datum_in_witness_set(&datum_hash, plutus_data_hash)? } } None => return Err(Babbage(InputNotInUTxO)), @@ -836,7 +837,10 @@ fn get_datum_hash(output: &MintedTransactionOutput) -> Option> { } } -fn find_datum_hash(hash: &Hash<32>, plutus_data_hash: &mut [(bool, Hash<32>)]) -> ValidationResult { +fn find_plutus_datum_in_witness_set( + hash: &Hash<32>, + plutus_data_hash: &mut [(bool, Hash<32>)], +) -> ValidationResult { for (found, plutus_datum_hash) in plutus_data_hash { if hash == plutus_datum_hash { *found = true; @@ -1142,8 +1146,15 @@ fn check_remaining_vk_wits( Ok(()) } -fn check_languages(mtx: &MintedTx, utxos: &UTxOs, block_slot: &u64) -> ValidationResult { - let available_langs: Vec = available_langs(mtx, utxos, block_slot); +fn check_languages( + mtx: &MintedTx, + utxos: &UTxOs, + network_magic: &u32, + network_id: &u8, + block_slot: &u64, +) -> ValidationResult { + let available_langs: Vec = + available_langs(mtx, utxos, network_magic, network_id, block_slot); for tx_lang in tx_languages(mtx, utxos).iter() { if !available_langs .iter() @@ -1155,8 +1166,14 @@ fn check_languages(mtx: &MintedTx, utxos: &UTxOs, block_slot: &u64) -> Validatio Ok(()) } -fn available_langs(mtx: &MintedTx, utxos: &UTxOs, block_slot: &u64) -> Vec { - let block_langs: Vec = block_langs(block_slot); +fn available_langs( + mtx: &MintedTx, + utxos: &UTxOs, + network_magic: &u32, + network_id: &u8, + block_slot: &u64, +) -> Vec { + let block_langs: Vec = block_langs(*network_magic, *network_id, *block_slot); let allowed_langs: Vec = allowed_langs(mtx, utxos); block_langs .iter() @@ -1165,11 +1182,28 @@ fn available_langs(mtx: &MintedTx, utxos: &UTxOs, block_slot: &u64) -> Vec>() } -fn block_langs(block_slot: &u64) -> Vec { - if *block_slot >= 72748820 { - vec![Language::PlutusV1, Language::PlutusV2] +fn block_langs(network_magic: u32, network_id: u8, block_slot: u64) -> Vec { + if network_magic == 1 && network_id == 0 { + //Preprod - 3,974,409 is the slot of the first block in epoch 13 + if block_slot >= 3974409 { + vec![Language::PlutusV1, Language::PlutusV2] + } else { + vec![Language::PlutusV1] + } + } else if network_magic == 2 && network_id == 0 { + // Preview - 777,610 is the slot of the first block in epoch 9 + if block_slot >= 777610 { + vec![Language::PlutusV1, Language::PlutusV2] + } else { + vec![Language::PlutusV1] + } } else { - vec![Language::PlutusV1] + // Mainnet - 72,748,820 is the slot of the first block in epoch 366 + if block_slot >= 72748820 { + vec![Language::PlutusV1, Language::PlutusV2] + } else { + vec![Language::PlutusV1] + } } } @@ -1320,6 +1354,8 @@ fn check_script_data_hash( tx_body: &MintedTransactionBody, mtx: &MintedTx, utxos: &UTxOs, + network_magic: &u32, + network_id: &u8, block_slot: &u64, ) -> ValidationResult { match tx_body.script_data_hash { @@ -1339,6 +1375,8 @@ fn check_script_data_hash( &tx_languages(mtx, utxos), &plutus_data, redeemer, + network_magic, + network_id, block_slot, ); if script_data_hash == indefinite_hash || script_data_hash == definite_hash { @@ -1369,6 +1407,8 @@ fn compute_script_integrity_hash( tx_languages: &[Language], plutus_data: &[PlutusData], redeemer: &[Redeemer], + network_magic: &u32, + network_id: &u8, block_slot: &u64, ) -> (Hash<32>, Hash<32>) { // Indefinite Plutus data serialization @@ -1383,7 +1423,7 @@ fn compute_script_integrity_hash( let _ = plutus_data_encoder_indef.end(); value_to_hash_with_indef.extend(plutus_data_encoder_indef.writer().clone()); } - let cost_model = cost_model_cbor(tx_languages, block_slot); + let cost_model = cost_model_cbor(tx_languages, *network_magic, *network_id, block_slot); value_to_hash_with_indef.extend(&cost_model); // Definite Plutus data serialization let mut value_to_hash_with_def: Vec = Vec::new(); @@ -1404,48 +1444,169 @@ fn compute_script_integrity_hash( } // Precondition: !tx_languages.is_empty() -fn cost_model_cbor(tx_languages: &[Language], block_slot: &u64) -> Vec { - if *block_slot < 72748820 { - hex::decode( - "a141005901d59f1a000302590001011a00060bc719026d00011a000249f01903e800011a000249f018201a0025cea81971f70419744d186419744d186419744d186419744d186419744d186419744d18641864186419744d18641a000249f018201a000249f018201a000249f018201a000249f01903e800011a000249f018201a000249f01903e800081a000242201a00067e2318760001011a000249f01903e800081a000249f01a0001b79818f7011a000249f0192710011a0002155e19052e011903e81a000249f01903e8011a000249f018201a000249f018201a000249f0182001011a000249f0011a000249f0041a000194af18f8011a000194af18f8011a0002377c190556011a0002bdea1901f1011a000249f018201a000249f018201a000249f018201a000249f018201a000249f018201a000249f018201a000242201a00067e23187600010119f04c192bd200011a000249f018201a000242201a00067e2318760001011a000242201a00067e2318760001011a0025cea81971f704001a000141bb041a000249f019138800011a000249f018201a000302590001011a000249f018201a000249f018201a000249f018201a000249f018201a000249f018201a000249f018201a000249f018201a00330da70101ff" - ).unwrap() - } else if *block_slot <= 84844885 { - // Prior to first block in epoch 394 - if tx_languages.contains(&Language::PlutusV1) && !tx_languages.contains(&Language::PlutusV2) - { +fn cost_model_cbor( + tx_languages: &[Language], + network_magic: u32, + network_id: u8, + block_slot: &u64, +) -> Vec { + if network_magic == 1 && network_id == 0 { + // Preprod + if *block_slot < 3974409 { + // Up to end of epoch 12 hex::decode( - "a141005901b69f1a0003236119032c01011903e819023b00011903e8195e7104011903e818201a0001ca761928eb041959d818641959d818641959d818641959d818641959d818641959d81864186418641959d81864194c5118201a0002acfa182019b551041a000363151901ff00011a00015c3518201a000797751936f404021a0002ff941a0006ea7818dc0001011903e8196ff604021a0003bd081a00034ec5183e011a00102e0f19312a011a00032e801901a5011a0002da781903e819cf06011a00013a34182019a8f118201903e818201a00013aac0119e143041903e80a1a00030219189c011a00030219189c011a0003207c1901d9011a000330001901ff0119ccf3182019fd40182019ffd5182019581e18201940b318201a00012adf18201a0002ff941a0006ea7818dc0001011a00010f92192da7000119eabb18201a0002ff941a0006ea7818dc0001011a0002ff941a0006ea7818dc0001011a000c504e197712041a001d6af61a0001425b041a00040c660004001a00014fab18201a0003236119032c010119a0de18201a00033d7618201979f41820197fb8182019a95d1820197df718201995aa18201a009063b91903fd0aff" - ).unwrap() - } else if !tx_languages.contains(&Language::PlutusV1) - && tx_languages.contains(&Language::PlutusV2) - { - hex::decode( - "a10198af1a0003236119032c01011903e819023b00011903e8195e7104011903e818201a0001ca761928eb041959d818641959d818641959d818641959d818641959d818641959d81864186418641959d81864194c5118201a0002acfa182019b551041a000363151901ff00011a00015c3518201a000797751936f404021a0002ff941a0006ea7818dc0001011903e8196ff604021a0003bd081a00034ec5183e011a00102e0f19312a011a00032e801901a5011a0002da781903e819cf06011a00013a34182019a8f118201903e818201a00013aac0119e143041903e80a1a00030219189c011a00030219189c011a0003207c1901d9011a000330001901ff0119ccf3182019fd40182019ffd5182019581e18201940b318201a00012adf18201a0002ff941a0006ea7818dc0001011a00010f92192da7000119eabb18201a0002ff941a0006ea7818dc0001011a0002ff941a0006ea7818dc0001011a0011b22c1a0005fdde00021a000c504e197712041a001d6af61a0001425b041a00040c660004001a00014fab18201a0003236119032c010119a0de18201a00033d7618201979f41820197fb8182019a95d1820197df718201995aa18201b00000004a817c8001b00000004a817c8001a009063b91903fd0a1b00000004a817c800001b00000004a817c800" + "a141005901d59f1a000302590001011a00060bc719026d00011a000249f01903e800011a000249f018201a0025cea81971f70419744d186419744d186419744d186419744d186419744d186419744d18641864186419744d18641a000249f018201a000249f018201a000249f018201a000249f01903e800011a000249f018201a000249f01903e800081a000242201a00067e2318760001011a000249f01903e800081a000249f01a0001b79818f7011a000249f0192710011a0002155e19052e011903e81a000249f01903e8011a000249f018201a000249f018201a000249f0182001011a000249f0011a000249f0041a000194af18f8011a000194af18f8011a0002377c190556011a0002bdea1901f1011a000249f018201a000249f018201a000249f018201a000249f018201a000249f018201a000249f018201a000242201a00067e23187600010119f04c192bd200011a000249f018201a000242201a00067e2318760001011a000242201a00067e2318760001011a0025cea81971f704001a000141bb041a000249f019138800011a000249f018201a000302590001011a000249f018201a000249f018201a000249f018201a000249f018201a000249f018201a000249f018201a000249f018201a00330da70101ff" ).unwrap() + } else if (3974409..=20390403).contains(block_slot) { + // From start of epoch 13 up to end of epoch 50 + if tx_languages.contains(&Language::PlutusV1) + && !tx_languages.contains(&Language::PlutusV2) + { + hex::decode( + "a141005901b69f1a0003236119032c01011903e819023b00011903e8195e7104011903e818201a0001ca761928eb041959d818641959d818641959d818641959d818641959d818641959d81864186418641959d81864194c5118201a0002acfa182019b551041a000363151901ff00011a00015c3518201a000797751936f404021a0002ff941a0006ea7818dc0001011903e8196ff604021a0003bd081a00034ec5183e011a00102e0f19312a011a00032e801901a5011a0002da781903e819cf06011a00013a34182019a8f118201903e818201a00013aac0119e143041903e80a1a00030219189c011a00030219189c011a0003207c1901d9011a000330001901ff0119ccf3182019fd40182019ffd5182019581e18201940b318201a00012adf18201a0002ff941a0006ea7818dc0001011a00010f92192da7000119eabb18201a0002ff941a0006ea7818dc0001011a0002ff941a0006ea7818dc0001011a000c504e197712041a001d6af61a0001425b041a00040c660004001a00014fab18201a0003236119032c010119a0de18201a00033d7618201979f41820197fb8182019a95d1820197df718201995aa18201a009063b91903fd0aff" + ).unwrap() + } else if !tx_languages.contains(&Language::PlutusV1) + && tx_languages.contains(&Language::PlutusV2) + { + hex::decode( + "a10198af1a0003236119032c01011903e819023b00011903e8195e7104011903e818201a0001ca761928eb041959d818641959d818641959d818641959d818641959d818641959d81864186418641959d81864194c5118201a0002acfa182019b551041a000363151901ff00011a00015c3518201a000797751936f404021a0002ff941a0006ea7818dc0001011903e8196ff604021a0003bd081a00034ec5183e011a00102e0f19312a011a00032e801901a5011a0002da781903e819cf06011a00013a34182019a8f118201903e818201a00013aac0119e143041903e80a1a00030219189c011a00030219189c011a0003207c1901d9011a000330001901ff0119ccf3182019fd40182019ffd5182019581e18201940b318201a00012adf18201a0002ff941a0006ea7818dc0001011a00010f92192da7000119eabb18201a0002ff941a0006ea7818dc0001011a0002ff941a0006ea7818dc0001011a0011b22c1a0005fdde00021a000c504e197712041a001d6af61a0001425b041a00040c660004001a00014fab18201a0003236119032c010119a0de18201a00033d7618201979f41820197fb8182019a95d1820197df718201995aa18201b00000004a817c8001b00000004a817c8001a009063b91903fd0a1b00000004a817c800001b00000004a817c800" + ).unwrap() + } else { + hex::decode( + "a241005901b69f1a0003236119032c01011903e819023b00011903e8195e7104011903e818201a0001ca761928eb041959d818641959d818641959d818641959d818641959d818641959d81864186418641959d81864194c5118201a0002acfa182019b551041a000363151901ff00011a00015c3518201a000797751936f404021a0002ff941a0006ea7818dc0001011903e8196ff604021a0003bd081a00034ec5183e011a00102e0f19312a011a00032e801901a5011a0002da781903e819cf06011a00013a34182019a8f118201903e818201a00013aac0119e143041903e80a1a00030219189c011a00030219189c011a0003207c1901d9011a000330001901ff0119ccf3182019fd40182019ffd5182019581e18201940b318201a00012adf18201a0002ff941a0006ea7818dc0001011a00010f92192da7000119eabb18201a0002ff941a0006ea7818dc0001011a0002ff941a0006ea7818dc0001011a000c504e197712041a001d6af61a0001425b041a00040c660004001a00014fab18201a0003236119032c010119a0de18201a00033d7618201979f41820197fb8182019a95d1820197df718201995aa18201a009063b91903fd0aff0198af1a0003236119032c01011903e819023b00011903e8195e7104011903e818201a0001ca761928eb041959d818641959d818641959d818641959d818641959d818641959d81864186418641959d81864194c5118201a0002acfa182019b551041a000363151901ff00011a00015c3518201a000797751936f404021a0002ff941a0006ea7818dc0001011903e8196ff604021a0003bd081a00034ec5183e011a00102e0f19312a011a00032e801901a5011a0002da781903e819cf06011a00013a34182019a8f118201903e818201a00013aac0119e143041903e80a1a00030219189c011a00030219189c011a0003207c1901d9011a000330001901ff0119ccf3182019fd40182019ffd5182019581e18201940b318201a00012adf18201a0002ff941a0006ea7818dc0001011a00010f92192da7000119eabb18201a0002ff941a0006ea7818dc0001011a0002ff941a0006ea7818dc0001011a0011b22c1a0005fdde00021a000c504e197712041a001d6af61a0001425b041a00040c660004001a00014fab18201a0003236119032c010119a0de18201a00033d7618201979f41820197fb8182019a95d1820197df718201995aa18201b00000004a817c8001b00000004a817c8001a009063b91903fd0a1b00000004a817c800001b00000004a817c800" + ).unwrap() + } } else { - // Precondition allows us to conclude both PlutusV1 and PlutusV2 are required by - // the transaction + // From start of epoch 51 onwards + if tx_languages.contains(&Language::PlutusV1) + && !tx_languages.contains(&Language::PlutusV2) + { + hex::decode( + "a141005901b69f1a0003236119032c01011903e819023b00011903e8195e7104011903e818201a0001ca761928eb041959d818641959d818641959d818641959d818641959d818641959d81864186418641959d81864194c5118201a0002acfa182019b551041a000363151901ff00011a00015c3518201a000797751936f404021a0002ff941a0006ea7818dc0001011903e8196ff604021a0003bd081a00034ec5183e011a00102e0f19312a011a00032e801901a5011a0002da781903e819cf06011a00013a34182019a8f118201903e818201a00013aac0119e143041903e80a1a00030219189c011a00030219189c011a0003207c1901d9011a000330001901ff0119ccf3182019fd40182019ffd5182019581e18201940b318201a00012adf18201a0002ff941a0006ea7818dc0001011a00010f92192da7000119eabb18201a0002ff941a0006ea7818dc0001011a0002ff941a0006ea7818dc0001011a000c504e197712041a001d6af61a0001425b041a00040c660004001a00014fab18201a0003236119032c010119a0de18201a00033d7618201979f41820197fb8182019a95d1820197df718201995aa18201a0374f693194a1f0aff" + ).unwrap() + } else if !tx_languages.contains(&Language::PlutusV1) + && tx_languages.contains(&Language::PlutusV2) + { + hex::decode( + "a10198af1a0003236119032c01011903e819023b00011903e8195e7104011903e818201a0001ca761928eb041959d818641959d818641959d818641959d818641959d818641959d81864186418641959d81864194c5118201a0002acfa182019b551041a000363151901ff00011a00015c3518201a000797751936f404021a0002ff941a0006ea7818dc0001011903e8196ff604021a0003bd081a00034ec5183e011a00102e0f19312a011a00032e801901a5011a0002da781903e819cf06011a00013a34182019a8f118201903e818201a00013aac0119e143041903e80a1a00030219189c011a00030219189c011a0003207c1901d9011a000330001901ff0119ccf3182019fd40182019ffd5182019581e18201940b318201a00012adf18201a0002ff941a0006ea7818dc0001011a00010f92192da7000119eabb18201a0002ff941a0006ea7818dc0001011a0002ff941a0006ea7818dc0001011a0011b22c1a0005fdde00021a000c504e197712041a001d6af61a0001425b041a00040c660004001a00014fab18201a0003236119032c010119a0de18201a00033d7618201979f41820197fb8182019a95d1820197df718201995aa18201a0223accc0a1a0374f693194a1f0a1a02515e841980b30a" + ).unwrap() + } else { + hex::decode( + "a241005901b69f1a0003236119032c01011903e819023b00011903e8195e7104011903e818201a0001ca761928eb041959d818641959d818641959d818641959d818641959d818641959d81864186418641959d81864194c5118201a0002acfa182019b551041a000363151901ff00011a00015c3518201a000797751936f404021a0002ff941a0006ea7818dc0001011903e8196ff604021a0003bd081a00034ec5183e011a00102e0f19312a011a00032e801901a5011a0002da781903e819cf06011a00013a34182019a8f118201903e818201a00013aac0119e143041903e80a1a00030219189c011a00030219189c011a0003207c1901d9011a000330001901ff0119ccf3182019fd40182019ffd5182019581e18201940b318201a00012adf18201a0002ff941a0006ea7818dc0001011a00010f92192da7000119eabb18201a0002ff941a0006ea7818dc0001011a0002ff941a0006ea7818dc0001011a000c504e197712041a001d6af61a0001425b041a00040c660004001a00014fab18201a0003236119032c010119a0de18201a00033d7618201979f41820197fb8182019a95d1820197df718201995aa18201a0374f693194a1f0aff0198af1a0003236119032c01011903e819023b00011903e8195e7104011903e818201a0001ca761928eb041959d818641959d818641959d818641959d818641959d818641959d81864186418641959d81864194c5118201a0002acfa182019b551041a000363151901ff00011a00015c3518201a000797751936f404021a0002ff941a0006ea7818dc0001011903e8196ff604021a0003bd081a00034ec5183e011a00102e0f19312a011a00032e801901a5011a0002da781903e819cf06011a00013a34182019a8f118201903e818201a00013aac0119e143041903e80a1a00030219189c011a00030219189c011a0003207c1901d9011a000330001901ff0119ccf3182019fd40182019ffd5182019581e18201940b318201a00012adf18201a0002ff941a0006ea7818dc0001011a00010f92192da7000119eabb18201a0002ff941a0006ea7818dc0001011a0002ff941a0006ea7818dc0001011a0011b22c1a0005fdde00021a000c504e197712041a001d6af61a0001425b041a00040c660004001a00014fab18201a0003236119032c010119a0de18201a00033d7618201979f41820197fb8182019a95d1820197df718201995aa18201a0223accc0a1a0374f693194a1f0a1a02515e841980b30a" + ).unwrap() + } + } + } else if network_magic == 2 && network_id == 0 { + // Preview + if *block_slot < 777610 { + // Up to end of epoch 8 hex::decode( - "a241005901b69f1a0003236119032c01011903e819023b00011903e8195e7104011903e818201a0001ca761928eb041959d818641959d818641959d818641959d818641959d818641959d81864186418641959d81864194c5118201a0002acfa182019b551041a000363151901ff00011a00015c3518201a000797751936f404021a0002ff941a0006ea7818dc0001011903e8196ff604021a0003bd081a00034ec5183e011a00102e0f19312a011a00032e801901a5011a0002da781903e819cf06011a00013a34182019a8f118201903e818201a00013aac0119e143041903e80a1a00030219189c011a00030219189c011a0003207c1901d9011a000330001901ff0119ccf3182019fd40182019ffd5182019581e18201940b318201a00012adf18201a0002ff941a0006ea7818dc0001011a00010f92192da7000119eabb18201a0002ff941a0006ea7818dc0001011a0002ff941a0006ea7818dc0001011a000c504e197712041a001d6af61a0001425b041a00040c660004001a00014fab18201a0003236119032c010119a0de18201a00033d7618201979f41820197fb8182019a95d1820197df718201995aa18201a009063b91903fd0aff0198af1a0003236119032c01011903e819023b00011903e8195e7104011903e818201a0001ca761928eb041959d818641959d818641959d818641959d818641959d818641959d81864186418641959d81864194c5118201a0002acfa182019b551041a000363151901ff00011a00015c3518201a000797751936f404021a0002ff941a0006ea7818dc0001011903e8196ff604021a0003bd081a00034ec5183e011a00102e0f19312a011a00032e801901a5011a0002da781903e819cf06011a00013a34182019a8f118201903e818201a00013aac0119e143041903e80a1a00030219189c011a00030219189c011a0003207c1901d9011a000330001901ff0119ccf3182019fd40182019ffd5182019581e18201940b318201a00012adf18201a0002ff941a0006ea7818dc0001011a00010f92192da7000119eabb18201a0002ff941a0006ea7818dc0001011a0002ff941a0006ea7818dc0001011a0011b22c1a0005fdde00021a000c504e197712041a001d6af61a0001425b041a00040c660004001a00014fab18201a0003236119032c010119a0de18201a00033d7618201979f41820197fb8182019a95d1820197df718201995aa18201b00000004a817c8001b00000004a817c8001a009063b91903fd0a1b00000004a817c800001b00000004a817c800" + "a141005901d59f1a000302590001011a00060bc719026d00011a000249f01903e800011a000249f018201a0025cea81971f70419744d186419744d186419744d186419744d186419744d186419744d18641864186419744d18641a000249f018201a000249f018201a000249f018201a000249f01903e800011a000249f018201a000249f01903e800081a000242201a00067e2318760001011a000249f01903e800081a000249f01a0001b79818f7011a000249f0192710011a0002155e19052e011903e81a000249f01903e8011a000249f018201a000249f018201a000249f0182001011a000249f0011a000249f0041a000194af18f8011a000194af18f8011a0002377c190556011a0002bdea1901f1011a000249f018201a000249f018201a000249f018201a000249f018201a000249f018201a000249f018201a000242201a00067e23187600010119f04c192bd200011a000249f018201a000242201a00067e2318760001011a000242201a00067e2318760001011a0025cea81971f704001a000141bb041a000249f019138800011a000249f018201a000302590001011a000249f018201a000249f018201a000249f018201a000249f018201a000249f018201a000249f018201a000249f018201a00330da70101ff" ).unwrap() + } else if (777610..1900893).contains(block_slot) { + // From start of epoch 9 up to end of epoch 21 + if tx_languages.contains(&Language::PlutusV1) + && !tx_languages.contains(&Language::PlutusV2) + { + hex::decode( + "a141005901b69f1a0003236119032c01011903e819023b00011903e8195e7104011903e818201a0001ca761928eb041959d818641959d818641959d818641959d818641959d818641959d81864186418641959d81864194c5118201a0002acfa182019b551041a000363151901ff00011a00015c3518201a000797751936f404021a0002ff941a0006ea7818dc0001011903e8196ff604021a0003bd081a00034ec5183e011a00102e0f19312a011a00032e801901a5011a0002da781903e819cf06011a00013a34182019a8f118201903e818201a00013aac0119e143041903e80a1a00030219189c011a00030219189c011a0003207c1901d9011a000330001901ff0119ccf3182019fd40182019ffd5182019581e18201940b318201a00012adf18201a0002ff941a0006ea7818dc0001011a00010f92192da7000119eabb18201a0002ff941a0006ea7818dc0001011a0002ff941a0006ea7818dc0001011a000c504e197712041a001d6af61a0001425b041a00040c660004001a00014fab18201a0003236119032c010119a0de18201a00033d7618201979f41820197fb8182019a95d1820197df718201995aa18201a009063b91903fd0aff" + ).unwrap() + } else if !tx_languages.contains(&Language::PlutusV1) + && tx_languages.contains(&Language::PlutusV2) + { + hex::decode( + "a10198af1a0003236119032c01011903e819023b00011903e8195e7104011903e818201a0001ca761928eb041959d818641959d818641959d818641959d818641959d818641959d81864186418641959d81864194c5118201a0002acfa182019b551041a000363151901ff00011a00015c3518201a000797751936f404021a0002ff941a0006ea7818dc0001011903e8196ff604021a0003bd081a00034ec5183e011a00102e0f19312a011a00032e801901a5011a0002da781903e819cf06011a00013a34182019a8f118201903e818201a00013aac0119e143041903e80a1a00030219189c011a00030219189c011a0003207c1901d9011a000330001901ff0119ccf3182019fd40182019ffd5182019581e18201940b318201a00012adf18201a0002ff941a0006ea7818dc0001011a00010f92192da7000119eabb18201a0002ff941a0006ea7818dc0001011a0002ff941a0006ea7818dc0001011a0011b22c1a0005fdde00021a000c504e197712041a001d6af61a0001425b041a00040c660004001a00014fab18201a0003236119032c010119a0de18201a00033d7618201979f41820197fb8182019a95d1820197df718201995aa18201b00000004a817c8001b00000004a817c8001a009063b91903fd0a1b00000004a817c800001b00000004a817c800" + ).unwrap() + } else { + hex::decode( + "a241005901b69f1a0003236119032c01011903e819023b00011903e8195e7104011903e818201a0001ca761928eb041959d818641959d818641959d818641959d818641959d818641959d81864186418641959d81864194c5118201a0002acfa182019b551041a000363151901ff00011a00015c3518201a000797751936f404021a0002ff941a0006ea7818dc0001011903e8196ff604021a0003bd081a00034ec5183e011a00102e0f19312a011a00032e801901a5011a0002da781903e819cf06011a00013a34182019a8f118201903e818201a00013aac0119e143041903e80a1a00030219189c011a00030219189c011a0003207c1901d9011a000330001901ff0119ccf3182019fd40182019ffd5182019581e18201940b318201a00012adf18201a0002ff941a0006ea7818dc0001011a00010f92192da7000119eabb18201a0002ff941a0006ea7818dc0001011a0002ff941a0006ea7818dc0001011a000c504e197712041a001d6af61a0001425b041a00040c660004001a00014fab18201a0003236119032c010119a0de18201a00033d7618201979f41820197fb8182019a95d1820197df718201995aa18201a009063b91903fd0aff0198af1a0003236119032c01011903e819023b00011903e8195e7104011903e818201a0001ca761928eb041959d818641959d818641959d818641959d818641959d818641959d81864186418641959d81864194c5118201a0002acfa182019b551041a000363151901ff00011a00015c3518201a000797751936f404021a0002ff941a0006ea7818dc0001011903e8196ff604021a0003bd081a00034ec5183e011a00102e0f19312a011a00032e801901a5011a0002da781903e819cf06011a00013a34182019a8f118201903e818201a00013aac0119e143041903e80a1a00030219189c011a00030219189c011a0003207c1901d9011a000330001901ff0119ccf3182019fd40182019ffd5182019581e18201940b318201a00012adf18201a0002ff941a0006ea7818dc0001011a00010f92192da7000119eabb18201a0002ff941a0006ea7818dc0001011a0002ff941a0006ea7818dc0001011a0011b22c1a0005fdde00021a000c504e197712041a001d6af61a0001425b041a00040c660004001a00014fab18201a0003236119032c010119a0de18201a00033d7618201979f41820197fb8182019a95d1820197df718201995aa18201b00000004a817c8001b00000004a817c8001a009063b91903fd0a1b00000004a817c800001b00000004a817c800" + ).unwrap() + } + } else if (1900893..=9244810).contains(block_slot) { + // From start of epoch 22 up to end of epoch 106 + if tx_languages.contains(&Language::PlutusV1) + && !tx_languages.contains(&Language::PlutusV2) + { + hex::decode( + "a141005901b69f1a0003236119032c01011903e819023b00011903e8195e7104011903e818201a0001ca761928eb041959d818641959d818641959d818641959d818641959d818641959d81864186418641959d81864194c5118201a0002acfa182019b551041a000363151901ff00011a00015c3518201a000797751936f404021a0002ff941a0006ea7818dc0001011903e8196ff604021a0003bd081a00034ec5183e011a00102e0f19312a011a00032e801901a5011a0002da781903e819cf06011a00013a34182019a8f118201903e818201a00013aac0119e143041903e80a1a00030219189c011a00030219189c011a0003207c1901d9011a000330001901ff0119ccf3182019fd40182019ffd5182019581e18201940b318201a00012adf18201a0002ff941a0006ea7818dc0001011a00010f92192da7000119eabb18201a0002ff941a0006ea7818dc0001011a0002ff941a0006ea7818dc0001011a000c504e197712041a001d6af61a0001425b041a00040c660004001a00014fab18201a0003236119032c010119a0de18201a00033d7618201979f41820197fb8182019a95d1820197df718201995aa18201a009063b91903fd0aff" + ).unwrap() + } else if !tx_languages.contains(&Language::PlutusV1) + && tx_languages.contains(&Language::PlutusV2) + { + hex::decode( + "a10198af1a0003236119032c01011903e819023b00011903e8195e7104011903e818201a0001ca761928eb041959d818641959d818641959d818641959d818641959d818641959d81864186418641959d81864194c5118201a0002acfa182019b551041a000363151901ff00011a00015c3518201a000797751936f404021a0002ff941a0006ea7818dc0001011903e8196ff604021a0003bd081a00034ec5183e011a00102e0f19312a011a00032e801901a5011a0002da781903e819cf06011a00013a34182019a8f118201903e818201a00013aac0119e143041903e80a1a00030219189c011a00030219189c011a0003207c1901d9011a000330001901ff0119ccf3182019fd40182019ffd5182019581e18201940b318201a00012adf18201a0002ff941a0006ea7818dc0001011a00010f92192da7000119eabb18201a0002ff941a0006ea7818dc0001011a0002ff941a0006ea7818dc0001011a0011b22c1a0005fdde00021a000c504e197712041a001d6af61a0001425b041a00040c660004001a00014fab18201a0003236119032c010119a0de18201a00033d7618201979f41820197fb8182019a95d1820197df718201995aa18201a0223accc0a1a009063b91903fd0a1a02515e841980b30a" + ).unwrap() + } else { + hex::decode( + "a241005901b69f1a0003236119032c01011903e819023b00011903e8195e7104011903e818201a0001ca761928eb041959d818641959d818641959d818641959d818641959d818641959d81864186418641959d81864194c5118201a0002acfa182019b551041a000363151901ff00011a00015c3518201a000797751936f404021a0002ff941a0006ea7818dc0001011903e8196ff604021a0003bd081a00034ec5183e011a00102e0f19312a011a00032e801901a5011a0002da781903e819cf06011a00013a34182019a8f118201903e818201a00013aac0119e143041903e80a1a00030219189c011a00030219189c011a0003207c1901d9011a000330001901ff0119ccf3182019fd40182019ffd5182019581e18201940b318201a00012adf18201a0002ff941a0006ea7818dc0001011a00010f92192da7000119eabb18201a0002ff941a0006ea7818dc0001011a0002ff941a0006ea7818dc0001011a000c504e197712041a001d6af61a0001425b041a00040c660004001a00014fab18201a0003236119032c010119a0de18201a00033d7618201979f41820197fb8182019a95d1820197df718201995aa18201a009063b91903fd0aff0198af1a0003236119032c01011903e819023b00011903e8195e7104011903e818201a0001ca761928eb041959d818641959d818641959d818641959d818641959d818641959d81864186418641959d81864194c5118201a0002acfa182019b551041a000363151901ff00011a00015c3518201a000797751936f404021a0002ff941a0006ea7818dc0001011903e8196ff604021a0003bd081a00034ec5183e011a00102e0f19312a011a00032e801901a5011a0002da781903e819cf06011a00013a34182019a8f118201903e818201a00013aac0119e143041903e80a1a00030219189c011a00030219189c011a0003207c1901d9011a000330001901ff0119ccf3182019fd40182019ffd5182019581e18201940b318201a00012adf18201a0002ff941a0006ea7818dc0001011a00010f92192da7000119eabb18201a0002ff941a0006ea7818dc0001011a0002ff941a0006ea7818dc0001011a0011b22c1a0005fdde00021a000c504e197712041a001d6af61a0001425b041a00040c660004001a00014fab18201a0003236119032c010119a0de18201a00033d7618201979f41820197fb8182019a95d1820197df718201995aa18201a0223accc0a1a009063b91903fd0a1a02515e841980b30a" + ).unwrap() + } + } else { + // From start of epoch 107 onwards + if tx_languages.contains(&Language::PlutusV1) + && !tx_languages.contains(&Language::PlutusV2) + { + hex::decode( + "a141005901b69f1a0003236119032c01011903e819023b00011903e8195e7104011903e818201a0001ca761928eb041959d818641959d818641959d818641959d818641959d818641959d81864186418641959d81864194c5118201a0002acfa182019b551041a000363151901ff00011a00015c3518201a000797751936f404021a0002ff941a0006ea7818dc0001011903e8196ff604021a0003bd081a00034ec5183e011a00102e0f19312a011a00032e801901a5011a0002da781903e819cf06011a00013a34182019a8f118201903e818201a00013aac0119e143041903e80a1a00030219189c011a00030219189c011a0003207c1901d9011a000330001901ff0119ccf3182019fd40182019ffd5182019581e18201940b318201a00012adf18201a0002ff941a0006ea7818dc0001011a00010f92192da7000119eabb18201a0002ff941a0006ea7818dc0001011a0002ff941a0006ea7818dc0001011a000c504e197712041a001d6af61a0001425b041a00040c660004001a00014fab18201a0003236119032c010119a0de18201a00033d7618201979f41820197fb8182019a95d1820197df718201995aa18201a0374f693194a1f0aff" + ).unwrap() + } else if !tx_languages.contains(&Language::PlutusV1) + && tx_languages.contains(&Language::PlutusV2) + { + hex::decode( + "a10198af1a0003236119032c01011903e819023b00011903e8195e7104011903e818201a0001ca761928eb041959d818641959d818641959d818641959d818641959d818641959d81864186418641959d81864194c5118201a0002acfa182019b551041a000363151901ff00011a00015c3518201a000797751936f404021a0002ff941a0006ea7818dc0001011903e8196ff604021a0003bd081a00034ec5183e011a00102e0f19312a011a00032e801901a5011a0002da781903e819cf06011a00013a34182019a8f118201903e818201a00013aac0119e143041903e80a1a00030219189c011a00030219189c011a0003207c1901d9011a000330001901ff0119ccf3182019fd40182019ffd5182019581e18201940b318201a00012adf18201a0002ff941a0006ea7818dc0001011a00010f92192da7000119eabb18201a0002ff941a0006ea7818dc0001011a0002ff941a0006ea7818dc0001011a0011b22c1a0005fdde00021a000c504e197712041a001d6af61a0001425b041a00040c660004001a00014fab18201a0003236119032c010119a0de18201a00033d7618201979f41820197fb8182019a95d1820197df718201995aa18201a0223accc0a1a0374f693194a1f0a1a02515e841980b30a" + ).unwrap() + } else { + hex::decode( + "a241005901b69f1a0003236119032c01011903e819023b00011903e8195e7104011903e818201a0001ca761928eb041959d818641959d818641959d818641959d818641959d818641959d81864186418641959d81864194c5118201a0002acfa182019b551041a000363151901ff00011a00015c3518201a000797751936f404021a0002ff941a0006ea7818dc0001011903e8196ff604021a0003bd081a00034ec5183e011a00102e0f19312a011a00032e801901a5011a0002da781903e819cf06011a00013a34182019a8f118201903e818201a00013aac0119e143041903e80a1a00030219189c011a00030219189c011a0003207c1901d9011a000330001901ff0119ccf3182019fd40182019ffd5182019581e18201940b318201a00012adf18201a0002ff941a0006ea7818dc0001011a00010f92192da7000119eabb18201a0002ff941a0006ea7818dc0001011a0002ff941a0006ea7818dc0001011a000c504e197712041a001d6af61a0001425b041a00040c660004001a00014fab18201a0003236119032c010119a0de18201a00033d7618201979f41820197fb8182019a95d1820197df718201995aa18201a0374f693194a1f0aff0198af1a0003236119032c01011903e819023b00011903e8195e7104011903e818201a0001ca761928eb041959d818641959d818641959d818641959d818641959d818641959d81864186418641959d81864194c5118201a0002acfa182019b551041a000363151901ff00011a00015c3518201a000797751936f404021a0002ff941a0006ea7818dc0001011903e8196ff604021a0003bd081a00034ec5183e011a00102e0f19312a011a00032e801901a5011a0002da781903e819cf06011a00013a34182019a8f118201903e818201a00013aac0119e143041903e80a1a00030219189c011a00030219189c011a0003207c1901d9011a000330001901ff0119ccf3182019fd40182019ffd5182019581e18201940b318201a00012adf18201a0002ff941a0006ea7818dc0001011a00010f92192da7000119eabb18201a0002ff941a0006ea7818dc0001011a0002ff941a0006ea7818dc0001011a0011b22c1a0005fdde00021a000c504e197712041a001d6af61a0001425b041a00040c660004001a00014fab18201a0003236119032c010119a0de18201a00033d7618201979f41820197fb8182019a95d1820197df718201995aa18201a0223accc0a1a0374f693194a1f0a1a02515e841980b30a" + ).unwrap() + } } } else { - // Starting from first block in epoch 394 - if tx_languages.contains(&Language::PlutusV1) && !tx_languages.contains(&Language::PlutusV2) - { + // All other combinations are assumed to correspond to a mainnet network + if *block_slot < 72748820 { hex::decode( - "a141005901b69f1a0003236119032c01011903e819023b00011903e8195e7104011903e818201a0001ca761928eb041959d818641959d818641959d818641959d818641959d818641959d81864186418641959d81864194c5118201a0002acfa182019b551041a000363151901ff00011a00015c3518201a000797751936f404021a0002ff941a0006ea7818dc0001011903e8196ff604021a0003bd081a00034ec5183e011a00102e0f19312a011a00032e801901a5011a0002da781903e819cf06011a00013a34182019a8f118201903e818201a00013aac0119e143041903e80a1a00030219189c011a00030219189c011a0003207c1901d9011a000330001901ff0119ccf3182019fd40182019ffd5182019581e18201940b318201a00012adf18201a0002ff941a0006ea7818dc0001011a00010f92192da7000119eabb18201a0002ff941a0006ea7818dc0001011a0002ff941a0006ea7818dc0001011a000c504e197712041a001d6af61a0001425b041a00040c660004001a00014fab18201a0003236119032c010119a0de18201a00033d7618201979f41820197fb8182019a95d1820197df718201995aa18201a0374f693194a1f0aff" - ).unwrap() - } else if !tx_languages.contains(&Language::PlutusV1) - && tx_languages.contains(&Language::PlutusV2) - { - hex::decode( - "a10198af1a0003236119032c01011903e819023b00011903e8195e7104011903e818201a0001ca761928eb041959d818641959d818641959d818641959d818641959d818641959d81864186418641959d81864194c5118201a0002acfa182019b551041a000363151901ff00011a00015c3518201a000797751936f404021a0002ff941a0006ea7818dc0001011903e8196ff604021a0003bd081a00034ec5183e011a00102e0f19312a011a00032e801901a5011a0002da781903e819cf06011a00013a34182019a8f118201903e818201a00013aac0119e143041903e80a1a00030219189c011a00030219189c011a0003207c1901d9011a000330001901ff0119ccf3182019fd40182019ffd5182019581e18201940b318201a00012adf18201a0002ff941a0006ea7818dc0001011a00010f92192da7000119eabb18201a0002ff941a0006ea7818dc0001011a0002ff941a0006ea7818dc0001011a0011b22c1a0005fdde00021a000c504e197712041a001d6af61a0001425b041a00040c660004001a00014fab18201a0003236119032c010119a0de18201a00033d7618201979f41820197fb8182019a95d1820197df718201995aa18201a0223accc0a1a0374f693194a1f0a1a02515e841980b30a" + "a141005901d59f1a000302590001011a00060bc719026d00011a000249f01903e800011a000249f018201a0025cea81971f70419744d186419744d186419744d186419744d186419744d186419744d18641864186419744d18641a000249f018201a000249f018201a000249f018201a000249f01903e800011a000249f018201a000249f01903e800081a000242201a00067e2318760001011a000249f01903e800081a000249f01a0001b79818f7011a000249f0192710011a0002155e19052e011903e81a000249f01903e8011a000249f018201a000249f018201a000249f0182001011a000249f0011a000249f0041a000194af18f8011a000194af18f8011a0002377c190556011a0002bdea1901f1011a000249f018201a000249f018201a000249f018201a000249f018201a000249f018201a000249f018201a000242201a00067e23187600010119f04c192bd200011a000249f018201a000242201a00067e2318760001011a000242201a00067e2318760001011a0025cea81971f704001a000141bb041a000249f019138800011a000249f018201a000302590001011a000249f018201a000249f018201a000249f018201a000249f018201a000249f018201a000249f018201a000249f018201a00330da70101ff" ).unwrap() + } else if (72748820..84844885).contains(block_slot) { + // Prior to epoch 394 + if tx_languages.contains(&Language::PlutusV1) + && !tx_languages.contains(&Language::PlutusV2) + { + hex::decode( + "a141005901b69f1a0003236119032c01011903e819023b00011903e8195e7104011903e818201a0001ca761928eb041959d818641959d818641959d818641959d818641959d818641959d81864186418641959d81864194c5118201a0002acfa182019b551041a000363151901ff00011a00015c3518201a000797751936f404021a0002ff941a0006ea7818dc0001011903e8196ff604021a0003bd081a00034ec5183e011a00102e0f19312a011a00032e801901a5011a0002da781903e819cf06011a00013a34182019a8f118201903e818201a00013aac0119e143041903e80a1a00030219189c011a00030219189c011a0003207c1901d9011a000330001901ff0119ccf3182019fd40182019ffd5182019581e18201940b318201a00012adf18201a0002ff941a0006ea7818dc0001011a00010f92192da7000119eabb18201a0002ff941a0006ea7818dc0001011a0002ff941a0006ea7818dc0001011a000c504e197712041a001d6af61a0001425b041a00040c660004001a00014fab18201a0003236119032c010119a0de18201a00033d7618201979f41820197fb8182019a95d1820197df718201995aa18201a009063b91903fd0aff" + ).unwrap() + } else if !tx_languages.contains(&Language::PlutusV1) + && tx_languages.contains(&Language::PlutusV2) + { + hex::decode( + "a10198af1a0003236119032c01011903e819023b00011903e8195e7104011903e818201a0001ca761928eb041959d818641959d818641959d818641959d818641959d818641959d81864186418641959d81864194c5118201a0002acfa182019b551041a000363151901ff00011a00015c3518201a000797751936f404021a0002ff941a0006ea7818dc0001011903e8196ff604021a0003bd081a00034ec5183e011a00102e0f19312a011a00032e801901a5011a0002da781903e819cf06011a00013a34182019a8f118201903e818201a00013aac0119e143041903e80a1a00030219189c011a00030219189c011a0003207c1901d9011a000330001901ff0119ccf3182019fd40182019ffd5182019581e18201940b318201a00012adf18201a0002ff941a0006ea7818dc0001011a00010f92192da7000119eabb18201a0002ff941a0006ea7818dc0001011a0002ff941a0006ea7818dc0001011a0011b22c1a0005fdde00021a000c504e197712041a001d6af61a0001425b041a00040c660004001a00014fab18201a0003236119032c010119a0de18201a00033d7618201979f41820197fb8182019a95d1820197df718201995aa18201b00000004a817c8001b00000004a817c8001a009063b91903fd0a1b00000004a817c800001b00000004a817c800" + ).unwrap() + } else { + // Precondition allows us to conclude both PlutusV1 and PlutusV2 are required by + // the transaction + hex::decode( + "a241005901b69f1a0003236119032c01011903e819023b00011903e8195e7104011903e818201a0001ca761928eb041959d818641959d818641959d818641959d818641959d818641959d81864186418641959d81864194c5118201a0002acfa182019b551041a000363151901ff00011a00015c3518201a000797751936f404021a0002ff941a0006ea7818dc0001011903e8196ff604021a0003bd081a00034ec5183e011a00102e0f19312a011a00032e801901a5011a0002da781903e819cf06011a00013a34182019a8f118201903e818201a00013aac0119e143041903e80a1a00030219189c011a00030219189c011a0003207c1901d9011a000330001901ff0119ccf3182019fd40182019ffd5182019581e18201940b318201a00012adf18201a0002ff941a0006ea7818dc0001011a00010f92192da7000119eabb18201a0002ff941a0006ea7818dc0001011a0002ff941a0006ea7818dc0001011a000c504e197712041a001d6af61a0001425b041a00040c660004001a00014fab18201a0003236119032c010119a0de18201a00033d7618201979f41820197fb8182019a95d1820197df718201995aa18201a009063b91903fd0aff0198af1a0003236119032c01011903e819023b00011903e8195e7104011903e818201a0001ca761928eb041959d818641959d818641959d818641959d818641959d818641959d81864186418641959d81864194c5118201a0002acfa182019b551041a000363151901ff00011a00015c3518201a000797751936f404021a0002ff941a0006ea7818dc0001011903e8196ff604021a0003bd081a00034ec5183e011a00102e0f19312a011a00032e801901a5011a0002da781903e819cf06011a00013a34182019a8f118201903e818201a00013aac0119e143041903e80a1a00030219189c011a00030219189c011a0003207c1901d9011a000330001901ff0119ccf3182019fd40182019ffd5182019581e18201940b318201a00012adf18201a0002ff941a0006ea7818dc0001011a00010f92192da7000119eabb18201a0002ff941a0006ea7818dc0001011a0002ff941a0006ea7818dc0001011a0011b22c1a0005fdde00021a000c504e197712041a001d6af61a0001425b041a00040c660004001a00014fab18201a0003236119032c010119a0de18201a00033d7618201979f41820197fb8182019a95d1820197df718201995aa18201b00000004a817c8001b00000004a817c8001a009063b91903fd0a1b00000004a817c800001b00000004a817c800" + ).unwrap() + } } else { - hex::decode( - "a241005901b69f1a0003236119032c01011903e819023b00011903e8195e7104011903e818201a0001ca761928eb041959d818641959d818641959d818641959d818641959d818641959d81864186418641959d81864194c5118201a0002acfa182019b551041a000363151901ff00011a00015c3518201a000797751936f404021a0002ff941a0006ea7818dc0001011903e8196ff604021a0003bd081a00034ec5183e011a00102e0f19312a011a00032e801901a5011a0002da781903e819cf06011a00013a34182019a8f118201903e818201a00013aac0119e143041903e80a1a00030219189c011a00030219189c011a0003207c1901d9011a000330001901ff0119ccf3182019fd40182019ffd5182019581e18201940b318201a00012adf18201a0002ff941a0006ea7818dc0001011a00010f92192da7000119eabb18201a0002ff941a0006ea7818dc0001011a0002ff941a0006ea7818dc0001011a000c504e197712041a001d6af61a0001425b041a00040c660004001a00014fab18201a0003236119032c010119a0de18201a00033d7618201979f41820197fb8182019a95d1820197df718201995aa18201a0374f693194a1f0aff0198af1a0003236119032c01011903e819023b00011903e8195e7104011903e818201a0001ca761928eb041959d818641959d818641959d818641959d818641959d818641959d81864186418641959d81864194c5118201a0002acfa182019b551041a000363151901ff00011a00015c3518201a000797751936f404021a0002ff941a0006ea7818dc0001011903e8196ff604021a0003bd081a00034ec5183e011a00102e0f19312a011a00032e801901a5011a0002da781903e819cf06011a00013a34182019a8f118201903e818201a00013aac0119e143041903e80a1a00030219189c011a00030219189c011a0003207c1901d9011a000330001901ff0119ccf3182019fd40182019ffd5182019581e18201940b318201a00012adf18201a0002ff941a0006ea7818dc0001011a00010f92192da7000119eabb18201a0002ff941a0006ea7818dc0001011a0002ff941a0006ea7818dc0001011a0011b22c1a0005fdde00021a000c504e197712041a001d6af61a0001425b041a00040c660004001a00014fab18201a0003236119032c010119a0de18201a00033d7618201979f41820197fb8182019a95d1820197df718201995aa18201a0223accc0a1a0374f693194a1f0a1a02515e841980b30a" - ).unwrap() + // Starting from epoch 394 + if tx_languages.contains(&Language::PlutusV1) + && !tx_languages.contains(&Language::PlutusV2) + { + hex::decode( + "a141005901b69f1a0003236119032c01011903e819023b00011903e8195e7104011903e818201a0001ca761928eb041959d818641959d818641959d818641959d818641959d818641959d81864186418641959d81864194c5118201a0002acfa182019b551041a000363151901ff00011a00015c3518201a000797751936f404021a0002ff941a0006ea7818dc0001011903e8196ff604021a0003bd081a00034ec5183e011a00102e0f19312a011a00032e801901a5011a0002da781903e819cf06011a00013a34182019a8f118201903e818201a00013aac0119e143041903e80a1a00030219189c011a00030219189c011a0003207c1901d9011a000330001901ff0119ccf3182019fd40182019ffd5182019581e18201940b318201a00012adf18201a0002ff941a0006ea7818dc0001011a00010f92192da7000119eabb18201a0002ff941a0006ea7818dc0001011a0002ff941a0006ea7818dc0001011a000c504e197712041a001d6af61a0001425b041a00040c660004001a00014fab18201a0003236119032c010119a0de18201a00033d7618201979f41820197fb8182019a95d1820197df718201995aa18201a0374f693194a1f0aff" + ).unwrap() + } else if !tx_languages.contains(&Language::PlutusV1) + && tx_languages.contains(&Language::PlutusV2) + { + hex::decode( + "a10198af1a0003236119032c01011903e819023b00011903e8195e7104011903e818201a0001ca761928eb041959d818641959d818641959d818641959d818641959d818641959d81864186418641959d81864194c5118201a0002acfa182019b551041a000363151901ff00011a00015c3518201a000797751936f404021a0002ff941a0006ea7818dc0001011903e8196ff604021a0003bd081a00034ec5183e011a00102e0f19312a011a00032e801901a5011a0002da781903e819cf06011a00013a34182019a8f118201903e818201a00013aac0119e143041903e80a1a00030219189c011a00030219189c011a0003207c1901d9011a000330001901ff0119ccf3182019fd40182019ffd5182019581e18201940b318201a00012adf18201a0002ff941a0006ea7818dc0001011a00010f92192da7000119eabb18201a0002ff941a0006ea7818dc0001011a0002ff941a0006ea7818dc0001011a0011b22c1a0005fdde00021a000c504e197712041a001d6af61a0001425b041a00040c660004001a00014fab18201a0003236119032c010119a0de18201a00033d7618201979f41820197fb8182019a95d1820197df718201995aa18201a0223accc0a1a0374f693194a1f0a1a02515e841980b30a" + ).unwrap() + } else { + hex::decode( + "a241005901b69f1a0003236119032c01011903e819023b00011903e8195e7104011903e818201a0001ca761928eb041959d818641959d818641959d818641959d818641959d818641959d81864186418641959d81864194c5118201a0002acfa182019b551041a000363151901ff00011a00015c3518201a000797751936f404021a0002ff941a0006ea7818dc0001011903e8196ff604021a0003bd081a00034ec5183e011a00102e0f19312a011a00032e801901a5011a0002da781903e819cf06011a00013a34182019a8f118201903e818201a00013aac0119e143041903e80a1a00030219189c011a00030219189c011a0003207c1901d9011a000330001901ff0119ccf3182019fd40182019ffd5182019581e18201940b318201a00012adf18201a0002ff941a0006ea7818dc0001011a00010f92192da7000119eabb18201a0002ff941a0006ea7818dc0001011a0002ff941a0006ea7818dc0001011a000c504e197712041a001d6af61a0001425b041a00040c660004001a00014fab18201a0003236119032c010119a0de18201a00033d7618201979f41820197fb8182019a95d1820197df718201995aa18201a0374f693194a1f0aff0198af1a0003236119032c01011903e819023b00011903e8195e7104011903e818201a0001ca761928eb041959d818641959d818641959d818641959d818641959d818641959d81864186418641959d81864194c5118201a0002acfa182019b551041a000363151901ff00011a00015c3518201a000797751936f404021a0002ff941a0006ea7818dc0001011903e8196ff604021a0003bd081a00034ec5183e011a00102e0f19312a011a00032e801901a5011a0002da781903e819cf06011a00013a34182019a8f118201903e818201a00013aac0119e143041903e80a1a00030219189c011a00030219189c011a0003207c1901d9011a000330001901ff0119ccf3182019fd40182019ffd5182019581e18201940b318201a00012adf18201a0002ff941a0006ea7818dc0001011a00010f92192da7000119eabb18201a0002ff941a0006ea7818dc0001011a0002ff941a0006ea7818dc0001011a0011b22c1a0005fdde00021a000c504e197712041a001d6af61a0001425b041a00040c660004001a00014fab18201a0003236119032c010119a0de18201a00033d7618201979f41820197fb8182019a95d1820197df718201995aa18201a0223accc0a1a0374f693194a1f0a1a02515e841980b30a" + ).unwrap() + } } } } diff --git a/pallas-applying/src/lib.rs b/pallas-applying/src/lib.rs index b2e615c..27460e6 100644 --- a/pallas-applying/src/lib.rs +++ b/pallas-applying/src/lib.rs @@ -43,9 +43,14 @@ pub fn validate(metx: &MultiEraTx, utxos: &UTxOs, env: &Environment) -> Validati _ => Err(TxAndProtParamsDiffer), }, MultiEraProtParams::Babbage(bpp) => match metx { - MultiEraTx::Babbage(mtx) => { - validate_babbage_tx(mtx, utxos, bpp, env.block_slot(), env.network_id()) - } + MultiEraTx::Babbage(mtx) => validate_babbage_tx( + mtx, + utxos, + bpp, + env.block_slot(), + env.prot_magic(), + env.network_id(), + ), _ => Err(TxAndProtParamsDiffer), }, } diff --git a/pallas-applying/src/utils.rs b/pallas-applying/src/utils.rs index ccd7625..b924d7b 100644 --- a/pallas-applying/src/utils.rs +++ b/pallas-applying/src/utils.rs @@ -257,8 +257,8 @@ pub fn get_lovelace_from_alonzo_val(val: &Value) -> Coin { pub fn get_network_id_value(network_id: NetworkId) -> u8 { match network_id { - NetworkId::One => 1, - NetworkId::Two => 2, + NetworkId::One => 0, + NetworkId::Two => 1, } } @@ -333,6 +333,6 @@ pub fn compute_plutus_script_hash(script: &PlutusScript) -> PolicyId { pub fn compute_plutus_v2_script_hash(script: &PlutusV2Script) -> PolicyId { let mut payload: Vec = Vec::from(script.as_ref()); - payload.insert(0, 1); + payload.insert(0, 2); pallas_crypto::hash::Hasher::<224>::hash(&payload) } diff --git a/pallas-applying/tests/alonzo.rs b/pallas-applying/tests/alonzo.rs index 67dbf47..bcc16dd 100644 --- a/pallas-applying/tests/alonzo.rs +++ b/pallas-applying/tests/alonzo.rs @@ -1247,7 +1247,9 @@ mod alonzo_tests { let cbor_bytes: Vec = cbor_to_bytes(include_str!("../../test_data/alonzo1.tx")); let mut mtx: MintedTx = minted_tx_from_cbor(&cbor_bytes); let mut tx_body: TransactionBody = (*mtx.transaction_body).clone(); - tx_body.network_id = Some(NetworkId::Two); + // Note that NetworkId::One maps to 0 through + // crate::utils::get_network_id_value, which is not correct in mainnet. + tx_body.network_id = Some(NetworkId::One); let mut tx_buf: Vec = Vec::new(); let _ = encode(tx_body, &mut tx_buf); mtx.transaction_body = diff --git a/pallas-applying/tests/babbage.rs b/pallas-applying/tests/babbage.rs index 01d987e..3c7da96 100644 --- a/pallas-applying/tests/babbage.rs +++ b/pallas-applying/tests/babbage.rs @@ -253,6 +253,183 @@ mod babbage_tests { } } + #[test] + // Transaction hash: + // 69d925ee5327bf98cbea8cb3aee3274abb5053d10bf2c51a4fd018f15904ec8e + fn successful_preview_tx_with_plutus_v2_script() { + let cbor_bytes: Vec = cbor_to_bytes(include_str!("../../test_data/babbage12.tx")); + let mtx: MintedTx = babbage_minted_tx_from_cbor(&cbor_bytes); + let metx: MultiEraTx = MultiEraTx::from_babbage(&mtx); + let tx_outs_info: &[( + String, + Value, + Option, + Option>, + )] = &[ + ( + String::from("60b5f82aaebdc942bb0c8774dc712338b82e5133fe69ebbc3b6312098e"), + Value::Coin(20000000), + None, + None, + ), + ( + String::from("708D73F125395466F1D68570447E4F4B87CD633C6728F3802B2DCFCA20"), + Value::Multiasset( + 2000000, + KeyValuePairs::from(Vec::from([( + "7F5AC1926607F0D6C000E088CEA67A1EDFDF5CB21F8B7F73412319B0" + .parse() + .unwrap(), + KeyValuePairs::from(Vec::from([( + Bytes::from( + hex::decode( + "B5F82AAEBDC942BB0C8774DC712338B82E5133FE69EBBC3B6312098E", + ) + .unwrap(), + ), + 1, + )])), + )])), + ), + Some(PseudoDatumOption::Hash( + hex::decode("923918E403BF43C34B4EF6B48EB2EE04BABED17320D8D1B9FF9AD086E86F44EC") + .unwrap() + .as_slice() + .into(), + )), + None, + ), + ]; + let mut utxos: UTxOs = mk_utxo_for_babbage_tx(&mtx.transaction_body, tx_outs_info); + let collateral_info: &[( + String, + Value, + Option, + Option>, + )] = &[( + String::from("60b5f82aaebdc942bb0c8774dc712338b82e5133fe69ebbc3b6312098e"), + Value::Coin(20000000), + None, + None, + )]; + add_collateral_babbage(&mtx.transaction_body, &mut utxos, collateral_info); + let env: Environment = Environment { + prot_params: MultiEraProtParams::Babbage(BabbageProtParams { + fee_policy: FeePolicy { + summand: 155381, + multiplier: 44, + }, + max_tx_size: 16384, + max_block_ex_mem: 62000000, + max_block_ex_steps: 40000000000, + max_tx_ex_mem: 14000000, + max_tx_ex_steps: 10000000000, + max_val_size: 5000, + collateral_percent: 150, + max_collateral_inputs: 3, + coins_per_utxo_word: 4310, + }), + prot_magic: 2, + block_slot: 2592005, + network_id: 0, + }; + match validate(&metx, &utxos, &env) { + Ok(()) => (), + Err(err) => assert!(false, "Unexpected error ({:?})", err), + } + } + + #[test] + // Transaction hash: + // 1825d08e4496cca673fd9e47898b92cf97fdc293a40cf5cff99c5b123b364384 + fn successful_preprod_tx_with_plutus_v2_script() { + let cbor_bytes: Vec = cbor_to_bytes(include_str!("../../test_data/babbage13.tx")); + let mtx: MintedTx = babbage_minted_tx_from_cbor(&cbor_bytes); + let metx: MultiEraTx = MultiEraTx::from_babbage(&mtx); + let plutus_data_cbor: Vec = hex::decode( + "D8799FD8799F1A1DCD650019300BFF1B0000018B2B449D97581C28B3E2B8259FAABB566361635C4F8BBF31FE1388B15565F917C33C85FF" + ).unwrap(); + let tx_outs_info: &[( + String, + Value, + Option, + Option>, + )] = &[ + ( + String::from("30DAB18165AE50399C5E477E0CFB38D0B35B32C75F7EB150EBC7874A5EDAB18165AE50399C5E477E0CFB38D0B35B32C75F7EB150EBC7874A5E"), + Value::Multiasset( + 2000000, + KeyValuePairs::from(Vec::from([( + "CCFC2EFE9C1C360EF60D7D2E35CDD359FAD373A62A8905345F8A8BC4" + .parse() + .unwrap(), + KeyValuePairs::from(Vec::from([( + Bytes::from( + hex::decode( + "4F7261636C65546872656164546F6B656E", + ) + .unwrap(), + ), + 1, + )])), + )])), + ), + Some(PseudoDatumOption::Data( + CborWrap( + KeepRaw::::decode( + &mut Decoder::new(&plutus_data_cbor), + &mut (), + ).unwrap(), + ) + )), + None, + ), + ( + String::from("0028B3E2B8259FAABB566361635C4F8BBF31FE1388B15565F917C33C85700D57DE08040F55793195E7ED87E693DBFCF4A62CF3597B1BC93567"), + Value::Coin(86112645), + None, + None, + ), + ]; + let mut utxos: UTxOs = mk_utxo_for_babbage_tx(&mtx.transaction_body, tx_outs_info); + let collateral_info: &[( + String, + Value, + Option, + Option>, + )] = &[( + String::from("0028B3E2B8259FAABB566361635C4F8BBF31FE1388B15565F917C33C85700D57DE08040F55793195E7ED87E693DBFCF4A62CF3597B1BC93567"), + Value::Coin(70884589), + None, + None, + )]; + add_collateral_babbage(&mtx.transaction_body, &mut utxos, collateral_info); + let env: Environment = Environment { + prot_params: MultiEraProtParams::Babbage(BabbageProtParams { + fee_policy: FeePolicy { + summand: 155381, + multiplier: 44, + }, + max_tx_size: 16384, + max_block_ex_mem: 62000000, + max_block_ex_steps: 40000000000, + max_tx_ex_mem: 14000000, + max_tx_ex_steps: 10000000000, + max_val_size: 5000, + collateral_percent: 150, + max_collateral_inputs: 3, + coins_per_utxo_word: 4310, + }), + prot_magic: 1, + block_slot: 41558438, + network_id: 0, + }; + match validate(&metx, &utxos, &env) { + Ok(()) => (), + Err(err) => assert!(false, "Unexpected error ({:?})", err), + } + } + #[test] // Transaction hash: // 8702b0a5835c16663101f68295e33e3b3868c487f736d3c8a0a4246242675a15 @@ -1523,7 +1700,9 @@ mod babbage_tests { )]; let utxos: UTxOs = mk_utxo_for_babbage_tx(&mtx.transaction_body, tx_outs_info); let mut tx_body: MintedTransactionBody = (*mtx.transaction_body).clone(); - tx_body.network_id = Some(NetworkId::Two); + // Note that NetworkId::One maps to 0 through + // crate::utils::get_network_id_value, which is not correct in mainnet. + tx_body.network_id = Some(NetworkId::One); let mut tx_buf: Vec = Vec::new(); let _ = encode(tx_body, &mut tx_buf); mtx.transaction_body = diff --git a/test_data/babbage12.tx b/test_data/babbage12.tx new file mode 100644 index 0000000..9bc5bfc --- /dev/null +++ b/test_data/babbage12.tx @@ -0,0 +1 @@ +84a600828258201bad86747f66c4bb5dcb893cd49a1940044f616271bf405ec7e3854a98cd6f15008258208b7fd06227371d90f62c6abfbba3f8c36ce4fe495975a3c24a683244ef3a24b3020d818258201bad86747f66c4bb5dcb893cd49a1940044f616271bf405ec7e3854a98cd6f15000182a300581d70d42ef9524304ec0444a50d4a399d18d9274703929370646471dcb42801821a001e8480a1581c7f5ac1926607f0d6c000e088cea67a1edfdf5cb21f8b7f73412319b0a1581cb5f82aaebdc942bb0c8774dc712338b82e5133fe69ebbc3b6312098e0102820058203bfda58d9a12e85691b472fbc635da4fcb288d506ba965fe30ed223062bb6718a300581d60b5f82aaebdc942bb0c8774dc712338b82e5133fe69ebbc3b6312098e011a00fb54a00282005820a654fb60d21c1fed48db2c320aa6df9737ec0204c0ba53b9b94a09fb40e757f3021a0035d8600e81581cb5f82aaebdc942bb0c8774dc712338b82e5133fe69ebbc3b6312098e0b582026ee8cc4632db9f6eadf0655d30a2ed0e611df3dc8334814e111340c279f0cc3a40081825820e1223d6c5cdbc9b5e5be026ba62224861d65d53cf44b1d547ac77a82e2bba5cf584052842aedd51e15f52061ba86d897097a39ee76f748c3a7b99fadef9df43bfcd67c1737bfc53887f50476f43623c84559f40741e909cdf937fa66e6ecceabb60a068159146c5914690100003323232323232323322323232323322323233223232323232323232323232323232323232323232323232323232323232323232323232323232323322323232323232323355503822232322323253353330083333573466e1cd55ce9baa00748000812c8c98c812ccd5ce01c0258249999ab9a3370ea0089001119091180080199a8178189aba135573ca00c46666ae68cdc3a802a40004244004464c6409866ae700e4130128124cccd5cd19b8735573aa0049000119910919800801801191919191919191919191919191999ab9a3370e6aae754031200023333333333332222222222221233333333333300100d00c00b00a00900800700600500400300233503803935742a01866a0700726ae85402ccd40e00e8d5d0a805199aa81e3ae503b35742a012666aa078eb940ecd5d0a80419a81c0209aba150073335503c04275a6ae854018c8c8c8cccd5cd19b8735573aa00490001199109198008018011919191999ab9a3370e6aae754009200023322123300100300233504c75a6ae854008c134d5d09aba2500223263206133573809c0c20be26aae7940044dd50009aba150023232323333573466e1cd55cea8012400046644246600200600466a098eb4d5d0a80118269aba135744a004464c640c266ae7013818417c4d55cf280089baa001357426ae8940088c98c8174cd5ce02502e82d89aab9e5001137540026ae854014cd40e1d71aba150043335503c03e200135742a006666aa078eb88004d5d0a80118201aba135744a004464c640b266ae7011816415c4d5d1280089aba25001135744a00226ae8940044d5d1280089aba25001135744a00226ae8940044d5d1280089aba25001135573ca00226ea8004d5d0a80118181aba135744a004464c6409666ae700e012c12441284d412124010350543500135573ca00226ea80044d55cea80089baa0012222325335003103b2133023350032323232322330293355045301d49011a6c6f636b656456616c756520646f6573206e6f74206d61746368003355045301d3372c92010d6c6f636b656456616c75653a2000303c50033355045301d3372c92010e696e697469616c56616c75653a2000303c50083355045301d3372c92010f636f6d697474656456616c75653a2000303c50043232333553022120013502c502a23500122333553025120013502f502d2350012233350012330304800000488cc0c40080048cc0c0005200000133013002001323233301301d00200150065009500353355005215335500321350022253355006213500122335504c3024491216d69736d6174636820636f6d6d69747465642054784f757420696e20646174756d00330303302037666a008444466e9520003357406a0084466e952000335740606600466ae80cd40c88cd40048cdd2a400066ae80c0d4004dd882e11119ba548008cd5d01ba80033357406ea0008cd5d01ba800137620bc0026ec4168cd5d0199aa817ba9335502f75246ea000400ccd5d02999a801099ba548000dd882c1099ba548010cd5d00009bb1059213374a900119aba037520026ec4164cd5d019a8183a900137620b00026605200a0042c26a09a9212c636f6d6d69747465642054784f75742c20627574206e6f7468696e6720696e206f757470757420646174756d00153355002213504d49012c6e6f7468696e6720636f6d6d69747465642c206275742054784f757420696e206f757470757420646174756d001042153353300c00a00413044498884d4008894cd400c54ccd40084d413924010d6d697373696e6720646174756d00213504f49117756e657870656374656420696e6c696e6520646174756d00232153353500a222222222222300d002215335335504a2323232323333333574800a46666ae68cdc39aab9d5005480008cccd55cfa8029282a11999aab9f500525055233335573ea00a4a0ac46666aae7cd5d128031299a99299a981e800909a82d0008a82c1aba15009215335303d35742a01242a66a646464646666666ae900108cccd5cd19b875002480008cccd55cfa8021283011999aab9f35744a00a4a66a646464646666666ae900108cccd5cd19b8735573aa008900011999aab9f500425068233335573ea0084a0d246666aae7cd5d128029299a991919191999999aba400423333573466e1cd55cea8022400046666aae7d4010941c48cccd55cfa8021283911999aab9f35744a00a4a66a6464646666666ae9000c8cccd5cd19b8735573aa006900011999aab9f500325079233335573e6ae89401094cd4c17cd5d0a802909a83e0008a83d1283d0400083f9283c03e9283b9283b9283b9283b83e89aab9e5001137540026ae85401c854cd4c8ccccccd5d20009283b1283b1283b11a83b9bad0022507607c35742a00e426a0ec660ee0040022a0e82a0e64a0e60f20f00ee4a0e00ea4a0de4a0de4a0de4a0de0ea26ae8940044d55cf280089baa00135742a00e42a66a60a06ae85401c84d41b448cc00400c008541ac541a8941a81c01bc1b89419c1b0941989419894198941981b04d5d1280089aab9e5001137540026ae85401884d418cd418c004541849418419c1988cccd5cd19b875003480088cccd55cfa80291a831283092830833928300328321282f1282f1282f1282f03209aab9d5002135573ca00226ea8004d5d0a804909a82d891998008020018010a82c8a82c0a82b9282b82e82e02d82d1282982c1282912829128291282902c09aba25001135744a00226aae7940044dd5000800909a80091100089a828a492e657870656374656420636f6d6d697420646174756d20747970652c20676f7420736f6d657468696e6720656c736500135050490114636f756c64206e6f742066696e6420646174756d00320013550522253350011504c22135002225335333573466e3c00801c12c1284d41440044c01800c884c12926133355301012001300d017503b3355300c120015500a3300b00900313335501a503a33555040017550095001153350022133355501f112253350012135047300300115045335550402335503c002001018350022222222222223335530281200150292350012253353302d0020101350530031505200c15042350032233550413019491204d697373696e67206f7220696e76616c696420636f6d6d697420617574686f72003323355301d12001350135015301600132001533532001320013355041335501a503a33555040017018301b005130464988854cd40044c1212622135002225335003153350011304d498884d4008894cd400c54cd4cc0b40052002100213051498884c14d26221304e498ccd55407cc04c480048004d40088888888888880104cd540f4cd5405940d8cd5540f004c050c05c004448d40048800488d4004888888888888ccd54c04c4800488d40088888d401088cd4008802094cd4ccd5cd19b8f00101704b04a133504633550480050060081008503e00a32001355040221122533500115033221335034300400233553006120010040012223355300a120012350012233550350023355300d12001235001223355038002333500123300a4800000488cc02c0080048cc028005200000133004002001223355300812001235001223355033002333500123355300c1200123500122335503700235500d0010012233355500800f00200123355300c1200123500122335503700235500c00100133355500300a00200111122233355300412001502e3355300812001235001223355033002355009001333553004120012235002225335333553015120013500b500d235001223300a00200500610031335032004003502f001335530081200123500122323355034003300100532001355043225335001135500a003221350022253353300c002008112223300200a004130060030023200135503c22112225335001100222133005002333553007120010050040011121222300300411212223001004123350162233350032200200200135001220013200135503822112253350011502b22133502c3004002335530061200100400111233001225335002102d100102a22333573466e3c0080040ac0a888cdc000100091a800911100191a8009100091299a8008813899ab9c002026112225335001213003001100323500122350022222222222223333500d25038250382503823335530111200150122350012253353301600200413503c0031503b00d3200135502f2211222533500113500322001221333500522002300400233355300712001005004001133500a2253350022100310015026225335333573466e3cd400888008d4004880080880844ccd5cd19b8735002220013500122001022021102111122233550030020011122322374c6004002640026aa05a44a66a00226ec80b4884d400888cd5d019bb03008002300700130060031225335001213374a900019aba030030013762056266e9520023762054466a002466e9520003357406ea4004dd8814919ba548008cd5d01ba9001376205244666ae68cdc380100080e80e0891980080100d91299a8010800880d0919a80111199a801910010010009a80091000891091980080180111999999aba40012501d2501d2501d2501d23501e375c0040462464460046eb0004c8004d5408c88cccd55cf8009280a919a80a18021aba1002300335744004048464646666ae68cdc39aab9d5002480008cc8848cc00400c008c028d5d0a80118029aba135744a004464c6404866ae700440900884d55cf280089baa0012323232323333573466e1cd55cea8022400046666444424666600200a0080060046464646666ae68cdc39aab9d5002480008cc8848cc00400c008c04cd5d0a80119a8068091aba135744a004464c6405266ae700580a409c4d55cf280089baa00135742a008666aa010eb9401cd5d0a8019919191999ab9a3370ea0029002119091118010021aba135573ca00646666ae68cdc3a80124004464244460020086eb8d5d09aab9e500423333573466e1d400d20002122200323263202b33573803005605205004e26aae7540044dd50009aba1500233500975c6ae84d5d1280111931901299ab9c012025023135744a00226ae8940044d55cf280089baa0011335500175ceb44488c88c008dd5800990009aa81011191999aab9f0022501323350123355014300635573aa004600a6aae794008c010d5d100181109aba100112232323333573466e1d4005200023501b3005357426aae79400c8cccd5cd19b875002480089406c8c98c8088cd5ce00781101000f89aab9d500113754002464646666ae68cdc3a800a400c46424444600800a600e6ae84d55cf280191999ab9a3370ea004900211909111180100298049aba135573ca00846666ae68cdc3a801a400446424444600200a600e6ae84d55cf280291999ab9a3370ea00890001190911118018029bae357426aae7940188c98c8088cd5ce00781101000f80f00e89aab9d500113754002464646666ae68cdc39aab9d5002480008cc064c014d5d0a8011bad357426ae8940088c98c8078cd5ce00580f00e09aab9e5001137540024646666ae68cdc39aab9d5001480008dd71aba135573ca004464c6403866ae700240700684dd5000919191919191999ab9a3370ea002900610911111100191999ab9a3370ea004900510911111100211999ab9a3370ea00690041199109111111198008048041bae35742a00a6eb4d5d09aba2500523333573466e1d40112006233221222222233002009008375c6ae85401cdd71aba135744a00e46666ae68cdc3a802a400846644244444446600c01201060186ae854024dd71aba135744a01246666ae68cdc3a8032400446424444444600e010601a6ae84d55cf280591999ab9a3370ea00e900011909111111180280418071aba135573ca018464c6404a66ae7004809408c08808408007c0780744d55cea80209aab9e5003135573ca00426aae7940044dd50009191919191999ab9a3370ea002900111999110911998008028020019bad35742a0086eb4d5d0a8019bad357426ae89400c8cccd5cd19b875002480008c8488c00800cc020d5d09aab9e500623263201e33573801603c03803626aae75400c4d5d1280089aab9e500113754002464646666ae68cdc3a800a400446424460020066eb8d5d09aab9e500323333573466e1d400920002321223002003375c6ae84d55cf280211931900d99ab9c00801b019018135573aa00226ea8004488c8c8cccd5cd19b87500148010848880048cccd5cd19b875002480088c84888c00c010c018d5d09aab9e500423333573466e1d400d20002122200223263201c33573801203803403203026aae7540044dd50009191999ab9a3370ea0029001100591999ab9a3370ea0049000100591931900c19ab9c005018016015135573a6ea8005240103505431002335500a33555009005235001223232300100632001355018223350014800088d4008894cd4ccd5cd19b8f002009011010130070011300600332001355017223350014800088d4008894cd4ccd5cd19b8f00200701000f1001130060033355004008008112200212212233001004003112212330010030023200135500f225335333573466e1c0052000004003149101300015335333573466e1c0052002004003149101310015335333573466e1c0052004004003149101320015335333573466e1c0052006004003149101330015335333573466e1c0052008004003149101340015335333573466e1c005200a004003149101350015335333573466e1c005200c004003149101360015335333573466e1c005200e004003149101370015335333573466e1c0052010004003149101380015335333573466e1c0052012004003149101390015335333573466e20005201400300413372c600466e100052014490101300013372c9201012d003002337029000000891001091000a44100111222300330020011122300200123500749011d65787065637465642073696e676c6520636f6d6d6974206f75747075740012122300200311220012212330010030022350034901136d697373696e67206865616420746f6b656e730023500249012d6d756c7469706c65206865616420746f6b656e73206f72206d6f7265207468616e20312050547320666f756e64001232632003335738002006930900088919180080091198019801001000a4411cd42ef9524304ec0444a50d4a399d18d9274703929370646471dcb42800010482d8799f5820b37aabd81024c043f53a069c91e51a5b52e4ea399ae17ee1fe3cb9c44db707eb581c58d3332af22d527dc44f97a34e38f41c3489c22f18fed9d30e176c54d87a80ffd879800581840001d87a9fd87a80ff821a00d59f801b00000002540be400f5f6 \ No newline at end of file diff --git a/test_data/babbage13.tx b/test_data/babbage13.tx new file mode 100644 index 0000000..1b6d86f --- /dev/null +++ b/test_data/babbage13.tx @@ -0,0 +1 @@ +84a9008282582097e372f0b8a11854a205880603b10454ca8a45cba1cd5eec58ac5eece56a244e0082582097e372f0b8a11854a205880603b10454ca8a45cba1cd5eec58ac5eece56a244e010182a300583930dab18165ae50399c5e477e0cfb38d0b35b32c75f7eb150ebc7874a5edab18165ae50399c5e477e0cfb38d0b35b32c75f7eb150ebc7874a5e01821a001e8480a1581cccfc2efe9c1c360ef60d7d2e35cdd359fad373a62a8905345f8a8bc4a1514f7261636c65546872656164546f6b656e01028201d8185837d8799fd8799f1a9502f90019f01dff1b0000018b2b7af7a7581c28b3e2b8259faabb566361635c4f8bbf31fe1388b15565f917c33c85ff8258390028b3e2b8259faabb566361635c4f8bbf31fe1388b15565f917c33c85700d57de08040f55793195e7ed87e693dbfcf4a62cf3597b1bc935671a051d6469021a0004951c0b5820ce18424d1bf413d1638fe6bfe048f6cc73ea924a595cedac9b995f385bf659e10d818258201045c6497434b4d90d494c8fa1c8126b76b3205859868a50904d49385235b2e1010e81581c28b3e2b8259faabb566361635c4f8bbf31fe1388b15565f917c33c850f00108258390028b3e2b8259faabb566361635c4f8bbf31fe1388b15565f917c33c85700d57de08040f55793195e7ed87e693dbfcf4a62cf3597b1bc935671a03ed51ad111a004c4b40a500828258204df012f407af3f6d7292385968980f68bcbf6611413f113663755ed3fc58923c58404d6ae1ece044a6486e7659f5e6e8f9d01db6de3044681a8b919a2dc6a6a3e164fb4405623cbaa392feae5c079f8a7510aca64d87bd295d6f8c3088c0cc261f08825820b1689adbbbb11bfaec61ad3fa90a4cf397b4e3fdbbf745b5b49f94685877997f5840f4bf0763a34832cfce863baa393a7e1e1bde2a49ad558eadaa44bd30af4447f7dae472e3dc169171d225aa1fef985fc8f47b0af3bbecc5f74701b8eeb3bfbd090380068159079059078d01000033232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232222232323232323232323232323232323232533303b3370e90000010991919191919299982099b87001480084c94ccc108cc08cdd48069bac001153330425332233304400200114a066e212000375a64608e6080002608c010266e212000375a64608e6080002608c0102a66608466ebcc8c11cc100004c07001cc11802054ccc108cdc79bae30463037303f01a375c64608e60706080002603800e2a6660846466ebcdd30079ba6001323756608e608c6080002603e0302930a99823a481033930330016153304749103393036001615330474910339303500161533047491033930340016153304702c163045302c303e00e15330460321633303200c00a009533303f3370e900000109919191919191919299982399b89480000044c8c8c94ccc128cdc39b8d001480e04c8c926533304c001149854cc14013458c13400c54cc13c12058dd7000982600098250018a998260230b1bad0013049001304700653330433370e900000109919191919191924ca6660940022930a998270258b18258019bad001304a0013048003375a002608e0022a660900922c609200460920026ea8004c10c00454cc11011458c114008c114004dd5180b000980c008899299981e19b87001480084c94ccc0f4cc078dd48041bac001132533303f0011323253330403370e002604490010a4c2a6608a0462c6660620020120106eacc108c0b4c0ec02c4c8c94ccc100cdc38009811240042930a998228118b1998188008048041bab3042302d303b00b3021013153304202716304030273039009153304102d1633302d00700500430410023041001375401e6eb8c0ecc0e8c0d0040dd7181d18198079bae3039302a303200d32375660726070606400264646074607260660026600240022a660749210333303500163232323302d00100337586074606600260726064016605e014606e6060012a66606466e1d20000021323232323232324994ccc0e4004526153303d03a16303a00653330363370e900000109919191919191924ca66607a0022930a9982081f0b181f0019bad001303d001303b003375a00260740022a660760782c607800460780026ea8004c0d800454ccc0c8cdc3a40040042649329998198008a4c2a6606e0682c2a6606e0702c607000460700026ea80194ccc0b8cdc3a400000426464646464646464a66606c66e252000001132323253330393370e6e340052038132324994ccc0ec004526153303f03c16303c003153303e03716375c002607600260720062a6607606a2c6eb4004c0e0004c0d80194ccc0c8cdc3a400000426464646464646493299981c8008a4c2a6607a0742c60740066eb4004c0e4004c0dc00cdd6800981b0008a9981b81c0b181c001181c0009baa00130320011533033034163034002303400137540064646464a66605466e1d2002002153302f005161533302a3370e9002001098170008a998178030b181800118180009baa302b301c302400149010333303200490103333031002300230080012533302400115330280021613253330250011302800215330290041630260014910333303600490103333037002301822533302300114a02a66604466ebcc09800400c528898011812800919b8148000005241033930370023232323233300600200100437586048602a603a0046eb0c08cc070004c088c06c008c060004888cccc05000c0048cc014c060c8c090c074004c08cc088c07000400c54cc08c01c588c04c894ccc07800440104c94ccc078c0100044cc018004c00cc0840084c00cc084008c0840052f5c0ae812412063616e27742067657420616e7920636f6e74696e75696e67206f7574707574730049010339303200230193002001230183002001230173002001230163002001230153002001230143006001490103393031002223333004002480008cccc014009200075a6eac00400c8c008dd480091111980411299980980088028a99980919baf301a301600100613004301930160011300230150010012300f300f001223300330050010023001222533300d00112250011533300c300230100011322230020033010001133003002300f0012323002233002002001230022330020020012233003002300d3006001223375e6e9cc014008dd398028009191919299980499b87480080084c03400454cc03801458c03c008c03c004dd5180518049801800a4903333034002300b375400292012c7074727946726f6d28505075624b657948617368293a206d757374206265203238206279746573206c6f6e67004901257074727946726f6d28504f53495854696d65293a206d75737420626520706f736974697665005734aae7d241317074727946726f6d2850446174615265636f72645b5d293a206c697374206973206c6f6e676572207468616e207a65726f005744ae855ce2493f7265616368656420656e64206f662073756d207768696c65207374696c6c206e6f7420686176696e6720666f756e642074686520636f6e7374727563746f72005573caae75300134d8799f581cccfc2efe9c1c360ef60d7d2e35cdd359fad373a62a8905345f8a8bc4514f7261636c65546872656164546f6b656eff000104800581840000d8799fd8799f1a9502f90019f01dffff821a0003deff1a06159ccdf5f6 \ No newline at end of file