From 969d5612b720040fdc862428c83a23390393aee6 Mon Sep 17 00:00:00 2001 From: Matthias Benkort <5680256+KtorZ@users.noreply.github.com> Date: Tue, 22 Oct 2024 13:57:21 +0200 Subject: [PATCH] refactor: Re-organize and clean-up pallas-primitives (#523) * Re-organize and clean-up pallas-primitives Namely: - Move _common_ (i.e. era-independent) types and structures up to the `lib` module; to be shared across all eras. If any of those deviate in a subsequent era, it is easy to bring them down and define new types from the point of divergence onward. This simplifies the scope of each era-specific module and make them slightly easier to navigate. Note that, each era module still re-export all of the common types that's relevant to that particular era. So technically, this reorganization doesn't really change anything for callers/users of the library. - Rename `Scripthash` to `ScriptHash`. Before this commit, both actually existed as `ScriptHash` was introduced with the Conway era. Yet, they refer to the same thing, so the duplication is simply confusing. - Rename `One` / `Two` constructors for `NetworkId` to `Testnet` and `Mainnet` respectively. Also defined idiomatic `From` & `TryFrom` implementation for conversion to and from `u8`. This is a lot let confusing! - Generalize `PlutusScript` with a constant generic, to avoid repetition for each plutus script generated for specific version. Note that a distinction is still _necessary_ if we want to provie out-of-the-box serialisers for Plutus scripts, which are serialised with a tag prefix depending on the language. All else apart, they are strictly similar types. - Rename `CostMdls` to `CostModels`. Because, common. - Rename `plutus_script` to `plutus_v1_script` in the Alonzo's witness set, for consistency with other eras. * Fix ordering of ScriptHash variants. This is an odd one. See the note. * Bump minicbor to v0.25.1 * Add aliases with deprecation warnings to various fields and types. * revert renaming plutus_script to plutus_v1_script in Alonzo witness See https://github.com/txpipe/pallas/pull/523#discussion_r1807329742 --- pallas-applying/src/alonzo.rs | 55 +- pallas-applying/src/babbage.rs | 31 +- pallas-applying/src/utils.rs | 28 +- pallas-applying/src/utils/environment.rs | 13 +- pallas-applying/tests/alonzo.rs | 6 +- pallas-applying/tests/babbage.rs | 18 +- pallas-codec/Cargo.toml | 2 +- pallas-codec/src/utils.rs | 14 +- pallas-configs/src/alonzo.rs | 2 +- .../src/miniprotocols/blockfetch/codec.rs | 4 +- .../src/miniprotocols/chainsync/codec.rs | 6 +- .../localstate/queries_v16/codec.rs | 4 +- .../miniprotocols/localtxsubmission/codec.rs | 6 +- .../src/miniprotocols/txsubmission/codec.rs | 6 +- pallas-primitives/src/alonzo/model.rs | 718 +----------------- pallas-primitives/src/babbage/model.rs | 141 +--- pallas-primitives/src/conway/model.rs | 160 +--- pallas-primitives/src/lib.rs | 392 ++++++++++ pallas-primitives/src/plutus_data.rs | 353 +++++++++ pallas-traverse/src/auxiliary.rs | 2 +- pallas-traverse/src/hashes.rs | 20 +- pallas-traverse/src/probe.rs | 2 +- pallas-traverse/src/update.rs | 16 +- pallas-traverse/src/witnesses.rs | 11 +- pallas-txbuilder/src/babbage.rs | 31 +- pallas-utxorpc/src/lib.rs | 2 +- 26 files changed, 972 insertions(+), 1071 deletions(-) create mode 100644 pallas-primitives/src/plutus_data.rs diff --git a/pallas-applying/src/alonzo.rs b/pallas-applying/src/alonzo.rs index ac9cda0..6faf915 100644 --- a/pallas-applying/src/alonzo.rs +++ b/pallas-applying/src/alonzo.rs @@ -2,8 +2,8 @@ use crate::utils::{ add_minted_value, add_values, aux_data_from_alonzo_minted_tx, compute_native_script_hash, - compute_plutus_script_hash, empty_value, get_alonzo_comp_tx_size, get_lovelace_from_alonzo_val, - get_network_id_value, get_payment_part, get_shelley_address, get_val_size_in_words, + compute_plutus_v1_script_hash, empty_value, get_alonzo_comp_tx_size, + get_lovelace_from_alonzo_val, get_payment_part, get_shelley_address, get_val_size_in_words, mk_alonzo_vk_wits_check_list, values_are_equal, verify_signature, AlonzoError::*, AlonzoProtParams, UTxOs, @@ -159,7 +159,7 @@ fn check_min_fee( fn presence_of_plutus_scripts(mtx: &MintedTx) -> bool { let minted_witness_set: &MintedWitnessSet = &mtx.transaction_witness_set; match &minted_witness_set.plutus_script { - Some(plutus_scripts) => !plutus_scripts.is_empty(), + Some(plutus_v1_scripts) => !plutus_v1_scripts.is_empty(), None => false, } } @@ -355,7 +355,7 @@ fn check_tx_outs_network_id(tx_body: &TransactionBody, network_id: &u8) -> Valid // global network ID. fn check_tx_network_id(tx_body: &TransactionBody, network_id: &u8) -> ValidationResult { if let Some(tx_network_id) = tx_body.network_id { - if get_network_id_value(tx_network_id) != *network_id { + if u8::from(tx_network_id) != *network_id { return Err(Alonzo(TxWrongNetworkID)); } } @@ -402,11 +402,11 @@ fn check_witness_set(mtx: &MintedTx, utxos: &UTxOs) -> ValidationResult { Some(scripts) => scripts.clone().iter().map(|x| x.clone().unwrap()).collect(), None => Vec::new(), }; - let plutus_scripts: Vec = match &tx_wits.plutus_script { + let plutus_v1_scripts: Vec> = match &tx_wits.plutus_script { Some(scripts) => scripts.clone(), None => Vec::new(), }; - check_needed_scripts_are_included(tx_body, utxos, &native_scripts, &plutus_scripts)?; + check_needed_scripts_are_included(tx_body, utxos, &native_scripts, &plutus_v1_scripts)?; check_datums(tx_body, utxos, &tx_wits.plutus_data)?; check_redeemers(tx_body, tx_wits, utxos)?; check_required_signers(&tx_body.required_signers, vkey_wits, tx_hash)?; @@ -420,21 +420,23 @@ fn check_needed_scripts_are_included( tx_body: &TransactionBody, utxos: &UTxOs, native_scripts: &[NativeScript], - plutus_scripts: &[PlutusScript], + plutus_v1_scripts: &[PlutusScript<1>], ) -> ValidationResult { let mut native_scripts: Vec<(bool, NativeScript)> = native_scripts.iter().map(|x| (false, x.clone())).collect(); - let mut plutus_scripts: Vec<(bool, PlutusScript)> = - plutus_scripts.iter().map(|x| (false, x.clone())).collect(); - check_script_inputs(tx_body, &mut native_scripts, &mut plutus_scripts, utxos)?; - check_minting_policies(tx_body, &mut native_scripts, &mut plutus_scripts)?; + let mut plutus_v1_scripts: Vec<(bool, PlutusScript<1>)> = plutus_v1_scripts + .iter() + .map(|x| (false, x.clone())) + .collect(); + check_script_inputs(tx_body, &mut native_scripts, &mut plutus_v1_scripts, utxos)?; + check_minting_policies(tx_body, &mut native_scripts, &mut plutus_v1_scripts)?; for (native_script_covered, _) in native_scripts.iter() { if !native_script_covered { return Err(Alonzo(UnneededNativeScript)); } } - for (plutus_script_covered, _) in plutus_scripts.iter() { - if !plutus_script_covered { + for (plutus_v1_script_covered, _) in plutus_v1_scripts.iter() { + if !plutus_v1_script_covered { return Err(Alonzo(UnneededPlutusScript)); } } @@ -554,7 +556,7 @@ fn mk_plutus_script_redeemer_pointers( for (index, input) in sorted_inputs.iter().enumerate() { if let Some(script_hash) = get_script_hash_from_input(input, utxos) { for plutus_script in plutus_scripts.iter() { - let hashed_script: PolicyId = compute_plutus_script_hash(plutus_script); + let hashed_script: PolicyId = compute_plutus_v1_script_hash(plutus_script); if script_hash == hashed_script { res.push(RedeemerPointer { tag: RedeemerTag::Spend, @@ -569,7 +571,8 @@ fn mk_plutus_script_redeemer_pointers( let sorted_policies: Vec = sort_policies(minted_value); for (index, policy) in sorted_policies.iter().enumerate() { for plutus_script in plutus_scripts.iter() { - let hashed_script: PolicyId = compute_plutus_script_hash(plutus_script); + let hashed_script: PolicyId = + compute_plutus_v1_script_hash(plutus_script); if *policy == hashed_script { res.push(RedeemerPointer { tag: RedeemerTag::Mint, @@ -626,7 +629,7 @@ fn redeemer_pointers_coincide( fn check_script_inputs( tx_body: &TransactionBody, native_scripts: &mut [(bool, NativeScript)], - plutus_scripts: &mut [(bool, PlutusScript)], + plutus_v1_scripts: &mut [(bool, PlutusScript<1>)], utxos: &UTxOs, ) -> ValidationResult { let mut inputs: Vec<(bool, ScriptHash)> = get_script_hashes(tx_body, utxos); @@ -638,8 +641,8 @@ fn check_script_inputs( *native_script_covered = true; } } - for (plutus_script_covered, plutus_script) in plutus_scripts.iter_mut() { - let hashed_script: PolicyId = compute_plutus_script_hash(plutus_script); + for (plutus_script_covered, plutus_v1_script) in plutus_v1_scripts.iter_mut() { + let hashed_script: PolicyId = compute_plutus_v1_script_hash(plutus_v1_script); if *input_script_hash == hashed_script { *input_script_covered = true; *plutus_script_covered = true; @@ -678,7 +681,7 @@ fn get_script_hash_from_input(input: &TransactionInput, utxos: &UTxOs) -> Option fn check_minting_policies( tx_body: &TransactionBody, native_scripts: &mut [(bool, NativeScript)], - plutus_scripts: &mut [(bool, PlutusScript)], + plutus_v1_scripts: &mut [(bool, PlutusScript<1>)], ) -> ValidationResult { match &tx_body.mint { None => Ok(()), @@ -693,8 +696,8 @@ fn check_minting_policies( *native_script_covered = true; } } - for (plutus_script_covered, plutus_script) in plutus_scripts.iter_mut() { - let hashed_script: PolicyId = compute_plutus_script_hash(plutus_script); + for (plutus_script_covered, plutus_v1_script) in plutus_v1_scripts.iter_mut() { + let hashed_script: PolicyId = compute_plutus_v1_script_hash(plutus_v1_script); if *policy == hashed_script { *policy_covered = true; *plutus_script_covered = true; @@ -923,18 +926,18 @@ fn check_minting(tx_body: &TransactionBody, mtx: &MintedTx) -> ValidationResult .map(|x| x.clone().unwrap()) .collect(), }; - let plutus_script_wits: Vec = + let plutus_v1_script_wits: Vec> = match &mtx.transaction_witness_set.plutus_script { None => Vec::new(), - Some(plutus_script_wits) => plutus_script_wits.clone(), + Some(plutus_v1_script_wits) => plutus_v1_script_wits.clone(), }; for (policy, _) in minted_value.iter() { if native_script_wits .iter() .all(|native_script| compute_native_script_hash(native_script) != *policy) - && plutus_script_wits - .iter() - .all(|plutus_script| compute_plutus_script_hash(plutus_script) != *policy) + && plutus_v1_script_wits.iter().all(|plutus_v1_script| { + compute_plutus_v1_script_hash(plutus_v1_script) != *policy + }) { return Err(Alonzo(MintingLacksPolicy)); } diff --git a/pallas-applying/src/babbage.rs b/pallas-applying/src/babbage.rs index 7e8b0c9..58c8a66 100644 --- a/pallas-applying/src/babbage.rs +++ b/pallas-applying/src/babbage.rs @@ -2,10 +2,10 @@ use crate::utils::{ add_minted_value, add_values, aux_data_from_babbage_minted_tx, compute_native_script_hash, - compute_plutus_script_hash, compute_plutus_v2_script_hash, empty_value, get_babbage_tx_size, - get_lovelace_from_alonzo_val, get_network_id_value, get_payment_part, get_shelley_address, - get_val_size_in_words, is_byron_address, lovelace_diff_or_fail, mk_alonzo_vk_wits_check_list, - values_are_equal, verify_signature, + compute_plutus_v1_script_hash, compute_plutus_v2_script_hash, empty_value, get_babbage_tx_size, + get_lovelace_from_alonzo_val, get_payment_part, get_shelley_address, get_val_size_in_words, + is_byron_address, lovelace_diff_or_fail, mk_alonzo_vk_wits_check_list, values_are_equal, + verify_signature, BabbageError::*, BabbageProtParams, UTxOs, ValidationError::{self, *}, @@ -16,15 +16,14 @@ use pallas_codec::{ minicbor::{encode, Encoder}, utils::{Bytes, KeepRaw}, }; -use pallas_crypto::hash::Hash; use pallas_primitives::{ alonzo::{RedeemerPointer, RedeemerTag}, babbage::{ - AddrKeyhash, Language, Mint, MintedTransactionBody, MintedTransactionOutput, MintedTx, - MintedWitnessSet, NativeScript, PlutusData, PlutusV1Script, PlutusV2Script, PolicyId, - PseudoDatumOption, PseudoScript, PseudoTransactionOutput, Redeemer, RequiredSigners, - TransactionInput, VKeyWitness, Value, + Language, Mint, MintedTransactionBody, MintedTransactionOutput, MintedTx, MintedWitnessSet, + NativeScript, PseudoDatumOption, PseudoScript, PseudoTransactionOutput, Redeemer, + RequiredSigners, VKeyWitness, Value, }, + AddrKeyhash, Hash, PlutusData, PlutusScript, PolicyId, TransactionInput, }; use pallas_traverse::{MultiEraInput, MultiEraOutput, OriginalHash}; use std::ops::Deref; @@ -166,11 +165,11 @@ fn check_min_fee( fn presence_of_plutus_scripts(mtx: &MintedTx) -> bool { let minted_witness_set: &MintedWitnessSet = &mtx.transaction_witness_set; - let plutus_v1_scripts: &[PlutusV1Script] = &minted_witness_set + let plutus_v1_scripts: &[PlutusScript<1>] = &minted_witness_set .plutus_v1_script .clone() .unwrap_or_default(); - let plutus_v2_scripts: &[PlutusV2Script] = &minted_witness_set + let plutus_v2_scripts: &[PlutusScript<2>] = &minted_witness_set .plutus_v2_script .clone() .unwrap_or_default(); @@ -401,7 +400,7 @@ fn check_tx_outs_network_id(tx_body: &MintedTransactionBody, network_id: &u8) -> // global network ID. fn check_tx_network_id(tx_body: &MintedTransactionBody, network_id: &u8) -> ValidationResult { if let Some(tx_network_id) = tx_body.network_id { - if get_network_id_value(tx_network_id) != *network_id { + if u8::from(tx_network_id) != *network_id { return Err(Babbage(TxWrongNetworkID)); } } @@ -449,12 +448,12 @@ fn check_minting(tx_body: &MintedTransactionBody, mtx: &MintedTx) -> ValidationR .map(|x| x.clone().unwrap()) .collect(), }; - let v1_script_wits: Vec = + let v1_script_wits: Vec> = match &mtx.transaction_witness_set.plutus_v1_script { None => Vec::new(), Some(v1_script_wits) => v1_script_wits.clone(), }; - let v2_script_wits: Vec = + let v2_script_wits: Vec> = match &mtx.transaction_witness_set.plutus_v2_script { None => Vec::new(), Some(v2_script_wits) => v2_script_wits.clone(), @@ -465,7 +464,7 @@ fn check_minting(tx_body: &MintedTransactionBody, mtx: &MintedTx) -> ValidationR .all(|script| compute_native_script_hash(script) != *policy) && v1_script_wits .iter() - .all(|script| compute_plutus_script_hash(script) != *policy) + .all(|script| compute_plutus_v1_script_hash(script) != *policy) && v2_script_wits .iter() .all(|script| compute_plutus_v2_script_hash(script) != *policy) @@ -500,7 +499,7 @@ fn check_witness_set(mtx: &MintedTx, utxos: &UTxOs) -> ValidationResult { Some(scripts) => scripts .clone() .iter() - .map(compute_plutus_script_hash) + .map(compute_plutus_v1_script_hash) .collect(), None => Vec::new(), }; diff --git a/pallas-applying/src/utils.rs b/pallas-applying/src/utils.rs index 7e868e0..394a899 100644 --- a/pallas-applying/src/utils.rs +++ b/pallas-applying/src/utils.rs @@ -12,12 +12,12 @@ use pallas_codec::{ use pallas_crypto::key::ed25519::{PublicKey, Signature}; use pallas_primitives::{ alonzo::{ - AddrKeyhash, AssetName, AuxiliaryData, Coin, Epoch, GenesisDelegateHash, Genesishash, - MintedTx as AlonzoMintedTx, Multiasset, NativeScript, NetworkId, PlutusScript, PolicyId, - PoolKeyhash, PoolMetadata, Relay, RewardAccount, StakeCredential, TransactionIndex, - UnitInterval, VKeyWitness, Value, VrfKeyhash, + AuxiliaryData, MintedTx as AlonzoMintedTx, Multiasset, NativeScript, VKeyWitness, Value, }, - babbage::{MintedTx as BabbageMintedTx, PlutusV2Script}, + babbage::MintedTx as BabbageMintedTx, + AddrKeyhash, AssetName, Coin, Epoch, GenesisDelegateHash, Genesishash, NetworkId, PlutusScript, + PolicyId, PoolKeyhash, PoolMetadata, Relay, RewardAccount, StakeCredential, TransactionIndex, + UnitInterval, VrfKeyhash, }; use pallas_traverse::{time::Slot, MultiEraInput, MultiEraOutput}; use std::collections::HashMap; @@ -267,11 +267,9 @@ pub fn get_lovelace_from_alonzo_val(val: &Value) -> Coin { } } +#[deprecated(since = "0.31.0", note = "use `u8::from(...)` instead")] pub fn get_network_id_value(network_id: NetworkId) -> u8 { - match network_id { - NetworkId::One => 0, - NetworkId::Two => 1, - } + u8::from(network_id) } pub fn mk_alonzo_vk_wits_check_list( @@ -337,13 +335,18 @@ pub fn compute_native_script_hash(script: &NativeScript) -> PolicyId { pallas_crypto::hash::Hasher::<224>::hash(&payload) } -pub fn compute_plutus_script_hash(script: &PlutusScript) -> PolicyId { +#[deprecated(since = "0.31.0", note = "use `compute_plutus_v1_script_hash` instead")] +pub fn compute_plutus_script_hash(script: &PlutusScript<1>) -> PolicyId { + compute_plutus_v1_script_hash(script) +} + +pub fn compute_plutus_v1_script_hash(script: &PlutusScript<1>) -> PolicyId { let mut payload: Vec = Vec::from(script.as_ref()); payload.insert(0, 1); pallas_crypto::hash::Hasher::<224>::hash(&payload) } -pub fn compute_plutus_v2_script_hash(script: &PlutusV2Script) -> PolicyId { +pub fn compute_plutus_v2_script_hash(script: &PlutusScript<2>) -> PolicyId { let mut payload: Vec = Vec::from(script.as_ref()); payload.insert(0, 2); pallas_crypto::hash::Hasher::<224>::hash(&payload) @@ -375,7 +378,8 @@ pub struct DState { pub inst_rewards: InstantaneousRewards, } -// Essentially part of the `PoolRegistration` component of `Certificate` at alonzo/src/model.rs +// Essentially part of the `PoolRegistration` component of `Certificate` at +// alonzo/src/model.rs #[derive(Clone, Debug)] pub struct PoolParam { pub vrf_keyhash: VrfKeyhash, diff --git a/pallas-applying/src/utils/environment.rs b/pallas-applying/src/utils/environment.rs index b9a04dd..369a24f 100644 --- a/pallas-applying/src/utils/environment.rs +++ b/pallas-applying/src/utils/environment.rs @@ -2,10 +2,11 @@ //! era. use pallas_primitives::{ alonzo::{ - Coin, CostMdls, ExUnitPrices, ExUnits, Nonce, ProtocolVersion, RationalNumber, UnitInterval, + Coin, CostModels, ExUnitPrices, ExUnits, Nonce, ProtocolVersion, RationalNumber, + UnitInterval, }, - babbage::CostMdls as BabbageCostMdls, - conway::{CostMdls as ConwayCostMdls, Epoch}, + babbage::CostModels as BabbageCostModels, + conway::{CostModels as ConwayCostModels, Epoch}, }; #[allow(clippy::large_enum_variant)] @@ -100,7 +101,7 @@ pub struct AlonzoProtParams { pub protocol_version: ProtocolVersion, pub min_pool_cost: Coin, pub ada_per_utxo_byte: Coin, - pub cost_models_for_script_languages: CostMdls, + pub cost_models_for_script_languages: CostModels, pub execution_costs: ExUnitPrices, pub max_tx_ex_units: ExUnits, pub max_block_ex_units: ExUnits, @@ -128,7 +129,7 @@ pub struct BabbageProtParams { pub protocol_version: ProtocolVersion, pub min_pool_cost: Coin, pub ada_per_utxo_byte: Coin, - pub cost_models_for_script_languages: BabbageCostMdls, + pub cost_models_for_script_languages: BabbageCostModels, pub execution_costs: ExUnitPrices, pub max_tx_ex_units: ExUnits, pub max_block_ex_units: ExUnits, @@ -156,7 +157,7 @@ pub struct ConwayProtParams { pub protocol_version: ProtocolVersion, pub min_pool_cost: Coin, pub ada_per_utxo_byte: Coin, - pub cost_models_for_script_languages: ConwayCostMdls, + pub cost_models_for_script_languages: ConwayCostModels, pub execution_costs: ExUnitPrices, pub max_tx_ex_units: ExUnits, pub max_block_ex_units: ExUnits, diff --git a/pallas-applying/tests/alonzo.rs b/pallas-applying/tests/alonzo.rs index ffc743b..d6a18ce 100644 --- a/pallas-applying/tests/alonzo.rs +++ b/pallas-applying/tests/alonzo.rs @@ -480,7 +480,7 @@ mod alonzo_tests { ), ( // (tx hash, tx output index): - // (d2f9764fa93ae5bcabbb65c7a2f97d1e31188064ae3d2ba1462114453928dd99, 0) + // (d2f9764fa93ae5bcabbb65c7a2f97d1e31188064ae3d2ba1462114453928dd99, 0) String::from("01c81ffcbc08ff49965d74f90c391541ff1cc2b043ffe41c81d840be8729f2ae5ed49a1734823ba37fd09923f5f7d494ae0efa23dd98ce02da"), Value::Coin(20292207), None, @@ -1152,9 +1152,7 @@ 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(); - // 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); + tx_body.network_id = Some(NetworkId::Testnet); 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 7e21be9..c17f806 100644 --- a/pallas-applying/tests/babbage.rs +++ b/pallas-applying/tests/babbage.rs @@ -19,9 +19,9 @@ use pallas_codec::{ utils::Nullable, }; use pallas_primitives::babbage::{ - CostMdls, ExUnitPrices, ExUnits, MintedDatumOption, MintedPostAlonzoTransactionOutput, + CostModels, ExUnitPrices, ExUnits, MintedDatumOption, MintedPostAlonzoTransactionOutput, MintedScriptRef, MintedTransactionBody, MintedTransactionOutput, MintedTx, MintedWitnessSet, - NetworkId, Nonce, NonceVariant, PlutusData, PlutusV2Script, PseudoDatumOption, PseudoScript, + NetworkId, Nonce, NonceVariant, PlutusData, PlutusScript, PseudoDatumOption, PseudoScript, PseudoTransactionOutput, RationalNumber, Redeemer, RedeemerTag, Value, }; use pallas_traverse::{MultiEraInput, MultiEraOutput, MultiEraTx}; @@ -210,7 +210,7 @@ mod babbage_tests { String::from("119068a7a3f008803edac87af1619860f2cdcde40c26987325ace138ad81728e7ed4cf324e1323135e7e6d931f01e30792d9cdf17129cb806d"), Value::Coin(40000000), None, - Some(CborWrap(PseudoScript::PlutusV2Script(PlutusV2Script(Bytes::from(hex::decode("5909fe010000323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232222323232533535533357346064606a0062646464642466002008004a666ae68c0d8c0e00044c848c004008c078d5d0981b8008191baa357426ae88c0d80154ccd5cd1819981b0008991919191919191919191919191919191919191919190919999999999980080b80a8098088078068058048038028018011aba135744004666068eb88004d5d08009aba2002357420026ae88008cc0c9d71aba1001357440046ae84004d5d10011aba1001357440046ae84004d5d10011aba1001357440046ae84004d5d10011981300f1aba1001357440046ae84004d5d1181b001198111192999ab9a30353038001132321233001003002301d357426ae88c0e0008c078d5d0981b8008191baa00135742606a0020606ea8d5d0981a001817911a8011111111111111a80691919299aa99a998149aa99a80109815a481035054380022100203d00303903a03a1533501213302549101350033302330340362350012232333027303803a235001223500122533533302b0440040062153353333026303e040223500222533500321533533303104a0030062153353302b0010031303f3305722533500104c221350022253353305100200a100313304d33047002001300600300215335330370010031303f333302d04b0043370200200600409209008e60720020044266060920102313000333573466e20ccd54c0fc104c0a8cc0f1c024000400266aa608008246a00209600200809208e266ae712410231310004813357389201023132000470023335530360393501b0403501b04233355303603922533535002222253353302200800413038003042213303d001002100103f010333301c303403622350022253353303c00b002100313333020303803a235001222533533302a0210030012133330260220043355303e03f235001223303d002333500120012235002223500322330433370000800466aa608e09046a002446608c004666a0024002e008004ccc0c013400c0048004ccc09c11000c0040084cccc09408400c00800400c0040f140044cc0952410134003330233034036235001223303b00a0025001153353355303403523500122350012222302c533350021303104821001213304e2253350011303404a221350022253353304800200710011300600300c0011302a49010136002213355303603723500122350012222302e533350021303304a2100121330502253350011303604c221350022253353304a00200710011300600300e0033335530310342253353353530283500203f03d203f253353303c001330482253350011302e044221350022253353303000200a135302f001223350022303504b20011300600301003b1302c4901013300133037002001100103a00d1120011533573892010350543500165333573460640020502a666ae68c0c400409c0b8c0ccdd50019baa00133019223355301f020235001223301e002335530220232350012233021002333500137009000380233700002900000099aa980f81011a800911980f001199a800919aa981181211a8009119811001180880080091199806815001000919aa981181211a80091198110011809000800999804012801000812111919807198021a8018139a801013a99a9a80181490a99a8011099a801119a80111980400100091101711119a80210171112999ab9a3370e00c0062a666ae68cdc38028010998068020008158158120a99a80090120121a8008141119a801119a8011198128010009014119a801101411981280100091199ab9a3370e00400204604a44446666aa00866032444600660040024002006002004444466aa603803a46a0024466036004666a0024002052400266600a0080026603c66030006004046444666aa603003603866aa603403646a00244660320046010002666aa6030036446a00444a66a666aa603a03e60106603444a66a00404a200204e46a002446601400400a00c200626604000800604200266aa603403646a00244660320046605e44a66a002260160064426a00444a66a6601800401022444660040140082600c00600800446602644666a0060420040026a00204242444600600842444600200844604e44a66a0020364426a00444a66a6601000400e2602a0022600c0064466aa0046602000603600244a66a004200202e44a66a00202e266ae7000806c8c94ccd5cd180f9811000899190919800801801198079192999ab9a3022302500113232123300100300233301075c464a666ae68c094c0a00044c8cc0514cd4cc028005200110011300e4901022d330033301375c464a66a660180029000080089808249022d3200375a0026ae84d5d118140011bad35742604e0020446ea8004d5d09aba23025002300c35742604800203e6ea8004d5d09aba23022002375c6ae84c084004070dd500091199ab9a3371200400203202e46a002444400844a666ae68cdc79a80100b1a80080b0999ab9a3370e6a0040306a00203002a02e024464a666ae68c06cc0780044c8c8c8c8c8c8c8c848cccc00402401c00c008d5d09aba20045333573466e1d2004001132122230020043574260460042a666ae68c0880044c84888c004010dd71aba1302300215333573460420022244400603c60460026ea8d5d08009aba200233300a75c66014eb9d69aba100135744603c004600a6ae84c074004060dd50009299ab9c001162325333573460326038002264646424660020060046eb4d5d09aba2301d003533357346034603a00226eb8d5d0980e00080b9baa35742603600202c6ea80048c94ccd5cd180c180d80089919191909198008028012999ab9a301b00113232300953335734603c00226464646424466600200c0080066eb4d5d09aba2002375a6ae84004d5d118100019bad35742603e0042a666ae68c0740044c8488c00800cc020d5d0980f80100d180f8009baa35742603a0042a666ae68c070004044060c074004dd51aba135744603600460066ae84c068004054dd5000919192999ab9a30190011321223001003375c6ae84c06800854ccd5cd180c00089909118010019bae35742603400402a60340026ea80048488c00800c888cc06888cccd55cf800900911919807198041803980e8009803180e00098021aba2003357420040166eac0048848cc00400c00888cc05c88cccd55cf800900791980518029aba10023003357440040106eb0004c05088448894cd40044008884cc014008ccd54c01c028014010004c04c88448894cd40044d400c040884ccd4014040c010008ccd54c01c024014010004c0488844894cd4004024884cc020c010008cd54c01801c0100044800488488cc00401000cc03c8894cd40080108854cd4cc02000800c01c4cc01400400c4014400888ccd5cd19b8f0020010030051001220021001220011533573892010350543100164901022d31004901013700370e90001b874800955cf2ab9d2323001001223300330020020011").unwrap()))))), + Some(CborWrap(PseudoScript::PlutusV2Script(PlutusScript::<2>(Bytes::from(hex::decode("5909fe010000323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232222323232533535533357346064606a0062646464642466002008004a666ae68c0d8c0e00044c848c004008c078d5d0981b8008191baa357426ae88c0d80154ccd5cd1819981b0008991919191919191919191919191919191919191919190919999999999980080b80a8098088078068058048038028018011aba135744004666068eb88004d5d08009aba2002357420026ae88008cc0c9d71aba1001357440046ae84004d5d10011aba1001357440046ae84004d5d10011aba1001357440046ae84004d5d10011981300f1aba1001357440046ae84004d5d1181b001198111192999ab9a30353038001132321233001003002301d357426ae88c0e0008c078d5d0981b8008191baa00135742606a0020606ea8d5d0981a001817911a8011111111111111a80691919299aa99a998149aa99a80109815a481035054380022100203d00303903a03a1533501213302549101350033302330340362350012232333027303803a235001223500122533533302b0440040062153353333026303e040223500222533500321533533303104a0030062153353302b0010031303f3305722533500104c221350022253353305100200a100313304d33047002001300600300215335330370010031303f333302d04b0043370200200600409209008e60720020044266060920102313000333573466e20ccd54c0fc104c0a8cc0f1c024000400266aa608008246a00209600200809208e266ae712410231310004813357389201023132000470023335530360393501b0403501b04233355303603922533535002222253353302200800413038003042213303d001002100103f010333301c303403622350022253353303c00b002100313333020303803a235001222533533302a0210030012133330260220043355303e03f235001223303d002333500120012235002223500322330433370000800466aa608e09046a002446608c004666a0024002e008004ccc0c013400c0048004ccc09c11000c0040084cccc09408400c00800400c0040f140044cc0952410134003330233034036235001223303b00a0025001153353355303403523500122350012222302c533350021303104821001213304e2253350011303404a221350022253353304800200710011300600300c0011302a49010136002213355303603723500122350012222302e533350021303304a2100121330502253350011303604c221350022253353304a00200710011300600300e0033335530310342253353353530283500203f03d203f253353303c001330482253350011302e044221350022253353303000200a135302f001223350022303504b20011300600301003b1302c4901013300133037002001100103a00d1120011533573892010350543500165333573460640020502a666ae68c0c400409c0b8c0ccdd50019baa00133019223355301f020235001223301e002335530220232350012233021002333500137009000380233700002900000099aa980f81011a800911980f001199a800919aa981181211a8009119811001180880080091199806815001000919aa981181211a80091198110011809000800999804012801000812111919807198021a8018139a801013a99a9a80181490a99a8011099a801119a80111980400100091101711119a80210171112999ab9a3370e00c0062a666ae68cdc38028010998068020008158158120a99a80090120121a8008141119a801119a8011198128010009014119a801101411981280100091199ab9a3370e00400204604a44446666aa00866032444600660040024002006002004444466aa603803a46a0024466036004666a0024002052400266600a0080026603c66030006004046444666aa603003603866aa603403646a00244660320046010002666aa6030036446a00444a66a666aa603a03e60106603444a66a00404a200204e46a002446601400400a00c200626604000800604200266aa603403646a00244660320046605e44a66a002260160064426a00444a66a6601800401022444660040140082600c00600800446602644666a0060420040026a00204242444600600842444600200844604e44a66a0020364426a00444a66a6601000400e2602a0022600c0064466aa0046602000603600244a66a004200202e44a66a00202e266ae7000806c8c94ccd5cd180f9811000899190919800801801198079192999ab9a3022302500113232123300100300233301075c464a666ae68c094c0a00044c8cc0514cd4cc028005200110011300e4901022d330033301375c464a66a660180029000080089808249022d3200375a0026ae84d5d118140011bad35742604e0020446ea8004d5d09aba23025002300c35742604800203e6ea8004d5d09aba23022002375c6ae84c084004070dd500091199ab9a3371200400203202e46a002444400844a666ae68cdc79a80100b1a80080b0999ab9a3370e6a0040306a00203002a02e024464a666ae68c06cc0780044c8c8c8c8c8c8c8c848cccc00402401c00c008d5d09aba20045333573466e1d2004001132122230020043574260460042a666ae68c0880044c84888c004010dd71aba1302300215333573460420022244400603c60460026ea8d5d08009aba200233300a75c66014eb9d69aba100135744603c004600a6ae84c074004060dd50009299ab9c001162325333573460326038002264646424660020060046eb4d5d09aba2301d003533357346034603a00226eb8d5d0980e00080b9baa35742603600202c6ea80048c94ccd5cd180c180d80089919191909198008028012999ab9a301b00113232300953335734603c00226464646424466600200c0080066eb4d5d09aba2002375a6ae84004d5d118100019bad35742603e0042a666ae68c0740044c8488c00800cc020d5d0980f80100d180f8009baa35742603a0042a666ae68c070004044060c074004dd51aba135744603600460066ae84c068004054dd5000919192999ab9a30190011321223001003375c6ae84c06800854ccd5cd180c00089909118010019bae35742603400402a60340026ea80048488c00800c888cc06888cccd55cf800900911919807198041803980e8009803180e00098021aba2003357420040166eac0048848cc00400c00888cc05c88cccd55cf800900791980518029aba10023003357440040106eb0004c05088448894cd40044008884cc014008ccd54c01c028014010004c04c88448894cd40044d400c040884ccd4014040c010008ccd54c01c024014010004c0488844894cd4004024884cc020c010008cd54c01801c0100044800488488cc00401000cc03c8894cd40080108854cd4cc02000800c01c4cc01400400c4014400888ccd5cd19b8f0020010030051001220021001220011533573892010350543100164901022d31004901013700370e90001b874800955cf2ab9d2323001001223300330020020011").unwrap()))))), )]; add_ref_input_babbage(&mtx.transaction_body, &mut utxos, ref_input_info); let acnt = AccountState { @@ -1555,9 +1555,7 @@ 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(); - // 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); + tx_body.network_id = Some(NetworkId::Testnet); let mut tx_buf: Vec = Vec::new(); let _ = encode(tx_body, &mut tx_buf); mtx.transaction_body = @@ -2402,7 +2400,7 @@ mod babbage_tests { protocol_version: (7, 0), min_pool_cost: 340000000, ada_per_utxo_byte: 4310, - cost_models_for_script_languages: CostMdls { + cost_models_for_script_languages: CostModels { plutus_v1: Some(vec![ 197209, 0, 1, 1, 396231, 621, 0, 1, 150000, 1000, 0, 1, 150000, 32, 2477736, 29175, 4, 29773, 100, 29773, 100, 29773, 100, 29773, 100, 29773, 100, 29773, @@ -2478,7 +2476,7 @@ mod babbage_tests { protocol_version: (7, 0), min_pool_cost: 340000000, ada_per_utxo_byte: 4310, - cost_models_for_script_languages: CostMdls { + cost_models_for_script_languages: CostModels { plutus_v1: Some(vec![ 205665, 812, 1, 1, 1000, 571, 0, 1, 1000, 24177, 4, 1, 1000, 32, 117366, 10475, 4, 23000, 100, 23000, 100, 23000, 100, 23000, 100, 23000, 100, 23000, 100, 100, @@ -2730,7 +2728,7 @@ mod babbage_tests { protocol_version: (8, 0), min_pool_cost: 340000000, ada_per_utxo_byte: 4310, - cost_models_for_script_languages: CostMdls { + cost_models_for_script_languages: CostModels { plutus_v1: Some(vec![ 205665, 812, 1, 1, 1000, 571, 0, 1, 1000, 24177, 4, 1, 1000, 32, 117366, 10475, 4, 23000, 100, 23000, 100, 23000, 100, 23000, 100, 23000, 100, 23000, 100, 100, @@ -2820,7 +2818,7 @@ mod babbage_tests { protocol_version: (8, 0), min_pool_cost: 340000000, ada_per_utxo_byte: 4310, - cost_models_for_script_languages: CostMdls { + cost_models_for_script_languages: CostModels { plutus_v1: Some(vec![ 205665, 812, 1, 1, 1000, 571, 0, 1, 1000, 24177, 4, 1, 1000, 32, 117366, 10475, 4, 23000, 100, 23000, 100, 23000, 100, 23000, 100, 23000, 100, 23000, 100, 100, diff --git a/pallas-codec/Cargo.toml b/pallas-codec/Cargo.toml index eed2661..c4db4d0 100644 --- a/pallas-codec/Cargo.toml +++ b/pallas-codec/Cargo.toml @@ -19,7 +19,7 @@ default = [] [dependencies] hex = "0.4.3" -minicbor = { version = "0.20", features = ["std", "half", "derive"] } +minicbor = { version = "0.25.1", features = ["std", "half", "derive"] } num-bigint = { version = "0.4.4", optional = true } serde = { version = "1.0.143", features = ["derive"] } thiserror = "1.0.39" diff --git a/pallas-codec/src/utils.rs b/pallas-codec/src/utils.rs index 172ef2c..10454fd 100644 --- a/pallas-codec/src/utils.rs +++ b/pallas-codec/src/utils.rs @@ -1,5 +1,5 @@ use minicbor::{ - data::{Tag, Type}, + data::{IanaTag, Tag, Type}, decode::Error, Decode, Encode, }; @@ -543,7 +543,7 @@ where minicbor::encode::Error::message("error encoding cbor-wrapped structure") })?; - e.tag(Tag::Cbor)?; + e.tag(IanaTag::Cbor)?; e.bytes(&buf)?; Ok(()) @@ -587,7 +587,7 @@ where e: &mut minicbor::Encoder, ctx: &mut C, ) -> Result<(), minicbor::encode::Error> { - e.tag(Tag::Unassigned(T))?; + e.tag(Tag::new(T))?; e.encode_with(&self.0, ctx)?; Ok(()) @@ -741,7 +741,7 @@ where if d.datatype()? == Type::Tag { let found_tag = d.tag()?; - if found_tag != Tag::Unassigned(TAG_SET) { + if found_tag != Tag::new(TAG_SET) { return Err(Error::message(format!("Unrecognised tag: {found_tag:?}"))); } } @@ -759,7 +759,7 @@ where e: &mut minicbor::Encoder, ctx: &mut C, ) -> Result<(), minicbor::encode::Error> { - e.tag(Tag::Unassigned(TAG_SET))?; + e.tag(Tag::new(TAG_SET))?; e.encode_with(&self.0, ctx)?; Ok(()) @@ -824,7 +824,7 @@ where if d.datatype()? == Type::Tag { let found_tag = d.tag()?; - if found_tag != Tag::Unassigned(TAG_SET) { + if found_tag != Tag::new(TAG_SET) { return Err(Error::message(format!("Unrecognised tag: {found_tag:?}"))); } } @@ -848,7 +848,7 @@ where e: &mut minicbor::Encoder, ctx: &mut C, ) -> Result<(), minicbor::encode::Error> { - e.tag(Tag::Unassigned(TAG_SET))?; + e.tag(Tag::new(TAG_SET))?; e.encode_with(&self.0, ctx)?; Ok(()) diff --git a/pallas-configs/src/alonzo.rs b/pallas-configs/src/alonzo.rs index 3537e8a..4654914 100644 --- a/pallas-configs/src/alonzo.rs +++ b/pallas-configs/src/alonzo.rs @@ -73,7 +73,7 @@ impl From for pallas_primitives::alonzo::CostModel { #[derive(Deserialize, Clone)] pub struct CostModelPerLanguage(HashMap); -impl From for pallas_primitives::alonzo::CostMdls { +impl From for pallas_primitives::alonzo::CostModels { fn from(value: CostModelPerLanguage) -> Self { let inner = value .0 diff --git a/pallas-network/src/miniprotocols/blockfetch/codec.rs b/pallas-network/src/miniprotocols/blockfetch/codec.rs index de34de3..c825164 100644 --- a/pallas-network/src/miniprotocols/blockfetch/codec.rs +++ b/pallas-network/src/miniprotocols/blockfetch/codec.rs @@ -1,4 +1,4 @@ -use pallas_codec::minicbor::{data::Tag, decode, encode, Decode, Decoder, Encode, Encoder}; +use pallas_codec::minicbor::{data::IanaTag, decode, encode, Decode, Decoder, Encode, Encoder}; use super::Message; @@ -29,7 +29,7 @@ impl Encode<()> for Message { } Message::Block { body } => { e.array(2)?.u16(4)?; - e.tag(Tag::Cbor)?; + e.tag(IanaTag::Cbor)?; e.bytes(body)?; Ok(()) } diff --git a/pallas-network/src/miniprotocols/chainsync/codec.rs b/pallas-network/src/miniprotocols/chainsync/codec.rs index 9a123d5..5608e49 100644 --- a/pallas-network/src/miniprotocols/chainsync/codec.rs +++ b/pallas-network/src/miniprotocols/chainsync/codec.rs @@ -186,10 +186,10 @@ impl Encode<()> for HeaderContent { return Err(Error::message("header variant 0 but no byron prefix")); } - e.tag(minicbor::data::Tag::Cbor)?; + e.tag(minicbor::data::IanaTag::Cbor)?; e.bytes(&self.cbor)?; } else { - e.tag(minicbor::data::Tag::Cbor)?; + e.tag(minicbor::data::IanaTag::Cbor)?; e.bytes(&self.cbor)?; } @@ -211,7 +211,7 @@ impl Encode<()> for BlockContent { e: &mut Encoder, _ctx: &mut (), ) -> Result<(), encode::Error> { - e.tag(minicbor::data::Tag::Cbor)?; + e.tag(minicbor::data::IanaTag::Cbor)?; e.bytes(&self.0)?; Ok(()) diff --git a/pallas-network/src/miniprotocols/localstate/queries_v16/codec.rs b/pallas-network/src/miniprotocols/localstate/queries_v16/codec.rs index a005606..d06763f 100644 --- a/pallas-network/src/miniprotocols/localstate/queries_v16/codec.rs +++ b/pallas-network/src/miniprotocols/localstate/queries_v16/codec.rs @@ -100,7 +100,7 @@ impl Encode<()> for BlockQuery { if !pools.is_empty() { e.array(1)?; - e.tag(Tag::Unassigned(258))?; + e.tag(Tag::new(258))?; } e.encode(pools)?; @@ -330,7 +330,7 @@ impl minicbor::encode::Encode for RationalNumber { e: &mut minicbor::Encoder, ctx: &mut C, ) -> Result<(), minicbor::encode::Error> { - e.tag(Tag::Unassigned(30))?; + e.tag(Tag::new(30))?; e.array(2)?; e.encode_with(self.numerator, ctx)?; e.encode_with(self.denominator, ctx)?; diff --git a/pallas-network/src/miniprotocols/localtxsubmission/codec.rs b/pallas-network/src/miniprotocols/localtxsubmission/codec.rs index ffd2c15..1a1fe36 100644 --- a/pallas-network/src/miniprotocols/localtxsubmission/codec.rs +++ b/pallas-network/src/miniprotocols/localtxsubmission/codec.rs @@ -1,4 +1,4 @@ -use pallas_codec::minicbor::data::Tag; +use pallas_codec::minicbor::data::IanaTag; use pallas_codec::minicbor::{decode, encode, Decode, Decoder, Encode, Encoder}; use crate::miniprotocols::localtxsubmission::{EraTx, Message, RejectReason}; @@ -78,7 +78,7 @@ impl<'b> Decode<'b, ()> for EraTx { d.array()?; let era = d.u16()?; let tag = d.tag()?; - if tag != Tag::Cbor { + if tag != IanaTag::Cbor.tag() { return Err(decode::Error::message("Expected encoded CBOR data item")); } Ok(EraTx(era, d.bytes()?.to_vec())) @@ -93,7 +93,7 @@ impl Encode<()> for EraTx { ) -> Result<(), encode::Error> { e.array(2)?; e.u16(self.0)?; - e.tag(Tag::Cbor)?; + e.tag(IanaTag::Cbor)?; e.bytes(&self.1)?; Ok(()) } diff --git a/pallas-network/src/miniprotocols/txsubmission/codec.rs b/pallas-network/src/miniprotocols/txsubmission/codec.rs index bb55717..fab5b7d 100644 --- a/pallas-network/src/miniprotocols/txsubmission/codec.rs +++ b/pallas-network/src/miniprotocols/txsubmission/codec.rs @@ -1,4 +1,4 @@ -use pallas_codec::minicbor::{data::Tag, decode, encode, Decode, Decoder, Encode, Encoder}; +use pallas_codec::minicbor::{data::IanaTag, decode, encode, Decode, Decoder, Encode, Encoder}; use super::{ protocol::{Message, TxIdAndSize}, @@ -89,7 +89,7 @@ impl<'b> Decode<'b, ()> for EraTxBody { d.array()?; let era = d.u16()?; let tag = d.tag()?; - if tag != Tag::Cbor { + if tag != IanaTag::Cbor.tag() { return Err(decode::Error::message("Expected encoded CBOR data item")); } Ok(EraTxBody(era, d.bytes()?.to_vec())) @@ -104,7 +104,7 @@ impl Encode<()> for EraTxBody { ) -> Result<(), encode::Error> { e.array(2)?; e.u16(self.0)?; - e.tag(Tag::Cbor)?; + e.tag(IanaTag::Cbor)?; e.bytes(&self.1)?; Ok(()) } diff --git a/pallas-primitives/src/alonzo/model.rs b/pallas-primitives/src/alonzo/model.rs index f037cf1..ba47f0d 100644 --- a/pallas-primitives/src/alonzo/model.rs +++ b/pallas-primitives/src/alonzo/model.rs @@ -3,18 +3,17 @@ //! Handcrafted, idiomatic rust artifacts based on based on the [Alonzo CDDL](https://github.com/input-output-hk/cardano-ledger/blob/master/eras/alonzo/test-suite/cddl-files/alonzo.cddl) file in IOHK repo. use serde::{Deserialize, Serialize}; -use std::{fmt, hash::Hash as StdHash, ops::Deref}; -use pallas_codec::minicbor::{data::Tag, Decode, Encode}; -use pallas_crypto::hash::Hash; +use pallas_codec::minicbor::{self, data::Tag, Decode, Encode}; -use pallas_codec::utils::{Bytes, Int, KeepRaw, KeyValuePairs, MaybeIndefArray, Nullable}; - -// required for derive attrs to work -use pallas_codec::minicbor; - -#[derive(Serialize, Deserialize, Encode, Decode, Debug, PartialEq, Eq, Clone)] -pub struct VrfCert(#[n(0)] pub Bytes, #[n(1)] pub Bytes); +pub use crate::{ + plutus_data::*, AddrKeyhash, AssetName, Bytes, Coin, CostModel, DatumHash, DnsName, Epoch, + ExUnitPrices, ExUnits, GenesisDelegateHash, Genesishash, Hash, IPv4, IPv6, Int, KeepRaw, + KeyValuePairs, MaybeIndefArray, Metadata, Metadatum, MetadatumLabel, NetworkId, Nonce, + NonceVariant, Nullable, PlutusScript, PolicyId, PoolKeyhash, PoolMetadata, PoolMetadataHash, + Port, PositiveInterval, ProtocolVersion, RationalNumber, Relay, RewardAccount, ScriptHash, + StakeCredential, TransactionIndex, TransactionInput, UnitInterval, VrfCert, VrfKeyhash, +}; #[derive(Serialize, Deserialize, Encode, Decode, Debug, PartialEq, Eq, Clone)] pub struct HeaderBody { @@ -64,11 +63,6 @@ pub struct HeaderBody { pub protocol_minor: u64, } -pub type ProtocolVersion = (u64, u64); - -#[derive(Serialize, Deserialize, Encode, Decode, Debug, PartialEq, Eq)] -pub struct KesSignature {} - pub type MintedHeaderBody<'a> = KeepRaw<'a, HeaderBody>; #[derive(Serialize, Deserialize, Encode, Decode, Debug, PartialEq, Eq, Clone)] @@ -100,50 +94,10 @@ impl<'a> From> for HeaderBody { } } -#[derive( - Serialize, Deserialize, Encode, Decode, Debug, PartialEq, Eq, PartialOrd, Ord, Clone, StdHash, -)] -pub struct TransactionInput { - #[n(0)] - pub transaction_id: Hash<32>, - - #[n(1)] - pub index: u64, -} - -// $nonce /= [ 0 // 1, bytes .size 32 ] - -#[derive(Serialize, Deserialize, Encode, Decode, Debug, PartialEq, Eq, Clone)] -#[cbor(index_only)] -pub enum NonceVariant { - #[n(0)] - NeutralNonce, - - #[n(1)] - Nonce, -} - -#[derive(Serialize, Deserialize, Encode, Decode, Debug, PartialEq, Eq, Clone)] -pub struct Nonce { - #[n(0)] - pub variant: NonceVariant, - - #[n(1)] - pub hash: Option>, -} - -pub type ScriptHash = Hash<28>; - -pub type PolicyId = Hash<28>; - -pub type AssetName = Bytes; - pub type Multiasset = KeyValuePairs>; pub type Mint = Multiasset; -pub type Coin = u64; - #[derive(Serialize, Deserialize, Debug, PartialEq, Eq, Clone)] pub enum Value { Coin(Coin), @@ -201,15 +155,9 @@ pub struct TransactionOutput { pub amount: Value, #[n(2)] - pub datum_hash: Option>, + pub datum_hash: Option, } -pub type PoolKeyhash = Hash<28>; -pub type Epoch = u64; -pub type Genesishash = Bytes; -pub type GenesisDelegateHash = Bytes; -pub type VrfKeyhash = Hash<32>; - /* move_instantaneous_reward = [ 0 / 1, { * stake_credential => delta_coin } / coin ] ; The first field determines where the funds are drawn from. ; 0 denotes the reserves, 1 denotes the treasury. @@ -298,7 +246,7 @@ impl minicbor::encode::Encode for InstantaneousRewardTarget { } #[derive(Serialize, Deserialize, Encode, Decode, Debug, PartialEq, Eq, PartialOrd, Ord, Clone)] -#[cbor] +#[cbor()] pub struct MoveInstantaneousReward { #[n(0)] pub source: InstantaneousRewardSource, @@ -307,180 +255,10 @@ pub struct MoveInstantaneousReward { pub target: InstantaneousRewardTarget, } -pub type RewardAccount = Bytes; - pub type Withdrawals = KeyValuePairs; pub type RequiredSigners = Vec; -pub type Port = u32; -pub type IPv4 = Bytes; -pub type IPv6 = Bytes; -pub type DnsName = String; - -#[derive(Serialize, Deserialize, Debug, PartialEq, Eq, Clone)] -pub enum Relay { - SingleHostAddr(Nullable, Nullable, Nullable), - SingleHostName(Nullable, DnsName), - MultiHostName(DnsName), -} - -impl<'b, C> minicbor::decode::Decode<'b, C> for Relay { - fn decode(d: &mut minicbor::Decoder<'b>, ctx: &mut C) -> Result { - d.array()?; - let variant = d.u16()?; - - match variant { - 0 => Ok(Relay::SingleHostAddr( - d.decode_with(ctx)?, - d.decode_with(ctx)?, - d.decode_with(ctx)?, - )), - 1 => Ok(Relay::SingleHostName( - d.decode_with(ctx)?, - d.decode_with(ctx)?, - )), - 2 => Ok(Relay::MultiHostName(d.decode_with(ctx)?)), - _ => Err(minicbor::decode::Error::message( - "invalid variant id for Relay", - )), - } - } -} - -impl minicbor::encode::Encode for Relay { - fn encode( - &self, - e: &mut minicbor::Encoder, - ctx: &mut C, - ) -> Result<(), minicbor::encode::Error> { - match self { - Relay::SingleHostAddr(a, b, c) => { - e.array(4)?; - e.encode_with(0, ctx)?; - e.encode_with(a, ctx)?; - e.encode_with(b, ctx)?; - e.encode_with(c, ctx)?; - - Ok(()) - } - Relay::SingleHostName(a, b) => { - e.array(3)?; - e.encode_with(1, ctx)?; - e.encode_with(a, ctx)?; - e.encode_with(b, ctx)?; - - Ok(()) - } - Relay::MultiHostName(a) => { - e.array(2)?; - e.encode_with(2, ctx)?; - e.encode_with(a, ctx)?; - - Ok(()) - } - } - } -} - -pub type PoolMetadataHash = Hash<32>; - -#[derive(Serialize, Deserialize, Encode, Decode, Debug, PartialEq, Eq, Clone)] -pub struct PoolMetadata { - #[n(0)] - pub url: String, - - #[n(1)] - pub hash: PoolMetadataHash, -} - -pub type AddrKeyhash = Hash<28>; -pub type Scripthash = Hash<28>; - -#[derive(Serialize, Deserialize, Debug, PartialEq, Eq, Clone)] -pub struct RationalNumber { - pub numerator: u64, - pub denominator: u64, -} - -impl<'b, C> minicbor::decode::Decode<'b, C> for RationalNumber { - fn decode(d: &mut minicbor::Decoder<'b>, ctx: &mut C) -> Result { - d.tag()?; - d.array()?; - - Ok(RationalNumber { - numerator: d.decode_with(ctx)?, - denominator: d.decode_with(ctx)?, - }) - } -} - -impl minicbor::encode::Encode for RationalNumber { - fn encode( - &self, - e: &mut minicbor::Encoder, - ctx: &mut C, - ) -> Result<(), minicbor::encode::Error> { - // TODO: check if this is the correct tag - e.tag(Tag::Unassigned(30))?; - e.array(2)?; - e.encode_with(self.numerator, ctx)?; - e.encode_with(self.denominator, ctx)?; - - Ok(()) - } -} - -pub type UnitInterval = RationalNumber; - -pub type PositiveInterval = RationalNumber; - -#[derive(Serialize, Deserialize, Debug, PartialEq, PartialOrd, Eq, Ord, Clone, Hash)] -pub enum StakeCredential { - AddrKeyhash(AddrKeyhash), - Scripthash(Scripthash), -} - -impl<'b, C> minicbor::decode::Decode<'b, C> for StakeCredential { - fn decode(d: &mut minicbor::Decoder<'b>, ctx: &mut C) -> Result { - d.array()?; - let variant = d.u16()?; - - match variant { - 0 => Ok(StakeCredential::AddrKeyhash(d.decode_with(ctx)?)), - 1 => Ok(StakeCredential::Scripthash(d.decode_with(ctx)?)), - _ => Err(minicbor::decode::Error::message( - "invalid variant id for StakeCredential", - )), - } - } -} - -impl minicbor::encode::Encode for StakeCredential { - fn encode( - &self, - e: &mut minicbor::Encoder, - ctx: &mut C, - ) -> Result<(), minicbor::encode::Error> { - match self { - StakeCredential::AddrKeyhash(a) => { - e.array(2)?; - e.encode_with(0, ctx)?; - e.encode_with(a, ctx)?; - - Ok(()) - } - StakeCredential::Scripthash(a) => { - e.array(2)?; - e.encode_with(1, ctx)?; - e.encode_with(a, ctx)?; - - Ok(()) - } - } - } -} - #[derive(Serialize, Deserialize, Debug, PartialEq, Eq, Clone)] pub enum Certificate { StakeRegistration(StakeCredential), @@ -649,17 +427,6 @@ impl minicbor::encode::Encode for Certificate { } } -#[derive( - Serialize, Deserialize, Encode, Decode, Debug, PartialEq, Eq, PartialOrd, Ord, Clone, Copy, -)] -#[cbor(index_only)] -pub enum NetworkId { - #[n(0)] - One, - #[n(1)] - Two, -} - #[derive(Serialize, Deserialize, Encode, Decode, Debug, PartialEq, Eq, PartialOrd, Ord, Clone)] #[cbor(index_only)] pub enum Language { @@ -667,9 +434,10 @@ pub enum Language { PlutusV1, } -pub type CostModel = Vec; +#[deprecated(since = "0.31.0", note = "use `CostModels` instead")] +pub type CostMdls = CostModels; -pub type CostMdls = KeyValuePairs; +pub type CostModels = KeyValuePairs; #[derive(Serialize, Deserialize, Encode, Decode, Debug, PartialEq, Eq, Clone)] #[cbor(map)] @@ -709,7 +477,7 @@ pub struct ProtocolParamUpdate { #[n(17)] pub ada_per_utxo_byte: Option, #[n(18)] - pub cost_models_for_script_languages: Option, + pub cost_models_for_script_languages: Option, #[n(19)] pub execution_costs: Option, #[n(20)] @@ -862,380 +630,6 @@ impl minicbor::encode::Encode for NativeScript { } } -#[derive(Serialize, Deserialize, Encode, Decode, Debug, PartialEq, Eq, Clone)] -#[cbor(transparent)] -pub struct PlutusScript(#[n(0)] pub Bytes); - -impl AsRef<[u8]> for PlutusScript { - fn as_ref(&self) -> &[u8] { - self.0.as_slice() - } -} - -/// Defined to encode PlutusData bytestring as it is done in the canonical -/// plutus implementation -#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, PartialOrd, Ord)] -#[serde(into = "String")] -#[serde(try_from = "String")] -pub struct BoundedBytes(Vec); - -impl From> for BoundedBytes { - fn from(xs: Vec) -> Self { - BoundedBytes(xs) - } -} - -impl From for Vec { - fn from(b: BoundedBytes) -> Self { - b.0 - } -} - -impl Deref for BoundedBytes { - type Target = Vec; - - fn deref(&self) -> &Self::Target { - &self.0 - } -} - -impl TryFrom for BoundedBytes { - type Error = hex::FromHexError; - - fn try_from(value: String) -> Result { - let v = hex::decode(value)?; - Ok(BoundedBytes(v)) - } -} - -impl From for String { - fn from(b: BoundedBytes) -> Self { - hex::encode(b.deref()) - } -} - -impl fmt::Display for BoundedBytes { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - let bytes: Vec = self.clone().into(); - - f.write_str(&hex::encode(bytes)) - } -} - -impl Encode for BoundedBytes { - fn encode( - &self, - e: &mut minicbor::Encoder, - _: &mut C, - ) -> Result<(), minicbor::encode::Error> { - // we match the haskell implementation by encoding bytestrings longer than 64 - // bytes as indefinite lists of bytes - const CHUNK_SIZE: usize = 64; - let bs: &Vec = self.deref(); - if bs.len() <= 64 { - e.bytes(bs)?; - } else { - e.begin_bytes()?; - for b in bs.chunks(CHUNK_SIZE) { - e.bytes(b)?; - } - e.end()?; - } - Ok(()) - } -} - -impl<'b, C> minicbor::decode::Decode<'b, C> for BoundedBytes { - fn decode(d: &mut minicbor::Decoder<'b>, _: &mut C) -> Result { - let mut res = Vec::new(); - for chunk in d.bytes_iter()? { - let bs = chunk?; - res.extend_from_slice(bs); - } - Ok(BoundedBytes::from(res)) - } -} - -/* -big_int = int / big_uint / big_nint ; New -big_uint = #6.2(bounded_bytes) ; New -big_nint = #6.3(bounded_bytes) ; New - */ - -#[derive(Serialize, Deserialize, Debug, PartialEq, Eq, PartialOrd, Ord, Clone)] -pub enum BigInt { - Int(Int), - BigUInt(BoundedBytes), - BigNInt(BoundedBytes), -} - -impl<'b, C> minicbor::decode::Decode<'b, C> for BigInt { - fn decode(d: &mut minicbor::Decoder<'b>, ctx: &mut C) -> Result { - let datatype = d.datatype()?; - - match datatype { - minicbor::data::Type::U8 - | minicbor::data::Type::U16 - | minicbor::data::Type::U32 - | minicbor::data::Type::U64 - | minicbor::data::Type::I8 - | minicbor::data::Type::I16 - | minicbor::data::Type::I32 - | minicbor::data::Type::I64 - | minicbor::data::Type::Int => Ok(Self::Int(d.decode_with(ctx)?)), - minicbor::data::Type::Tag => { - let tag = d.tag()?; - - match tag { - minicbor::data::Tag::PosBignum => Ok(Self::BigUInt(d.decode_with(ctx)?)), - minicbor::data::Tag::NegBignum => Ok(Self::BigNInt(d.decode_with(ctx)?)), - _ => Err(minicbor::decode::Error::message( - "invalid cbor tag for big int", - )), - } - } - _ => Err(minicbor::decode::Error::message( - "invalid cbor data type for big int", - )), - } - } -} - -impl minicbor::encode::Encode for BigInt { - fn encode( - &self, - e: &mut minicbor::Encoder, - ctx: &mut C, - ) -> Result<(), minicbor::encode::Error> { - match self { - BigInt::Int(x) => { - e.encode_with(x, ctx)?; - } - BigInt::BigUInt(x) => { - e.tag(Tag::PosBignum)?; - e.encode_with(x, ctx)?; - } - BigInt::BigNInt(x) => { - e.tag(Tag::NegBignum)?; - e.encode_with(x, ctx)?; - } - }; - - Ok(()) - } -} - -#[derive(Serialize, Deserialize, Debug, PartialEq, Eq, PartialOrd, Ord, Clone)] -pub enum PlutusData { - Constr(Constr), - Map(KeyValuePairs), - BigInt(BigInt), - BoundedBytes(BoundedBytes), - Array(Vec), -} - -impl<'b, C> minicbor::decode::Decode<'b, C> for PlutusData { - fn decode(d: &mut minicbor::Decoder<'b>, ctx: &mut C) -> Result { - let type_ = d.datatype()?; - - match type_ { - minicbor::data::Type::Tag => { - let mut probe = d.probe(); - let tag = probe.tag()?; - - match tag { - Tag::Unassigned(121..=127 | 1280..=1400 | 102) => { - Ok(Self::Constr(d.decode_with(ctx)?)) - } - Tag::PosBignum | Tag::NegBignum => Ok(Self::BigInt(d.decode_with(ctx)?)), - _ => Err(minicbor::decode::Error::message( - "unknown tag for plutus data tag", - )), - } - } - minicbor::data::Type::U8 - | minicbor::data::Type::U16 - | minicbor::data::Type::U32 - | minicbor::data::Type::U64 - | minicbor::data::Type::I8 - | minicbor::data::Type::I16 - | minicbor::data::Type::I32 - | minicbor::data::Type::I64 - | minicbor::data::Type::Int => Ok(Self::BigInt(d.decode_with(ctx)?)), - minicbor::data::Type::Map | minicbor::data::Type::MapIndef => { - Ok(Self::Map(d.decode_with(ctx)?)) - } - minicbor::data::Type::Bytes => Ok(Self::BoundedBytes(d.decode_with(ctx)?)), - minicbor::data::Type::BytesIndef => { - let mut full = Vec::new(); - - for slice in d.bytes_iter()? { - full.extend(slice?); - } - - Ok(Self::BoundedBytes(BoundedBytes::from(full))) - } - minicbor::data::Type::Array | minicbor::data::Type::ArrayIndef => { - Ok(Self::Array(d.decode_with(ctx)?)) - } - - any => Err(minicbor::decode::Error::message(format!( - "bad cbor data type ({any:?}) for plutus data" - ))), - } - } -} - -fn encode_list>( - a: &Vec, - e: &mut minicbor::Encoder, - ctx: &mut C, -) -> Result<(), minicbor::encode::Error> { - // Mimics default haskell list encoding from cborg: - // We use indef array for non-empty arrays but definite 0-length array for empty - if a.is_empty() { - e.array(0)?; - } else { - e.begin_array()?; - for v in a { - e.encode_with(v, ctx)?; - } - e.end()?; - } - Ok(()) -} - -impl minicbor::encode::Encode for PlutusData { - fn encode( - &self, - e: &mut minicbor::Encoder, - ctx: &mut C, - ) -> Result<(), minicbor::encode::Error> { - match self { - Self::Constr(a) => { - e.encode_with(a, ctx)?; - } - Self::Map(a) => { - // we use definite array to match the approach used by haskell's plutus - // implementation https://github.com/input-output-hk/plutus/blob/9538fc9829426b2ecb0628d352e2d7af96ec8204/plutus-core/plutus-core/src/PlutusCore/Data.hs#L152 - e.map(a.len().try_into().unwrap())?; - for (k, v) in a.iter() { - k.encode(e, ctx)?; - v.encode(e, ctx)?; - } - } - Self::BigInt(a) => { - e.encode_with(a, ctx)?; - } - Self::BoundedBytes(a) => { - e.encode_with(a, ctx)?; - } - Self::Array(a) => { - // we use definite array for empty array or indef array otherwise to match - // haskell implementation https://github.com/input-output-hk/plutus/blob/9538fc9829426b2ecb0628d352e2d7af96ec8204/plutus-core/plutus-core/src/PlutusCore/Data.hs#L153 - // default encoder for a list: - // https://github.com/well-typed/cborg/blob/4bdc818a1f0b35f38bc118a87944630043b58384/serialise/src/Codec/Serialise/Class.hs#L181 - encode_list(a, e, ctx)?; - } - }; - - Ok(()) - } -} - -#[derive(Serialize, Deserialize, Debug, PartialEq, Eq, PartialOrd, Ord, Clone)] -pub struct Constr { - pub tag: u64, - pub any_constructor: Option, - pub fields: Vec, -} - -impl<'b, C, A> minicbor::decode::Decode<'b, C> for Constr -where - A: minicbor::decode::Decode<'b, C>, -{ - fn decode(d: &mut minicbor::Decoder<'b>, ctx: &mut C) -> Result { - let tag = d.tag()?; - - match tag { - Tag::Unassigned(x) => match x { - 121..=127 | 1280..=1400 => Ok(Constr { - tag: x, - fields: d.decode_with(ctx)?, - any_constructor: None, - }), - 102 => { - d.array()?; - - Ok(Constr { - tag: x, - any_constructor: Some(d.decode_with(ctx)?), - fields: d.decode_with(ctx)?, - }) - } - _ => Err(minicbor::decode::Error::message( - "bad tag code for plutus data", - )), - }, - _ => Err(minicbor::decode::Error::message( - "bad tag code for plutus data", - )), - } - } -} - -impl minicbor::encode::Encode for Constr -where - A: minicbor::encode::Encode, -{ - fn encode( - &self, - e: &mut minicbor::Encoder, - ctx: &mut C, - ) -> Result<(), minicbor::encode::Error> { - e.tag(Tag::Unassigned(self.tag))?; - - match self.tag { - 102 => { - // definite length array here - // https://github.com/input-output-hk/plutus/blob/9538fc9829426b2ecb0628d352e2d7af96ec8204/plutus-core/plutus-core/src/PlutusCore/Data.hs#L152 - e.array(2)?; - e.encode_with(self.any_constructor.unwrap_or_default(), ctx)?; - - // we use definite array for empty array or indef array otherwise to match - // haskell implementation https://github.com/input-output-hk/plutus/blob/9538fc9829426b2ecb0628d352e2d7af96ec8204/plutus-core/plutus-core/src/PlutusCore/Data.hs#L144 - // default encoder for a list: - // https://github.com/well-typed/cborg/blob/4bdc818a1f0b35f38bc118a87944630043b58384/serialise/src/Codec/Serialise/Class.hs#L181 - encode_list(&self.fields, e, ctx)?; - Ok(()) - } - _ => { - // we use definite array for empty array or indef array otherwise to match - // haskell implementation. See above reference. - encode_list(&self.fields, e, ctx)?; - Ok(()) - } - } - } -} - -#[derive(Serialize, Deserialize, Encode, Decode, Debug, PartialEq, Eq, Clone, Copy)] -pub struct ExUnits { - #[n(0)] - pub mem: u64, - #[n(1)] - pub steps: u64, -} - -#[derive(Serialize, Deserialize, Encode, Decode, Debug, PartialEq, Eq, Clone)] -pub struct ExUnitPrices { - #[n(0)] - pub mem_price: PositiveInterval, - - #[n(1)] - pub step_price: PositiveInterval, -} - #[derive(Serialize, Deserialize, Encode, Decode, Debug, PartialEq, Eq, Clone, Copy)] #[cbor(index_only)] pub enum RedeemerTag { @@ -1308,7 +702,7 @@ pub struct WitnessSet { pub bootstrap_witness: Option>, #[n(3)] - pub plutus_script: Option>, + pub plutus_script: Option>>, #[n(4)] pub plutus_data: Option>, @@ -1330,7 +724,7 @@ pub struct MintedWitnessSet<'b> { pub bootstrap_witness: Option>, #[n(3)] - pub plutus_script: Option>, + pub plutus_script: Option>>, #[b(4)] pub plutus_data: Option>>, @@ -1340,6 +734,7 @@ pub struct MintedWitnessSet<'b> { } impl<'b> From> for WitnessSet { + #[allow(deprecated)] fn from(x: MintedWitnessSet<'b>) -> Self { WitnessSet { vkeywitness: x.vkeywitness, @@ -1366,80 +761,9 @@ pub struct PostAlonzoAuxiliaryData { pub native_scripts: Option>, #[n(2)] - pub plutus_scripts: Option>, + pub plutus_scripts: Option>>, } -#[derive(Serialize, Deserialize, Debug, PartialEq, Eq, PartialOrd, Ord, Clone)] -pub enum Metadatum { - Int(Int), - Bytes(Bytes), - Text(String), - Array(Vec), - Map(KeyValuePairs), -} - -impl<'b, C> minicbor::Decode<'b, C> for Metadatum { - fn decode(d: &mut minicbor::Decoder<'b>, ctx: &mut C) -> Result { - match d.datatype()? { - minicbor::data::Type::U8 - | minicbor::data::Type::U16 - | minicbor::data::Type::U32 - | minicbor::data::Type::U64 - | minicbor::data::Type::I8 - | minicbor::data::Type::I16 - | minicbor::data::Type::I32 - | minicbor::data::Type::I64 - | minicbor::data::Type::Int => { - let i = d.decode()?; - Ok(Metadatum::Int(i)) - } - minicbor::data::Type::Bytes => Ok(Metadatum::Bytes(d.decode_with(ctx)?)), - minicbor::data::Type::String => Ok(Metadatum::Text(d.decode_with(ctx)?)), - minicbor::data::Type::Array | minicbor::data::Type::ArrayIndef => { - Ok(Metadatum::Array(d.decode_with(ctx)?)) - } - minicbor::data::Type::Map | minicbor::data::Type::MapIndef => { - Ok(Metadatum::Map(d.decode_with(ctx)?)) - } - _ => Err(minicbor::decode::Error::message( - "Can't turn data type into metadatum", - )), - } - } -} - -impl minicbor::Encode for Metadatum { - fn encode( - &self, - e: &mut minicbor::Encoder, - ctx: &mut C, - ) -> Result<(), minicbor::encode::Error> { - match self { - Metadatum::Int(a) => { - e.encode_with(a, ctx)?; - } - Metadatum::Bytes(a) => { - e.encode_with(a, ctx)?; - } - Metadatum::Text(a) => { - e.encode_with(a, ctx)?; - } - Metadatum::Array(a) => { - e.encode_with(a, ctx)?; - } - Metadatum::Map(a) => { - e.encode_with(a, ctx)?; - } - }; - - Ok(()) - } -} - -pub type MetadatumLabel = u64; - -pub type Metadata = KeyValuePairs; - #[derive(Serialize, Deserialize, Encode, Decode, Debug, PartialEq, Clone)] pub struct ShelleyMaAuxiliaryData { #[n(0)] @@ -1489,7 +813,7 @@ impl minicbor::Encode for AuxiliaryData { } AuxiliaryData::PostAlonzo(v) => { // TODO: check if this is the correct tag - e.tag(Tag::Unassigned(259))?; + e.tag(Tag::new(259))?; e.encode_with(v, ctx)?; } }; @@ -1498,8 +822,6 @@ impl minicbor::Encode for AuxiliaryData { } } -pub type TransactionIndex = u32; - #[derive(Serialize, Deserialize, Encode, Decode, Debug, PartialEq, Clone)] pub struct Block { #[n(0)] diff --git a/pallas-primitives/src/babbage/model.rs b/pallas-primitives/src/babbage/model.rs index 3fb6cba..acc937f 100644 --- a/pallas-primitives/src/babbage/model.rs +++ b/pallas-primitives/src/babbage/model.rs @@ -4,15 +4,19 @@ use serde::{Deserialize, Serialize}; -use pallas_codec::minicbor::{Decode, Encode}; +use pallas_codec::{ + minicbor::{self, Decode, Encode}, + utils::{Bytes, CborWrap, KeepRaw, KeyValuePairs, MaybeIndefArray, Nullable}, +}; use pallas_crypto::hash::{Hash, Hasher}; -use pallas_codec::utils::{Bytes, CborWrap, KeepRaw, KeyValuePairs, MaybeIndefArray, Nullable}; - -// required for derive attrs to work -use pallas_codec::minicbor; - -use crate::alonzo::VrfCert; +pub use crate::{ + plutus_data::*, AddrKeyhash, AssetName, DatumHash, DnsName, Epoch, ExUnitPrices, ExUnits, + GenesisDelegateHash, Genesishash, IPv4, IPv6, Metadata, Metadatum, MetadatumLabel, NetworkId, + Nonce, NonceVariant, PlutusScript, PolicyId, PoolKeyhash, PoolMetadata, PoolMetadataHash, Port, + PositiveInterval, ProtocolVersion, RationalNumber, Relay, ScriptHash, StakeCredential, + TransactionIndex, TransactionInput, UnitInterval, VrfCert, VrfKeyhash, +}; #[derive(Serialize, Deserialize, Encode, Decode, Debug, PartialEq, Eq, Clone)] pub struct HeaderBody { @@ -62,10 +66,6 @@ pub struct OperationalCert { pub operational_cert_sigma: Bytes, } -pub use crate::alonzo::ProtocolVersion; - -pub use crate::alonzo::KesSignature; - pub type MintedHeaderBody<'a> = KeepRaw<'a, HeaderBody>; #[derive(Serialize, Deserialize, Encode, Decode, Debug, PartialEq, Eq, Clone)] @@ -97,18 +97,6 @@ impl<'a> From> for HeaderBody { } } -pub use crate::alonzo::TransactionInput; - -pub use crate::alonzo::NonceVariant; - -pub use crate::alonzo::Nonce; - -pub use crate::alonzo::ScriptHash; - -pub use crate::alonzo::PolicyId; - -pub use crate::alonzo::AssetName; - pub use crate::alonzo::Multiasset; pub use crate::alonzo::Mint; @@ -119,16 +107,6 @@ pub use crate::alonzo::Value; pub use crate::alonzo::TransactionOutput as LegacyTransactionOutput; -pub use crate::alonzo::PoolKeyhash; - -pub use crate::alonzo::Epoch; - -pub use crate::alonzo::Genesishash; - -pub use crate::alonzo::GenesisDelegateHash; - -pub use crate::alonzo::VrfKeyhash; - pub use crate::alonzo::InstantaneousRewardSource; pub use crate::alonzo::InstantaneousRewardTarget; @@ -137,40 +115,12 @@ pub use crate::alonzo::MoveInstantaneousReward; pub use crate::alonzo::RewardAccount; -pub type Withdrawals = KeyValuePairs; +pub use crate::alonzo::Withdrawals; -pub type RequiredSigners = Vec; - -pub use crate::alonzo::Port; - -pub use crate::alonzo::IPv4; - -pub use crate::alonzo::IPv6; - -pub use crate::alonzo::DnsName; - -pub use crate::alonzo::Relay; - -pub use crate::alonzo::PoolMetadataHash; - -pub use crate::alonzo::PoolMetadata; - -pub use crate::alonzo::AddrKeyhash; - -pub use crate::alonzo::Scripthash; - -pub use crate::alonzo::RationalNumber; - -pub use crate::alonzo::UnitInterval; - -pub use crate::alonzo::PositiveInterval; - -pub use crate::alonzo::StakeCredential; +pub use crate::alonzo::RequiredSigners; pub use crate::alonzo::Certificate; -pub use crate::alonzo::NetworkId; - #[derive(Serialize, Deserialize, Encode, Decode, Debug, PartialEq, Eq, Clone)] #[cbor(index_only)] pub enum Language { @@ -181,11 +131,14 @@ pub enum Language { PlutusV2, } +#[deprecated(since = "0.31.0", note = "use `CostModels` instead")] +pub type CostMdls = CostModels; + pub use crate::alonzo::CostModel; #[derive(Serialize, Deserialize, Encode, Decode, Debug, PartialEq, Eq, Clone)] #[cbor(map)] -pub struct CostMdls { +pub struct CostModels { #[n(0)] pub plutus_v1: Option, @@ -228,7 +181,7 @@ pub struct ProtocolParamUpdate { #[n(17)] pub ada_per_utxo_byte: Option, #[n(18)] - pub cost_models_for_script_languages: Option, + pub cost_models_for_script_languages: Option, #[n(19)] pub execution_costs: Option, #[n(20)] @@ -455,28 +408,6 @@ pub use crate::alonzo::VKeyWitness; pub use crate::alonzo::NativeScript; -pub use crate::alonzo::PlutusScript as PlutusV1Script; - -#[derive(Serialize, Deserialize, Encode, Decode, Debug, PartialEq, Eq, Clone)] -#[cbor(transparent)] -pub struct PlutusV2Script(#[n(0)] pub Bytes); - -impl AsRef<[u8]> for PlutusV2Script { - fn as_ref(&self) -> &[u8] { - self.0.as_slice() - } -} - -pub use crate::alonzo::BigInt; - -pub use crate::alonzo::PlutusData; - -pub use crate::alonzo::Constr; - -pub use crate::alonzo::ExUnits; - -pub use crate::alonzo::ExUnitPrices; - pub use crate::alonzo::RedeemerTag; pub use crate::alonzo::Redeemer; @@ -496,7 +427,7 @@ pub struct WitnessSet { pub bootstrap_witness: Option>, #[n(3)] - pub plutus_v1_script: Option>, + pub plutus_v1_script: Option>>, #[n(4)] pub plutus_data: Option>, @@ -505,7 +436,7 @@ pub struct WitnessSet { pub redeemer: Option>, #[n(6)] - pub plutus_v2_script: Option>, + pub plutus_v2_script: Option>>, } #[derive(Encode, Decode, Debug, PartialEq, Clone)] @@ -521,7 +452,7 @@ pub struct MintedWitnessSet<'b> { pub bootstrap_witness: Option>, #[n(3)] - pub plutus_v1_script: Option>, + pub plutus_v1_script: Option>>, #[b(4)] pub plutus_data: Option>>, @@ -530,7 +461,7 @@ pub struct MintedWitnessSet<'b> { pub redeemer: Option>, #[n(6)] - pub plutus_v2_script: Option>, + pub plutus_v2_script: Option>>, } impl<'b> From> for WitnessSet { @@ -561,20 +492,16 @@ pub struct PostAlonzoAuxiliaryData { pub native_scripts: Option>, #[n(2)] - pub plutus_v1_scripts: Option>, + pub plutus_v1_scripts: Option>>, #[n(3)] - pub plutus_v2_scripts: Option>, + pub plutus_v2_scripts: Option>>, } -pub type DatumHash = Hash<32>; - -//pub type Data = CborWrap; - // datum_option = [ 0, $hash32 // 1, data ] #[derive(Debug, PartialEq, Eq, Clone)] pub enum PseudoDatumOption { - Hash(Hash<32>), + Hash(DatumHash), Data(CborWrap), } @@ -626,12 +553,18 @@ impl<'b> From> for DatumOption { } } +#[deprecated(since = "0.31.0", note = "use `PlutusScript<1>` instead")] +pub type PlutusV1Script = PlutusScript<1>; + +#[deprecated(since = "0.31.0", note = "use `PlutusScript<2>` instead")] +pub type PlutusV2Script = PlutusScript<2>; + // script = [ 0, native_script // 1, plutus_v1_script // 2, plutus_v2_script ] #[derive(Debug, PartialEq, Eq, Clone)] pub enum PseudoScript { NativeScript(T1), - PlutusV1Script(PlutusV1Script), - PlutusV2Script(PlutusV2Script), + PlutusV1Script(PlutusScript<1>), + PlutusV2Script(PlutusScript<2>), } // script_ref = #6.24(bytes .cbor script) @@ -689,16 +622,8 @@ where } } -pub use crate::alonzo::Metadatum; - -pub use crate::alonzo::MetadatumLabel; - -pub use crate::alonzo::Metadata; - pub use crate::alonzo::AuxiliaryData; -pub use crate::alonzo::TransactionIndex; - #[derive(Serialize, Deserialize, Encode, Decode, Debug, PartialEq, Clone)] pub struct PseudoBlock where diff --git a/pallas-primitives/src/conway/model.rs b/pallas-primitives/src/conway/model.rs index ed1e976..2ea3854 100644 --- a/pallas-primitives/src/conway/model.rs +++ b/pallas-primitives/src/conway/model.rs @@ -2,53 +2,34 @@ //! //! Handcrafted, idiomatic rust artifacts based on based on the [Conway CDDL](https://github.com/IntersectMBO/cardano-ledger/blob/master/eras/conway/impl/cddl-files/conway.cddl) file in IntersectMBO repo. +use serde::{Deserialize, Serialize}; use std::ops::Deref; -use pallas_codec::minicbor::decode::Error; -use serde::{Deserialize, Serialize}; +use pallas_codec::minicbor::{self, decode::Error, Decode, Encode}; +use pallas_codec::utils::CborWrap; -use pallas_codec::minicbor::{Decode, Encode}; -use pallas_crypto::hash::Hash; - -use pallas_codec::utils::{ - Bytes, CborWrap, KeepRaw, KeyValuePairs, MaybeIndefArray, NonEmptyKeyValuePairs, NonEmptySet, - NonZeroInt, Nullable, PositiveCoin, Set, +pub use crate::{ + plutus_data::*, AddrKeyhash, AssetName, Bytes, Coin, CostModel, DnsName, Epoch, ExUnits, + GenesisDelegateHash, Genesishash, Hash, IPv4, IPv6, KeepRaw, KeyValuePairs, MaybeIndefArray, + Metadata, Metadatum, MetadatumLabel, NetworkId, NonEmptyKeyValuePairs, NonEmptySet, NonZeroInt, + Nonce, NonceVariant, Nullable, PlutusScript, PolicyId, PoolKeyhash, PoolMetadata, + PoolMetadataHash, Port, PositiveCoin, PositiveInterval, ProtocolVersion, RationalNumber, Relay, + RewardAccount, ScriptHash, Set, StakeCredential, TransactionIndex, TransactionInput, + UnitInterval, VrfCert, VrfKeyhash, }; -// required for derive attrs to work -use pallas_codec::minicbor; - -pub use crate::alonzo::VrfCert; - use crate::babbage; + pub use crate::babbage::HeaderBody; pub use crate::babbage::OperationalCert; -pub use crate::alonzo::ProtocolVersion; - -pub use crate::alonzo::KesSignature; - pub use crate::babbage::Header; -pub use crate::alonzo::TransactionInput; - -pub use crate::alonzo::NonceVariant; - -pub use crate::alonzo::Nonce; - -pub use crate::alonzo::ScriptHash; - -pub use crate::alonzo::PolicyId; - -pub use crate::alonzo::AssetName; - pub type Multiasset = NonEmptyKeyValuePairs>; pub type Mint = Multiasset; -pub use crate::alonzo::Coin; - #[derive(Serialize, Deserialize, Debug, PartialEq, Eq, Clone)] pub enum Value { Coin(Coin), @@ -99,54 +80,10 @@ impl minicbor::encode::Encode for Value { pub use crate::alonzo::TransactionOutput as LegacyTransactionOutput; -pub use crate::alonzo::PoolKeyhash; - -pub use crate::alonzo::Epoch; - -pub use crate::alonzo::Genesishash; - -pub use crate::alonzo::GenesisDelegateHash; - -pub use crate::alonzo::VrfKeyhash; - -pub use crate::alonzo::InstantaneousRewardSource; - -pub use crate::alonzo::InstantaneousRewardTarget; - -pub use crate::alonzo::MoveInstantaneousReward; - -pub use crate::alonzo::RewardAccount; - pub type Withdrawals = NonEmptyKeyValuePairs; pub type RequiredSigners = NonEmptySet; -pub use crate::alonzo::Port; - -pub use crate::alonzo::IPv4; - -pub use crate::alonzo::IPv6; - -pub use crate::alonzo::DnsName; - -pub use crate::alonzo::Relay; - -pub use crate::alonzo::PoolMetadataHash; - -pub use crate::alonzo::PoolMetadata; - -pub use crate::alonzo::AddrKeyhash; - -pub use crate::alonzo::Scripthash; - -pub use crate::alonzo::RationalNumber; - -pub use crate::alonzo::UnitInterval; - -pub use crate::alonzo::PositiveInterval; - -pub use crate::alonzo::StakeCredential; - #[derive(Serialize, Deserialize, Debug, PartialEq, Eq, Clone)] pub enum Certificate { StakeRegistration(StakeCredential), @@ -442,7 +379,7 @@ impl minicbor::encode::Encode for Certificate { #[derive(Serialize, Deserialize, Debug, PartialEq, PartialOrd, Eq, Ord, Clone)] pub enum DRep { Key(AddrKeyhash), - Script(Scripthash), + Script(ScriptHash), Abstain, NoConfidence, } @@ -507,8 +444,6 @@ pub type CommitteeColdCredential = StakeCredential; pub type CommitteeHotCredential = StakeCredential; -pub use crate::alonzo::NetworkId; - #[derive(Serialize, Deserialize, Encode, Decode, Debug, PartialEq, Eq, Clone)] #[cbor(index_only)] pub enum Language { @@ -522,11 +457,12 @@ pub enum Language { PlutusV3, } -pub use crate::alonzo::CostModel; +#[deprecated(since = "0.31.0", note = "use `CostModels` instead")] +pub type CostMdls = CostModels; #[derive(Serialize, Deserialize, Encode, Decode, Debug, PartialEq, Eq, Clone)] #[cbor(map)] -pub struct CostMdls { +pub struct CostModels { #[n(0)] pub plutus_v1: Option, @@ -570,7 +506,7 @@ pub struct ProtocolParamUpdate { #[n(17)] pub ada_per_utxo_byte: Option, #[n(18)] - pub cost_models_for_script_languages: Option, + pub cost_models_for_script_languages: Option, #[n(19)] pub execution_costs: Option, #[n(20)] @@ -1285,28 +1221,6 @@ pub use crate::alonzo::VKeyWitness; pub use crate::alonzo::NativeScript; -pub use crate::alonzo::PlutusScript as PlutusV1Script; - -pub use crate::babbage::PlutusV2Script; - -#[derive(Serialize, Deserialize, Encode, Decode, Debug, PartialEq, Eq, Clone)] -#[cbor(transparent)] -pub struct PlutusV3Script(#[n(0)] pub Bytes); - -impl AsRef<[u8]> for PlutusV3Script { - fn as_ref(&self) -> &[u8] { - self.0.as_slice() - } -} - -pub use crate::alonzo::BigInt; - -pub use crate::alonzo::PlutusData; - -pub use crate::alonzo::Constr; - -pub use crate::alonzo::ExUnits; - #[derive(Serialize, Deserialize, Encode, Decode, Debug, PartialEq, Eq, Clone)] pub struct ExUnitPrices { #[n(0)] @@ -1446,7 +1360,7 @@ pub struct WitnessSet { pub bootstrap_witness: Option>, #[n(3)] - pub plutus_v1_script: Option>, + pub plutus_v1_script: Option>>, #[n(4)] pub plutus_data: Option>, @@ -1455,10 +1369,10 @@ pub struct WitnessSet { pub redeemer: Option, #[n(6)] - pub plutus_v2_script: Option>, + pub plutus_v2_script: Option>>, #[n(7)] - pub plutus_v3_script: Option>, + pub plutus_v3_script: Option>>, } #[derive(Encode, Decode, Debug, PartialEq, Clone)] @@ -1474,7 +1388,7 @@ pub struct MintedWitnessSet<'b> { pub bootstrap_witness: Option>, #[n(3)] - pub plutus_v1_script: Option>, + pub plutus_v1_script: Option>>, #[b(4)] pub plutus_data: Option>>, @@ -1483,10 +1397,10 @@ pub struct MintedWitnessSet<'b> { pub redeemer: Option>, #[n(6)] - pub plutus_v2_script: Option>, + pub plutus_v2_script: Option>>, #[n(7)] - pub plutus_v3_script: Option>, + pub plutus_v3_script: Option>>, } impl<'b> From> for WitnessSet { @@ -1514,13 +1428,13 @@ pub struct PostAlonzoAuxiliaryData { pub native_scripts: Option>, #[n(2)] - pub plutus_v1_scripts: Option>, + pub plutus_v1_scripts: Option>>, #[n(3)] - pub plutus_v2_scripts: Option>, + pub plutus_v2_scripts: Option>>, #[n(4)] - pub plutus_v3_scripts: Option>, + pub plutus_v3_scripts: Option>>, } pub use crate::babbage::DatumHash; @@ -1531,13 +1445,22 @@ pub use crate::babbage::DatumOption; pub use crate::babbage::MintedDatumOption; +#[deprecated(since = "0.31.0", note = "use `PlutusScript<1>` instead")] +pub type PlutusV1Script = PlutusScript<1>; + +#[deprecated(since = "0.31.0", note = "use `PlutusScript<2>` instead")] +pub type PlutusV2Script = PlutusScript<2>; + +#[deprecated(since = "0.31.0", note = "use `PlutusScript<3>` instead")] +pub type PlutusV3Script = PlutusScript<3>; + // script = [ 0, native_script // 1, plutus_v1_script // 2, plutus_v2_script ] #[derive(Debug, PartialEq, Eq, Clone)] pub enum PseudoScript { NativeScript(T1), - PlutusV1Script(PlutusV1Script), - PlutusV2Script(PlutusV2Script), - PlutusV3Script(PlutusV3Script), + PlutusV1Script(PlutusScript<1>), + PlutusV2Script(PlutusScript<2>), + PlutusV3Script(PlutusScript<3>), } // script_ref = #6.24(bytes .cbor script) @@ -1610,15 +1533,8 @@ where } } -pub use crate::alonzo::Metadatum; - -pub use crate::alonzo::MetadatumLabel; - -pub use crate::alonzo::Metadata; - pub use crate::alonzo::AuxiliaryData; -pub use crate::alonzo::TransactionIndex; use crate::babbage::MintedHeader; #[derive(Serialize, Deserialize, Encode, Decode, Debug, PartialEq, Clone)] diff --git a/pallas-primitives/src/lib.rs b/pallas-primitives/src/lib.rs index 797b7f4..accbf41 100644 --- a/pallas-primitives/src/lib.rs +++ b/pallas-primitives/src/lib.rs @@ -1,10 +1,402 @@ //! Ledger primitives and cbor codec for the Cardano eras mod framework; +mod plutus_data; pub mod alonzo; pub mod babbage; pub mod byron; pub mod conway; +pub use plutus_data::*; pub use framework::*; + +pub use pallas_codec::utils::{ + Bytes, Int, KeepRaw, KeyValuePairs, MaybeIndefArray, NonEmptyKeyValuePairs, NonEmptySet, + NonZeroInt, Nullable, PositiveCoin, Set, +}; +pub use pallas_crypto::hash::Hash; + +use pallas_codec::minicbor::{self, data::Tag, Decode, Encode}; +use serde::{Deserialize, Serialize}; + +// ----- Common type definitions + +pub type AddrKeyhash = Hash<28>; + +pub type AssetName = Bytes; + +pub type Coin = u64; + +pub type CostModel = Vec; + +pub type DatumHash = Hash<32>; + +pub type DnsName = String; + +pub type Epoch = u64; + +#[derive(Serialize, Deserialize, Encode, Decode, Debug, PartialEq, Eq, Clone, Copy)] +pub struct ExUnits { + #[n(0)] + pub mem: u64, + #[n(1)] + pub steps: u64, +} + +#[derive(Serialize, Deserialize, Encode, Decode, Debug, PartialEq, Eq, Clone)] +pub struct ExUnitPrices { + #[n(0)] + pub mem_price: PositiveInterval, + + #[n(1)] + pub step_price: PositiveInterval, +} + +pub type Genesishash = Bytes; + +pub type GenesisDelegateHash = Bytes; + +pub type IPv4 = Bytes; + +pub type IPv6 = Bytes; + +pub type Metadata = KeyValuePairs; + +#[derive(Serialize, Deserialize, Debug, PartialEq, Eq, PartialOrd, Ord, Clone)] +pub enum Metadatum { + Int(Int), + Bytes(Bytes), + Text(String), + Array(Vec), + Map(KeyValuePairs), +} + +impl<'b, C> minicbor::Decode<'b, C> for Metadatum { + fn decode(d: &mut minicbor::Decoder<'b>, ctx: &mut C) -> Result { + match d.datatype()? { + minicbor::data::Type::U8 + | minicbor::data::Type::U16 + | minicbor::data::Type::U32 + | minicbor::data::Type::U64 + | minicbor::data::Type::I8 + | minicbor::data::Type::I16 + | minicbor::data::Type::I32 + | minicbor::data::Type::I64 + | minicbor::data::Type::Int => { + let i = d.decode()?; + Ok(Metadatum::Int(i)) + } + minicbor::data::Type::Bytes => Ok(Metadatum::Bytes(d.decode_with(ctx)?)), + minicbor::data::Type::String => Ok(Metadatum::Text(d.decode_with(ctx)?)), + minicbor::data::Type::Array | minicbor::data::Type::ArrayIndef => { + Ok(Metadatum::Array(d.decode_with(ctx)?)) + } + minicbor::data::Type::Map | minicbor::data::Type::MapIndef => { + Ok(Metadatum::Map(d.decode_with(ctx)?)) + } + _ => Err(minicbor::decode::Error::message( + "Can't turn data type into metadatum", + )), + } + } +} + +impl minicbor::Encode for Metadatum { + fn encode( + &self, + e: &mut minicbor::Encoder, + ctx: &mut C, + ) -> Result<(), minicbor::encode::Error> { + match self { + Metadatum::Int(a) => { + e.encode_with(a, ctx)?; + } + Metadatum::Bytes(a) => { + e.encode_with(a, ctx)?; + } + Metadatum::Text(a) => { + e.encode_with(a, ctx)?; + } + Metadatum::Array(a) => { + e.encode_with(a, ctx)?; + } + Metadatum::Map(a) => { + e.encode_with(a, ctx)?; + } + }; + + Ok(()) + } +} + +pub type MetadatumLabel = u64; + +#[derive( + Serialize, Deserialize, Encode, Decode, Debug, PartialEq, Eq, PartialOrd, Ord, Clone, Copy, +)] +#[cbor(index_only)] +pub enum NetworkId { + #[n(0)] + Testnet, + #[n(1)] + Mainnet, +} + +impl From for u8 { + fn from(network_id: NetworkId) -> u8 { + match network_id { + NetworkId::Testnet => 0, + NetworkId::Mainnet => 1, + } + } +} + +impl TryFrom for NetworkId { + type Error = (); + + fn try_from(i: u8) -> Result { + match i { + 0 => Ok(Self::Testnet), + 1 => Ok(Self::Mainnet), + _ => Err(()), + } + } +} + +#[derive(Serialize, Deserialize, Encode, Decode, Debug, PartialEq, Eq, Clone)] +pub struct Nonce { + #[n(0)] + pub variant: NonceVariant, + + #[n(1)] + pub hash: Option>, +} + +#[derive(Serialize, Deserialize, Encode, Decode, Debug, PartialEq, Eq, Clone)] +#[cbor(index_only)] +pub enum NonceVariant { + #[n(0)] + NeutralNonce, + + #[n(1)] + Nonce, +} + +#[derive(Serialize, Deserialize, Encode, Decode, Debug, PartialEq, Eq, Clone)] +#[cbor(transparent)] +pub struct PlutusScript(#[n(0)] pub Bytes); + +impl AsRef<[u8]> for PlutusScript { + fn as_ref(&self) -> &[u8] { + self.0.as_slice() + } +} + +pub type PolicyId = Hash<28>; + +pub type PoolKeyhash = Hash<28>; + +#[derive(Serialize, Deserialize, Encode, Decode, Debug, PartialEq, Eq, Clone)] +pub struct PoolMetadata { + #[n(0)] + pub url: String, + + #[n(1)] + pub hash: PoolMetadataHash, +} + +pub type PoolMetadataHash = Hash<32>; + +pub type Port = u32; + +pub type PositiveInterval = RationalNumber; + +pub type ProtocolVersion = (u64, u64); + +#[derive(Serialize, Deserialize, Debug, PartialEq, Eq, Clone)] +pub struct RationalNumber { + pub numerator: u64, + pub denominator: u64, +} + +impl<'b, C> minicbor::decode::Decode<'b, C> for RationalNumber { + fn decode(d: &mut minicbor::Decoder<'b>, ctx: &mut C) -> Result { + // TODO: Enforce tag == 30 & array of size 2 + d.tag()?; + d.array()?; + Ok(RationalNumber { + numerator: d.decode_with(ctx)?, + denominator: d.decode_with(ctx)?, + }) + } +} + +impl minicbor::encode::Encode for RationalNumber { + fn encode( + &self, + e: &mut minicbor::Encoder, + ctx: &mut C, + ) -> Result<(), minicbor::encode::Error> { + e.tag(Tag::new(30))?; + e.array(2)?; + e.encode_with(self.numerator, ctx)?; + e.encode_with(self.denominator, ctx)?; + Ok(()) + } +} + +#[derive(Serialize, Deserialize, Debug, PartialEq, Eq, Clone)] +pub enum Relay { + SingleHostAddr(Nullable, Nullable, Nullable), + SingleHostName(Nullable, DnsName), + MultiHostName(DnsName), +} + +impl<'b, C> minicbor::decode::Decode<'b, C> for Relay { + fn decode(d: &mut minicbor::Decoder<'b>, ctx: &mut C) -> Result { + d.array()?; + let variant = d.u16()?; + + match variant { + 0 => Ok(Relay::SingleHostAddr( + d.decode_with(ctx)?, + d.decode_with(ctx)?, + d.decode_with(ctx)?, + )), + 1 => Ok(Relay::SingleHostName( + d.decode_with(ctx)?, + d.decode_with(ctx)?, + )), + 2 => Ok(Relay::MultiHostName(d.decode_with(ctx)?)), + _ => Err(minicbor::decode::Error::message( + "invalid variant id for Relay", + )), + } + } +} + +impl minicbor::encode::Encode for Relay { + fn encode( + &self, + e: &mut minicbor::Encoder, + ctx: &mut C, + ) -> Result<(), minicbor::encode::Error> { + match self { + Relay::SingleHostAddr(a, b, c) => { + e.array(4)?; + e.encode_with(0, ctx)?; + e.encode_with(a, ctx)?; + e.encode_with(b, ctx)?; + e.encode_with(c, ctx)?; + + Ok(()) + } + Relay::SingleHostName(a, b) => { + e.array(3)?; + e.encode_with(1, ctx)?; + e.encode_with(a, ctx)?; + e.encode_with(b, ctx)?; + + Ok(()) + } + Relay::MultiHostName(a) => { + e.array(2)?; + e.encode_with(2, ctx)?; + e.encode_with(a, ctx)?; + + Ok(()) + } + } + } +} + +pub type RewardAccount = Bytes; + +pub type ScriptHash = Hash<28>; + +#[derive(Serialize, Deserialize, Debug, PartialEq, PartialOrd, Eq, Ord, Clone, Hash)] +// !! NOTE / IMPORTANT !! +// It is tempting to swap the order of the two constructors so that AddrKeyHash +// comes first. This indeed nicely maps the binary representation which +// associates 0 to AddrKeyHash and 1 to ScriptHash. +// +// However, for historical reasons, the ScriptHash variant comes first in the +// Haskell reference codebase. From this ordering is derived the `PartialOrd` +// and `Ord` instances; which impacts how Maps/Dictionnaries indexed by +// StakeCredential will be ordered. So, it is crucial to preserve this quirks to +// avoid hard to troubleshoot issues down the line. +pub enum StakeCredential { + ScriptHash(ScriptHash), + AddrKeyhash(AddrKeyhash), +} + +impl<'b, C> minicbor::decode::Decode<'b, C> for StakeCredential { + fn decode(d: &mut minicbor::Decoder<'b>, ctx: &mut C) -> Result { + d.array()?; + let variant = d.u16()?; + + match variant { + 0 => Ok(StakeCredential::AddrKeyhash(d.decode_with(ctx)?)), + 1 => Ok(StakeCredential::ScriptHash(d.decode_with(ctx)?)), + _ => Err(minicbor::decode::Error::message( + "invalid variant id for StakeCredential", + )), + } + } +} + +impl minicbor::encode::Encode for StakeCredential { + fn encode( + &self, + e: &mut minicbor::Encoder, + ctx: &mut C, + ) -> Result<(), minicbor::encode::Error> { + match self { + StakeCredential::AddrKeyhash(a) => { + e.array(2)?; + e.encode_with(0, ctx)?; + e.encode_with(a, ctx)?; + + Ok(()) + } + StakeCredential::ScriptHash(a) => { + e.array(2)?; + e.encode_with(1, ctx)?; + e.encode_with(a, ctx)?; + + Ok(()) + } + } + } +} + +pub type TransactionIndex = u32; + +#[derive( + Serialize, + Deserialize, + Encode, + Decode, + Debug, + PartialEq, + Eq, + PartialOrd, + Ord, + Clone, + std::hash::Hash, +)] +pub struct TransactionInput { + #[n(0)] + pub transaction_id: Hash<32>, + + #[n(1)] + pub index: u64, +} + +pub type UnitInterval = RationalNumber; + +#[derive(Serialize, Deserialize, Encode, Decode, Debug, PartialEq, Eq, Clone)] +pub struct VrfCert(#[n(0)] pub Bytes, #[n(1)] pub Bytes); + +pub type VrfKeyhash = Hash<32>; diff --git a/pallas-primitives/src/plutus_data.rs b/pallas-primitives/src/plutus_data.rs new file mode 100644 index 0000000..f8c0f1a --- /dev/null +++ b/pallas-primitives/src/plutus_data.rs @@ -0,0 +1,353 @@ +use crate::KeyValuePairs; +use pallas_codec::minicbor::{ + self, + data::{IanaTag, Tag}, + Encode, +}; +use pallas_codec::utils::Int; +use serde::{Deserialize, Serialize}; +use std::{fmt, ops::Deref}; + +#[derive(Serialize, Deserialize, Debug, PartialEq, Eq, PartialOrd, Ord, Clone)] +pub enum PlutusData { + Constr(Constr), + Map(KeyValuePairs), + BigInt(BigInt), + BoundedBytes(BoundedBytes), + Array(Vec), +} + +impl<'b, C> minicbor::decode::Decode<'b, C> for PlutusData { + fn decode(d: &mut minicbor::Decoder<'b>, ctx: &mut C) -> Result { + let type_ = d.datatype()?; + + match type_ { + minicbor::data::Type::Tag => { + let mut probe = d.probe(); + let tag = probe.tag()?; + + if tag == IanaTag::PosBignum.tag() || tag == IanaTag::NegBignum.tag() { + Ok(Self::BigInt(d.decode_with(ctx)?)) + } else { + match tag.as_u64() { + (121..=127) | (1280..=1400) | 102 => Ok(Self::Constr(d.decode_with(ctx)?)), + _ => Err(minicbor::decode::Error::message( + "unknown tag for plutus data tag", + )), + } + } + } + minicbor::data::Type::U8 + | minicbor::data::Type::U16 + | minicbor::data::Type::U32 + | minicbor::data::Type::U64 + | minicbor::data::Type::I8 + | minicbor::data::Type::I16 + | minicbor::data::Type::I32 + | minicbor::data::Type::I64 + | minicbor::data::Type::Int => Ok(Self::BigInt(d.decode_with(ctx)?)), + minicbor::data::Type::Map | minicbor::data::Type::MapIndef => { + Ok(Self::Map(d.decode_with(ctx)?)) + } + minicbor::data::Type::Bytes => Ok(Self::BoundedBytes(d.decode_with(ctx)?)), + minicbor::data::Type::BytesIndef => { + let mut full = Vec::new(); + + for slice in d.bytes_iter()? { + full.extend(slice?); + } + + Ok(Self::BoundedBytes(BoundedBytes::from(full))) + } + minicbor::data::Type::Array | minicbor::data::Type::ArrayIndef => { + Ok(Self::Array(d.decode_with(ctx)?)) + } + + any => Err(minicbor::decode::Error::message(format!( + "bad cbor data type ({any:?}) for plutus data" + ))), + } + } +} + +impl minicbor::encode::Encode for PlutusData { + fn encode( + &self, + e: &mut minicbor::Encoder, + ctx: &mut C, + ) -> Result<(), minicbor::encode::Error> { + match self { + Self::Constr(a) => { + e.encode_with(a, ctx)?; + } + Self::Map(a) => { + // we use definite array to match the approach used by haskell's plutus + // implementation https://github.com/input-output-hk/plutus/blob/9538fc9829426b2ecb0628d352e2d7af96ec8204/plutus-core/plutus-core/src/PlutusCore/Data.hs#L152 + e.map(a.len().try_into().unwrap())?; + for (k, v) in a.iter() { + k.encode(e, ctx)?; + v.encode(e, ctx)?; + } + } + Self::BigInt(a) => { + e.encode_with(a, ctx)?; + } + Self::BoundedBytes(a) => { + e.encode_with(a, ctx)?; + } + Self::Array(a) => { + // we use definite array for empty array or indef array otherwise to match + // haskell implementation https://github.com/input-output-hk/plutus/blob/9538fc9829426b2ecb0628d352e2d7af96ec8204/plutus-core/plutus-core/src/PlutusCore/Data.hs#L153 + // default encoder for a list: + // https://github.com/well-typed/cborg/blob/4bdc818a1f0b35f38bc118a87944630043b58384/serialise/src/Codec/Serialise/Class.hs#L181 + encode_list(a, e, ctx)?; + } + }; + + Ok(()) + } +} + +/* +big_int = int / big_uint / big_nint ; New +big_uint = #6.2(bounded_bytes) ; New +big_nint = #6.3(bounded_bytes) ; New + */ + +#[derive(Serialize, Deserialize, Debug, PartialEq, Eq, PartialOrd, Ord, Clone)] +pub enum BigInt { + Int(Int), + BigUInt(BoundedBytes), + BigNInt(BoundedBytes), +} + +impl<'b, C> minicbor::decode::Decode<'b, C> for BigInt { + fn decode(d: &mut minicbor::Decoder<'b>, ctx: &mut C) -> Result { + let datatype = d.datatype()?; + + match datatype { + minicbor::data::Type::U8 + | minicbor::data::Type::U16 + | minicbor::data::Type::U32 + | minicbor::data::Type::U64 + | minicbor::data::Type::I8 + | minicbor::data::Type::I16 + | minicbor::data::Type::I32 + | minicbor::data::Type::I64 + | minicbor::data::Type::Int => Ok(Self::Int(d.decode_with(ctx)?)), + minicbor::data::Type::Tag => { + let tag = d.tag()?; + if tag == IanaTag::PosBignum.tag() { + Ok(Self::BigUInt(d.decode_with(ctx)?)) + } else if tag == IanaTag::NegBignum.tag() { + Ok(Self::BigNInt(d.decode_with(ctx)?)) + } else { + Err(minicbor::decode::Error::message( + "invalid cbor tag for big int", + )) + } + } + _ => Err(minicbor::decode::Error::message( + "invalid cbor data type for big int", + )), + } + } +} + +impl minicbor::encode::Encode for BigInt { + fn encode( + &self, + e: &mut minicbor::Encoder, + ctx: &mut C, + ) -> Result<(), minicbor::encode::Error> { + match self { + BigInt::Int(x) => { + e.encode_with(x, ctx)?; + } + BigInt::BigUInt(x) => { + e.tag(IanaTag::PosBignum)?; + e.encode_with(x, ctx)?; + } + BigInt::BigNInt(x) => { + e.tag(IanaTag::NegBignum)?; + e.encode_with(x, ctx)?; + } + }; + + Ok(()) + } +} + +#[derive(Serialize, Deserialize, Debug, PartialEq, Eq, PartialOrd, Ord, Clone)] +pub struct Constr { + pub tag: u64, + pub any_constructor: Option, + pub fields: Vec, +} + +impl<'b, C, A> minicbor::decode::Decode<'b, C> for Constr +where + A: minicbor::decode::Decode<'b, C>, +{ + fn decode(d: &mut minicbor::Decoder<'b>, ctx: &mut C) -> Result { + let tag = d.tag()?; + let x = tag.as_u64(); + match x { + 121..=127 | 1280..=1400 => Ok(Constr { + tag: x, + fields: d.decode_with(ctx)?, + any_constructor: None, + }), + 102 => { + d.array()?; + + Ok(Constr { + tag: x, + any_constructor: Some(d.decode_with(ctx)?), + fields: d.decode_with(ctx)?, + }) + } + _ => Err(minicbor::decode::Error::message( + "bad tag code for plutus data", + )), + } + } +} + +impl minicbor::encode::Encode for Constr +where + A: minicbor::encode::Encode, +{ + fn encode( + &self, + e: &mut minicbor::Encoder, + ctx: &mut C, + ) -> Result<(), minicbor::encode::Error> { + e.tag(Tag::new(self.tag))?; + + match self.tag { + 102 => { + // definite length array here + // https://github.com/input-output-hk/plutus/blob/9538fc9829426b2ecb0628d352e2d7af96ec8204/plutus-core/plutus-core/src/PlutusCore/Data.hs#L152 + e.array(2)?; + e.encode_with(self.any_constructor.unwrap_or_default(), ctx)?; + + // we use definite array for empty array or indef array otherwise to match + // haskell implementation https://github.com/input-output-hk/plutus/blob/9538fc9829426b2ecb0628d352e2d7af96ec8204/plutus-core/plutus-core/src/PlutusCore/Data.hs#L144 + // default encoder for a list: + // https://github.com/well-typed/cborg/blob/4bdc818a1f0b35f38bc118a87944630043b58384/serialise/src/Codec/Serialise/Class.hs#L181 + encode_list(&self.fields, e, ctx)?; + Ok(()) + } + _ => { + // we use definite array for empty array or indef array otherwise to match + // haskell implementation. See above reference. + encode_list(&self.fields, e, ctx)?; + Ok(()) + } + } + } +} + +/// Defined to encode PlutusData bytestring as it is done in the canonical +/// plutus implementation +#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, PartialOrd, Ord)] +#[serde(into = "String")] +#[serde(try_from = "String")] +pub struct BoundedBytes(Vec); + +impl From> for BoundedBytes { + fn from(xs: Vec) -> Self { + BoundedBytes(xs) + } +} + +impl From for Vec { + fn from(b: BoundedBytes) -> Self { + b.0 + } +} + +impl Deref for BoundedBytes { + type Target = Vec; + + fn deref(&self) -> &Self::Target { + &self.0 + } +} + +impl TryFrom for BoundedBytes { + type Error = hex::FromHexError; + + fn try_from(value: String) -> Result { + let v = hex::decode(value)?; + Ok(BoundedBytes(v)) + } +} + +impl From for String { + fn from(b: BoundedBytes) -> Self { + hex::encode(b.deref()) + } +} + +impl fmt::Display for BoundedBytes { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + let bytes: Vec = self.clone().into(); + + f.write_str(&hex::encode(bytes)) + } +} + +impl Encode for BoundedBytes { + fn encode( + &self, + e: &mut minicbor::Encoder, + _: &mut C, + ) -> Result<(), minicbor::encode::Error> { + // we match the haskell implementation by encoding bytestrings longer than 64 + // bytes as indefinite lists of bytes + const CHUNK_SIZE: usize = 64; + let bs: &Vec = self.deref(); + if bs.len() <= 64 { + e.bytes(bs)?; + } else { + e.begin_bytes()?; + for b in bs.chunks(CHUNK_SIZE) { + e.bytes(b)?; + } + e.end()?; + } + Ok(()) + } +} + +impl<'b, C> minicbor::decode::Decode<'b, C> for BoundedBytes { + fn decode(d: &mut minicbor::Decoder<'b>, _: &mut C) -> Result { + let mut res = Vec::new(); + for chunk in d.bytes_iter()? { + let bs = chunk?; + res.extend_from_slice(bs); + } + Ok(BoundedBytes::from(res)) + } +} + +fn encode_list>( + a: &Vec, + e: &mut minicbor::Encoder, + ctx: &mut C, +) -> Result<(), minicbor::encode::Error> { + // Mimics default haskell list encoding from cborg: + // We use indef array for non-empty arrays but definite 0-length array for empty + if a.is_empty() { + e.array(0)?; + } else { + e.begin_array()?; + for v in a { + e.encode_with(v, ctx)?; + } + e.end()?; + } + Ok(()) +} diff --git a/pallas-traverse/src/auxiliary.rs b/pallas-traverse/src/auxiliary.rs index 3df5599..5e84f2c 100644 --- a/pallas-traverse/src/auxiliary.rs +++ b/pallas-traverse/src/auxiliary.rs @@ -5,7 +5,7 @@ use pallas_primitives::alonzo; use crate::MultiEraTx; impl<'b> MultiEraTx<'b> { - pub fn aux_plutus_v1_scripts(&self) -> &[alonzo::PlutusScript] { + pub fn aux_plutus_v1_scripts(&self) -> &[alonzo::PlutusScript<1>] { if let Some(aux_data) = self.aux_data() { if let alonzo::AuxiliaryData::PostAlonzo(x) = aux_data.deref() { if let Some(plutus) = &x.plutus_scripts { diff --git a/pallas-traverse/src/hashes.rs b/pallas-traverse/src/hashes.rs index 0139277..14ff5fe 100644 --- a/pallas-traverse/src/hashes.rs +++ b/pallas-traverse/src/hashes.rs @@ -82,9 +82,9 @@ impl OriginalHash<28> for KeepRaw<'_, alonzo::NativeScript> { } } -impl ComputeHash<28> for alonzo::PlutusScript { +impl ComputeHash<28> for alonzo::PlutusScript { fn compute_hash(&self) -> Hash<28> { - Hasher::<224>::hash_tagged(&self.0, 1) + Hasher::<224>::hash_tagged(&self.0, VERSION as u8) } } @@ -124,12 +124,6 @@ impl OriginalHash<32> for KeepRaw<'_, babbage::Header> { } } -impl ComputeHash<28> for babbage::PlutusV2Script { - fn compute_hash(&self) -> Hash<28> { - Hasher::<224>::hash_tagged(&self.0, 2) - } -} - impl ComputeHash<32> for babbage::TransactionBody { fn compute_hash(&self) -> Hash<32> { Hasher::<256>::hash_cbor(self) @@ -159,12 +153,6 @@ impl ComputeHash<32> for babbage::DatumOption { // conway -impl ComputeHash<28> for conway::PlutusV3Script { - fn compute_hash(&self) -> Hash<28> { - Hasher::<224>::hash_tagged(&self.0, 3) - } -} - impl ComputeHash<32> for conway::TransactionBody { fn compute_hash(&self) -> Hash<32> { Hasher::<256>::hash_cbor(self) @@ -334,7 +322,7 @@ mod tests { fn plutus_v1_script_hashes_as_cardano_cli() { let bytecode_hex = include_str!("../../test_data/jpgstore.plutus"); let bytecode = hex::decode(bytecode_hex).unwrap(); - let script = alonzo::PlutusScript(Bytes::from(bytecode)); + let script = alonzo::PlutusScript::<1>(Bytes::from(bytecode)); let generated = script.compute_hash().to_string(); @@ -350,7 +338,7 @@ mod tests { fn plutus_v2_script_hashes_as_cardano_cli() { let bytecode_hex = include_str!("../../test_data/v2script.plutus"); let bytecode = hex::decode(bytecode_hex).unwrap(); - let script = babbage::PlutusV2Script(Bytes::from(bytecode)); + let script = babbage::PlutusScript::<2>(Bytes::from(bytecode)); let generated = script.compute_hash().to_string(); diff --git a/pallas-traverse/src/probe.rs b/pallas-traverse/src/probe.rs index 72c09f2..fab1377 100644 --- a/pallas-traverse/src/probe.rs +++ b/pallas-traverse/src/probe.rs @@ -1,6 +1,6 @@ //! Lightweight inspection of block data without full CBOR decoding -use pallas_codec::minicbor::decode::{Token, Tokenizer}; +use pallas_codec::minicbor::{data::Token, decode::Tokenizer}; use crate::Era; diff --git a/pallas-traverse/src/update.rs b/pallas-traverse/src/update.rs index b135499..0604d2a 100644 --- a/pallas-traverse/src/update.rs +++ b/pallas-traverse/src/update.rs @@ -47,9 +47,9 @@ pub type UnitInterval = alonzo::UnitInterval; pub type Nonce = alonzo::Nonce; pub type ExUnitPrices = alonzo::ExUnitPrices; pub type ExUnits = alonzo::ExUnits; -pub type AlonzoCostMdls = alonzo::CostMdls; -pub type BabbageCostMdls = babbage::CostMdls; -pub type ConwayCostMdls = conway::CostMdls; +pub type AlonzoCostModels = alonzo::CostModels; +pub type BabbageCostModels = babbage::CostModels; +pub type ConwayCostModels = conway::CostModels; pub type ProtocolVersion = alonzo::ProtocolVersion; pub type PoolVotingThresholds = conway::PoolVotingThresholds; pub type DRepVotingThresholds = conway::DRepVotingThresholds; @@ -157,7 +157,9 @@ impl<'b> MultiEraUpdate<'b> { } } - pub fn alonzo_first_proposed_cost_models_for_script_languages(&self) -> Option { + pub fn alonzo_first_proposed_cost_models_for_script_languages( + &self, + ) -> Option { match self { MultiEraUpdate::AlonzoCompatible(x) => x .proposed_protocol_parameter_updates @@ -169,7 +171,7 @@ impl<'b> MultiEraUpdate<'b> { pub fn babbage_first_proposed_cost_models_for_script_languages( &self, - ) -> Option { + ) -> Option { match self { MultiEraUpdate::Babbage(x) => x .proposed_protocol_parameter_updates @@ -179,7 +181,9 @@ impl<'b> MultiEraUpdate<'b> { } } - pub fn conway_first_proposed_cost_models_for_script_languages(&self) -> Option { + pub fn conway_first_proposed_cost_models_for_script_languages( + &self, + ) -> Option { match self { MultiEraUpdate::Conway(x) => x .proposed_protocol_parameter_updates diff --git a/pallas-traverse/src/witnesses.rs b/pallas-traverse/src/witnesses.rs index b681c03..6ad238c 100644 --- a/pallas-traverse/src/witnesses.rs +++ b/pallas-traverse/src/witnesses.rs @@ -1,8 +1,7 @@ use pallas_codec::utils::KeepRaw; use pallas_primitives::{ - alonzo::{self, BootstrapWitness, NativeScript, PlutusData, VKeyWitness}, - babbage::PlutusV2Script, - conway::PlutusV3Script, + alonzo::{self, BootstrapWitness, NativeScript, VKeyWitness}, + PlutusData, PlutusScript, }; use crate::{MultiEraRedeemer, MultiEraTx}; @@ -80,7 +79,7 @@ impl<'b> MultiEraTx<'b> { } } - pub fn plutus_v1_scripts(&self) -> &[alonzo::PlutusScript] { + pub fn plutus_v1_scripts(&self) -> &[alonzo::PlutusScript<1>] { match self { Self::Byron(_) => &[], Self::AlonzoCompatible(x, _) => x @@ -181,7 +180,7 @@ impl<'b> MultiEraTx<'b> { }) } - pub fn plutus_v2_scripts(&self) -> &[PlutusV2Script] { + pub fn plutus_v2_scripts(&self) -> &[PlutusScript<2>] { match self { Self::Byron(_) => &[], Self::AlonzoCompatible(_, _) => &[], @@ -200,7 +199,7 @@ impl<'b> MultiEraTx<'b> { } } - pub fn plutus_v3_scripts(&self) -> &[PlutusV3Script] { + pub fn plutus_v3_scripts(&self) -> &[PlutusScript<3>] { match self { Self::Byron(_) => &[], Self::AlonzoCompatible(_, _) => &[], diff --git a/pallas-txbuilder/src/babbage.rs b/pallas-txbuilder/src/babbage.rs index 2cb8c74..078092a 100644 --- a/pallas-txbuilder/src/babbage.rs +++ b/pallas-txbuilder/src/babbage.rs @@ -4,10 +4,10 @@ use pallas_codec::utils::{CborWrap, KeyValuePairs}; use pallas_crypto::hash::Hash; use pallas_primitives::{ babbage::{ - DatumOption, ExUnits as PallasExUnits, NativeScript, NetworkId, PlutusData, PlutusV1Script, - PlutusV2Script, PostAlonzoTransactionOutput, PseudoScript as PallasScript, - PseudoTransactionOutput, Redeemer, RedeemerTag, TransactionBody, TransactionInput, - Tx as BabbageTx, Value, WitnessSet, + DatumOption, ExUnits as PallasExUnits, NativeScript, NetworkId, PlutusData, PlutusScript, + PostAlonzoTransactionOutput, PseudoScript as PallasScript, PseudoTransactionOutput, + Redeemer, RedeemerTag, TransactionBody, TransactionInput, Tx as BabbageTx, Value, + WitnessSet, }, Fragment, }; @@ -88,10 +88,9 @@ impl BuildBabbage for StagingTransaction { .collect(); let network_id = if let Some(nid) = self.network_id { - match nid { - 0 => Some(NetworkId::One), - 1 => Some(NetworkId::Two), - _ => return Err(TxBuilderError::InvalidNetworkId), + match NetworkId::try_from(nid) { + Err(()) => return Err(TxBuilderError::InvalidNetworkId), + Ok(network_id) => Some(network_id), } } else { None @@ -125,12 +124,12 @@ impl BuildBabbage for StagingTransaction { native_script.push(script) } ScriptKind::PlutusV1 => { - let script = PlutusV1Script(script.bytes.into()); + let script = PlutusScript::<1>(script.bytes.into()); plutus_v1_script.push(script) } ScriptKind::PlutusV2 => { - let script = PlutusV2Script(script.bytes.into()); + let script = PlutusScript::<2>(script.bytes.into()); plutus_v2_script.push(script) } @@ -313,12 +312,12 @@ impl Output { NativeScript::decode_fragment(s.bytes.as_ref()) .map_err(|_| TxBuilderError::MalformedScript)?, ), - ScriptKind::PlutusV1 => { - PallasScript::PlutusV1Script(PlutusV1Script(s.bytes.as_ref().to_vec().into())) - } - ScriptKind::PlutusV2 => { - PallasScript::PlutusV2Script(PlutusV2Script(s.bytes.as_ref().to_vec().into())) - } + ScriptKind::PlutusV1 => PallasScript::PlutusV1Script(PlutusScript::<1>( + s.bytes.as_ref().to_vec().into(), + )), + ScriptKind::PlutusV2 => PallasScript::PlutusV2Script(PlutusScript::<2>( + s.bytes.as_ref().to_vec().into(), + )), }; Some(CborWrap(script)) diff --git a/pallas-utxorpc/src/lib.rs b/pallas-utxorpc/src/lib.rs index 995ea85..27edb75 100644 --- a/pallas-utxorpc/src/lib.rs +++ b/pallas-utxorpc/src/lib.rs @@ -185,7 +185,7 @@ impl Mapper { babbage::StakeCredential::AddrKeyhash(x) => { u5c::stake_credential::StakeCredential::AddrKeyHash(x.to_vec().into()) } - babbage::StakeCredential::Scripthash(x) => { + babbage::StakeCredential::ScriptHash(x) => { u5c::stake_credential::StakeCredential::ScriptHash(x.to_vec().into()) } };