diff --git a/Cargo.lock b/Cargo.lock index 58dc6f16..4ab8bc0c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -8,6 +8,9 @@ version = "0.0.12" dependencies = [ "anyhow", "clap", + "hex", + "pallas-primitives 0.13.2", + "pallas-traverse", "uplc", ] @@ -46,6 +49,12 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6107fe1be6682a68940da878d9e9f5e90ca5745b3dec9fd1bb393c8777d4f581" +[[package]] +name = "bech32" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf9ff0bbfd639f15c74af777d81383cf53efb7c93613f6cab67c6c11e05bbf8b" + [[package]] name = "bech32" version = "0.9.0" @@ -300,6 +309,20 @@ version = "6.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "029d8d0b2f198229de29dca79676f2738ff952edf3fde542eb8bf94d8c21b435" +[[package]] +name = "pallas-addresses" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712ead72b4f40d09f1c8660c47340489862754609cc2d587f24874ce55e51492" +dependencies = [ + "base58", + "bech32 0.8.1", + "hex", + "pallas-codec 0.13.2", + "pallas-crypto 0.13.2", + "thiserror", +] + [[package]] name = "pallas-codec" version = "0.12.0" @@ -309,6 +332,15 @@ dependencies = [ "minicbor 0.17.1", ] +[[package]] +name = "pallas-codec" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1758a68b9b2332a24403cf484ea2dd05dd14cceeb6f7b63cb8d11137865fb4cf" +dependencies = [ + "minicbor 0.17.1", +] + [[package]] name = "pallas-crypto" version = "0.12.0" @@ -317,7 +349,20 @@ checksum = "051226367cd851895c73e3115d378b58495ade1ee60c3a154c0d0c30554565fa" dependencies = [ "cryptoxide", "hex", - "pallas-codec", + "pallas-codec 0.12.0", + "rand_core", + "thiserror", +] + +[[package]] +name = "pallas-crypto" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e17a13efbe2609916de03c063d5bbef840616b02c658f3db5222785a18b63362" +dependencies = [ + "cryptoxide", + "hex", + "pallas-codec 0.13.2", "rand_core", "thiserror", ] @@ -329,15 +374,45 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "97a0fcc7d5a7120bc2b2e203ec5e7f8088107c500c0eb665569d0e77a910d3c0" dependencies = [ "base58", - "bech32", + "bech32 0.9.0", "hex", "log", - "pallas-codec", - "pallas-crypto", + "pallas-codec 0.12.0", + "pallas-crypto 0.12.0", "serde", "serde_json", ] +[[package]] +name = "pallas-primitives" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24f8d900bac04b711d2c4b21e906680224efd02d312a87ce25e688595b91d1fc" +dependencies = [ + "base58", + "bech32 0.9.0", + "hex", + "log", + "pallas-codec 0.13.2", + "pallas-crypto 0.13.2", + "serde", + "serde_json", +] + +[[package]] +name = "pallas-traverse" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0549db2f8bbaf22d13fc35791dd50fb13a50a1290a342a98929c8ce6c422ed86" +dependencies = [ + "hex", + "pallas-addresses", + "pallas-codec 0.13.2", + "pallas-crypto 0.13.2", + "pallas-primitives 0.13.2", + "thiserror", +] + [[package]] name = "peg" version = "0.8.0" @@ -647,8 +722,8 @@ dependencies = [ "flat-rs", "hex", "minicbor 0.18.0", - "pallas-codec", - "pallas-primitives", + "pallas-codec 0.12.0", + "pallas-primitives 0.12.0", "peg", "pretty", "proptest", diff --git a/crates/cli/Cargo.toml b/crates/cli/Cargo.toml index 699249d7..8d3e11a7 100644 --- a/crates/cli/Cargo.toml +++ b/crates/cli/Cargo.toml @@ -13,4 +13,7 @@ authors = ["Lucas Rosa ", "Kasey White "] [dependencies] anyhow = "1.0.57" clap = { version = "3.1.14", features = ["derive"] } +hex = "0.4.3" +pallas-primitives = "0.13.2" +pallas-traverse = "0.13.2" uplc = { path = '../uplc', version = "0.0.12" } diff --git a/crates/cli/src/args.rs b/crates/cli/src/args.rs index 032c36b1..15f0436f 100644 --- a/crates/cli/src/args.rs +++ b/crates/cli/src/args.rs @@ -7,11 +7,25 @@ use clap::{Parser, Subcommand}; #[clap(version, about, long_about = None)] #[clap(propagate_version = true)] pub enum Args { + /// A subcommand for working with transactions + #[clap(subcommand)] + Tx(TxCommand), /// A subcommand for working with Untyped Plutus Core #[clap(subcommand)] Uplc(UplcCommand), } +/// Commands for working with transactions +#[derive(Subcommand)] +pub enum TxCommand { + /// Simulate a transaction by evaluating it's script + Simulate { + input: PathBuf, + #[clap(short, long)] + cbor: bool, + }, +} + /// Commands for working with Untyped Plutus Core #[derive(Subcommand)] pub enum UplcCommand { diff --git a/crates/cli/src/main.rs b/crates/cli/src/main.rs index 322fca9a..d54f035a 100644 --- a/crates/cli/src/main.rs +++ b/crates/cli/src/main.rs @@ -1,5 +1,6 @@ use std::{fmt::Write as _, fs}; +use pallas_traverse::{Era, MultiEraTx}; use uplc::{ ast::{DeBruijn, FakeNamedDeBruijn, Name, NamedDeBruijn, Program, Term}, machine::cost_model::ExBudget, @@ -8,13 +9,29 @@ use uplc::{ mod args; -use args::{Args, UplcCommand}; +use args::{Args, TxCommand, UplcCommand}; fn main() -> anyhow::Result<()> { let args = Args::default(); match args { - Args::Uplc(uplc) => match uplc { + Args::Tx(tx_cmd) => match tx_cmd { + TxCommand::Simulate { input, cbor } => { + let tx_bytes = if cbor { + fs::read(input)? + } else { + let cbor_hex = fs::read_to_string(input)?; + + hex::decode(cbor_hex)? + }; + + let tx = MultiEraTx::decode(Era::Alonzo, &tx_bytes) + .or_else(|_| MultiEraTx::decode(Era::Byron, &tx_bytes))?; + + println!("{:?}", tx); + } + }, + Args::Uplc(uplc_cmd) => match uplc_cmd { UplcCommand::Flat { input, print, out } => { let code = std::fs::read_to_string(&input)?;