add txininfo plutus data to main

This commit is contained in:
Kasey White 2022-09-03 18:48:51 -04:00 committed by rvcas
parent cf27c0c755
commit d5f8b749ae
No known key found for this signature in database
GPG Key ID: C09B64E263F7D68C
4 changed files with 192 additions and 8 deletions

26
Cargo.lock generated
View File

@ -9,8 +9,12 @@ dependencies = [
"anyhow",
"clap",
"hex",
"pallas-addresses",
"pallas-codec",
"pallas-primitives",
"pallas-traverse",
"serde",
"serde_json",
"uplc",
]
@ -577,15 +581,29 @@ checksum = "4501abdff3ae82a1c1b477a17252eb69cee9e66eb915c1abaa4f44d873df9f09"
[[package]]
name = "serde"
version = "1.0.142"
version = "1.0.144"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e590c437916fb6b221e1d00df6e3294f3fccd70ca7e92541c475d6ed6ef5fee2"
checksum = "0f747710de3dcd43b88c9168773254e809d8ddbdf9653b84e2554ab219f17860"
dependencies = [
"serde_derive",
]
[[package]]
name = "serde_derive"
version = "1.0.144"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "94ed3a816fb1d101812f83e789f888322c34e291f894f19590dc310963e87a00"
dependencies = [
"proc-macro2",
"quote",
"syn",
]
[[package]]
name = "serde_json"
version = "1.0.83"
version = "1.0.85"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "38dd04e3c8279e75b31ef29dbdceebfe5ad89f4d0937213c53f7d49d01b3d5a7"
checksum = "e55a28e3aaef9d5ce0506d0a14dbba8054ddc7e499ef522dd8b26859ec9d4a44"
dependencies = [
"itoa",
"ryu",

View File

@ -15,5 +15,9 @@ anyhow = "1.0.57"
clap = { version = "3.1.14", features = ["derive"] }
hex = "0.4.3"
pallas-primitives = "0.13.2"
pallas-codec = "0.13.2"
pallas-traverse = "0.13.2"
serde = { version = "1.0.144", features = ["derive"] }
serde_json = "1.0.85"
uplc = { path = '../uplc', version = "0.0.12" }
pallas-addresses = "0.13.2"

View File

@ -1,6 +1,7 @@
use std::path::PathBuf;
use std::{collections::HashMap, path::PathBuf};
use clap::{Parser, Subcommand};
use serde::{de, Deserialize};
/// Cardano smart contract toolchain
#[derive(Parser)]
@ -23,9 +24,28 @@ pub enum TxCommand {
input: PathBuf,
#[clap(short, long)]
cbor: bool,
resolved_inputs: PathBuf,
},
}
#[derive(Deserialize)]
pub struct ResolvedInput {
pub input: Input,
pub ouput: Output,
}
#[derive(Deserialize)]
pub struct Input {
pub tx_hash: String,
pub index: u64,
}
#[derive(Deserialize)]
pub struct Output {
pub address: String,
pub value: (u64, HashMap<String, HashMap<String, u64>>),
}
/// Commands for working with Untyped Plutus Core
#[derive(Subcommand)]
pub enum UplcCommand {

View File

@ -1,22 +1,35 @@
use std::{fmt::Write as _, fs};
use std::{
fmt::Write as _,
fs::{self, File},
io::BufReader, collections::HashMap, thread::LocalKey,
};
use pallas_addresses::Address;
use pallas_codec::{minicbor::bytes::ByteVec, utils::{MaybeIndefArray, KeyValuePairs}};
use pallas_primitives::babbage::{BigInt, Constr};
use pallas_traverse::{Era, MultiEraTx};
use uplc::{
ast::{Constant, DeBruijn, FakeNamedDeBruijn, Name, NamedDeBruijn, Program, Term},
machine::cost_model::ExBudget,
parser,
parser, PlutusData,
};
mod args;
use args::{Args, TxCommand, UplcCommand};
use crate::args::ResolvedInput;
fn main() -> anyhow::Result<()> {
let args = Args::default();
match args {
Args::Tx(tx_cmd) => match tx_cmd {
TxCommand::Simulate { input, cbor } => {
TxCommand::Simulate {
input,
cbor,
resolved_inputs,
} => {
let tx_bytes = if cbor {
fs::read(input)?
} else {
@ -52,6 +65,135 @@ fn main() -> anyhow::Result<()> {
program
.apply_data(datum.clone())
.apply_data(redeemer.data.clone());
let file = File::open(&resolved_inputs)?;
let reader = BufReader::new(file);
let resolved_inputs: Vec<ResolvedInput> = serde_json::from_reader(reader)?;
let tx_in_info: Vec<PlutusData> = resolved_inputs
.iter()
.map(|resolved_input| {
let tx_out_ref = PlutusData::Constr(Constr {
tag: 0,
any_constructor: None,
fields: MaybeIndefArray::Indef(vec![
PlutusData::BoundedBytes(
hex::decode(resolved_input.input.tx_hash.clone())
.unwrap()
.into(),
),
PlutusData::BigInt(BigInt::Int(
resolved_input.input.index.into(),
)),
]),
});
let address =
Address::from_bech32(&resolved_input.ouput.address).unwrap();
let payment_tag = match address.typeid() % 2 {
0 => 0,
1 => 1,
_ => unreachable!(),
};
let stake_tag = match address.typeid() {
0 | 1 => Some(0),
2 | 3 => Some(1),
_ => None,
};
let (payment_part, stake_part) = match address {
Address::Shelley(s) => {
(s.payment().to_vec(), s.delegation().to_vec())
}
_ => unreachable!(),
};
let lovelace = resolved_input.ouput.value.0;
let mut assets = resolved_input.ouput.value.1.clone();
assets.insert("".to_string(), vec![("".to_string(), lovelace)].into_iter().collect());
let tx_out = PlutusData::Constr(Constr {
tag: 0,
any_constructor: None,
fields: MaybeIndefArray::Indef(vec![
// txOutAddress
PlutusData::Constr(Constr {
tag: 0,
any_constructor: None,
fields: MaybeIndefArray::Indef(vec![
// addressCredential
PlutusData::Constr(Constr {
tag: payment_tag,
any_constructor: None,
fields: MaybeIndefArray::Indef(vec![
PlutusData::BoundedBytes(
payment_part.into(),
),
]),
}),
// addressStakingCredential
PlutusData::Constr(Constr {
tag: if stake_tag.is_some() { 0 } else { 1 },
any_constructor: None,
fields: MaybeIndefArray::Indef(
if stake_tag.is_some() {
vec![
// StakingCredential
PlutusData::Constr(Constr {
tag: 0,
any_constructor: None,
fields: MaybeIndefArray::Indef(vec![
// StakingHash
PlutusData::Constr(Constr {
tag: stake_tag.unwrap(),
any_constructor: None,
fields: MaybeIndefArray::Indef(vec![
PlutusData::BoundedBytes(
stake_part.into(),
),
]),
}),
]),
}),
]
} else {
vec![]
},
),
}),
]),
}),
// txOutValue
PlutusData::Map(KeyValuePairs::Def(
assets.iter().map(|val| {
let currency_symbol = PlutusData::BoundedBytes(hex::decode(val.0).unwrap().into());
let token_map = PlutusData::Map(KeyValuePairs::Def(
val.1.iter().map(|token| {
( PlutusData::BoundedBytes(token.0.as_bytes().to_vec().into()), PlutusData::BigInt(BigInt::Int((*token.1).into())))
}).collect()
));
(currency_symbol, token_map)
}).collect()
) ),
]),
});
PlutusData::Constr(Constr{
tag: 0,
any_constructor: None,
fields: MaybeIndefArray::Indef(vec![
tx_out_ref,
tx_out
])
})
})
.collect();
}
}