add txininfo plutus data to main
This commit is contained in:
parent
cf27c0c755
commit
d5f8b749ae
|
@ -9,8 +9,12 @@ dependencies = [
|
||||||
"anyhow",
|
"anyhow",
|
||||||
"clap",
|
"clap",
|
||||||
"hex",
|
"hex",
|
||||||
|
"pallas-addresses",
|
||||||
|
"pallas-codec",
|
||||||
"pallas-primitives",
|
"pallas-primitives",
|
||||||
"pallas-traverse",
|
"pallas-traverse",
|
||||||
|
"serde",
|
||||||
|
"serde_json",
|
||||||
"uplc",
|
"uplc",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
@ -577,15 +581,29 @@ checksum = "4501abdff3ae82a1c1b477a17252eb69cee9e66eb915c1abaa4f44d873df9f09"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "serde"
|
name = "serde"
|
||||||
version = "1.0.142"
|
version = "1.0.144"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
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]]
|
[[package]]
|
||||||
name = "serde_json"
|
name = "serde_json"
|
||||||
version = "1.0.83"
|
version = "1.0.85"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "38dd04e3c8279e75b31ef29dbdceebfe5ad89f4d0937213c53f7d49d01b3d5a7"
|
checksum = "e55a28e3aaef9d5ce0506d0a14dbba8054ddc7e499ef522dd8b26859ec9d4a44"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"itoa",
|
"itoa",
|
||||||
"ryu",
|
"ryu",
|
||||||
|
|
|
@ -15,5 +15,9 @@ anyhow = "1.0.57"
|
||||||
clap = { version = "3.1.14", features = ["derive"] }
|
clap = { version = "3.1.14", features = ["derive"] }
|
||||||
hex = "0.4.3"
|
hex = "0.4.3"
|
||||||
pallas-primitives = "0.13.2"
|
pallas-primitives = "0.13.2"
|
||||||
|
pallas-codec = "0.13.2"
|
||||||
pallas-traverse = "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" }
|
uplc = { path = '../uplc', version = "0.0.12" }
|
||||||
|
pallas-addresses = "0.13.2"
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
use std::path::PathBuf;
|
use std::{collections::HashMap, path::PathBuf};
|
||||||
|
|
||||||
use clap::{Parser, Subcommand};
|
use clap::{Parser, Subcommand};
|
||||||
|
use serde::{de, Deserialize};
|
||||||
|
|
||||||
/// Cardano smart contract toolchain
|
/// Cardano smart contract toolchain
|
||||||
#[derive(Parser)]
|
#[derive(Parser)]
|
||||||
|
@ -23,9 +24,28 @@ pub enum TxCommand {
|
||||||
input: PathBuf,
|
input: PathBuf,
|
||||||
#[clap(short, long)]
|
#[clap(short, long)]
|
||||||
cbor: bool,
|
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
|
/// Commands for working with Untyped Plutus Core
|
||||||
#[derive(Subcommand)]
|
#[derive(Subcommand)]
|
||||||
pub enum UplcCommand {
|
pub enum UplcCommand {
|
||||||
|
|
|
@ -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 pallas_traverse::{Era, MultiEraTx};
|
||||||
use uplc::{
|
use uplc::{
|
||||||
ast::{Constant, DeBruijn, FakeNamedDeBruijn, Name, NamedDeBruijn, Program, Term},
|
ast::{Constant, DeBruijn, FakeNamedDeBruijn, Name, NamedDeBruijn, Program, Term},
|
||||||
machine::cost_model::ExBudget,
|
machine::cost_model::ExBudget,
|
||||||
parser,
|
parser, PlutusData,
|
||||||
};
|
};
|
||||||
|
|
||||||
mod args;
|
mod args;
|
||||||
|
|
||||||
use args::{Args, TxCommand, UplcCommand};
|
use args::{Args, TxCommand, UplcCommand};
|
||||||
|
|
||||||
|
use crate::args::ResolvedInput;
|
||||||
|
|
||||||
fn main() -> anyhow::Result<()> {
|
fn main() -> anyhow::Result<()> {
|
||||||
let args = Args::default();
|
let args = Args::default();
|
||||||
|
|
||||||
match args {
|
match args {
|
||||||
Args::Tx(tx_cmd) => match tx_cmd {
|
Args::Tx(tx_cmd) => match tx_cmd {
|
||||||
TxCommand::Simulate { input, cbor } => {
|
TxCommand::Simulate {
|
||||||
|
input,
|
||||||
|
cbor,
|
||||||
|
resolved_inputs,
|
||||||
|
} => {
|
||||||
let tx_bytes = if cbor {
|
let tx_bytes = if cbor {
|
||||||
fs::read(input)?
|
fs::read(input)?
|
||||||
} else {
|
} else {
|
||||||
|
@ -52,6 +65,135 @@ fn main() -> anyhow::Result<()> {
|
||||||
program
|
program
|
||||||
.apply_data(datum.clone())
|
.apply_data(datum.clone())
|
||||||
.apply_data(redeemer.data.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();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue