use pallas_codec::utils::MaybeIndefArray; use pallas_primitives::{ babbage::{CostMdls, TransactionInput, TransactionOutput}, Fragment, }; use pallas_traverse::{Era, MultiEraTx}; use crate::machine::cost_model::ExBudget; use super::{eval_phase_two, ResolvedInput, SlotConfig}; #[test] fn test_eval() { /* PlutusV2 {-# INLINEABLE mintTestValidator #-} mintTestValidator :: () -> Api.ScriptContext -> Bool mintTestValidator _ ctx = Api.txInfoFee txInfo == Api.txInfoFee txInfo && (case Api.txInfoSignatories txInfo of [] -> True) where txInfo :: Api.TxInfo txInfo = Api.scriptContextTxInfo ctx */ let tx_bytes = hex::decode("84a80081825820975c17a4fed0051be622328efa548e206657d2b65a19224bf6ff8132571e6a5002018282581d60b6c8794e9a7a26599440a4d0fd79cd07644d15917ff13694f1f67235821a000f41f0a1581cc4f241450001af08f3ddbaf9335db79883cbcd81071b8e3508de3055a1400a82581d60b6c8794e9a7a26599440a4d0fd79cd07644d15917ff13694f1f672351a0084192f021a00053b6109a1581cc4f241450001af08f3ddbaf9335db79883cbcd81071b8e3508de3055a1400a0b5820b4f96b0acec8beff2adededa8ba317bcac92174f0f65ccefe569b9a6aac7375a0d818258206c732139de33e916342707de2aebef2252c781640326ff37b86ec99d97f1ba8d011082581d60b6c8794e9a7a26599440a4d0fd79cd07644d15917ff13694f1f672351b00000001af0cdfa2111a0007d912a3008182582031ae74f8058527afb305d7495b10a99422d9337fc199e1f28044f2c477a0f9465840b8b97b7c3b4e19ecfc2fcd9884ee53a35887ee6e4d36901b9ecbac3fe032d7e8a4358305afa573a86396e378255651ed03501906e9def450e588d4bb36f42a050581840100d87980821a000b68081a0cf3a5bf06815909b25909af010000323322323232323232323232323232323232323232332232323232323232323233223232223232533533223233025323233355300f1200135028502623500122333553012120013502b50292350012233350012330314800000488cc0c80080048cc0c400520000013355300e1200123500122335501c0023335001233553012120012350012233550200023550140010012233355500f0150020012335530121200123500122335502000235501300100133355500a01000200130105002300f5001533532350012222222222220045001102a2216135001220023333573466e1cd55ce9baa0044800080808c98c8080cd5ce01081000f1999ab9a3370e6aae7540092000233221233001003002323232323232323232323232323333573466e1cd55cea8062400046666666666664444444444442466666666666600201a01801601401201000e00c00a00800600466a03803a6ae854030cd4070074d5d0a80599a80e00f1aba1500a3335502075ca03e6ae854024ccd54081d7280f9aba1500833501c02835742a00e666aa040052eb4d5d0a8031919191999ab9a3370e6aae75400920002332212330010030023232323333573466e1cd55cea8012400046644246600200600466a066eb4d5d0a801181a1aba135744a004464c6406c66ae700dc0d80d04d55cf280089baa00135742a0046464646666ae68cdc39aab9d5002480008cc8848cc00400c008cd40cdd69aba150023034357426ae8940088c98c80d8cd5ce01b81b01a09aab9e5001137540026ae84d5d1280111931901919ab9c033032030135573ca00226ea8004d5d0a80299a80e3ae35742a008666aa04004a40026ae85400cccd54081d710009aba150023027357426ae8940088c98c80b8cd5ce01781701609aba25001135744a00226ae8940044d5d1280089aba25001135744a00226ae8940044d5d1280089aba25001135744a00226aae7940044dd50009aba150023017357426ae8940088c98c8080cd5ce01081000f080f89931900f99ab9c4901035054350001f135573ca00226ea8004444888ccd54c010480054040cd54c01c480048d400488cd54054008d54024004ccd54c0104800488d4008894cd4ccd54c03048004c8cd409c88ccd400c88008008004d40048800448cc004894cd400840b040040a48d400488cc028008014018400c4cd405001000d4044004cd54c01c480048d400488c8cd5405800cc004014c8004d540a4894cd40044d5402800c884d4008894cd4cc03000802044888cc0080280104c01800c008c8004d5408888448894cd40044008884cc014008ccd54c01c480040140100044484888c00c0104484888c004010c8004d5407c8844894cd400454038884cd403cc010008cd54c01848004010004c8004d5407888448894cd40044d400c88004884ccd401488008c010008ccd54c01c4800401401000488ccd5cd19b8f00200101e01d2350012222222222220091232230023758002640026aa038446666aae7c004940288cd4024c010d5d080118019aba2002015232323333573466e1cd55cea80124000466442466002006004601a6ae854008c014d5d09aba2500223263201533573802c02a02626aae7940044dd50009191919191999ab9a3370e6aae75401120002333322221233330010050040030023232323333573466e1cd55cea80124000466442466002006004602c6ae854008cd4040054d5d09aba2500223263201a33573803603403026aae7940044dd50009aba150043335500875ca00e6ae85400cc8c8c8cccd5cd19b875001480108c84888c008010d5d09aab9e500323333573466e1d4009200223212223001004375c6ae84d55cf280211999ab9a3370ea00690001091100191931900e19ab9c01d01c01a019018135573aa00226ea8004d5d0a80119a8063ae357426ae8940088c98c8058cd5ce00b80b00a09aba25001135744a00226aae7940044dd5000899aa800bae75a224464460046eac004c8004d5406488c8cccd55cf80112804119a80399aa80498031aab9d5002300535573ca00460086ae8800c04c4d5d08008891001091091198008020018891091980080180109119191999ab9a3370ea0029000119091180100198029aba135573ca00646666ae68cdc3a801240044244002464c6402066ae700440400380344d55cea80089baa001232323333573466e1d400520062321222230040053007357426aae79400c8cccd5cd19b875002480108c848888c008014c024d5d09aab9e500423333573466e1d400d20022321222230010053007357426aae7940148cccd5cd19b875004480008c848888c00c014dd71aba135573ca00c464c6402066ae7004404003803403002c4d55cea80089baa001232323333573466e1cd55cea80124000466442466002006004600a6ae854008dd69aba135744a004464c6401866ae700340300284d55cf280089baa0012323333573466e1cd55cea800a400046eb8d5d09aab9e500223263200a33573801601401026ea80048c8c8c8c8c8cccd5cd19b8750014803084888888800c8cccd5cd19b875002480288488888880108cccd5cd19b875003480208cc8848888888cc004024020dd71aba15005375a6ae84d5d1280291999ab9a3370ea00890031199109111111198010048041bae35742a00e6eb8d5d09aba2500723333573466e1d40152004233221222222233006009008300c35742a0126eb8d5d09aba2500923333573466e1d40192002232122222223007008300d357426aae79402c8cccd5cd19b875007480008c848888888c014020c038d5d09aab9e500c23263201333573802802602202001e01c01a01801626aae7540104d55cf280189aab9e5002135573ca00226ea80048c8c8c8c8cccd5cd19b875001480088ccc888488ccc00401401000cdd69aba15004375a6ae85400cdd69aba135744a00646666ae68cdc3a80124000464244600400660106ae84d55cf280311931900619ab9c00d00c00a009135573aa00626ae8940044d55cf280089baa001232323333573466e1d400520022321223001003375c6ae84d55cf280191999ab9a3370ea004900011909118010019bae357426aae7940108c98c8024cd5ce00500480380309aab9d50011375400224464646666ae68cdc3a800a40084244400246666ae68cdc3a8012400446424446006008600c6ae84d55cf280211999ab9a3370ea00690001091100111931900519ab9c00b00a008007006135573aa00226ea80048c8cccd5cd19b8750014800880348cccd5cd19b8750024800080348c98c8018cd5ce00380300200189aab9d37540029309000a4810350543100112330010020072253350021001100612335002223335003220020020013500122001122123300100300222333573466e1c00800401000c488008488004448c8c00400488cc00cc008008005f5f6").unwrap(); let raw_inputs = hex::decode("84825820b16778c9cf065d9efeefe37ec269b4fc5107ecdbd0dd6bf3274b224165c2edd9008258206c732139de33e916342707de2aebef2252c781640326ff37b86ec99d97f1ba8d01825820975c17a4fed0051be622328efa548e206657d2b65a19224bf6ff8132571e6a500282582018f86700660fc88d0370a8f95ea58f75507e6b27a18a17925ad3b1777eb0d77600").unwrap(); let raw_outputs = hex::decode("8482581d60b6c8794e9a7a26599440a4d0fd79cd07644d15917ff13694f1f67235821a000f8548a1581c15be994a64bdb79dde7fe080d8e7ff81b33a9e4860e9ee0d857a8e85a144576177610182581d60b6c8794e9a7a26599440a4d0fd79cd07644d15917ff13694f1f672351b00000001af14b8b482581d60b6c8794e9a7a26599440a4d0fd79cd07644d15917ff13694f1f672351a0098968082581d60b6c8794e9a7a26599440a4d0fd79cd07644d15917ff13694f1f672351a00acd8c6").unwrap(); let inputs = Vec::::decode_fragment(&raw_inputs).unwrap(); let outputs = Vec::::decode_fragment(&raw_outputs).unwrap(); let utxos: Vec = inputs .iter() .zip(outputs.iter()) .map(|(input, output)| ResolvedInput { input: input.clone(), output: output.clone(), }) .collect(); let slot_config = SlotConfig { zero_time: 1660003200000, // Preview network zero_slot: 0, slot_length: 1000, }; let costs: Vec = vec![ 205665, 812, 1, 1, 1000, 571, 0, 1, 1000, 24177, 4, 1, 1000, 32, 117366, 10475, 4, 23000, 100, 23000, 100, 23000, 100, 23000, 100, 23000, 100, 23000, 100, 100, 100, 23000, 100, 19537, 32, 175354, 32, 46417, 4, 221973, 511, 0, 1, 89141, 32, 497525, 14068, 4, 2, 196500, 453240, 220, 0, 1, 1, 1000, 28662, 4, 2, 245000, 216773, 62, 1, 1060367, 12586, 1, 208512, 421, 1, 187000, 1000, 52998, 1, 80436, 32, 43249, 32, 1000, 32, 80556, 1, 57667, 4, 1000, 10, 197145, 156, 1, 197145, 156, 1, 204924, 473, 1, 208896, 511, 1, 52467, 32, 64832, 32, 65493, 32, 22558, 32, 16563, 32, 76511, 32, 196500, 453240, 220, 0, 1, 1, 69522, 11687, 0, 1, 60091, 32, 196500, 453240, 220, 0, 1, 1, 196500, 453240, 220, 0, 1, 1, 1159724, 392670, 0, 2, 806990, 30482, 4, 1927926, 82523, 4, 265318, 0, 4, 0, 85931, 32, 205665, 812, 1, 1, 41182, 32, 212342, 32, 31220, 32, 32696, 32, 43357, 32, 32247, 32, 38314, 32, 20000000000, 20000000000, 9462713, 1021, 10, 20000000000, 0, 20000000000, ]; let cost_mdl = CostMdls { plutus_v1: None, plutus_v2: Some(costs), }; let initial_budget = ExBudget { cpu: 10000000000, mem: 14000000, }; let multi_era_tx = MultiEraTx::decode(Era::Babbage, &tx_bytes) .or_else(|_| MultiEraTx::decode(Era::Alonzo, &tx_bytes)) .unwrap(); match multi_era_tx { MultiEraTx::Babbage(tx) => { let redeemers = eval_phase_two( &tx, &utxos, Some(&cost_mdl), Some(&initial_budget), &slot_config, false, ) .unwrap(); assert_eq!(redeemers.len(), 1); let total_budget_used = redeemers .iter() .fold(ExBudget { mem: 0, cpu: 0 }, |accum, curr| ExBudget { mem: accum.mem + curr.ex_units.mem as i64, cpu: accum.cpu + curr.ex_units.steps as i64, }); println!("{:?}", total_budget_used); assert_eq!( total_budget_used, // Numbers came uplc evaluate ExBudget { cpu: 217294271, mem: 747528 } ); } _ => unreachable!(), }; } #[test] fn test_eval_1() { /* Haskell PLC: (738928, 215316271) Aiken PLC: (721484, 210171376) PlutusV2 {-# INLINEABLE mintTestValidator #-} mintTestValidator :: () -> Api.ScriptContext -> Bool mintTestValidator _ ctx = Api.txInfoFee txInfo == Api.txInfoFee txInfo where txInfo :: Api.TxInfo txInfo = Api.scriptContextTxInfo ctx */ let tx_bytes = hex::decode("84a800818258206c732139de33e916342707de2aebef2252c781640326ff37b86ec99d97f1ba8d01018282581d60b6c8794e9a7a26599440a4d0fd79cd07644d15917ff13694f1f67235821a000f41f0a1581c88c9dfd60601e22509d58b904c2730fe2bdef6a52a41a6f376b0ba94a1400a82581d60b6c8794e9a7a26599440a4d0fd79cd07644d15917ff13694f1f672351b00000001af004152021a0005357209a1581c88c9dfd60601e22509d58b904c2730fe2bdef6a52a41a6f376b0ba94a1400a0b5820ff1a62ad8cb2d73ffb8687471e2c99b48bf3b067966a7ea9285f95adcee708a20d818258206c732139de33e916342707de2aebef2252c781640326ff37b86ec99d97f1ba8d011082581d60b6c8794e9a7a26599440a4d0fd79cd07644d15917ff13694f1f672351b00000001af0ce889111a0007d02ba3008182582031ae74f8058527afb305d7495b10a99422d9337fc199e1f28044f2c477a0f9465840b3dde25e3a2b825d3f120955211e722cc4a7c65fa67697076f2725a2ed0adec0d4bfc742934fe7c29d475bb0630aed1b1cdcf5fac9e06d84976455a661b0dc080581840100d87980821a000b46701a0cd5772f068159099a59099701000032332232323232323232323232323232323232323322323232323232323232332232322232325335332232323233355300f1200135027502623500122333553012120013502a50292350012233350012330304800000488cc0c40080048cc0c000520000013355300e1200123500122335501c0023335001233553012120012350012233550200023550140010012233355500f0150020012335530121200123500122335502000235501300100133355500a01000200130105002300f5001135001220023333573466e1cd55ce9baa0044800080808c98c8080cd5ce01081000f1999ab9a3370e6aae7540092000233221233001003002323232323232323232323232323333573466e1cd55cea8062400046666666666664444444444442466666666666600201a01801601401201000e00c00a00800600466a03803a6ae854030cd4070074d5d0a80599a80e00f1aba1500a3335502075ca03e6ae854024ccd54081d7280f9aba1500833501c02835742a00e666aa040052eb4d5d0a8031919191999ab9a3370e6aae75400920002332212330010030023232323333573466e1cd55cea8012400046644246600200600466a066eb4d5d0a801181a1aba135744a004464c6406c66ae700dc0d80d04d55cf280089baa00135742a0046464646666ae68cdc39aab9d5002480008cc8848cc00400c008cd40cdd69aba150023034357426ae8940088c98c80d8cd5ce01b81b01a09aab9e5001137540026ae84d5d1280111931901919ab9c033032030135573ca00226ea8004d5d0a80299a80e3ae35742a008666aa04004a40026ae85400cccd54081d710009aba150023027357426ae8940088c98c80b8cd5ce01781701609aba25001135744a00226ae8940044d5d1280089aba25001135744a00226ae8940044d5d1280089aba25001135744a00226aae7940044dd50009aba150023017357426ae8940088c98c8080cd5ce01081000f080f89931900f99ab9c491035054350001f135573ca00226ea8004444888ccd54c010480054040cd54c01c480048d400488cd54054008d54024004ccd54c0104800488d4008894cd4ccd54c03048004c8cd409888ccd400c88008008004d40048800448cc004894cd400840ac40040a08d400488cc028008014018400c4cd405001000d4044004cd54c01c480048d400488c8cd5405800cc004014c8004d540a0894cd40044d5402800c884d4008894cd4cc03000802044888cc0080280104c01800c008c8004d5408488448894cd40044008884cc014008ccd54c01c480040140100044484888c00c0104484888c004010c8004d540788844894cd400454038884cd403cc010008cd54c01848004010004c8004d5407488448894cd40044d400c88004884ccd401488008c010008ccd54c01c4800401401000488ccd5cd19b8f00200101d01c2350012222222222220091232230023758002640026aa036446666aae7c004940288cd4024c010d5d080118019aba2002015232323333573466e1cd55cea80124000466442466002006004601a6ae854008c014d5d09aba2500223263201533573802c02a02626aae7940044dd50009191919191999ab9a3370e6aae75401120002333322221233330010050040030023232323333573466e1cd55cea80124000466442466002006004602c6ae854008cd4040054d5d09aba2500223263201a33573803603403026aae7940044dd50009aba150043335500875ca00e6ae85400cc8c8c8cccd5cd19b875001480108c84888c008010d5d09aab9e500323333573466e1d4009200223212223001004375c6ae84d55cf280211999ab9a3370ea00690001091100191931900e19ab9c01d01c01a019018135573aa00226ea8004d5d0a80119a8063ae357426ae8940088c98c8058cd5ce00b80b00a09aba25001135744a00226aae7940044dd5000899aa800bae75a224464460046eac004c8004d5406088c8cccd55cf80112804119a80399aa80498031aab9d5002300535573ca00460086ae8800c04c4d5d08008891001091091198008020018891091980080180109119191999ab9a3370ea0029000119091180100198029aba135573ca00646666ae68cdc3a801240044244002464c6402066ae700440400380344d55cea80089baa001232323333573466e1d400520062321222230040053007357426aae79400c8cccd5cd19b875002480108c848888c008014c024d5d09aab9e500423333573466e1d400d20022321222230010053007357426aae7940148cccd5cd19b875004480008c848888c00c014dd71aba135573ca00c464c6402066ae7004404003803403002c4d55cea80089baa001232323333573466e1cd55cea80124000466442466002006004600a6ae854008dd69aba135744a004464c6401866ae700340300284d55cf280089baa0012323333573466e1cd55cea800a400046eb8d5d09aab9e500223263200a33573801601401026ea80048c8c8c8c8c8cccd5cd19b8750014803084888888800c8cccd5cd19b875002480288488888880108cccd5cd19b875003480208cc8848888888cc004024020dd71aba15005375a6ae84d5d1280291999ab9a3370ea00890031199109111111198010048041bae35742a00e6eb8d5d09aba2500723333573466e1d40152004233221222222233006009008300c35742a0126eb8d5d09aba2500923333573466e1d40192002232122222223007008300d357426aae79402c8cccd5cd19b875007480008c848888888c014020c038d5d09aab9e500c23263201333573802802602202001e01c01a01801626aae7540104d55cf280189aab9e5002135573ca00226ea80048c8c8c8c8cccd5cd19b875001480088ccc888488ccc00401401000cdd69aba15004375a6ae85400cdd69aba135744a00646666ae68cdc3a80124000464244600400660106ae84d55cf280311931900619ab9c00d00c00a009135573aa00626ae8940044d55cf280089baa001232323333573466e1d400520022321223001003375c6ae84d55cf280191999ab9a3370ea004900011909118010019bae357426aae7940108c98c8024cd5ce00500480380309aab9d50011375400224464646666ae68cdc3a800a40084244400246666ae68cdc3a8012400446424446006008600c6ae84d55cf280211999ab9a3370ea00690001091100111931900519ab9c00b00a008007006135573aa00226ea80048c8cccd5cd19b8750014800880308cccd5cd19b8750024800080308c98c8018cd5ce00380300200189aab9d37540029309000a4810350543100112330012253350021001100700612335002223335003220020020013500122001122123300100300222333573466e1c00800401000c488008488004448c8c00400488cc00cc0080080041f5f6").unwrap(); let raw_inputs = hex::decode("84825820b16778c9cf065d9efeefe37ec269b4fc5107ecdbd0dd6bf3274b224165c2edd9008258206c732139de33e916342707de2aebef2252c781640326ff37b86ec99d97f1ba8d01825820975c17a4fed0051be622328efa548e206657d2b65a19224bf6ff8132571e6a500282582018f86700660fc88d0370a8f95ea58f75507e6b27a18a17925ad3b1777eb0d77600").unwrap(); let raw_outputs = hex::decode("8482581d60b6c8794e9a7a26599440a4d0fd79cd07644d15917ff13694f1f67235821a000f8548a1581c15be994a64bdb79dde7fe080d8e7ff81b33a9e4860e9ee0d857a8e85a144576177610182581d60b6c8794e9a7a26599440a4d0fd79cd07644d15917ff13694f1f672351b00000001af14b8b482581d60b6c8794e9a7a26599440a4d0fd79cd07644d15917ff13694f1f672351a0098968082581d60b6c8794e9a7a26599440a4d0fd79cd07644d15917ff13694f1f672351a00acd8c6").unwrap(); let inputs = MaybeIndefArray::::decode_fragment(&raw_inputs).unwrap(); let outputs = MaybeIndefArray::::decode_fragment(&raw_outputs).unwrap(); let utxos: MaybeIndefArray = MaybeIndefArray::Indef( inputs .iter() .zip(outputs.iter()) .map(|(input, output)| ResolvedInput { input: input.clone(), output: output.clone(), }) .collect(), ); let slot_config = SlotConfig { zero_time: 1660003200000, // Preview network zero_slot: 0, slot_length: 1000, }; let costs: Vec = vec![ 205665, 812, 1, 1, 1000, 571, 0, 1, 1000, 24177, 4, 1, 1000, 32, 117366, 10475, 4, 23000, 100, 23000, 100, 23000, 100, 23000, 100, 23000, 100, 23000, 100, 100, 100, 23000, 100, 19537, 32, 175354, 32, 46417, 4, 221973, 511, 0, 1, 89141, 32, 497525, 14068, 4, 2, 196500, 453240, 220, 0, 1, 1, 1000, 28662, 4, 2, 245000, 216773, 62, 1, 1060367, 12586, 1, 208512, 421, 1, 187000, 1000, 52998, 1, 80436, 32, 43249, 32, 1000, 32, 80556, 1, 57667, 4, 1000, 10, 197145, 156, 1, 197145, 156, 1, 204924, 473, 1, 208896, 511, 1, 52467, 32, 64832, 32, 65493, 32, 22558, 32, 16563, 32, 76511, 32, 196500, 453240, 220, 0, 1, 1, 69522, 11687, 0, 1, 60091, 32, 196500, 453240, 220, 0, 1, 1, 196500, 453240, 220, 0, 1, 1, 1159724, 392670, 0, 2, 806990, 30482, 4, 1927926, 82523, 4, 265318, 0, 4, 0, 85931, 32, 205665, 812, 1, 1, 41182, 32, 212342, 32, 31220, 32, 32696, 32, 43357, 32, 32247, 32, 38314, 32, 20000000000, 20000000000, 9462713, 1021, 10, 20000000000, 0, 20000000000, ]; let cost_mdl = CostMdls { plutus_v1: None, plutus_v2: Some(costs), }; let initial_budget = ExBudget { cpu: 10000000000, mem: 14000000, }; let multi_era_tx = MultiEraTx::decode(Era::Babbage, &tx_bytes) .or_else(|_| MultiEraTx::decode(Era::Alonzo, &tx_bytes)) .unwrap(); match multi_era_tx { MultiEraTx::Babbage(tx) => { let redeemers = eval_phase_two( &tx, &utxos, Some(&cost_mdl), Some(&initial_budget), &slot_config, false, ) .unwrap(); assert_eq!(redeemers.len(), 1); let total_budget_used = redeemers .iter() .fold(ExBudget { mem: 0, cpu: 0 }, |accum, curr| ExBudget { mem: accum.mem + curr.ex_units.mem as i64, cpu: accum.cpu + curr.ex_units.steps as i64, }); println!("{:?}", total_budget_used); assert_eq!( total_budget_used, // Numbers came uplc evaluate ExBudget { cpu: 215316271, mem: 738928 } ); } _ => unreachable!(), }; } #[test] fn test_eval_2() { /* Haskell PLC: (655782, 188449458) Aiken PLC: (638338, 183304563) Plutus V1 {-# INLINEABLE mintTestValidator #-} mintTestValidator :: () -> Api.ScriptContext -> Bool mintTestValidator _ ctx = Api.txInfoFee txInfo == Api.txInfoFee txInfo where txInfo :: Api.TxInfo txInfo = Api.scriptContextTxInfo ctx */ let tx_bytes = hex::decode("84a800818258206c732139de33e916342707de2aebef2252c781640326ff37b86ec99d97f1ba8d01018282581d60b6c8794e9a7a26599440a4d0fd79cd07644d15917ff13694f1f67235821a000f41f0a1581ccba7bc9e83499376b6ad49304157778dba7c14bd748e4fd31792a930a1400a82581d60b6c8794e9a7a26599440a4d0fd79cd07644d15917ff13694f1f672351b00000001af006ac1021a00050c0309a1581ccba7bc9e83499376b6ad49304157778dba7c14bd748e4fd31792a930a1400a0b5820eb3b868ec2b33dffaf5d5481703ed00870333812b96e0f75ae89fd150b4744300d818258206c732139de33e916342707de2aebef2252c781640326ff37b86ec99d97f1ba8d011082581d60b6c8794e9a7a26599440a4d0fd79cd07644d15917ff13694f1f672351b00000001af0d26af111a00079205a3008182582031ae74f8058527afb305d7495b10a99422d9337fc199e1f28044f2c477a0f94658405a2dd70be89483bd6291a018c6ca91328dad37e092fdeab2eea14685004878da5f1e5962f35d771498bf54e79be3dcf922ea93b46a1356960dcf0bfd80a91b0b038159094259093f010000323322323232323232323232323232323232323233223232323232323232332232322232325335332232323233355300f12001350265025235001223335530121200135029502823500122333500123302f4800000488cc0c00080048cc0bc00520000013355300e120012350012233550250023335001233553012120012350012233550290023550140010012233355500f0150020012335530121200123500122335502900235501300100133355500a01000200130105002300f5001135001220023333573466e1cd55ce9baa00448000807c8c98c8078cd5ce01000f80e1999ab9a3370e6aae754009200023322123300100300232323232323232323232323333573466e1cd55cea8052400046666666666444444444424666666666600201601401201000e00c00a00800600466a034464646666ae68cdc39aab9d5002480008cc8848cc00400c008c094d5d0a801180f9aba135744a004464c6405c66ae700c00bc0b04d55cf280089baa00135742a01466a0340366ae854024ccd54075d7280e1aba150083335501d75ca0386ae85401ccd4068094d5d0a80319a80d19aa8140133ad35742a00a6464646666ae68cdc39aab9d5002480008cc8848cc00400c008c8c8c8cccd5cd19b8735573aa004900011991091980080180119a815bad35742a00460586ae84d5d1280111931901919ab9c034033030135573ca00226ea8004d5d0a8011919191999ab9a3370e6aae754009200023322123300100300233502b75a6ae854008c0b0d5d09aba2500223263203233573806806606026aae7940044dd50009aba135744a004464c6405c66ae700c00bc0b04d55cf280089baa00135742a00866a034eb8d5d0a80199a80d19aa8143ae200135742a00460446ae84d5d1280111931901519ab9c02c02b028135744a00226ae8940044d5d1280089aba25001135744a00226ae8940044d5d1280089aba25001135573ca00226ea8004d5d0a8011919191999ab9a3370ea0029003119091111802002980e9aba135573ca00646666ae68cdc3a8012400846424444600400a603e6ae84d55cf280211999ab9a3370ea0069001119091111800802980d9aba135573ca00a46666ae68cdc3a8022400046424444600600a6eb8d5d09aab9e500623263202533573804e04c04604404204026aae7540044dd50009aba135744a004464c6403c66ae7008007c07040784c98c8074cd5ce249035054350001e135573ca00226ea8004444888ccd54c01048005403ccd54c01c480048d400488cd54078008d54024004ccd54c0104800488d4008894cd4ccd54c03048004c8cd409488ccd400c88008008004d40048800448cc004894cd400840a8400409c8d400488cc028008014018400c4cd404c01000d4040004cd54c01c480048d400488c8cd5407c00cc004014c8004d5409c894cd40044d5402800c884d4008894cd4cc03000802044888cc0080280104c01800c008c8004d5408088448894cd40044008884cc014008ccd54c01c480040140100044484888c00c0104484888c004010c8004d540748844894cd400454034884cd4038c010008cd54c01848004010004c8004d5407088448894cd40044d400c88004884ccd401488008c010008ccd54c01c4800401401000488ccd5cd19b8f00200101c01b23500122222222220081232230023758002640026aa034446666aae7c004940248cd4020c010d5d080118019aba200201423232323333573466e1cd55cea801a40004666444246660020080060046464646666ae68cdc39aab9d5002480008cc8848cc00400c008c054d5d0a80119a80700a1aba135744a004464c6403066ae700680640584d55cf280089baa00135742a006666aa00eeb94018d5d0a80119a8053ae357426ae8940088c98c8050cd5ce00b00a80909aba25001135573ca00226ea80044cd54005d73ad112232230023756002640026aa03044646666aae7c008940208cd401ccd5404cc018d55cea80118029aab9e500230043574400602626ae840044488008488488cc00401000c488c8c8cccd5cd19b875001480008c8488c00800cc014d5d09aab9e500323333573466e1d40092002212200123263201033573802402201c01a26aae7540044dd5000919191999ab9a3370e6aae7540092000233221233001003002300535742a0046eb4d5d09aba2500223263200d33573801e01c01626aae7940044dd50009191999ab9a3370e6aae75400520002375c6ae84d55cf280111931900599ab9c00d00c0091375400224464646666ae68cdc3a800a40084244400246666ae68cdc3a8012400446424446006008600c6ae84d55cf280211999ab9a3370ea00690001091100111931900719ab9c01000f00c00b00a135573aa00226ea80048c8cccd5cd19b8750014800880448cccd5cd19b8750024800080448c98c8028cd5ce00600580400389aab9d3754002464646464646666ae68cdc3a800a401842444444400646666ae68cdc3a8012401442444444400846666ae68cdc3a801a40104664424444444660020120106eb8d5d0a8029bad357426ae8940148cccd5cd19b875004480188cc8848888888cc008024020dd71aba15007375c6ae84d5d1280391999ab9a3370ea00a900211991091111111980300480418061aba15009375c6ae84d5d1280491999ab9a3370ea00c900111909111111180380418069aba135573ca01646666ae68cdc3a803a400046424444444600a010601c6ae84d55cf280611931900919ab9c01401301000f00e00d00c00b00a135573aa00826aae79400c4d55cf280109aab9e5001137540024646464646666ae68cdc3a800a4004466644424466600200a0080066eb4d5d0a8021bad35742a0066eb4d5d09aba2500323333573466e1d4009200023212230020033008357426aae7940188c98c802ccd5ce00680600480409aab9d5003135744a00226aae7940044dd5000919191999ab9a3370ea002900111909118008019bae357426aae79400c8cccd5cd19b875002480008c8488c00800cdd71aba135573ca008464c6401066ae700280240180144d55cea80089baa0011122232323333573466e1cd55cea80124000466aa010600c6ae854008c014d5d09aba2500223263200833573801401200c26aae7940044dd5000a4c22442466002006004240029210350543100112330012253350021001100700612335002223335003220020020013500122001122123300100300222333573466e1c00800401000c488008488004448c8c00400488cc00cc00800800410581840100d87980821a000a01a61a0b3b82b2f5f6").unwrap(); let raw_inputs = hex::decode("84825820b16778c9cf065d9efeefe37ec269b4fc5107ecdbd0dd6bf3274b224165c2edd9008258206c732139de33e916342707de2aebef2252c781640326ff37b86ec99d97f1ba8d01825820975c17a4fed0051be622328efa548e206657d2b65a19224bf6ff8132571e6a500282582018f86700660fc88d0370a8f95ea58f75507e6b27a18a17925ad3b1777eb0d77600").unwrap(); let raw_outputs = hex::decode("8482581d60b6c8794e9a7a26599440a4d0fd79cd07644d15917ff13694f1f67235821a000f8548a1581c15be994a64bdb79dde7fe080d8e7ff81b33a9e4860e9ee0d857a8e85a144576177610182581d60b6c8794e9a7a26599440a4d0fd79cd07644d15917ff13694f1f672351b00000001af14b8b482581d60b6c8794e9a7a26599440a4d0fd79cd07644d15917ff13694f1f672351a0098968082581d60b6c8794e9a7a26599440a4d0fd79cd07644d15917ff13694f1f672351a00acd8c6").unwrap(); let inputs = MaybeIndefArray::::decode_fragment(&raw_inputs).unwrap(); let outputs = MaybeIndefArray::::decode_fragment(&raw_outputs).unwrap(); let utxos: MaybeIndefArray = MaybeIndefArray::Indef( inputs .iter() .zip(outputs.iter()) .map(|(input, output)| ResolvedInput { input: input.clone(), output: output.clone(), }) .collect(), ); let slot_config = SlotConfig { zero_time: 1660003200000, // Preview network zero_slot: 0, slot_length: 1000, }; let costs: Vec = vec![ 205665, 812, 1, 1, 1000, 571, 0, 1, 1000, 24177, 4, 1, 1000, 32, 117366, 10475, 4, 23000, 100, 23000, 100, 23000, 100, 23000, 100, 23000, 100, 23000, 100, 100, 100, 23000, 100, 19537, 32, 175354, 32, 46417, 4, 221973, 511, 0, 1, 89141, 32, 497525, 14068, 4, 2, 196500, 453240, 220, 0, 1, 1, 1000, 28662, 4, 2, 245000, 216773, 62, 1, 1060367, 12586, 1, 208512, 421, 1, 187000, 1000, 52998, 1, 80436, 32, 43249, 32, 1000, 32, 80556, 1, 57667, 4, 1000, 10, 197145, 156, 1, 197145, 156, 1, 204924, 473, 1, 208896, 511, 1, 52467, 32, 64832, 32, 65493, 32, 22558, 32, 16563, 32, 76511, 32, 196500, 453240, 220, 0, 1, 1, 69522, 11687, 0, 1, 60091, 32, 196500, 453240, 220, 0, 1, 1, 196500, 453240, 220, 0, 1, 1, 806990, 30482, 4, 1927926, 82523, 4, 265318, 0, 4, 0, 85931, 32, 205665, 812, 1, 1, 41182, 32, 212342, 32, 31220, 32, 32696, 32, 43357, 32, 32247, 32, 38314, 32, 9462713, 1021, 10, ]; let cost_mdl = CostMdls { plutus_v1: Some(costs), plutus_v2: None, }; let initial_budget = ExBudget { cpu: 10000000000, mem: 14000000, }; let multi_era_tx = MultiEraTx::decode(Era::Babbage, &tx_bytes) .or_else(|_| MultiEraTx::decode(Era::Alonzo, &tx_bytes)) .unwrap(); match multi_era_tx { MultiEraTx::Babbage(tx) => { let redeemers = eval_phase_two( &tx, &utxos, Some(&cost_mdl), Some(&initial_budget), &slot_config, false, ) .unwrap(); assert_eq!(redeemers.len(), 1); let total_budget_used = redeemers .iter() .fold(ExBudget { mem: 0, cpu: 0 }, |accum, curr| ExBudget { mem: accum.mem + curr.ex_units.mem as i64, cpu: accum.cpu + curr.ex_units.steps as i64, }); println!("{:?}", total_budget_used); assert_eq!( total_budget_used, // Numbers came uplc evaluate ExBudget { cpu: 188449458, mem: 655782 } ); } _ => unreachable!(), }; } #[test] fn test_eval_3() { /* Plutus V2 {-# INLINEABLE mintTestValidator #-} mintTestValidator :: () -> Api.ScriptContext -> Bool mintTestValidator _ ctx = True */ let tx_bytes = hex::decode("84a80081825820275b5da338c8b899035081eb34bfa950b634911a5dd3271b3ad6cf4c2bba0c50010182825839000af00cc47500bb64cfffb783e8c42f746b4e8b8a70ede9c08c7113acf3bde34d1041f5a2076ef9aa6cf4539ab1a96ed462a0300acbdb65d5821a00111958a1581c74184f56338d719f7888d9719ff0c8a9d9550c0f46165e09831cdba9a1400a825839000af00cc47500bb64cfffb783e8c42f746b4e8b8a70ede9c08c7113acf3bde34d1041f5a2076ef9aa6cf4539ab1a96ed462a0300acbdb65d51a029d7d51021a0004ba2809a1581c74184f56338d719f7888d9719ff0c8a9d9550c0f46165e09831cdba9a1400a0b5820901a846f82e9b756b94686bc56109ca62e7724cbb99091b0b971bcb1c8ce98530d81825820275b5da338c8b899035081eb34bfa950b634911a5dd3271b3ad6cf4c2bba0c500110825839000af00cc47500bb64cfffb783e8c42f746b4e8b8a70ede9c08c7113acf3bde34d1041f5a2076ef9aa6cf4539ab1a96ed462a0300acbdb65d51a02ac3995111a0007173ca30081825820065dd553fbe4e240a8f819bb9e333a7483de4a22b65c7fb6a95ce9450f84dff7584063f5dd2edfd43a5c0fc066d0230e5a5ba4b201bc75b22f94bfa5344c0ff9cd08c0018b5cc0f0e34cd2ab4e8c59954834330ba63a1b875c0cb3b5fd1ac68db4060581840100d87980821a0008e6681a0ae626b7068159078259077f0100003232323232323232323232323232332232323232322232325335332201a3333573466e1cd55ce9baa00448000805c8c98c805ccd5ce00c00b80a9999ab9a3370e6aae7540092000233221233001003002323232323232323232323232323333573466e1cd55cea8062400046666666666664444444444442466666666666600201a01801601401201000e00c00a00800600466a02802a6ae854030cd4050054d5d0a80599a80a00b1aba1500a3335501875ca02e6ae854024ccd54061d7280b9aba1500833501401f35742a00e666aa030040eb4d5d0a8031919191999ab9a3370e6aae75400920002332212330010030023232323333573466e1cd55cea8012400046644246600200600466a054eb4d5d0a80118159aba135744a004464c6405a66ae700b80b40ac4d55cf280089baa00135742a0046464646666ae68cdc39aab9d5002480008cc8848cc00400c008cd40a9d69aba15002302b357426ae8940088c98c80b4cd5ce01701681589aab9e5001137540026ae84d5d1280111931901499ab9c02a029027135573ca00226ea8004d5d0a80299a80a3ae35742a008666aa03003840026ae85400cccd54061d710009aba15002301e357426ae8940088c98c8094cd5ce01301281189aba25001135744a00226ae8940044d5d1280089aba25001135744a00226ae8940044d5d1280089aba25001135744a00226aae7940044dd50009aba15002300e357426ae8940088c98c805ccd5ce00c00b80a880b09931900b19ab9c4910350543500016135573ca00226ea800448c88c008dd6000990009aa80a911999aab9f0012500a233500930043574200460066ae880080508c8c8cccd5cd19b8735573aa004900011991091980080180118061aba150023005357426ae8940088c98c8050cd5ce00a80a00909aab9e5001137540024646464646666ae68cdc39aab9d5004480008cccc888848cccc00401401000c008c8c8c8cccd5cd19b8735573aa0049000119910919800801801180a9aba1500233500f014357426ae8940088c98c8064cd5ce00d00c80b89aab9e5001137540026ae854010ccd54021d728039aba150033232323333573466e1d4005200423212223002004357426aae79400c8cccd5cd19b875002480088c84888c004010dd71aba135573ca00846666ae68cdc3a801a400042444006464c6403666ae7007006c06406005c4d55cea80089baa00135742a00466a016eb8d5d09aba2500223263201533573802c02a02626ae8940044d5d1280089aab9e500113754002266aa002eb9d6889119118011bab00132001355012223233335573e0044a010466a00e66442466002006004600c6aae754008c014d55cf280118021aba200301213574200222440042442446600200800624464646666ae68cdc3a800a40004642446004006600a6ae84d55cf280191999ab9a3370ea0049001109100091931900819ab9c01101000e00d135573aa00226ea80048c8c8cccd5cd19b875001480188c848888c010014c01cd5d09aab9e500323333573466e1d400920042321222230020053009357426aae7940108cccd5cd19b875003480088c848888c004014c01cd5d09aab9e500523333573466e1d40112000232122223003005375c6ae84d55cf280311931900819ab9c01101000e00d00c00b135573aa00226ea80048c8c8cccd5cd19b8735573aa004900011991091980080180118029aba15002375a6ae84d5d1280111931900619ab9c00d00c00a135573ca00226ea80048c8cccd5cd19b8735573aa002900011bae357426aae7940088c98c8028cd5ce00580500409baa001232323232323333573466e1d4005200c21222222200323333573466e1d4009200a21222222200423333573466e1d400d2008233221222222233001009008375c6ae854014dd69aba135744a00a46666ae68cdc3a8022400c4664424444444660040120106eb8d5d0a8039bae357426ae89401c8cccd5cd19b875005480108cc8848888888cc018024020c030d5d0a8049bae357426ae8940248cccd5cd19b875006480088c848888888c01c020c034d5d09aab9e500b23333573466e1d401d2000232122222223005008300e357426aae7940308c98c804ccd5ce00a00980880800780700680600589aab9d5004135573ca00626aae7940084d55cf280089baa0012323232323333573466e1d400520022333222122333001005004003375a6ae854010dd69aba15003375a6ae84d5d1280191999ab9a3370ea0049000119091180100198041aba135573ca00c464c6401866ae700340300280244d55cea80189aba25001135573ca00226ea80048c8c8cccd5cd19b875001480088c8488c00400cdd71aba135573ca00646666ae68cdc3a8012400046424460040066eb8d5d09aab9e500423263200933573801401200e00c26aae7540044dd500089119191999ab9a3370ea00290021091100091999ab9a3370ea00490011190911180180218031aba135573ca00846666ae68cdc3a801a400042444004464c6401466ae7002c02802001c0184d55cea80089baa0012323333573466e1d40052002200723333573466e1d40092000212200123263200633573800e00c00800626aae74dd5000a4c2400292010350543100122002112323001001223300330020020011f5f6").unwrap(); let raw_inputs = hex::decode("8682582075a419179618ca358554fc47aeb33b6c93d12ba8f752495a4e5ef6ea0a1a099a03825820b810e77e706ccaebf7284f6c3d41e2a1eb4af5fabae452618f4175ad1b2aaded03825820975c17a4fed0051be622328efa548e206657d2b65a19224bf6ff8132571e6a50038258207453531a00f98db47c8c2b05e5c38f2c40a0be4f91d42d835bc3bc998b612a8e00825820452b2fc0d170323f86ad1e5b761dcae912774c42c1b1af4de2905a094f2f541403825820275b5da338c8b899035081eb34bfa950b634911a5dd3271b3ad6cf4c2bba0c5001").unwrap(); let raw_outputs = hex::decode("86825839000af00cc47500bb64cfffb783e8c42f746b4e8b8a70ede9c08c7113acf3bde34d1041f5a2076ef9aa6cf4539ab1a96ed462a0300acbdb65d5821a00412c6aad581c01dd79d464e2446231d662c9422445c4cf709b691baceb8b040a34d4a14d28323232294d6174726978363701581c11638d4d600d32b2849c93314e7e6bc656fded924f30514749e1eb3ea64c28323232294d617472697830014c28323232294d617472697831014d28323232294d61747269783133014d28323232294d61747269783330014d28323232294d61747269783534014d28323232294d6174726978383601581c1e60ac8228a21f6e3685c73970584aa54504a0476c4b66f3ef5c4dd2a14c28323232294d61747269783001581c25da1064122988292665c14259ea26cb4dd96d7f04535125fea248ffa14c28323232294d61747269783001581c46214283f4b5cc5d66836a4fe743e121190f1e5b91448a1b52f1b7bfa14d28323232294d6174726978313801581c4788a484721270845917e0986ab55b51922a46b514eb7a1f871e917ca14d28323232294d6174726978323101581c6ed9951ddcd79c98bc50142ba033890815330d4de1cb4c96870a234ca24c28323232294d617472697830014c28323232294d61747269783101581c6f7fd77c85b9856bdb1cfac1afa90c65d92c3c5e2fcca4a993e7fb52a14d28323232294d6174726978323401581ca07afd05db7f0ccb144052935be97b48593e5c8435f9eb859191de81a34c28323232294d617472697830014c28323232294d617472697831014d28323232294d6174726978323101581ca5ca38805c14270ec4c3c1c2446b28a95324054fac98066c5e82a016a14d28323232294d6174726978313901581ca65e6e94d1a260dbc6c4d9319b45585fa54b83742a33a2c599df56b9a2494265727279436f616c014c426572727954616e67656c6f01581cb3e2625ebd6bd613ce904db9fedb0565eec0671054d30d08bc5edadda44c28323232294d617472697835014d28323232294d61747269783237014d28323232294d61747269783430014d28323232294d6174726978343701581ce3ef435a5910f74d890b2a7cb0d1f7288efc22c75823d57acdab9f52a14d28323232294d6174726978363101825839000af00cc47500bb64cfffb783e8c42f746b4e8b8a70ede9c08c7113acf3bde34d1041f5a2076ef9aa6cf4539ab1a96ed462a0300acbdb65d5821a0011f436a1581c11638d4d600d32b2849c93314e7e6bc656fded924f30514749e1eb3ea14d28323232294d6174726978363801825839000af00cc47500bb64cfffb783e8c42f746b4e8b8a70ede9c08c7113acf3bde34d1041f5a2076ef9aa6cf4539ab1a96ed462a0300acbdb65d5821a0011f436a1581c11638d4d600d32b2849c93314e7e6bc656fded924f30514749e1eb3ea14d28323232294d6174726978343101825839000af00cc47500bb64cfffb783e8c42f746b4e8b8a70ede9c08c7113acf3bde34d1041f5a2076ef9aa6cf4539ab1a96ed462a0300acbdb65d5821a0012378ea1581c2c04f7a15aec58b2bec5dab3d201f3e3898370b98d2f01d4ac8bc270a14d28323232294d6174726978323801825839000af00cc47500bb64cfffb783e8c42f746b4e8b8a70ede9c08c7113acf3bde34d1041f5a2076ef9aa6cf4539ab1a96ed462a0300acbdb65d5821a0011f436a1581c11638d4d600d32b2849c93314e7e6bc656fded924f30514749e1eb3ea14d28323232294d6174726978323101825839000af00cc47500bb64cfffb783e8c42f746b4e8b8a70ede9c08c7113acf3bde34d1041f5a2076ef9aa6cf4539ab1a96ed462a0300acbdb65d51a02b350d1").unwrap(); let inputs = MaybeIndefArray::::decode_fragment(&raw_inputs).unwrap(); let outputs = MaybeIndefArray::::decode_fragment(&raw_outputs).unwrap(); let utxos: MaybeIndefArray = MaybeIndefArray::Indef( inputs .iter() .zip(outputs.iter()) .map(|(input, output)| ResolvedInput { input: input.clone(), output: output.clone(), }) .collect(), ); let slot_config = SlotConfig { zero_time: 1660003200000, // Preview network zero_slot: 0, slot_length: 1000, }; let costs: Vec = vec![ 205665, 812, 1, 1, 1000, 571, 0, 1, 1000, 24177, 4, 1, 1000, 32, 117366, 10475, 4, 23000, 100, 23000, 100, 23000, 100, 23000, 100, 23000, 100, 23000, 100, 100, 100, 23000, 100, 19537, 32, 175354, 32, 46417, 4, 221973, 511, 0, 1, 89141, 32, 497525, 14068, 4, 2, 196500, 453240, 220, 0, 1, 1, 1000, 28662, 4, 2, 245000, 216773, 62, 1, 1060367, 12586, 1, 208512, 421, 1, 187000, 1000, 52998, 1, 80436, 32, 43249, 32, 1000, 32, 80556, 1, 57667, 4, 1000, 10, 197145, 156, 1, 197145, 156, 1, 204924, 473, 1, 208896, 511, 1, 52467, 32, 64832, 32, 65493, 32, 22558, 32, 16563, 32, 76511, 32, 196500, 453240, 220, 0, 1, 1, 69522, 11687, 0, 1, 60091, 32, 196500, 453240, 220, 0, 1, 1, 196500, 453240, 220, 0, 1, 1, 1159724, 392670, 0, 2, 806990, 30482, 4, 1927926, 82523, 4, 265318, 0, 4, 0, 85931, 32, 205665, 812, 1, 1, 41182, 32, 212342, 32, 31220, 32, 32696, 32, 43357, 32, 32247, 32, 38314, 32, 20000000000, 20000000000, 9462713, 1021, 10, 20000000000, 0, 20000000000, ]; let cost_mdl = CostMdls { plutus_v1: None, plutus_v2: Some(costs), }; let initial_budget = ExBudget { cpu: 10000000000, mem: 14000000, }; let multi_era_tx = MultiEraTx::decode(Era::Babbage, &tx_bytes) .or_else(|_| MultiEraTx::decode(Era::Alonzo, &tx_bytes)) .unwrap(); match multi_era_tx { MultiEraTx::Babbage(tx) => { let redeemers = eval_phase_two( &tx, &utxos, Some(&cost_mdl), Some(&initial_budget), &slot_config, false, ) .unwrap(); assert_eq!(redeemers.len(), 1); let total_budget_used = redeemers .iter() .fold(ExBudget { mem: 0, cpu: 0 }, |accum, curr| ExBudget { mem: accum.mem + curr.ex_units.mem as i64, cpu: accum.cpu + curr.ex_units.steps as i64, }); println!("{:?}", total_budget_used); assert_eq!( total_budget_used, // Numbers came uplc evaluate ExBudget { cpu: 182855351, mem: 583272 } ); } _ => unreachable!(), }; } #[test] fn test_eval_4() { /* Plutus V1 Helios script: func main() Bool { false } */ let tx_bytes = hex::decode("84A80081825820275B5DA338C8B899035081EB34BFA950B634911A5DD3271B3AD6CF4C2BBA0C50010182825839000AF00CC47500BB64CFFFB783E8C42F746B4E8B8A70EDE9C08C7113ACF3BDE34D1041F5A2076EF9AA6CF4539AB1A96ED462A0300ACBDB65D5821A00111958A1581C1E8BCA1FA1D937F408AFE2FD4DBF343AB7A09CF07984071ED95B3C92A1400A825839000AF00CC47500BB64CFFFB783E8C42F746B4E8B8A70EDE9C08C7113ACF3BDE34D1041F5A2076EF9AA6CF4539AB1A96ED462A0300ACBDB65D51A029F7B29021A0002BC5009A1581C1E8BCA1FA1D937F408AFE2FD4DBF343AB7A09CF07984071ED95B3C92A1400A0B58205013DBE72526511F63B0C4A235FBBC5D09D11D42F310113AAAB1A28E01E0BDE60D81825820275B5DA338C8B899035081EB34BFA950B634911A5DD3271B3AD6CF4C2BBA0C500110825839000AF00CC47500BB64CFFFB783E8C42F746B4E8B8A70EDE9C08C7113ACF3BDE34D1041F5A2076EF9AA6CF4539AB1A96ED462A0300ACBDB65D51A02AF3659111A00041A78A30081825820065DD553FBE4E240A8F819BB9E333A7483DE4A22B65C7FB6A95CE9450F84DFF758401679B607EABEF3DBBC9AC0ABB03AFB3A979EA32243BB5B99E299290D709BB4A6C2AA528C447C2DB610A103CC9C0E7C018CAA4FC8322D8EC217620E6D4BC2EF0B03815453010000322233335734600693124C4C931250010581840100D87980821909611A00094D78F5F6").unwrap(); let raw_inputs = hex::decode("8682582075a419179618ca358554fc47aeb33b6c93d12ba8f752495a4e5ef6ea0a1a099a03825820b810e77e706ccaebf7284f6c3d41e2a1eb4af5fabae452618f4175ad1b2aaded03825820975c17a4fed0051be622328efa548e206657d2b65a19224bf6ff8132571e6a50038258207453531a00f98db47c8c2b05e5c38f2c40a0be4f91d42d835bc3bc998b612a8e00825820452b2fc0d170323f86ad1e5b761dcae912774c42c1b1af4de2905a094f2f541403825820275b5da338c8b899035081eb34bfa950b634911a5dd3271b3ad6cf4c2bba0c5001").unwrap(); let raw_outputs = hex::decode("86825839000af00cc47500bb64cfffb783e8c42f746b4e8b8a70ede9c08c7113acf3bde34d1041f5a2076ef9aa6cf4539ab1a96ed462a0300acbdb65d5821a00412c6aad581c01dd79d464e2446231d662c9422445c4cf709b691baceb8b040a34d4a14d28323232294d6174726978363701581c11638d4d600d32b2849c93314e7e6bc656fded924f30514749e1eb3ea64c28323232294d617472697830014c28323232294d617472697831014d28323232294d61747269783133014d28323232294d61747269783330014d28323232294d61747269783534014d28323232294d6174726978383601581c1e60ac8228a21f6e3685c73970584aa54504a0476c4b66f3ef5c4dd2a14c28323232294d61747269783001581c25da1064122988292665c14259ea26cb4dd96d7f04535125fea248ffa14c28323232294d61747269783001581c46214283f4b5cc5d66836a4fe743e121190f1e5b91448a1b52f1b7bfa14d28323232294d6174726978313801581c4788a484721270845917e0986ab55b51922a46b514eb7a1f871e917ca14d28323232294d6174726978323101581c6ed9951ddcd79c98bc50142ba033890815330d4de1cb4c96870a234ca24c28323232294d617472697830014c28323232294d61747269783101581c6f7fd77c85b9856bdb1cfac1afa90c65d92c3c5e2fcca4a993e7fb52a14d28323232294d6174726978323401581ca07afd05db7f0ccb144052935be97b48593e5c8435f9eb859191de81a34c28323232294d617472697830014c28323232294d617472697831014d28323232294d6174726978323101581ca5ca38805c14270ec4c3c1c2446b28a95324054fac98066c5e82a016a14d28323232294d6174726978313901581ca65e6e94d1a260dbc6c4d9319b45585fa54b83742a33a2c599df56b9a2494265727279436f616c014c426572727954616e67656c6f01581cb3e2625ebd6bd613ce904db9fedb0565eec0671054d30d08bc5edadda44c28323232294d617472697835014d28323232294d61747269783237014d28323232294d61747269783430014d28323232294d6174726978343701581ce3ef435a5910f74d890b2a7cb0d1f7288efc22c75823d57acdab9f52a14d28323232294d6174726978363101825839000af00cc47500bb64cfffb783e8c42f746b4e8b8a70ede9c08c7113acf3bde34d1041f5a2076ef9aa6cf4539ab1a96ed462a0300acbdb65d5821a0011f436a1581c11638d4d600d32b2849c93314e7e6bc656fded924f30514749e1eb3ea14d28323232294d6174726978363801825839000af00cc47500bb64cfffb783e8c42f746b4e8b8a70ede9c08c7113acf3bde34d1041f5a2076ef9aa6cf4539ab1a96ed462a0300acbdb65d5821a0011f436a1581c11638d4d600d32b2849c93314e7e6bc656fded924f30514749e1eb3ea14d28323232294d6174726978343101825839000af00cc47500bb64cfffb783e8c42f746b4e8b8a70ede9c08c7113acf3bde34d1041f5a2076ef9aa6cf4539ab1a96ed462a0300acbdb65d5821a0012378ea1581c2c04f7a15aec58b2bec5dab3d201f3e3898370b98d2f01d4ac8bc270a14d28323232294d6174726978323801825839000af00cc47500bb64cfffb783e8c42f746b4e8b8a70ede9c08c7113acf3bde34d1041f5a2076ef9aa6cf4539ab1a96ed462a0300acbdb65d5821a0011f436a1581c11638d4d600d32b2849c93314e7e6bc656fded924f30514749e1eb3ea14d28323232294d6174726978323101825839000af00cc47500bb64cfffb783e8c42f746b4e8b8a70ede9c08c7113acf3bde34d1041f5a2076ef9aa6cf4539ab1a96ed462a0300acbdb65d51a02b350d1").unwrap(); let inputs = MaybeIndefArray::::decode_fragment(&raw_inputs).unwrap(); let outputs = MaybeIndefArray::::decode_fragment(&raw_outputs).unwrap(); let utxos: MaybeIndefArray = MaybeIndefArray::Indef( inputs .iter() .zip(outputs.iter()) .map(|(input, output)| ResolvedInput { input: input.clone(), output: output.clone(), }) .collect(), ); let slot_config = SlotConfig { zero_time: 1660003200000, // Preview network zero_slot: 0, slot_length: 1000, }; let costs: Vec = vec![ 205665, 812, 1, 1, 1000, 571, 0, 1, 1000, 24177, 4, 1, 1000, 32, 117366, 10475, 4, 23000, 100, 23000, 100, 23000, 100, 23000, 100, 23000, 100, 23000, 100, 100, 100, 23000, 100, 19537, 32, 175354, 32, 46417, 4, 221973, 511, 0, 1, 89141, 32, 497525, 14068, 4, 2, 196500, 453240, 220, 0, 1, 1, 1000, 28662, 4, 2, 245000, 216773, 62, 1, 1060367, 12586, 1, 208512, 421, 1, 187000, 1000, 52998, 1, 80436, 32, 43249, 32, 1000, 32, 80556, 1, 57667, 4, 1000, 10, 197145, 156, 1, 197145, 156, 1, 204924, 473, 1, 208896, 511, 1, 52467, 32, 64832, 32, 65493, 32, 22558, 32, 16563, 32, 76511, 32, 196500, 453240, 220, 0, 1, 1, 69522, 11687, 0, 1, 60091, 32, 196500, 453240, 220, 0, 1, 1, 196500, 453240, 220, 0, 1, 1, 806990, 30482, 4, 1927926, 82523, 4, 265318, 0, 4, 0, 85931, 32, 205665, 812, 1, 1, 41182, 32, 212342, 32, 31220, 32, 32696, 32, 43357, 32, 32247, 32, 38314, 32, 9462713, 1021, 10, ]; let cost_mdl = CostMdls { plutus_v1: Some(costs), plutus_v2: None, }; let initial_budget = ExBudget { cpu: 10000000000, mem: 14000000, }; let multi_era_tx = MultiEraTx::decode(Era::Babbage, &tx_bytes) .or_else(|_| MultiEraTx::decode(Era::Alonzo, &tx_bytes)) .unwrap(); match multi_era_tx { MultiEraTx::Babbage(tx) => { assert!(eval_phase_two( &tx, &utxos, Some(&cost_mdl), Some(&initial_budget), &slot_config, false, ) .is_err()); } _ => unreachable!(), }; } #[test] fn test_eval_5() { /* Haskell PLC: (114126, 40098159) Aiken PLC: (114126,40211433) Plutus V1 Helios script: func main(ctx: ScriptContext) -> Bool {ctx.tx.fee == ctx.tx.fee} */ let tx_bytes = hex::decode("84a80081825820275b5da338c8b899035081eb34bfa950b634911a5dd3271b3ad6cf4c2bba0c50010182825839000af00cc47500bb64cfffb783e8c42f746b4e8b8a70ede9c08c7113acf3bde34d1041f5a2076ef9aa6cf4539ab1a96ed462a0300acbdb65d5821a00111958a1581cd1f4c65937e3c25d4f229b12b79a68f22e500c312b4c2e6977ffe443a1400a825839000af00cc47500bb64cfffb783e8c42f746b4e8b8a70ede9c08c7113acf3bde34d1041f5a2076ef9aa6cf4539ab1a96ed462a0300acbdb65d51a029ef827021a00033f5209a1581cd1f4c65937e3c25d4f229b12b79a68f22e500c312b4c2e6977ffe443a1400a0b5820bdbcad5d5d3667646455252dcc5a255ce7162a9792be84ea48635b4645b962480d81825820275b5da338c8b899035081eb34bfa950b634911a5dd3271b3ad6cf4c2bba0c500110825839000af00cc47500bb64cfffb783e8c42f746b4e8b8a70ede9c08c7113acf3bde34d1041f5a2076ef9aa6cf4539ab1a96ed462a0300acbdb65d51a02ae71d6111a0004defba30081825820065dd553fbe4e240a8f819bb9e333a7483de4a22b65c7fb6a95ce9450f84dff7584060b43793ced32fb8128ad53e0710f7f4191410548a0d6bd80454b6988fbb0ae58e5f0c942b8bbf4cbfe79aeae36156690a289096cff034c31c13d083a096420803815902375902340100003232323232323232323232323232323232323232223333573460060024931324c466012600860040026008600400200246ae84c0180040048d5d0980100091aba23002001235744600400246aae78dd5000911998019119b87002001002001222332232330010013300b00300222333357346ae8c0049289191999ab9a300d33300b0093300a0060013300a00500124a046600a00a6ae880112635742004931bab0023756002446466002002006446666ae68d5d180091bb24988cccd5cd19baf35573a6ae840080108dd59aab9e357420064660080086ae8800d26498888c8cc004004cc01c00c00888cccd5cd1aba300124a24646666ae68c024cc01ccc020018004cc0200140049281198028029aba2004498d5d080124c44646660020020060044446666ae68d5d180112400046666ae68cdd79aab9d3574200600446eb4d55cf1aba10042333005005357440080069324c4666ae6800528251223232323300a003001333001001002003222333357346ae8c004802c8c8cccd5cd1980500300091998030030029aba2004233574000466600c00c00a6ae880112635573a6ae840092630030022323300100100222333357346ae8c004801c8cd5d01aab9d35742004660060066ae8800926223300300223375e00200444646660020020060044446666ae68d5d1801125023333573460046ae8400c92891998028029aba20040034992637629311191998008008010019111999ab9a357460024006466ae80d5d08011998020020019aba200249810581840100d87980821a0001bdce1a0263d96ff5f6").unwrap(); let raw_inputs = hex::decode("8682582075a419179618ca358554fc47aeb33b6c93d12ba8f752495a4e5ef6ea0a1a099a03825820b810e77e706ccaebf7284f6c3d41e2a1eb4af5fabae452618f4175ad1b2aaded03825820975c17a4fed0051be622328efa548e206657d2b65a19224bf6ff8132571e6a50038258207453531a00f98db47c8c2b05e5c38f2c40a0be4f91d42d835bc3bc998b612a8e00825820452b2fc0d170323f86ad1e5b761dcae912774c42c1b1af4de2905a094f2f541403825820275b5da338c8b899035081eb34bfa950b634911a5dd3271b3ad6cf4c2bba0c5001").unwrap(); let raw_outputs = hex::decode("86825839000af00cc47500bb64cfffb783e8c42f746b4e8b8a70ede9c08c7113acf3bde34d1041f5a2076ef9aa6cf4539ab1a96ed462a0300acbdb65d5821a00412c6aad581c01dd79d464e2446231d662c9422445c4cf709b691baceb8b040a34d4a14d28323232294d6174726978363701581c11638d4d600d32b2849c93314e7e6bc656fded924f30514749e1eb3ea64c28323232294d617472697830014c28323232294d617472697831014d28323232294d61747269783133014d28323232294d61747269783330014d28323232294d61747269783534014d28323232294d6174726978383601581c1e60ac8228a21f6e3685c73970584aa54504a0476c4b66f3ef5c4dd2a14c28323232294d61747269783001581c25da1064122988292665c14259ea26cb4dd96d7f04535125fea248ffa14c28323232294d61747269783001581c46214283f4b5cc5d66836a4fe743e121190f1e5b91448a1b52f1b7bfa14d28323232294d6174726978313801581c4788a484721270845917e0986ab55b51922a46b514eb7a1f871e917ca14d28323232294d6174726978323101581c6ed9951ddcd79c98bc50142ba033890815330d4de1cb4c96870a234ca24c28323232294d617472697830014c28323232294d61747269783101581c6f7fd77c85b9856bdb1cfac1afa90c65d92c3c5e2fcca4a993e7fb52a14d28323232294d6174726978323401581ca07afd05db7f0ccb144052935be97b48593e5c8435f9eb859191de81a34c28323232294d617472697830014c28323232294d617472697831014d28323232294d6174726978323101581ca5ca38805c14270ec4c3c1c2446b28a95324054fac98066c5e82a016a14d28323232294d6174726978313901581ca65e6e94d1a260dbc6c4d9319b45585fa54b83742a33a2c599df56b9a2494265727279436f616c014c426572727954616e67656c6f01581cb3e2625ebd6bd613ce904db9fedb0565eec0671054d30d08bc5edadda44c28323232294d617472697835014d28323232294d61747269783237014d28323232294d61747269783430014d28323232294d6174726978343701581ce3ef435a5910f74d890b2a7cb0d1f7288efc22c75823d57acdab9f52a14d28323232294d6174726978363101825839000af00cc47500bb64cfffb783e8c42f746b4e8b8a70ede9c08c7113acf3bde34d1041f5a2076ef9aa6cf4539ab1a96ed462a0300acbdb65d5821a0011f436a1581c11638d4d600d32b2849c93314e7e6bc656fded924f30514749e1eb3ea14d28323232294d6174726978363801825839000af00cc47500bb64cfffb783e8c42f746b4e8b8a70ede9c08c7113acf3bde34d1041f5a2076ef9aa6cf4539ab1a96ed462a0300acbdb65d5821a0011f436a1581c11638d4d600d32b2849c93314e7e6bc656fded924f30514749e1eb3ea14d28323232294d6174726978343101825839000af00cc47500bb64cfffb783e8c42f746b4e8b8a70ede9c08c7113acf3bde34d1041f5a2076ef9aa6cf4539ab1a96ed462a0300acbdb65d5821a0012378ea1581c2c04f7a15aec58b2bec5dab3d201f3e3898370b98d2f01d4ac8bc270a14d28323232294d6174726978323801825839000af00cc47500bb64cfffb783e8c42f746b4e8b8a70ede9c08c7113acf3bde34d1041f5a2076ef9aa6cf4539ab1a96ed462a0300acbdb65d5821a0011f436a1581c11638d4d600d32b2849c93314e7e6bc656fded924f30514749e1eb3ea14d28323232294d6174726978323101825839000af00cc47500bb64cfffb783e8c42f746b4e8b8a70ede9c08c7113acf3bde34d1041f5a2076ef9aa6cf4539ab1a96ed462a0300acbdb65d51a02b350d1").unwrap(); let inputs = MaybeIndefArray::::decode_fragment(&raw_inputs).unwrap(); let outputs = MaybeIndefArray::::decode_fragment(&raw_outputs).unwrap(); let utxos: MaybeIndefArray = MaybeIndefArray::Indef( inputs .iter() .zip(outputs.iter()) .map(|(input, output)| ResolvedInput { input: input.clone(), output: output.clone(), }) .collect(), ); let slot_config = SlotConfig { zero_time: 1660003200000, // Preview network zero_slot: 0, slot_length: 1000, }; let costs: Vec = vec![ 205665, 812, 1, 1, 1000, 571, 0, 1, 1000, 24177, 4, 1, 1000, 32, 117366, 10475, 4, 23000, 100, 23000, 100, 23000, 100, 23000, 100, 23000, 100, 23000, 100, 100, 100, 23000, 100, 19537, 32, 175354, 32, 46417, 4, 221973, 511, 0, 1, 89141, 32, 497525, 14068, 4, 2, 196500, 453240, 220, 0, 1, 1, 1000, 28662, 4, 2, 245000, 216773, 62, 1, 1060367, 12586, 1, 208512, 421, 1, 187000, 1000, 52998, 1, 80436, 32, 43249, 32, 1000, 32, 80556, 1, 57667, 4, 1000, 10, 197145, 156, 1, 197145, 156, 1, 204924, 473, 1, 208896, 511, 1, 52467, 32, 64832, 32, 65493, 32, 22558, 32, 16563, 32, 76511, 32, 196500, 453240, 220, 0, 1, 1, 69522, 11687, 0, 1, 60091, 32, 196500, 453240, 220, 0, 1, 1, 196500, 453240, 220, 0, 1, 1, 806990, 30482, 4, 1927926, 82523, 4, 265318, 0, 4, 0, 85931, 32, 205665, 812, 1, 1, 41182, 32, 212342, 32, 31220, 32, 32696, 32, 43357, 32, 32247, 32, 38314, 32, 9462713, 1021, 10, ]; let cost_mdl = CostMdls { plutus_v1: Some(costs), plutus_v2: None, }; let initial_budget = ExBudget { cpu: 10000000000, mem: 14000000, }; let multi_era_tx = MultiEraTx::decode(Era::Babbage, &tx_bytes) .or_else(|_| MultiEraTx::decode(Era::Alonzo, &tx_bytes)) .unwrap(); match multi_era_tx { MultiEraTx::Babbage(tx) => { let redeemers = eval_phase_two( &tx, &utxos, Some(&cost_mdl), Some(&initial_budget), &slot_config, false, ) .unwrap(); assert_eq!(redeemers.len(), 1); let total_budget_used = redeemers .iter() .fold(ExBudget { mem: 0, cpu: 0 }, |accum, curr| ExBudget { mem: accum.mem + curr.ex_units.mem as i64, cpu: accum.cpu + curr.ex_units.steps as i64, }); println!("{:?}", total_budget_used); assert_eq!( total_budget_used, // Numbers came uplc evaluate ExBudget { cpu: 40098159, mem: 114126 } ); } _ => unreachable!(), }; } #[test] fn test_eval_6() { /* Haskell PLC: (_, _) Aiken PLC: (_,_) Plutus V1 Helios script: func main(ctx: ScriptContext) -> Bool {ctx.tx.fee == ctx.tx.fee} */ let tx_bytes = hex::decode("84a80082825820f375a19211ee8ce75b8306a2604e2a0e8c50dfae7a103dd3688f980bec5e29b200825820a0bfcb30c19402a5bc79ecd33ddea4d67d8d6cb2ebe694c5ac2f14abc47092f4000182825839010af00cc47500bb64cfffb783e8c42f746b4e8b8a70ede9c08c7113acf3bde34d1041f5a2076ef9aa6cf4539ab1a96ed462a0300acbdb65d5821a00111958a1581c652cc39999ceb1ddbdd788c3206d70536d84d36f42198296736355efa1400a825839010af00cc47500bb64cfffb783e8c42f746b4e8b8a70ede9c08c7113acf3bde34d1041f5a2076ef9aa6cf4539ab1a96ed462a0300acbdb65d51a0047acf6021a0002c73209a1581c652cc39999ceb1ddbdd788c3206d70536d84d36f42198296736355efa1400a0b58201ca9076f41fe63a349f05c6346c732fa7f42744e43e0d54f546af0ffc463057f0d81825820f375a19211ee8ce75b8306a2604e2a0e8c50dfae7a103dd3688f980bec5e29b20110825839010af00cc47500bb64cfffb783e8c42f746b4e8b8a70ede9c08c7113acf3bde34d1041f5a2076ef9aa6cf4539ab1a96ed462a0300acbdb65d51a054bc2ef111a00042acba30081825820065dd553fbe4e240a8f819bb9e333a7483de4a22b65c7fb6a95ce9450f84dff758402220dcecba177cabf70414676a5b9af9e0d6dec5ce3a7335caef5e4843a2f045995f6e8debbe019d21dcfc8749d780f0cd75c717cfab17ba275702c3aae37309038158235821010000323232223333573460060024931324c4660040020020024466ebc00800410581840100d8798082190fa21a005f14d0f5f6").unwrap(); let raw_inputs = hex::decode("86825820a0bfcb30c19402a5bc79ecd33ddea4d67d8d6cb2ebe694c5ac2f14abc47092f400825820a0bfcb30c19402a5bc79ecd33ddea4d67d8d6cb2ebe694c5ac2f14abc47092f401825820cd3589fae0ae4ad33dbc8a8d99b4e99b4a78c2b0473040aab34da8e44fba9fa300825820f375a19211ee8ce75b8306a2604e2a0e8c50dfae7a103dd3688f980bec5e29b200825820f375a19211ee8ce75b8306a2604e2a0e8c50dfae7a103dd3688f980bec5e29b201825820c5bc1437117c200f325467dcede3c09fbfca32f9fe399bd40c778ab2fa832f4301").unwrap(); let raw_outputs = hex::decode("86825839010af00cc47500bb64cfffb783e8c42f746b4e8b8a70ede9c08c7113acf3bde34d1041f5a2076ef9aa6cf4539ab1a96ed462a0300acbdb65d51a000f4240825839010af00cc47500bb64cfffb783e8c42f746b4e8b8a70ede9c08c7113acf3bde34d1041f5a2076ef9aa6cf4539ab1a96ed462a0300acbdb65d5821a005da7c4ac581c1e852216c006c55490cd85b6e0ba523a37c2be3526f479e61cca41eba2444e616d6902454e616d693201581c21514b6c51f0aaa0c9c337329ce93c52fad208cfd0b4ccd51074d9dcab4d50494e4b44494e4f4331494439014d50494e4b44494e4f4332494439014d50494e4b44494e4f4333494439014d50494e4b44494e4f4334494439014d50494e4b44494e4f4335494439014d50494e4b44494e4f4336494439014d50494e4b44494e4f4337494439014d50494e4b44494e4f4338494439014d50494e4b44494e4f4339494439014e50494e4b44494e4f433130494439014e50494e4b44494e4f43313149443901581c321668648736a09a40bc3ef5fbd05590530be624e39af84fab3bc6bba84d435033503050726f6d6f333431014f4b696e67447572616e747574323531015053616d757257686950726f6d6f313933015143727970746f6d626f50726f6d6f3134360154536b756c6c62616c6c4c6f676f50726f6d6f35320155536b756c6c62616c6c4c6f676f50726f6d6f33313301581b425345647761726473536c616d6d696e48616e647330303034313201581c42697a61727265537461727344726561646c696f6e526f736533323401581c9ec93fd47d1e43ec5bb5dad70af92b6498b92d20d4325f9027ac4743a1574a6f736570684d6972616e64615754503030353754323601581ca7dc26584358f5ca8d99d7aa646a7b658120296a94588e1cefad8940a157546573744e616d69467269656e645368696e794a50454701581cbc5a0f0f3f1bfa92286410388c54655687bb518f47e12b88c0d0728ca14b566563746f724669656c6401581cc4c00fbd8fa227442a5e7cdecde33b24588494d05a2c50fda8938c6da1444b49445a19c346581cd068fe47123ec4c86460eeb74c7d7765c67d2df295a3ac86d664ed45a156506c757475734669727374436c61737350686f746f3101581cd3b65744dd067fd7103cc6a4019cc9cd5f8627b78174c05dc67a9ad6a1544c696665496e4c6f636b646f776e53314d31503201581cd973d8df645da318bb331dbe4af8eb0270079470225d955c6183445ca15148617070794269727468646179416c657301581cdf9974c2192744f3b6dac92990769fe26c36b0ac8bcc623fb457a45da14d575450303035466c796572323401581cee47c1521b55a006c345f739f084f5c205aeb295e3e42fa66b9d1dd2a151446965666e6643727970746f6e6965726505825839010af00cc47500bb64cfffb783e8c42f746b4e8b8a70ede9c08c7113acf3bde34d1041f5a2076ef9aa6cf4539ab1a96ed462a0300acbdb65d51a000f4240825839010af00cc47500bb64cfffb783e8c42f746b4e8b8a70ede9c08c7113acf3bde34d1041f5a2076ef9aa6cf4539ab1a96ed462a0300acbdb65d51a004c4b40825839010af00cc47500bb64cfffb783e8c42f746b4e8b8a70ede9c08c7113acf3bde34d1041f5a2076ef9aa6cf4539ab1a96ed462a0300acbdb65d51a054fedba825839010af00cc47500bb64cfffb783e8c42f746b4e8b8a70ede9c08c7113acf3bde34d1041f5a2076ef9aa6cf4539ab1a96ed462a0300acbdb65d51a0028a3c6").unwrap(); let inputs = MaybeIndefArray::::decode_fragment(&raw_inputs).unwrap(); let outputs = MaybeIndefArray::::decode_fragment(&raw_outputs).unwrap(); let utxos: MaybeIndefArray = MaybeIndefArray::Indef( inputs .iter() .zip(outputs.iter()) .map(|(input, output)| ResolvedInput { input: input.clone(), output: output.clone(), }) .collect(), ); let slot_config = SlotConfig { zero_time: 1596059091000, // Mainnet network zero_slot: 4492800, slot_length: 1000, }; let costs: Vec = vec![ 197209, 0, 1, 1, 396231, 621, 0, 1, 150000, 1000, 0, 1, 150000, 32, 2477736, 29175, 4, 29773, 100, 29773, 100, 29773, 100, 29773, 100, 29773, 100, 29773, 100, 100, 100, 29773, 100, 150000, 32, 150000, 32, 150000, 32, 150000, 1000, 0, 1, 150000, 32, 150000, 1000, 0, 8, 148000, 425507, 118, 0, 1, 1, 150000, 1000, 0, 8, 150000, 112536, 247, 1, 150000, 10000, 1, 136542, 1326, 1, 1000, 150000, 1000, 1, 150000, 32, 150000, 32, 150000, 32, 1, 1, 150000, 1, 150000, 4, 103599, 248, 1, 103599, 248, 1, 145276, 1366, 1, 179690, 497, 1, 150000, 32, 150000, 32, 150000, 32, 150000, 32, 150000, 32, 150000, 32, 148000, 425507, 118, 0, 1, 1, 61516, 11218, 0, 1, 150000, 32, 148000, 425507, 118, 0, 1, 1, 148000, 425507, 118, 0, 1, 1, 2477736, 29175, 4, 0, 82363, 4, 150000, 5000, 0, 1, 150000, 32, 197209, 0, 1, 1, 150000, 32, 150000, 32, 150000, 32, 150000, 32, 150000, 32, 150000, 32, 150000, 32, 3345831, 1, 1, ]; let cost_mdl = CostMdls { plutus_v1: Some(costs), plutus_v2: None, }; let initial_budget = ExBudget { cpu: 10000000000, mem: 14000000, }; let multi_era_tx = MultiEraTx::decode(Era::Babbage, &tx_bytes) .or_else(|_| MultiEraTx::decode(Era::Alonzo, &tx_bytes)) .unwrap(); match multi_era_tx { MultiEraTx::Babbage(tx) => { let redeemers = eval_phase_two( &tx, &utxos, Some(&cost_mdl), Some(&initial_budget), &slot_config, false, ) .unwrap(); assert_eq!(redeemers.len(), 1); let total_budget_used = redeemers .iter() .fold(ExBudget { mem: 0, cpu: 0 }, |accum, curr| ExBudget { mem: accum.mem + curr.ex_units.mem as i64, cpu: accum.cpu + curr.ex_units.steps as i64, }); println!("{:?}", total_budget_used); assert_eq!( total_budget_used, // Numbers came uplc evaluate ExBudget { cpu: 6231248, mem: 4002 } ); } _ => unreachable!(), }; } #[test] fn test_eval_7() { /* Haskell PLC: (_, _) Aiken PLC: (_,_) Plutus V1 Helios script: func main(ctx: ScriptContext) -> Bool {ctx.tx.fee == ctx.tx.fee} */ let tx_bytes = hex::decode("84a80082825820a0bfcb30c19402a5bc79ecd33ddea4d67d8d6cb2ebe694c5ac2f14abc47092f400825820f375a19211ee8ce75b8306a2604e2a0e8c50dfae7a103dd3688f980bec5e29b2000182825839010af00cc47500bb64cfffb783e8c42f746b4e8b8a70ede9c08c7113acf3bde34d1041f5a2076ef9aa6cf4539ab1a96ed462a0300acbdb65d5821a00113b04a1581c9bed3f1e167c09eb82273ab0b51b383d31c3b0dbf3a468ca4bc23d02a14231310c825839010af00cc47500bb64cfffb783e8c42f746b4e8b8a70ede9c08c7113acf3bde34d1041f5a2076ef9aa6cf4539ab1a96ed462a0300acbdb65d51a0040eb3c021a0009674009a1581c9bed3f1e167c09eb82273ab0b51b383d31c3b0dbf3a468ca4bc23d02a14231310c0b5820f7a477a807b46ecb36f2552c1ac4730394e8d24e572c65afde772771d688114a0d8182582017a796d7541fc547bca875a82c7bd35e45b821cb69bebd21db774bcde16fffdc0110825839010af00cc47500bb64cfffb783e8c42f746b4e8b8a70ede9c08c7113acf3bde34d1041f5a2076ef9aa6cf4539ab1a96ed462a0300acbdb65d51a052fe707111a000e1ae0a30081825820065dd553fbe4e240a8f819bb9e333a7483de4a22b65c7fb6a95ce9450f84dff7584090a0c710cbd45fdfca8b789e9062bc7d8fbfb6eb44a2a348db3b8daaddb6f6198d6ece3a36f808d118a7b16ac17747ee6e0790a4b5234187aa5f3c11631ba50a0381590fc3590fc001000032332232332232323232323232323232323232332232323232323232323232323232332232322232323232325335001102713263202633573892010350543500027323233355300e1200135012501123500122333553011120013501550142350012233350012330324800000488cc0cc0080048cc0c800520000013355300d1200123500122335502a00233350012335530111200123500122335502e0023550130010012233355500e0140020012335530111200123500122335502e00235501200100133355500900f0020013013300f50023012300e500113553353333333574800846666ae68cdc39aab9d5004480008cccd55cfa8021281491999aab9f50042502a233335573e6ae89401494cd54cd4c8c8c8c8c8c8c8c8c8c8c8c8ccccccd5d200611999ab9a3370e6aae7540312000233335573ea0184a07446666aae7d4030940ec8cccd55cfa8061281e11999aab9f500c2503d233335573ea0184a07c46666aae7d4030940fc8cccd55cfa8061282011999aab9f500c25041233335573ea0184a08446666aae7d40309410c8cccd55cf9aba2500d2533553355335533553355335533553355335533533503023232323333333574800846666ae68cdc39aab9d5004480008cccd55cfa8021282591999aab9f50042504c233335573e6ae89401494cd4c10cd5d0a80390a99a981d9aba15007213505012330010030021504e1504d2504d04b04a0492504a04625049250492504925049047135744a00226aae7940044dd50009aba15017213504622222222212333333333300100b00a0090080070060050040030021504421533533503103235742a02e426a08e60040022a08a2a08842a66a666aa06807ca0666ae85405884d411cc0080045411454110854cd4ccd540d00f940ccd5d0a80a909a82398010008a8228a82210a99a99a81891919191919191999999aba400723333573466e1d4009200c233335573ea00e46a0a0244444440064a09e09a46666ae68cdc3a801a401446666aae7d40208d414448888888010941401388cccd5cd19b875004480208cccd55cfa8049282891999aab9f500725052233335573e6ae89402094cd4c130d5d0a80610a99a98259aba1500a2135056122222223300100900815054150532505305105004f23333573466e1d40152006233335573ea0144a0a446666aae7d40249414c8cccd55cf9aba2500a25335304d35742a01a42a66a609c6ae85403084d415c48888888cc0080240205415454150941501481441408cccd5cd19b875006480108cccd55cfa8059282991999aab9f500b25054233335573e6ae89403094cd4c124d5d0a80710a99a98279aba1500e2135058122222223300600900815056150552505505305205123333573466e1d401d2002233335573ea0184a0a846666aae7cd5d128069299a98249aba1500e2135057122222223007008150552505505305223333573466e1d40212000233335573ea01a4a0aa46666aae7cd5d128071299a98251aba1500f213505812222222300500815056250560540532505405004f04e04d04c04b04a2504d2504d2504d2504d04b135573aa00a26ae89400c4d5d1280109aba25001135573ca00226ea8004d5d0a80a109a82398010008a8228a82210a99a99a81899aa82081c81e1aba15013213504730020011504515044215335323232323333333574800846666ae68cdc39aab9d5004480008cccd55cfa8021282611999aab9f50042504d233335573e6ae89401494cd4c8c8c8c8ccccccd5d200211999ab9a3370e6aae7540112000233335573ea0084a0aa46666aae7d4010941588cccd55cf9aba250052533533505104e35742a00e42a66a60a66ae85401c84d416848cc00400c008541605415c9415c15415014c941501409414c9414c9414c9414c1444d5d1280089aab9e5001137540026ae85401c854cd4c8c8c8c8ccccccd5d200211999ab9a3370e6aae7540112000233335573ea0084a0ac46666aae7d40109415c8cccd55cf9aba250052533533505204f35742a00e42a66a60a86ae85401c84d416c48cc00400c00854164541609416015815415094154144941509415094150941501484d5d1280089aab9e5001137540026ae85401c84d414448cc00400c0085413c541389413813012c1289412c11c941289412894128941281204d5d1280089aab9e5001137540026ae85404884d411cc0080045411454110854cd4cd40c40f8d5d0a808909a82398010008a8228a82210a99a99a81899aa82081f28231aba15010213504730020011504515044215335303d35742a01e426a08e60040022a08a2a0884a08808408208007e07c07a0780760740720704a07206a4a0704a0704a0704a07006c26ae8940044d5d1280089aba25001135744a00226ae8940044d5d1280089aba25001135744a00226ae8940044d55cf280089baa00135742a00e426a05a424660020060042a05642a66a646464646666666ae900108cccd5cd19b875002480088cccd55cfa8021281991999aab9f35744a00a4a66a60546ae85401884d40d8488c00400c540d0940d00c80c48cccd5cd19b875003480008cccd55cfa8029281a11999aab9f35744a00c4a66a605c6ae85401c84d40dc488c00800c540d4940d40cc0c8940cc0bc0b8940c4940c4940c4940c40bc4d55cea80109aab9e5001137540026ae85401c84d40b8c008004540b0540ac940ac0a40a009c940a00909409c9409c9409c9409c0948448c0040085880044d5d1280089aab9e500113754002222444666aa600824002a02866aa600e2400246a0024466aa0480046aa012002666aa600824002446a00444a66a666aa6018240026466a02444666a006440040040026a00244002246600244a66a004205c200205646a002446601400400a00c2006266a030008006a02a00266aa600e2400246a002446466aa04a006600200a640026aa05644a66a00226aa0140064426a00444a66a6601800401022444660040140082600c006004640026aa0484422444a66a00220044426600a004666aa600e2400200a0080022242444600600822424446002008640026aa042442244a66a0022a02444266a026600800466aa600c24002008002640026aa0404422444a66a00226a00644002442666a00a440046008004666aa600e2400200a00800244666ae68cdc780100081000f91a800910010891980091299a8010800880f00e8919a80111199a801910010010009a80091000891091980080180111a8009111111111004091911999999aba400125018250182300337580044a0304a03002c640026aa034446666aae7c0048d4065402894cd4c010d5d080110a99a98021aba2003213501b33500b00200115019150180162323232323333333574800a46666ae68cdc39aab9d5005480008cccd55cfa8029280d91999aab9f50052501c233335573ea00a4a03a46666aae7cd5d128031299a991919191999999aba400423333573466e1cd55cea8022400046666aae7d4010940948cccd55cfa8021281311999aab9f35744a00a4a66a60386ae85401c854cd4cd406c070d5d0a803909a81509198008018010a8140a81392813812812011928120101281192811928119281181089aba25001135573ca00226ea8004d5d0a80490a99a999aa80700c28069aba1500921533533501301935742a012426a044246660020080060042a0402a03e2a03c4a03c0380360340324a03402c4a0324a0324a0324a03202e26ae8940044d5d1280089aab9e500113754002266aa00201601222446446666666ae900055401494cd4c00cdd5801109a80c0008a80b2a802aa802aa80280a190009aa80c11191999aab9f002235018500925335300635573aa00442a66a600c6aae79400c854cd4c018d5d1002909a80d99a80599aa80c0018010008a80c8a80c0a80b80a89aba100111250111122002122122330010040031223232323333333574800846666ae68cdc3a8012400046666aae7d4010940548cccd55cf9aba2500525335300935742a00c426a0306a0300022a02c4a02c02802646666ae68cdc3a801a400446666aae7d40148d405d405894058050940540440409404c9404c9404c9404c0444d55cea80109aab9e500113754002464646464646666666ae900188cccd5cd19b875002480088cccd55cfa8031280a91999aab9f500625016233335573ea00c4a02e46666aae7cd5d128039299a98079aba1500a215335301035742a01442a66a60226ae85402884d4070488ccc00401401000c5406854064540609406005805405004c8cccd5cd19b875003480008cccd55cfa8039280b11999aab9f35744a0104a66a60186ae85402484d4064488c00800c5405c9405c054050940540440409404c9404c9404c9404c0444d55cea80209aba25001135744a00226aae7940044dd500091919191999999aba400423333573466e1d40092002233335573ea0084a02446666aae7cd5d128029299a98061aba1500621350151223001003150132501301101023333573466e1d400d2000233335573ea00a4a02646666aae7cd5d128031299a98069aba150072135016122300200315014250140120112501200e00d2501025010250102501000e135573aa00426aae7940044dd500091919191999999aba400423333573466e1cd55cea8022400046666aae7d4010940448cccd55cfa8021280911999aab9f35744a00a4a66a60166ae85401c854cd4c02cd5d0a803909a80b09198008018010a80a0a80992809808808007928080061280792807928079280780689aba25001135573ca00226ea80048ccccccd5d200092805928059280591a8061bad0022500b009232323333333574800646666ae68cdc39aab9d5003480008cccd55cfa8019280711999aab9f35744a0084a66a60106ae85401484d40440045403c9403c03403094034024940309403094030940300284d55cf280089baa0012333333357480024a0124a0124a0124a01246a0146eb800801c488c8c8c8ccccccd5d200211999ab9a3370ea004900211999aab9f500423500f12220012500e00c23333573466e1d400d2002233335573ea00a4a01e46666aae7cd5d128031299a98051aba15007213501212223003004150102501000e00d23333573466e1d40112000233335573ea00c46a02224440044a02001c4a01e0160140124a0184a0184a0184a01801426aae7540084d55cf280089baa00123232323333333574800846666ae68cdc3a8012400446666aae7d40108d4034040940300288cccd5cd19b875003480008cccd55cfa80291a80700812806805928060040039280512805128051280500409aab9d5002135573ca00226ea800444888c8c8c8ccccccd5d200211999ab9a3370e6aae7540112000233335573ea0084a01a46666aae7d4010940388cccd55cf9aba2500525335300b35742a00e42a66a60166ae85401c84d4048cd5403c008004540405403c9403c03403002c940300209402c9402c9402c9402c0244d5d1280089aab9e500113754002930891091980080180109000890911801001889100091199ab9a3370e0040020080062440042440022246460020024466006600400400210581840100d87980821a002d162a1a48ceb84cf5f6").unwrap(); let raw_inputs = hex::decode("8782582017a796d7541fc547bca875a82c7bd35e45b821cb69bebd21db774bcde16fffdc00825820a0bfcb30c19402a5bc79ecd33ddea4d67d8d6cb2ebe694c5ac2f14abc47092f400825820a0bfcb30c19402a5bc79ecd33ddea4d67d8d6cb2ebe694c5ac2f14abc47092f401825820cd3589fae0ae4ad33dbc8a8d99b4e99b4a78c2b0473040aab34da8e44fba9fa300825820f375a19211ee8ce75b8306a2604e2a0e8c50dfae7a103dd3688f980bec5e29b200825820c5bc1437117c200f325467dcede3c09fbfca32f9fe399bd40c778ab2fa832f430182582017a796d7541fc547bca875a82c7bd35e45b821cb69bebd21db774bcde16fffdc01").unwrap(); let raw_outputs = hex::decode("8783581d71ef703237c089955b1f87e4a5bf1c706151b45bdfcf5a957ea20bef321a000f52c6582058260815eb79c0e8168502dbe5c6e73ac0fa37b57fe2b0582f765778c9c63550825839010af00cc47500bb64cfffb783e8c42f746b4e8b8a70ede9c08c7113acf3bde34d1041f5a2076ef9aa6cf4539ab1a96ed462a0300acbdb65d51a000f4240825839010af00cc47500bb64cfffb783e8c42f746b4e8b8a70ede9c08c7113acf3bde34d1041f5a2076ef9aa6cf4539ab1a96ed462a0300acbdb65d5821a005da7c4ac581c1e852216c006c55490cd85b6e0ba523a37c2be3526f479e61cca41eba2444e616d6902454e616d693201581c21514b6c51f0aaa0c9c337329ce93c52fad208cfd0b4ccd51074d9dcab4d50494e4b44494e4f4331494439014d50494e4b44494e4f4332494439014d50494e4b44494e4f4333494439014d50494e4b44494e4f4334494439014d50494e4b44494e4f4335494439014d50494e4b44494e4f4336494439014d50494e4b44494e4f4337494439014d50494e4b44494e4f4338494439014d50494e4b44494e4f4339494439014e50494e4b44494e4f433130494439014e50494e4b44494e4f43313149443901581c321668648736a09a40bc3ef5fbd05590530be624e39af84fab3bc6bba84d435033503050726f6d6f333431014f4b696e67447572616e747574323531015053616d757257686950726f6d6f313933015143727970746f6d626f50726f6d6f3134360154536b756c6c62616c6c4c6f676f50726f6d6f35320155536b756c6c62616c6c4c6f676f50726f6d6f33313301581b425345647761726473536c616d6d696e48616e647330303034313201581c42697a61727265537461727344726561646c696f6e526f736533323401581c9ec93fd47d1e43ec5bb5dad70af92b6498b92d20d4325f9027ac4743a1574a6f736570684d6972616e64615754503030353754323601581ca7dc26584358f5ca8d99d7aa646a7b658120296a94588e1cefad8940a157546573744e616d69467269656e645368696e794a50454701581cbc5a0f0f3f1bfa92286410388c54655687bb518f47e12b88c0d0728ca14b566563746f724669656c6401581cc4c00fbd8fa227442a5e7cdecde33b24588494d05a2c50fda8938c6da1444b49445a19c346581cd068fe47123ec4c86460eeb74c7d7765c67d2df295a3ac86d664ed45a156506c757475734669727374436c61737350686f746f3101581cd3b65744dd067fd7103cc6a4019cc9cd5f8627b78174c05dc67a9ad6a1544c696665496e4c6f636b646f776e53314d31503201581cd973d8df645da318bb331dbe4af8eb0270079470225d955c6183445ca15148617070794269727468646179416c657301581cdf9974c2192744f3b6dac92990769fe26c36b0ac8bcc623fb457a45da14d575450303035466c796572323401581cee47c1521b55a006c345f739f084f5c205aeb295e3e42fa66b9d1dd2a151446965666e6643727970746f6e6965726505825839010af00cc47500bb64cfffb783e8c42f746b4e8b8a70ede9c08c7113acf3bde34d1041f5a2076ef9aa6cf4539ab1a96ed462a0300acbdb65d51a000f4240825839010af00cc47500bb64cfffb783e8c42f746b4e8b8a70ede9c08c7113acf3bde34d1041f5a2076ef9aa6cf4539ab1a96ed462a0300acbdb65d51a004c4b40825839010af00cc47500bb64cfffb783e8c42f746b4e8b8a70ede9c08c7113acf3bde34d1041f5a2076ef9aa6cf4539ab1a96ed462a0300acbdb65d51a0028a3c6825839010af00cc47500bb64cfffb783e8c42f746b4e8b8a70ede9c08c7113acf3bde34d1041f5a2076ef9aa6cf4539ab1a96ed462a0300acbdb65d51a053e01e7").unwrap(); let inputs = MaybeIndefArray::::decode_fragment(&raw_inputs).unwrap(); let outputs = MaybeIndefArray::::decode_fragment(&raw_outputs).unwrap(); let utxos: MaybeIndefArray = MaybeIndefArray::Indef( inputs .iter() .zip(outputs.iter()) .map(|(input, output)| ResolvedInput { input: input.clone(), output: output.clone(), }) .collect(), ); let slot_config = SlotConfig { zero_time: 1596059091000, // Mainnet network zero_slot: 4492800, slot_length: 1000, }; let costs: Vec = vec![ 197209, 0, 1, 1, 396231, 621, 0, 1, 150000, 1000, 0, 1, 150000, 32, 2477736, 29175, 4, 29773, 100, 29773, 100, 29773, 100, 29773, 100, 29773, 100, 29773, 100, 100, 100, 29773, 100, 150000, 32, 150000, 32, 150000, 32, 150000, 1000, 0, 1, 150000, 32, 150000, 1000, 0, 8, 148000, 425507, 118, 0, 1, 1, 150000, 1000, 0, 8, 150000, 112536, 247, 1, 150000, 10000, 1, 136542, 1326, 1, 1000, 150000, 1000, 1, 150000, 32, 150000, 32, 150000, 32, 1, 1, 150000, 1, 150000, 4, 103599, 248, 1, 103599, 248, 1, 145276, 1366, 1, 179690, 497, 1, 150000, 32, 150000, 32, 150000, 32, 150000, 32, 150000, 32, 150000, 32, 148000, 425507, 118, 0, 1, 1, 61516, 11218, 0, 1, 150000, 32, 148000, 425507, 118, 0, 1, 1, 148000, 425507, 118, 0, 1, 1, 2477736, 29175, 4, 0, 82363, 4, 150000, 5000, 0, 1, 150000, 32, 197209, 0, 1, 1, 150000, 32, 150000, 32, 150000, 32, 150000, 32, 150000, 32, 150000, 32, 150000, 32, 3345831, 1, 1, ]; let cost_mdl = CostMdls { plutus_v1: Some(costs), plutus_v2: None, }; let initial_budget = ExBudget { cpu: 10000000000, mem: 14000000, }; let multi_era_tx = MultiEraTx::decode(Era::Babbage, &tx_bytes) .or_else(|_| MultiEraTx::decode(Era::Alonzo, &tx_bytes)) .unwrap(); match multi_era_tx { MultiEraTx::Babbage(tx) => { let redeemers = eval_phase_two( &tx, &utxos, Some(&cost_mdl), Some(&initial_budget), &slot_config, false, ) .unwrap(); assert_eq!(redeemers.len(), 1); let total_budget_used = redeemers .iter() .fold(ExBudget { mem: 0, cpu: 0 }, |accum, curr| ExBudget { mem: accum.mem + curr.ex_units.mem as i64, cpu: accum.cpu + curr.ex_units.steps as i64, }); println!("{:?}", total_budget_used); assert_eq!( total_budget_used, // Numbers came uplc evaluate ExBudget { cpu: 1221507148, mem: 2954794 } ); } _ => unreachable!(), }; } #[test] fn test_eval_8() { let tx_bytes = hex::decode("84a800838258206eba69fbd940408c9ba007cb6059282be7afc95682e68a6160110239287c393c00825820ffcb865d43f1f1734de4c547584a1fe757ea58c58df29b18a5a5a148f92db37700825820aa1643f6a487d81273fa18df738b9d39a0930fd2b6562ba713169d33731e42c6010182825839000af00cc47500bb64cfffb783e8c42f746b4e8b8a70ede9c08c7113acf3bde34d1041f5a2076ef9aa6cf4539ab1a96ed462a0300acbdb65d5821a00113b04a1581c4bc8e3d235d4d3ecf3d963293b4e775cb793c29e96fd4b0103b2e570a14231310c825839000af00cc47500bb64cfffb783e8c42f746b4e8b8a70ede9c08c7113acf3bde34d1041f5a2076ef9aa6cf4539ab1a96ed462a0300acbdb65d51b0000000246f999e7021a00085b3f09a1581c4bc8e3d235d4d3ecf3d963293b4e775cb793c29e96fd4b0103b2e570a14231310c0b5820fbfc34e93ecf7c829127cb623f88ee5a41e553356cce7f16c6fda22dd7bd2c640d81825820aa1643f6a487d81273fa18df738b9d39a0930fd2b6562ba713169d33731e42c60110825839000af00cc47500bb64cfffb783e8c42f746b4e8b8a70ede9c08c7113acf3bde34d1041f5a2076ef9aa6cf4539ab1a96ed462a0300acbdb65d51b0000000246e822cb111a000c88dfa30081825820065dd553fbe4e240a8f819bb9e333a7483de4a22b65c7fb6a95ce9450f84dff75840510d58d69433006c8a7880b704c703810cdda4554b1b3bde9df0eb2e74247c88f0f2e1639a5f8d92b347651e147cc501a91f2bd93c73573f4c9f529d20212c0c0581840100d87980821a0029125e1a2a63a39a0681590e1d590e1a010000323322323232323232323232332232323233223232323232323232323232323232323232323232323232323222323253353322350012235003225335350042222222222223500e2222222222225335333530361200103701800c15335333530361200103701700b15335333530361200103801600a1533533303904b0150091533533303904b014008153353335303612001048013007153353335303612001223500222350032253353304f0040021330510030011052012006153353501122350022235009223235003223253335008215333500421533533057002001150031058105710571533350032105715001105615333500321057105615001153350061533500115003105515335001105515003135005223500322533350042153335003215335330570020011330410050031058105710571533350022105713303f003001105615333500221057105613303f00300115335333530361200104a010004153353335303612001223500222350032253353304c00400213303a003001105200f00315335333530361200122350022235003225335333573466e3c01000814c1484cc0e800c00441480380084cc128034004413041304130413041304130413041304130413041304cc0b800c00440d0cccd5cd19b8735573a6ea80112000201523263201533573802c02a0266666ae68cdc39aab9d5002480008cc8848cc00400c008c8c8c8c8c8c8c8c8c8c8c8c8c8cccd5cd19b8735573aa018900011999999999999111111111110919999999999980080680600580500480400380300280200180119a80a00a9aba1500c33501401535742a01666a02802c6ae854028ccd54061d7280b9aba150093335501875ca02e6ae854020cd4050074d5d0a803999aa80c00f3ad35742a00c6464646666ae68cdc39aab9d5002480008cc8848cc00400c008c8c8c8cccd5cd19b8735573aa004900011991091980080180119a8143ad35742a00460526ae84d5d1280111931901599ab9c02c02b029135573ca00226ea8004d5d0a8011919191999ab9a3370e6aae754009200023322123300100300233502875a6ae854008c0a4d5d09aba2500223263202b33573805805605226aae7940044dd50009aba135744a004464c6404e66ae700a009c0944d55cf280089baa00135742a00a66a028eb8d5d0a802199aa80c00d10009aba150033335501875c40026ae854008c070d5d09aba2500223263202333573804804604226ae8940044d5d1280089aba25001135744a00226ae8940044d5d1280089aba25001135744a00226ae8940044d5d1280089aab9e5001137540026ae854008c030d5d09aba2500223263201533573802c02a0262028264c6402866ae712410350543500014135573ca00226ea800448c88c008dd6000990009aa816111999aab9f00125023233502230043574200460066ae880080488c8c8cccd5cd19b8735573aa004900011991091980080180118051aba150023005357426ae8940088c98c8048cd5ce00980900809aab9e5001137540024646464646666ae68cdc39aab9d5004480008cccc888848cccc00401401000c008c8c8c8cccd5cd19b8735573aa004900011991091980080180118099aba1500233500d012357426ae8940088c98c805ccd5ce00c00b80a89aab9e5001137540026ae854010ccd54021d728039aba150033232323333573466e1d4005200423212223002004357426aae79400c8cccd5cd19b875002480088c84888c004010dd71aba135573ca00846666ae68cdc3a801a400042444006464c6403266ae7006806405c0580544d55cea80089baa00135742a00466a012eb8d5d09aba2500223263201333573802802602226ae8940044d5d1280089aab9e500113754002266aa002eb9d6889119118011bab00132001355029223233335573e0044a042466a04066aa03a600c6aae754008c014d55cf280118021aba200301013574200224464646666ae68cdc3a800a40004642446004006600a6ae84d55cf280191999ab9a3370ea0049001109100091931900819ab9c01101000e00d135573aa00226ea80048c8c8cccd5cd19b875001480188c848888c010014c01cd5d09aab9e500323333573466e1d400920042321222230020053009357426aae7940108cccd5cd19b875003480088c848888c004014c01cd5d09aab9e500523333573466e1d40112000232122223003005375c6ae84d55cf280311931900819ab9c01101000e00d00c00b135573aa00226ea80048c8c8cccd5cd19b8735573aa004900011991091980080180118029aba15002375a6ae84d5d1280111931900619ab9c00d00c00a135573ca00226ea80048c8cccd5cd19b8735573aa002900011bae357426aae7940088c98c8028cd5ce00580500409baa001232323232323333573466e1d4005200c21222222200323333573466e1d4009200a21222222200423333573466e1d400d2008233221222222233001009008375c6ae854014dd69aba135744a00a46666ae68cdc3a8022400c4664424444444660040120106eb8d5d0a8039bae357426ae89401c8cccd5cd19b875005480108cc8848888888cc018024020c030d5d0a8049bae357426ae8940248cccd5cd19b875006480088c848888888c01c020c034d5d09aab9e500b23333573466e1d401d2000232122222223005008300e357426aae7940308c98c804ccd5ce00a00980880800780700680600589aab9d5004135573ca00626aae7940084d55cf280089baa0012323232323333573466e1d400520022333222122333001005004003375a6ae854010dd69aba15003375a6ae84d5d1280191999ab9a3370ea0049000119091180100198041aba135573ca00c464c6401866ae700340300280244d55cea80189aba25001135573ca00226ea80048c8c8cccd5cd19b875001480088c8488c00400cdd71aba135573ca00646666ae68cdc3a8012400046424460040066eb8d5d09aab9e500423263200933573801401200e00c26aae7540044dd500089119191999ab9a3370ea00290021091100091999ab9a3370ea00490011190911180180218031aba135573ca00846666ae68cdc3a801a400042444004464c6401466ae7002c02802001c0184d55cea80089baa0012323333573466e1d40052002202023333573466e1d40092000202023263200633573800e00c00800626aae74dd5000a4c24002921035054310022333573466ebc00800406c068894cd4008400454cd400440644068c8004d540608848894cd400854cd400440708840748854cd400c40748854cd4cc01c0100084ccd4c0244800401c00c004407c88d400888d400c894cd4cc0580100084cc01c00c004406c88d40088888d401088d401c8888c8d401488c94cd4cd40288cd401094cd4ccd5cd19b8f00200102702615003102620262335004202625335333573466e3c00800409c0985400c409854cd4ccc04408c03401c54ccd403054ccd4018540108409484094854ccd401c4094854cd4ccd5cd19baf002001027026150061026210262153335007102521026215335333573466e3c00800409c0985401840984090409054cd4020854cd400884cc088008004409054cd400484090409054cd401c854cd400884cc080008004408454cd4004840844084888ccd54c02848004d403940348d400488ccd54c03448004d404540408d400488ccd40048cc0292000001223300b00200123300a00148000004cd54c024480048d400488cd5402c008ccd40048cd54c034480048d400488cd5403c008d5403800400488ccd5540240640080048cd54c034480048d400488cd5403c008d54034004004ccd554010050008004444888ccd54c010480054028cd54c020480048d400488cd54028008d54024004ccd54c0104800488d4008894cd4ccd54c03448004c8cd404c88ccd400c88008008004d40048800448cc004894cd4008407440040688d400488cc028008014018400c4cd403801000d402c004cd54c020480048d400488c8cd5402c00cc004014c8004d54068894cd40044d5402800c884d4008894cd4cc03000802044888cc0080280104c01800c008c8004d5404c88448894cd40044008884cc014008ccd54c01c480040140100044484888c00c0104484888c004010448848cc00400c008c8004d5403c8844894cd40045401c884cd4020c010008cd54c01848004010004c8004d5403888448894cd40044d400c88004884ccd401488008c010008ccd54c01c480040140100044488008488488cc00401000c448cc004894cd40084004403002c48cd400888ccd400c88008008004d40048800448848cc00400c00888cccd40088cccd40088cc0180080048028802880288cccd400880288cc020008004802880288cccd4008802880288cc01c00800480288cccd40088028802880288cc014008004894cd4ccd5cd19b8f350022200235001220020080071333573466e1cd400888004d40048800402001c401c894ccccccd4008854ccccccd400884cc01400800488402484020401c401c8840248840248854ccccccd400c840248854cd4cc01c0100084cc02000c00440288402440204020884028884028854ccccccd40088402088402484cc014008004401c401c88402488402454ccccccd40048401c8840208401c401c401888402088402054ccccccd40048401c8840208401c4018401c8840208840208854ccccccd400c8402488402884024402040208854cd4ccd5cd19b8f00400200b00a133008003001100a22100a2215333333350032100922100a210091008100822100a2215335333573466e3c01000802c0284cc02400c004402888cd40088cd40088cd40088cd40088cc01c00800480248cd400880248cc01c008004888024888cd401080248894cd4ccd5cd19b8700600300c00b15335333573466e1c01400803002c4cc028010004402c402c88ccd5cd19b8f00200100500422333573466e1c00800401000c488008488004448c8c00400488cc00cc008008005f5f6").unwrap(); let raw_inputs = hex::decode("84825820ffcb865d43f1f1734de4c547584a1fe757ea58c58df29b18a5a5a148f92db377008258206eba69fbd940408c9ba007cb6059282be7afc95682e68a6160110239287c393c00825820aa1643f6a487d81273fa18df738b9d39a0930fd2b6562ba713169d33731e42c600825820aa1643f6a487d81273fa18df738b9d39a0930fd2b6562ba713169d33731e42c601").unwrap(); let raw_outputs = hex::decode("84825839000af00cc47500bb64cfffb783e8c42f746b4e8b8a70ede9c08c7113acf3bde34d1041f5a2076ef9aa6cf4539ab1a96ed462a0300acbdb65d51a000f4240825839000af00cc47500bb64cfffb783e8c42f746b4e8b8a70ede9c08c7113acf3bde34d1041f5a2076ef9aa6cf4539ab1a96ed462a0300acbdb65d51a000f4240825839000af00cc47500bb64cfffb783e8c42f746b4e8b8a70ede9c08c7113acf3bde34d1041f5a2076ef9aa6cf4539ab1a96ed462a0300acbdb65d51a000f4240825839000af00cc47500bb64cfffb783e8c42f746b4e8b8a70ede9c08c7113acf3bde34d1041f5a2076ef9aa6cf4539ab1a96ed462a0300acbdb65d51b0000000246f4abaa").unwrap(); let inputs = MaybeIndefArray::::decode_fragment(&raw_inputs).unwrap(); let outputs = MaybeIndefArray::::decode_fragment(&raw_outputs).unwrap(); let utxos: MaybeIndefArray = MaybeIndefArray::Indef( inputs .iter() .zip(outputs.iter()) .map(|(input, output)| ResolvedInput { input: input.clone(), output: output.clone(), }) .collect(), ); let slot_config = SlotConfig { zero_time: 1596059091000, // Mainnet network zero_slot: 4492800, slot_length: 1000, }; let costs: Vec = vec![ 205665, 812, 1, 1, 1000, 571, 0, 1, 1000, 24177, 4, 1, 1000, 32, 117366, 10475, 4, 23000, 100, 23000, 100, 23000, 100, 23000, 100, 23000, 100, 23000, 100, 100, 100, 23000, 100, 19537, 32, 175354, 32, 46417, 4, 221973, 511, 0, 1, 89141, 32, 497525, 14068, 4, 2, 196500, 453240, 220, 0, 1, 1, 1000, 28662, 4, 2, 245000, 216773, 62, 1, 1060367, 12586, 1, 208512, 421, 1, 187000, 1000, 52998, 1, 80436, 32, 43249, 32, 1000, 32, 80556, 1, 57667, 4, 1000, 10, 197145, 156, 1, 197145, 156, 1, 204924, 473, 1, 208896, 511, 1, 52467, 32, 64832, 32, 65493, 32, 22558, 32, 16563, 32, 76511, 32, 196500, 453240, 220, 0, 1, 1, 69522, 11687, 0, 1, 60091, 32, 196500, 453240, 220, 0, 1, 1, 196500, 453240, 220, 0, 1, 1, 1159724, 392670, 0, 2, 806990, 30482, 4, 1927926, 82523, 4, 265318, 0, 4, 0, 85931, 32, 205665, 812, 1, 1, 41182, 32, 212342, 32, 31220, 32, 32696, 32, 43357, 32, 32247, 32, 38314, 32, 20000000000, 20000000000, 9462713, 1021, 10, 20000000000, 0, 20000000000, ]; let cost_mdl = CostMdls { plutus_v1: None, plutus_v2: Some(costs), }; let initial_budget = ExBudget { cpu: 10000000000, mem: 14000000, }; let multi_era_tx = MultiEraTx::decode(Era::Babbage, &tx_bytes) .or_else(|_| MultiEraTx::decode(Era::Alonzo, &tx_bytes)) .unwrap(); match multi_era_tx { MultiEraTx::Babbage(tx) => { let redeemers = eval_phase_two( &tx, &utxos, Some(&cost_mdl), Some(&initial_budget), &slot_config, false, ) .unwrap(); assert_eq!(redeemers.len(), 1); let total_budget_used = redeemers .iter() .fold(ExBudget { mem: 0, cpu: 0 }, |accum, curr| ExBudget { mem: accum.mem + curr.ex_units.mem as i64, cpu: accum.cpu + curr.ex_units.steps as i64, }); println!("{:?}", total_budget_used); assert_eq!( total_budget_used, // Numbers came uplc evaluate ExBudget { cpu: 711173018, mem: 2691678 } ); } _ => unreachable!(), }; } #[test] fn eval_missing_redeemer() { let tx_bytes = hex::decode("84a30082825820275b5da338c8b899035081eb34bfa950b634911a5dd3271b3ad6cf4c2bba0c5000825820275b5da338c8b899035081eb34bfa950b634911a5dd3271b3ad6cf4c2bba0c50010181825839000af00cc47500bb64cfffb783e8c42f746b4e8b8a70ede9c08c7113acf3bde34d1041f5a2076ef9aa6cf4539ab1a96ed462a0300acbdb65d51a02cf47c8021a00028d89a1068149480100002221200101f5f6").unwrap(); let multi_era_tx = MultiEraTx::decode(Era::Babbage, &tx_bytes) .or_else(|_| MultiEraTx::decode(Era::Alonzo, &tx_bytes)) .unwrap(); let inputs = multi_era_tx .as_babbage() .unwrap() .transaction_body .inputs .clone(); let raw_outputs = hex::decode("82825839000af00cc47500bb64cfffb783e8c42f746b4e8b8a70ede9c08c7113acf3bde34d1041f5a2076ef9aa6cf4539ab1a96ed462a0300acbdb65d51a02b3603082581d703a888d65f16790950a72daee1f63aa05add6d268434107cfa5b677121a001e8480").unwrap(); let outputs = MaybeIndefArray::::decode_fragment(&raw_outputs).unwrap(); let utxos: MaybeIndefArray = MaybeIndefArray::Indef( inputs .iter() .zip(outputs.iter()) .map(|(input, output)| ResolvedInput { input: input.clone(), output: output.clone(), }) .collect(), ); let slot_config = SlotConfig { zero_time: 1660003200000, // Preview network zero_slot: 0, slot_length: 1000, }; let costs: Vec = vec![ 205665, 812, 1, 1, 1000, 571, 0, 1, 1000, 24177, 4, 1, 1000, 32, 117366, 10475, 4, 23000, 100, 23000, 100, 23000, 100, 23000, 100, 23000, 100, 23000, 100, 100, 100, 23000, 100, 19537, 32, 175354, 32, 46417, 4, 221973, 511, 0, 1, 89141, 32, 497525, 14068, 4, 2, 196500, 453240, 220, 0, 1, 1, 1000, 28662, 4, 2, 245000, 216773, 62, 1, 1060367, 12586, 1, 208512, 421, 1, 187000, 1000, 52998, 1, 80436, 32, 43249, 32, 1000, 32, 80556, 1, 57667, 4, 1000, 10, 197145, 156, 1, 197145, 156, 1, 204924, 473, 1, 208896, 511, 1, 52467, 32, 64832, 32, 65493, 32, 22558, 32, 16563, 32, 76511, 32, 196500, 453240, 220, 0, 1, 1, 69522, 11687, 0, 1, 60091, 32, 196500, 453240, 220, 0, 1, 1, 196500, 453240, 220, 0, 1, 1, 806990, 30482, 4, 1927926, 82523, 4, 265318, 0, 4, 0, 85931, 32, 205665, 812, 1, 1, 41182, 32, 212342, 32, 31220, 32, 32696, 32, 43357, 32, 32247, 32, 38314, 32, 9462713, 1021, 10, ]; let cost_mdl = CostMdls { plutus_v1: Some(costs), plutus_v2: None, }; let initial_budget = ExBudget { cpu: 10000000000, mem: 14000000, }; let multi_era_tx = MultiEraTx::decode(Era::Babbage, &tx_bytes) .or_else(|_| MultiEraTx::decode(Era::Alonzo, &tx_bytes)) .unwrap(); match multi_era_tx { MultiEraTx::Babbage(tx) => { eval_phase_two( &tx, &utxos, Some(&cost_mdl), Some(&initial_budget), &slot_config, false, ) .unwrap(); } _ => unreachable!(), }; } #[test] fn eval_extraneous_redeemer() { let tx_bytes = hex::decode("84a70082825820275b5da338c8b899035081eb34bfa950b634911a5dd3271b3ad6cf4c2bba0c5000825820275b5da338c8b899035081eb34bfa950b634911a5dd3271b3ad6cf4c2bba0c50010181825839000af00cc47500bb64cfffb783e8c42f746b4e8b8a70ede9c08c7113acf3bde34d1041f5a2076ef9aa6cf4539ab1a96ed462a0300acbdb65d51a02cf2b47021a0002aa0a0b5820fc54f302cff3a8a1cb374f5e4979e18a1d3627dcf4539637b03f5959eb8565bf0d81825820275b5da338c8b899035081eb34bfa950b634911a5dd3271b3ad6cf4c2bba0c500110825839000af00cc47500bb64cfffb783e8c42f746b4e8b8a70ede9c08c7113acf3bde34d1041f5a2076ef9aa6cf4539ab1a96ed462a0300acbdb65d51a02af51c2111a0003ff0fa40081825820065dd553fbe4e240a8f819bb9e333a7483de4a22b65c7fb6a95ce9450f84dff758402c26125a057a696079d08f2c8c9d2b8ccda9fe7cf7360c1a86712b85a91db82a3b80996b30ba6f4b2f969c93eb50694e0f6ea0bcf129080dcc07ecd9e605f00a049fd87980ff0582840000d879808219044c1a000382d48401001864821903e81903e8068149480100002221200101f5f6").unwrap(); let multi_era_tx = MultiEraTx::decode(Era::Babbage, &tx_bytes) .or_else(|_| MultiEraTx::decode(Era::Alonzo, &tx_bytes)) .unwrap(); let inputs = multi_era_tx .as_babbage() .unwrap() .transaction_body .inputs .clone(); let raw_outputs = hex::decode("82825839000af00cc47500bb64cfffb783e8c42f746b4e8b8a70ede9c08c7113acf3bde34d1041f5a2076ef9aa6cf4539ab1a96ed462a0300acbdb65d51a02b3603082581d703a888d65f16790950a72daee1f63aa05add6d268434107cfa5b677121a001e8480").unwrap(); let outputs = MaybeIndefArray::::decode_fragment(&raw_outputs).unwrap(); let utxos: MaybeIndefArray = MaybeIndefArray::Indef( inputs .iter() .zip(outputs.iter()) .map(|(input, output)| ResolvedInput { input: input.clone(), output: output.clone(), }) .collect(), ); let slot_config = SlotConfig { zero_time: 1660003200000, // Preview network zero_slot: 0, slot_length: 1000, }; let costs: Vec = vec![ 205665, 812, 1, 1, 1000, 571, 0, 1, 1000, 24177, 4, 1, 1000, 32, 117366, 10475, 4, 23000, 100, 23000, 100, 23000, 100, 23000, 100, 23000, 100, 23000, 100, 100, 100, 23000, 100, 19537, 32, 175354, 32, 46417, 4, 221973, 511, 0, 1, 89141, 32, 497525, 14068, 4, 2, 196500, 453240, 220, 0, 1, 1, 1000, 28662, 4, 2, 245000, 216773, 62, 1, 1060367, 12586, 1, 208512, 421, 1, 187000, 1000, 52998, 1, 80436, 32, 43249, 32, 1000, 32, 80556, 1, 57667, 4, 1000, 10, 197145, 156, 1, 197145, 156, 1, 204924, 473, 1, 208896, 511, 1, 52467, 32, 64832, 32, 65493, 32, 22558, 32, 16563, 32, 76511, 32, 196500, 453240, 220, 0, 1, 1, 69522, 11687, 0, 1, 60091, 32, 196500, 453240, 220, 0, 1, 1, 196500, 453240, 220, 0, 1, 1, 806990, 30482, 4, 1927926, 82523, 4, 265318, 0, 4, 0, 85931, 32, 205665, 812, 1, 1, 41182, 32, 212342, 32, 31220, 32, 32696, 32, 43357, 32, 32247, 32, 38314, 32, 9462713, 1021, 10, ]; let cost_mdl = CostMdls { plutus_v1: Some(costs), plutus_v2: None, }; let initial_budget = ExBudget { cpu: 10000000000, mem: 14000000, }; let multi_era_tx = MultiEraTx::decode(Era::Babbage, &tx_bytes) .or_else(|_| MultiEraTx::decode(Era::Alonzo, &tx_bytes)) .unwrap(); match multi_era_tx { MultiEraTx::Babbage(tx) => { assert!(eval_phase_two( &tx, &utxos, Some(&cost_mdl), Some(&initial_budget), &slot_config, false, ) .is_err()); } _ => unreachable!(), }; }