feat: apply redeemers and datum to script

This commit is contained in:
rvcas
2022-09-03 17:10:51 -04:00
parent c9072deb09
commit cf27c0c755
5 changed files with 60 additions and 62 deletions

View File

@@ -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<NamedDeBruijn> = {
let mut buffer = Vec::new();
println!("\nRedeemer:");
let prog =
Program::<FakeNamedDeBruijn>::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:");

View File

@@ -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"

View File

@@ -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<T>

View File

@@ -31,8 +31,11 @@ where
T: Binder<'b> + Debug,
{
pub fn from_cbor(bytes: &'b [u8], buffer: &'b mut Vec<u8>) -> Result<Self, de::Error> {
let flat_bytes: Vec<u8> =
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<Vec<u8>, 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