feat: rename transaction eval and add error enum
This commit is contained in:
		
							parent
							
								
									68fc0f643e
								
							
						
					
					
						commit
						9e280f9cb5
					
				|  | @ -9,8 +9,10 @@ use uplc::{ | ||||||
|     ast::{DeBruijn, FakeNamedDeBruijn, Name, NamedDeBruijn, Program, Term}, |     ast::{DeBruijn, FakeNamedDeBruijn, Name, NamedDeBruijn, Program, Term}, | ||||||
|     machine::cost_model::ExBudget, |     machine::cost_model::ExBudget, | ||||||
|     parser, |     parser, | ||||||
|     transaction_eval::eval_tx, |     tx::{ | ||||||
|     transaction_eval::script_context::{ResolvedInput, SlotConfig}, |         self, | ||||||
|  |         script_context::{ResolvedInput, SlotConfig}, | ||||||
|  |     }, | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| mod args; | mod args; | ||||||
|  | @ -52,7 +54,7 @@ fn main() -> anyhow::Result<()> { | ||||||
|                         slot_length, |                         slot_length, | ||||||
|                     }; |                     }; | ||||||
| 
 | 
 | ||||||
|                     eval_tx(tx_babbage, &resolved_inputs, None, &slot_config)?; |                     tx::eval(tx_babbage, &resolved_inputs, None, &slot_config)?; | ||||||
|                 } |                 } | ||||||
|             } |             } | ||||||
|         }, |         }, | ||||||
|  |  | ||||||
|  | @ -6,11 +6,11 @@ pub mod machine; | ||||||
| pub mod parser; | pub mod parser; | ||||||
| mod pretty; | mod pretty; | ||||||
| pub mod program_builder; | pub mod program_builder; | ||||||
| pub mod transaction_eval; | pub mod tx; | ||||||
| 
 | 
 | ||||||
| pub use pallas_primitives::alonzo::PlutusData; | pub use pallas_primitives::alonzo::PlutusData; | ||||||
| pub type Error = Box<dyn std::error::Error>; | 
 | ||||||
| use pallas_primitives::Fragment; | use pallas_primitives::{Error, Fragment}; | ||||||
| 
 | 
 | ||||||
| pub fn plutus_data(bytes: &[u8]) -> Result<PlutusData, Error> { | pub fn plutus_data(bytes: &[u8]) -> Result<PlutusData, Error> { | ||||||
|     PlutusData::decode_fragment(bytes) |     PlutusData::decode_fragment(bytes) | ||||||
|  |  | ||||||
|  | @ -1,12 +1,10 @@ | ||||||
| use std::string::FromUtf8Error; | use std::string::FromUtf8Error; | ||||||
| 
 | 
 | ||||||
| use thiserror::Error; |  | ||||||
| 
 |  | ||||||
| use crate::ast::{NamedDeBruijn, Term, Type}; | use crate::ast::{NamedDeBruijn, Term, Type}; | ||||||
| 
 | 
 | ||||||
| use super::{ExBudget, Value}; | use super::{ExBudget, Value}; | ||||||
| 
 | 
 | ||||||
| #[derive(Error, Debug)] | #[derive(thiserror::Error, Debug)] | ||||||
| pub enum Error { | pub enum Error { | ||||||
|     #[error("Over budget mem: {} & cpu: {}", .0.mem, .0.cpu)] |     #[error("Over budget mem: {} & cpu: {}", .0.mem, .0.cpu)] | ||||||
|     OutOfExError(ExBudget), |     OutOfExError(ExBudget), | ||||||
|  |  | ||||||
|  | @ -4,20 +4,20 @@ use pallas_primitives::{ | ||||||
| }; | }; | ||||||
| use pallas_traverse::{Era, MultiEraTx}; | use pallas_traverse::{Era, MultiEraTx}; | ||||||
| 
 | 
 | ||||||
| use crate::Error; | use error::Error; | ||||||
| 
 | use script_context::{ResolvedInput, SlotConfig}; | ||||||
| use self::script_context::{ResolvedInput, SlotConfig}; |  | ||||||
| 
 | 
 | ||||||
|  | mod error; | ||||||
| mod eval; | mod eval; | ||||||
| pub mod script_context; | pub mod script_context; | ||||||
| mod to_plutus_data; | mod to_plutus_data; | ||||||
| 
 | 
 | ||||||
| pub fn eval_tx( | pub fn eval( | ||||||
|     tx: &MintedTx, |     tx: &MintedTx, | ||||||
|     utxos: &[ResolvedInput], |     utxos: &[ResolvedInput], | ||||||
|     cost_mdls: Option<&CostMdls>, |     cost_mdls: Option<&CostMdls>, | ||||||
|     slot_config: &SlotConfig, |     slot_config: &SlotConfig, | ||||||
| ) -> anyhow::Result<Vec<Redeemer>> { | ) -> Result<Vec<Redeemer>, Error> { | ||||||
|     let redeemers = tx.transaction_witness_set.redeemer.as_ref(); |     let redeemers = tx.transaction_witness_set.redeemer.as_ref(); | ||||||
| 
 | 
 | ||||||
|     let lookup_table = eval::get_script_and_datum_lookup_table(tx, utxos); |     let lookup_table = eval::get_script_and_datum_lookup_table(tx, utxos); | ||||||
|  | @ -41,7 +41,7 @@ pub fn eval_tx( | ||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| pub fn eval_tx_raw( | pub fn eval_raw( | ||||||
|     tx_bytes: &[u8], |     tx_bytes: &[u8], | ||||||
|     utxos_bytes: &[(Vec<u8>, Vec<u8>)], |     utxos_bytes: &[(Vec<u8>, Vec<u8>)], | ||||||
|     cost_mdls_bytes: &[u8], |     cost_mdls_bytes: &[u8], | ||||||
|  | @ -68,7 +68,7 @@ pub fn eval_tx_raw( | ||||||
|     }; |     }; | ||||||
| 
 | 
 | ||||||
|     match multi_era_tx { |     match multi_era_tx { | ||||||
|         MultiEraTx::Babbage(tx) => match eval_tx(&tx, &utxos, Some(&cost_mdls), &sc) { |         MultiEraTx::Babbage(tx) => match eval(&tx, &utxos, Some(&cost_mdls), &sc) { | ||||||
|             Ok(redeemers) => Ok(redeemers |             Ok(redeemers) => Ok(redeemers | ||||||
|                 .iter() |                 .iter() | ||||||
|                 .map(|r| r.encode_fragment().unwrap()) |                 .map(|r| r.encode_fragment().unwrap()) | ||||||
|  | @ -96,7 +96,7 @@ mod tests { | ||||||
|     }; |     }; | ||||||
|     use pallas_traverse::{Era, MultiEraTx}; |     use pallas_traverse::{Era, MultiEraTx}; | ||||||
| 
 | 
 | ||||||
|     use super::{eval_tx, ResolvedInput, SlotConfig}; |     use super::{eval, ResolvedInput, SlotConfig}; | ||||||
| 
 | 
 | ||||||
|     #[test] |     #[test] | ||||||
|     fn test_eval() { |     fn test_eval() { | ||||||
|  | @ -322,7 +322,7 @@ mod tests { | ||||||
|             .unwrap(); |             .unwrap(); | ||||||
|         match multi_era_tx { |         match multi_era_tx { | ||||||
|             MultiEraTx::Babbage(tx) => { |             MultiEraTx::Babbage(tx) => { | ||||||
|                 let redeemers = eval_tx(&tx, &utxos, Some(&cost_mdl), &slot_config).unwrap(); |                 let redeemers = eval(&tx, &utxos, Some(&cost_mdl), &slot_config).unwrap(); | ||||||
| 
 | 
 | ||||||
|                 assert_eq!(redeemers.len(), 1) |                 assert_eq!(redeemers.len(), 1) | ||||||
|             } |             } | ||||||
|  | @ -556,7 +556,7 @@ mod tests { | ||||||
|             .unwrap(); |             .unwrap(); | ||||||
|         match multi_era_tx { |         match multi_era_tx { | ||||||
|             MultiEraTx::Babbage(tx) => { |             MultiEraTx::Babbage(tx) => { | ||||||
|                 let redeemers = eval_tx(&tx, &utxos, Some(&cost_mdl), &slot_config).unwrap(); |                 let redeemers = eval(&tx, &utxos, Some(&cost_mdl), &slot_config).unwrap(); | ||||||
| 
 | 
 | ||||||
|                 println!("{:?}", redeemers.len()); |                 println!("{:?}", redeemers.len()); | ||||||
|             } |             } | ||||||
|  | @ -626,7 +626,7 @@ mod tests { | ||||||
|             .unwrap(); |             .unwrap(); | ||||||
|         match multi_era_tx { |         match multi_era_tx { | ||||||
|             MultiEraTx::Babbage(tx) => { |             MultiEraTx::Babbage(tx) => { | ||||||
|                 let redeemers = eval_tx(&tx, &utxos, Some(&cost_mdl), &slot_config).unwrap(); |                 let redeemers = eval(&tx, &utxos, Some(&cost_mdl), &slot_config).unwrap(); | ||||||
| 
 | 
 | ||||||
|                 println!("{:?}", redeemers.len()); |                 println!("{:?}", redeemers.len()); | ||||||
|             } |             } | ||||||
|  | @ -0,0 +1,7 @@ | ||||||
|  | use crate::machine; | ||||||
|  | 
 | ||||||
|  | #[derive(thiserror::Error, Debug)] | ||||||
|  | pub enum Error { | ||||||
|  |     #[error("Runtime error")] | ||||||
|  |     Machine(#[from] machine::Error), | ||||||
|  | } | ||||||
|  | @ -20,6 +20,7 @@ use super::{ | ||||||
|         TxInfoV1, TxInfoV2, TxOut, |         TxInfoV1, TxInfoV2, TxOut, | ||||||
|     }, |     }, | ||||||
|     to_plutus_data::ToPlutusData, |     to_plutus_data::ToPlutusData, | ||||||
|  |     Error, | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| fn slot_to_begin_posix_time(slot: u64, sc: &SlotConfig) -> u64 { | fn slot_to_begin_posix_time(slot: u64, sc: &SlotConfig) -> u64 { | ||||||
|  | @ -58,7 +59,7 @@ pub struct DataLookupTable { | ||||||
| pub fn get_tx_in_info_v1( | pub fn get_tx_in_info_v1( | ||||||
|     inputs: &[TransactionInput], |     inputs: &[TransactionInput], | ||||||
|     utxos: &[ResolvedInput], |     utxos: &[ResolvedInput], | ||||||
| ) -> anyhow::Result<Vec<TxInInfo>> { | ) -> Result<Vec<TxInInfo>, Error> { | ||||||
|     let result = inputs |     let result = inputs | ||||||
|         .iter() |         .iter() | ||||||
|         .map(|input| { |         .map(|input| { | ||||||
|  | @ -105,7 +106,7 @@ pub fn get_tx_in_info_v1( | ||||||
| fn get_tx_in_info_v2( | fn get_tx_in_info_v2( | ||||||
|     inputs: &[TransactionInput], |     inputs: &[TransactionInput], | ||||||
|     utxos: &[ResolvedInput], |     utxos: &[ResolvedInput], | ||||||
| ) -> anyhow::Result<Vec<TxInInfo>> { | ) -> Result<Vec<TxInInfo>, Error> { | ||||||
|     let result = inputs |     let result = inputs | ||||||
|         .iter() |         .iter() | ||||||
|         .map(|input| { |         .map(|input| { | ||||||
|  | @ -142,7 +143,7 @@ fn get_script_purpose( | ||||||
|     mint: &Option<Mint>, |     mint: &Option<Mint>, | ||||||
|     dcert: &Option<Vec<Certificate>>, |     dcert: &Option<Vec<Certificate>>, | ||||||
|     wdrl: &Option<Withdrawals>, |     wdrl: &Option<Withdrawals>, | ||||||
| ) -> anyhow::Result<ScriptPurpose> { | ) -> Result<ScriptPurpose, Error> { | ||||||
|     // sorting according to specs section 4.1: https://hydra.iohk.io/build/18583827/download/1/alonzo-changes.pdf
 |     // sorting according to specs section 4.1: https://hydra.iohk.io/build/18583827/download/1/alonzo-changes.pdf
 | ||||||
|     let tag = redeemer.tag.clone(); |     let tag = redeemer.tag.clone(); | ||||||
|     let index = redeemer.index; |     let index = redeemer.index; | ||||||
|  | @ -226,7 +227,7 @@ fn get_tx_info_v1( | ||||||
|     tx: &MintedTx, |     tx: &MintedTx, | ||||||
|     utxos: &[ResolvedInput], |     utxos: &[ResolvedInput], | ||||||
|     slot_config: &SlotConfig, |     slot_config: &SlotConfig, | ||||||
| ) -> anyhow::Result<TxInfo> { | ) -> Result<TxInfo, Error> { | ||||||
|     let body = tx.transaction_body.clone(); |     let body = tx.transaction_body.clone(); | ||||||
| 
 | 
 | ||||||
|     if body.reference_inputs.is_some() { |     if body.reference_inputs.is_some() { | ||||||
|  | @ -289,7 +290,7 @@ fn get_tx_info_v2( | ||||||
|     tx: &MintedTx, |     tx: &MintedTx, | ||||||
|     utxos: &[ResolvedInput], |     utxos: &[ResolvedInput], | ||||||
|     slot_config: &SlotConfig, |     slot_config: &SlotConfig, | ||||||
| ) -> anyhow::Result<TxInfo> { | ) -> Result<TxInfo, Error> { | ||||||
|     let body = tx.transaction_body.clone(); |     let body = tx.transaction_body.clone(); | ||||||
| 
 | 
 | ||||||
|     let inputs = get_tx_in_info_v2(&body.inputs, utxos)?; |     let inputs = get_tx_in_info_v2(&body.inputs, utxos)?; | ||||||
|  | @ -557,7 +558,7 @@ pub fn eval_redeemer( | ||||||
|     redeemer: &Redeemer, |     redeemer: &Redeemer, | ||||||
|     lookup_table: &DataLookupTable, |     lookup_table: &DataLookupTable, | ||||||
|     cost_mdls_opt: Option<&CostMdls>, |     cost_mdls_opt: Option<&CostMdls>, | ||||||
| ) -> anyhow::Result<Redeemer> { | ) -> Result<Redeemer, Error> { | ||||||
|     let purpose = get_script_purpose( |     let purpose = get_script_purpose( | ||||||
|         redeemer, |         redeemer, | ||||||
|         &tx.transaction_body.inputs, |         &tx.transaction_body.inputs, | ||||||
		Loading…
	
		Reference in New Issue
	
	 rvcas
						rvcas