diff --git a/Cargo.lock b/Cargo.lock index 4ab8bc0c..b3ec7045 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -9,7 +9,7 @@ dependencies = [ "anyhow", "clap", "hex", - "pallas-primitives 0.13.2", + "pallas-primitives", "pallas-traverse", "uplc", ] @@ -318,20 +318,11 @@ dependencies = [ "base58", "bech32 0.8.1", "hex", - "pallas-codec 0.13.2", - "pallas-crypto 0.13.2", + "pallas-codec", + "pallas-crypto", "thiserror", ] -[[package]] -name = "pallas-codec" -version = "0.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0dce0ea17341c1a0e43e2bb4a637740198dcb09826879ce3ac5ae1c6f4398a5d" -dependencies = [ - "minicbor 0.17.1", -] - [[package]] name = "pallas-codec" version = "0.13.2" @@ -341,19 +332,6 @@ dependencies = [ "minicbor 0.17.1", ] -[[package]] -name = "pallas-crypto" -version = "0.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "051226367cd851895c73e3115d378b58495ade1ee60c3a154c0d0c30554565fa" -dependencies = [ - "cryptoxide", - "hex", - "pallas-codec 0.12.0", - "rand_core", - "thiserror", -] - [[package]] name = "pallas-crypto" version = "0.13.2" @@ -362,27 +340,11 @@ checksum = "e17a13efbe2609916de03c063d5bbef840616b02c658f3db5222785a18b63362" dependencies = [ "cryptoxide", "hex", - "pallas-codec 0.13.2", + "pallas-codec", "rand_core", "thiserror", ] -[[package]] -name = "pallas-primitives" -version = "0.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97a0fcc7d5a7120bc2b2e203ec5e7f8088107c500c0eb665569d0e77a910d3c0" -dependencies = [ - "base58", - "bech32 0.9.0", - "hex", - "log", - "pallas-codec 0.12.0", - "pallas-crypto 0.12.0", - "serde", - "serde_json", -] - [[package]] name = "pallas-primitives" version = "0.13.2" @@ -393,8 +355,8 @@ dependencies = [ "bech32 0.9.0", "hex", "log", - "pallas-codec 0.13.2", - "pallas-crypto 0.13.2", + "pallas-codec", + "pallas-crypto", "serde", "serde_json", ] @@ -407,9 +369,9 @@ checksum = "0549db2f8bbaf22d13fc35791dd50fb13a50a1290a342a98929c8ce6c422ed86" dependencies = [ "hex", "pallas-addresses", - "pallas-codec 0.13.2", - "pallas-crypto 0.13.2", - "pallas-primitives 0.13.2", + "pallas-codec", + "pallas-crypto", + "pallas-primitives", "thiserror", ] @@ -722,8 +684,8 @@ dependencies = [ "flat-rs", "hex", "minicbor 0.18.0", - "pallas-codec 0.12.0", - "pallas-primitives 0.12.0", + "pallas-codec", + "pallas-primitives", "peg", "pretty", "proptest", diff --git a/crates/cli/src/main.rs b/crates/cli/src/main.rs index 46792eeb..f53d53e5 100644 --- a/crates/cli/src/main.rs +++ b/crates/cli/src/main.rs @@ -2,7 +2,7 @@ use std::{fmt::Write as _, fs}; use pallas_traverse::{Era, MultiEraTx}; use uplc::{ - ast::{DeBruijn, FakeNamedDeBruijn, Name, NamedDeBruijn, Program, Term}, + ast::{Constant, DeBruijn, FakeNamedDeBruijn, Name, NamedDeBruijn, Program, Term}, machine::cost_model::ExBudget, parser, }; @@ -30,17 +30,30 @@ fn main() -> anyhow::Result<()> { println!("Simulating: {}", tx.hash()); - println!("\nPlutus Data:"); + let witnesses = tx.witnesses(); - println!("{:#?}", tx.witnesses().plutus_data()); + if let Some(((datums, redeemers), scripts)) = witnesses + .plutus_data() + .zip(witnesses.redeemer()) + .zip(witnesses.plutus_v1_script()) + { + for ((datum, redeemer), script) in + datums.iter().zip(redeemers.iter()).zip(scripts.iter()) + { + let program: Program = { + let mut buffer = Vec::new(); - println!("\nRedeemer:"); + let prog = + Program::::from_cbor(&script.0, &mut buffer)?; - println!("{:#?}", tx.witnesses().redeemer()); + prog.into() + }; - println!("\nPlutus V1 Script:"); - - println!("{:#?}", tx.witnesses().plutus_v1_script()); + program + .apply_data(datum.clone()) + .apply_data(redeemer.data.clone()); + } + } println!("\nPlutus V2 Script:"); diff --git a/crates/uplc/Cargo.toml b/crates/uplc/Cargo.toml index 3795fb11..336721c7 100644 --- a/crates/uplc/Cargo.toml +++ b/crates/uplc/Cargo.toml @@ -17,8 +17,8 @@ cryptoxide = "0.4.2" flat-rs = { path = "../flat", version = "0.0.10" } hex = "0.4.3" minicbor = { version = "0.18.0", features = ["std"] } -pallas-codec = "0.12.0" -pallas-primitives = "0.12.0" +pallas-codec = "0.13.2" +pallas-primitives = "0.13.2" peg = "0.8.0" pretty = "0.11.3" thiserror = "1.0.31" diff --git a/crates/uplc/src/ast.rs b/crates/uplc/src/ast.rs index fd4ef74d..55a38ae6 100644 --- a/crates/uplc/src/ast.rs +++ b/crates/uplc/src/ast.rs @@ -54,6 +54,18 @@ where term: applied_term, } } + + pub fn apply_data(&self, plutus_data: PlutusData) -> Self { + let applied_term = Term::Apply { + function: Rc::new(self.term.clone()), + argument: Rc::new(Term::Constant(Constant::Data(plutus_data))), + }; + + Program { + version: self.version, + term: applied_term, + } + } } impl<'a, T> Display for Program diff --git a/crates/uplc/src/flat.rs b/crates/uplc/src/flat.rs index 161751f8..efb5b7d1 100644 --- a/crates/uplc/src/flat.rs +++ b/crates/uplc/src/flat.rs @@ -31,8 +31,11 @@ where T: Binder<'b> + Debug, { pub fn from_cbor(bytes: &'b [u8], buffer: &'b mut Vec) -> Result { - let flat_bytes: Vec = - minicbor::decode(bytes).map_err(|err| de::Error::Message(err.to_string()))?; + let mut cbor_decoder = minicbor::Decoder::new(bytes); + + let flat_bytes = cbor_decoder + .bytes() + .map_err(|err| de::Error::Message(err.to_string()))?; buffer.extend(flat_bytes); @@ -58,7 +61,15 @@ where pub fn to_cbor(&self) -> Result, en::Error> { let flat_bytes = self.flat()?; - minicbor::to_vec(&flat_bytes).map_err(|err| en::Error::Message(err.to_string())) + let mut bytes = Vec::new(); + + let mut cbor_encoder = minicbor::Encoder::new(&mut bytes); + + cbor_encoder + .bytes(&flat_bytes) + .map_err(|err| en::Error::Message(err.to_string()))?; + + Ok(bytes) } // convenient so that people don't need to depend on the flat crate