diff --git a/crates/uplc/src/machine.rs b/crates/uplc/src/machine.rs index f8a4fa87..8740699a 100644 --- a/crates/uplc/src/machine.rs +++ b/crates/uplc/src/machine.rs @@ -459,7 +459,7 @@ impl Value { } Constant::ByteString(b) => { if b.is_empty() { - 0 + 1 } else { ((b.len() as i64 - 1) / 8) + 1 } diff --git a/crates/uplc/src/tx/eval.rs b/crates/uplc/src/tx/eval.rs index f7021efe..e22f0287 100644 --- a/crates/uplc/src/tx/eval.rs +++ b/crates/uplc/src/tx/eval.rs @@ -19,7 +19,7 @@ use super::{ ResolvedInput, ScriptContext, ScriptPurpose, SlotConfig, TimeRange, TxInInfo, TxInfo, TxInfoV1, TxInfoV2, TxOut, }, - to_plutus_data::ToPlutusData, + to_plutus_data::{MintValue, ToPlutusData}, Error, }; @@ -286,7 +286,7 @@ fn get_tx_info_v1( inputs, outputs, fee, - mint, + mint: MintValue { mint_value: mint }, dcert, wdrl, valid_range, @@ -363,7 +363,7 @@ fn get_tx_info_v2( reference_inputs, outputs, fee, - mint, + mint: MintValue { mint_value: mint }, dcert, wdrl, valid_range, @@ -739,15 +739,10 @@ pub fn eval_redeemer( prog.into() }; - let program_flat: Program = program.clone().into(); - println!("{}", hex::encode(program_flat.to_cbor().unwrap())); - let program = program .apply_data(redeemer.data.clone()) .apply_data(script_context.to_plutus_data()); - println!("{:#?}", script_context.to_plutus_data()); - let (result, budget, logs) = if let Some(cost_mdls) = cost_mdls_opt { let costs = if let Some(costs) = &cost_mdls.plutus_v1 { costs @@ -820,12 +815,6 @@ pub fn eval_redeemer( None => ExBudget::default(), }; - println!( - "({},{})", - initial_budget.mem - budget.mem, - initial_budget.cpu - budget.cpu - ); - let new_redeemer = Redeemer { tag: redeemer.tag.clone(), index: redeemer.index, diff --git a/crates/uplc/src/tx/script_context.rs b/crates/uplc/src/tx/script_context.rs index 2ae643b9..f762e441 100644 --- a/crates/uplc/src/tx/script_context.rs +++ b/crates/uplc/src/tx/script_context.rs @@ -1,11 +1,13 @@ use pallas_codec::utils::KeyValuePairs; use pallas_crypto::hash::Hash; use pallas_primitives::babbage::{ - AddrKeyhash, Certificate, Coin, DatumHash, Mint, PlutusData, PolicyId, Redeemer, RewardAccount, + AddrKeyhash, Certificate, Coin, DatumHash, PlutusData, PolicyId, Redeemer, RewardAccount, StakeCredential, TransactionInput, TransactionOutput, Value, Withdrawals, }; use serde::Deserialize; +use super::to_plutus_data::MintValue; + #[derive(Debug, PartialEq, Clone, Deserialize)] pub struct ResolvedInput { pub input: TransactionInput, @@ -36,7 +38,7 @@ pub struct TxInfoV1 { pub inputs: Vec, pub outputs: Vec, pub fee: Value, - pub mint: Mint, + pub mint: MintValue, pub dcert: Vec, pub wdrl: Vec<(RewardAccount, Coin)>, pub valid_range: TimeRange, @@ -51,7 +53,7 @@ pub struct TxInfoV2 { pub reference_inputs: Vec, pub outputs: Vec, pub fee: Value, - pub mint: Mint, + pub mint: MintValue, pub dcert: Vec, pub wdrl: Withdrawals, pub valid_range: TimeRange, diff --git a/crates/uplc/src/tx/tests.rs b/crates/uplc/src/tx/tests.rs index 0fea12d7..9fd84405 100644 --- a/crates/uplc/src/tx/tests.rs +++ b/crates/uplc/src/tx/tests.rs @@ -1190,10 +1190,10 @@ fn test_eval_7() { */ - let tx_bytes = hex::decode("84a80082825820f375a19211ee8ce75b8306a2604e2a0e8c50dfae7a103dd3688f980bec5e29b200825820c5bc1437117c200f325467dcede3c09fbfca32f9fe399bd40c778ab2fa832f43010182825839010af00cc47500bb64cfffb783e8c42f746b4e8b8a70ede9c08c7113acf3bde34d1041f5a2076ef9aa6cf4539ab1a96ed462a0300acbdb65d5821a00111958a1581c366b596f230f1f7002b5a7a63c3fc6be4ef4e3ab81aae50824f78f52a1400a825839010af00cc47500bb64cfffb783e8c42f746b4e8b8a70ede9c08c7113acf3bde34d1041f5a2076ef9aa6cf4539ab1a96ed462a0300acbdb65d51a0060019e021a0003d41009a1581c366b596f230f1f7002b5a7a63c3fc6be4ef4e3ab81aae50824f78f52a1400a0b58204d87ff063c986ace7ca9fb756623f2125e7270c6934724f4cef6ae181d59cf650d81825820f375a19211ee8ce75b8306a2604e2a0e8c50dfae7a103dd3688f980bec5e29b20110825839010af00cc47500bb64cfffb783e8c42f746b4e8b8a70ede9c08c7113acf3bde34d1041f5a2076ef9aa6cf4539ab1a96ed462a0300acbdb65d51a054a2fa2111a0005be18a30081825820065dd553fbe4e240a8f819bb9e333a7483de4a22b65c7fb6a95ce9450f84dff75840bb436c43e52cf56c75c551c65c25b10e6ef864ded07742bc2bca8ee20c29bad00d2016e265d15b614fa486b912443e3206a2ca19cca5d9a7c0ff08124a821f0e038159045a590457010000332232323232323222323232325335001100c1326320083357389201035054350000c3353235001220013553353333333574800846666ae68cdc39aab9d5004480008cccd55cfa8021280791999aab9f500425010233335573e6ae89401494cd54cd4c8c8c8c8c8c8c8c8c8c8c8c8ccccccd5d200611999ab9a3370e6aae7540312000233335573ea0184a04046666aae7d4030940848cccd55cfa8061281111999aab9f500c25023233335573ea0184a04846666aae7d4030940948cccd55cfa8061281311999aab9f500c25027233335573ea0184a05046666aae7d4030940a48cccd55cf9aba2500d2533553355335533553355335533533355025028335502502802735742a028426a05866644444444424666666666600201401201001600e00c00a0080060046ae854060d5d0a80b9aba150161502a213502c300135742a0282a054426a05860026ae85404c540a884d40b0c004d5d0a8090a815109a81618009aba150111502a213502c300135742a0202a054426a05860026ae85403c540a8940a80a009c09809409008c08808408007c0789407c060940789407894078940780704d5d1280089aba25001135744a00226ae8940044d5d1280089aba25001135744a00226ae8940044d5d1280089aab9e5001137540026ae85401c84d404c848cc00400c00854044854cd4c8c8c8c8ccccccd5d200211999ab9a3370ea004900111999aab9f500425019233335573e6ae89401494cd4c8c8c8c8ccccccd5d200211999ab9a3370e6aae7540112000233335573ea0084a04246666aae7d4010940888cccd55cf9aba25005253353232323333333574800646666ae68cdc39aab9d5003480008cccd55cfa8019281491999aab9f35744a0084a66a60506ae85401484d40b0004540a8940a80a009c940a00849409c9409c9409c9409c0944d55cf280089baa00135742a00e42a66a60426ae85401c84d409848cc00400c008540905408c9408c08408007c940800649407c9407c9407c9407c0744d5d1280089aab9e5001137540026ae85401884d4070488c00400c540689406806005c8cccd5cd19b875003480008cccd55cfa8029280d11999aab9f35744a00c4a66a60326ae85401c84d4074488c00800c5406c9406c064060940640480449405c9405c9405c9405c0544d55cea80109aab9e5001137540026ae85401c84d4050c00800454048540449404403c0380349403801c9403494034940349403402c8448c0040085880048488008984d5d1280089aab9e5001137540029308911911999999aba4001550052533530033756004426a0180022a014aa00aaa00aaa00a010640026460020024464646666aae7c00c8d403448800894cd4c01cd55cea80110a99a98039aab9e500321533530053574400c426a02024466002246600200c00a0062a01c2a01a2a01801426ae84008c00800844940148ccccccd5d200092802928029280291a8031bad002250050032333333357480024a0084a0084a0084a00846a00a6eb80080084800448488c00800c44880050581840100d87980821a0003b9f01a0675391df5f6").unwrap(); + let tx_bytes = hex::decode("84a80082825820a0bfcb30c19402a5bc79ecd33ddea4d67d8d6cb2ebe694c5ac2f14abc47092f400825820f375a19211ee8ce75b8306a2604e2a0e8c50dfae7a103dd3688f980bec5e29b2000182825839010af00cc47500bb64cfffb783e8c42f746b4e8b8a70ede9c08c7113acf3bde34d1041f5a2076ef9aa6cf4539ab1a96ed462a0300acbdb65d5821a00113b04a1581c9bed3f1e167c09eb82273ab0b51b383d31c3b0dbf3a468ca4bc23d02a14231310c825839010af00cc47500bb64cfffb783e8c42f746b4e8b8a70ede9c08c7113acf3bde34d1041f5a2076ef9aa6cf4539ab1a96ed462a0300acbdb65d51a0040eb3c021a0009674009a1581c9bed3f1e167c09eb82273ab0b51b383d31c3b0dbf3a468ca4bc23d02a14231310c0b5820f7a477a807b46ecb36f2552c1ac4730394e8d24e572c65afde772771d688114a0d8182582017a796d7541fc547bca875a82c7bd35e45b821cb69bebd21db774bcde16fffdc0110825839010af00cc47500bb64cfffb783e8c42f746b4e8b8a70ede9c08c7113acf3bde34d1041f5a2076ef9aa6cf4539ab1a96ed462a0300acbdb65d51a052fe707111a000e1ae0a30081825820065dd553fbe4e240a8f819bb9e333a7483de4a22b65c7fb6a95ce9450f84dff7584090a0c710cbd45fdfca8b789e9062bc7d8fbfb6eb44a2a348db3b8daaddb6f6198d6ece3a36f808d118a7b16ac17747ee6e0790a4b5234187aa5f3c11631ba50a0381590fc3590fc001000032332232332232323232323232323232323232332232323232323232323232323232332232322232323232325335001102713263202633573892010350543500027323233355300e1200135012501123500122333553011120013501550142350012233350012330324800000488cc0cc0080048cc0c800520000013355300d1200123500122335502a00233350012335530111200123500122335502e0023550130010012233355500e0140020012335530111200123500122335502e00235501200100133355500900f0020013013300f50023012300e500113553353333333574800846666ae68cdc39aab9d5004480008cccd55cfa8021281491999aab9f50042502a233335573e6ae89401494cd54cd4c8c8c8c8c8c8c8c8c8c8c8c8ccccccd5d200611999ab9a3370e6aae7540312000233335573ea0184a07446666aae7d4030940ec8cccd55cfa8061281e11999aab9f500c2503d233335573ea0184a07c46666aae7d4030940fc8cccd55cfa8061282011999aab9f500c25041233335573ea0184a08446666aae7d40309410c8cccd55cf9aba2500d2533553355335533553355335533553355335533533503023232323333333574800846666ae68cdc39aab9d5004480008cccd55cfa8021282591999aab9f50042504c233335573e6ae89401494cd4c10cd5d0a80390a99a981d9aba15007213505012330010030021504e1504d2504d04b04a0492504a04625049250492504925049047135744a00226aae7940044dd50009aba15017213504622222222212333333333300100b00a0090080070060050040030021504421533533503103235742a02e426a08e60040022a08a2a08842a66a666aa06807ca0666ae85405884d411cc0080045411454110854cd4ccd540d00f940ccd5d0a80a909a82398010008a8228a82210a99a99a81891919191919191999999aba400723333573466e1d4009200c233335573ea00e46a0a0244444440064a09e09a46666ae68cdc3a801a401446666aae7d40208d414448888888010941401388cccd5cd19b875004480208cccd55cfa8049282891999aab9f500725052233335573e6ae89402094cd4c130d5d0a80610a99a98259aba1500a2135056122222223300100900815054150532505305105004f23333573466e1d40152006233335573ea0144a0a446666aae7d40249414c8cccd55cf9aba2500a25335304d35742a01a42a66a609c6ae85403084d415c48888888cc0080240205415454150941501481441408cccd5cd19b875006480108cccd55cfa8059282991999aab9f500b25054233335573e6ae89403094cd4c124d5d0a80710a99a98279aba1500e2135058122222223300600900815056150552505505305205123333573466e1d401d2002233335573ea0184a0a846666aae7cd5d128069299a98249aba1500e2135057122222223007008150552505505305223333573466e1d40212000233335573ea01a4a0aa46666aae7cd5d128071299a98251aba1500f213505812222222300500815056250560540532505405004f04e04d04c04b04a2504d2504d2504d2504d04b135573aa00a26ae89400c4d5d1280109aba25001135573ca00226ea8004d5d0a80a109a82398010008a8228a82210a99a99a81899aa82081c81e1aba15013213504730020011504515044215335323232323333333574800846666ae68cdc39aab9d5004480008cccd55cfa8021282611999aab9f50042504d233335573e6ae89401494cd4c8c8c8c8ccccccd5d200211999ab9a3370e6aae7540112000233335573ea0084a0aa46666aae7d4010941588cccd55cf9aba250052533533505104e35742a00e42a66a60a66ae85401c84d416848cc00400c008541605415c9415c15415014c941501409414c9414c9414c9414c1444d5d1280089aab9e5001137540026ae85401c854cd4c8c8c8c8ccccccd5d200211999ab9a3370e6aae7540112000233335573ea0084a0ac46666aae7d40109415c8cccd55cf9aba250052533533505204f35742a00e42a66a60a86ae85401c84d416c48cc00400c00854164541609416015815415094154144941509415094150941501484d5d1280089aab9e5001137540026ae85401c84d414448cc00400c0085413c541389413813012c1289412c11c941289412894128941281204d5d1280089aab9e5001137540026ae85404884d411cc0080045411454110854cd4cd40c40f8d5d0a808909a82398010008a8228a82210a99a99a81899aa82081f28231aba15010213504730020011504515044215335303d35742a01e426a08e60040022a08a2a0884a08808408208007e07c07a0780760740720704a07206a4a0704a0704a0704a07006c26ae8940044d5d1280089aba25001135744a00226ae8940044d5d1280089aba25001135744a00226ae8940044d55cf280089baa00135742a00e426a05a424660020060042a05642a66a646464646666666ae900108cccd5cd19b875002480088cccd55cfa8021281991999aab9f35744a00a4a66a60546ae85401884d40d8488c00400c540d0940d00c80c48cccd5cd19b875003480008cccd55cfa8029281a11999aab9f35744a00c4a66a605c6ae85401c84d40dc488c00800c540d4940d40cc0c8940cc0bc0b8940c4940c4940c4940c40bc4d55cea80109aab9e5001137540026ae85401c84d40b8c008004540b0540ac940ac0a40a009c940a00909409c9409c9409c9409c0948448c0040085880044d5d1280089aab9e500113754002222444666aa600824002a02866aa600e2400246a0024466aa0480046aa012002666aa600824002446a00444a66a666aa6018240026466a02444666a006440040040026a00244002246600244a66a004205c200205646a002446601400400a00c2006266a030008006a02a00266aa600e2400246a002446466aa04a006600200a640026aa05644a66a00226aa0140064426a00444a66a6601800401022444660040140082600c006004640026aa0484422444a66a00220044426600a004666aa600e2400200a0080022242444600600822424446002008640026aa042442244a66a0022a02444266a026600800466aa600c24002008002640026aa0404422444a66a00226a00644002442666a00a440046008004666aa600e2400200a00800244666ae68cdc780100081000f91a800910010891980091299a8010800880f00e8919a80111199a801910010010009a80091000891091980080180111a8009111111111004091911999999aba400125018250182300337580044a0304a03002c640026aa034446666aae7c0048d4065402894cd4c010d5d080110a99a98021aba2003213501b33500b00200115019150180162323232323333333574800a46666ae68cdc39aab9d5005480008cccd55cfa8029280d91999aab9f50052501c233335573ea00a4a03a46666aae7cd5d128031299a991919191999999aba400423333573466e1cd55cea8022400046666aae7d4010940948cccd55cfa8021281311999aab9f35744a00a4a66a60386ae85401c854cd4cd406c070d5d0a803909a81509198008018010a8140a81392813812812011928120101281192811928119281181089aba25001135573ca00226ea8004d5d0a80490a99a999aa80700c28069aba1500921533533501301935742a012426a044246660020080060042a0402a03e2a03c4a03c0380360340324a03402c4a0324a0324a0324a03202e26ae8940044d5d1280089aab9e500113754002266aa00201601222446446666666ae900055401494cd4c00cdd5801109a80c0008a80b2a802aa802aa80280a190009aa80c11191999aab9f002235018500925335300635573aa00442a66a600c6aae79400c854cd4c018d5d1002909a80d99a80599aa80c0018010008a80c8a80c0a80b80a89aba100111250111122002122122330010040031223232323333333574800846666ae68cdc3a8012400046666aae7d4010940548cccd55cf9aba2500525335300935742a00c426a0306a0300022a02c4a02c02802646666ae68cdc3a801a400446666aae7d40148d405d405894058050940540440409404c9404c9404c9404c0444d55cea80109aab9e500113754002464646464646666666ae900188cccd5cd19b875002480088cccd55cfa8031280a91999aab9f500625016233335573ea00c4a02e46666aae7cd5d128039299a98079aba1500a215335301035742a01442a66a60226ae85402884d4070488ccc00401401000c5406854064540609406005805405004c8cccd5cd19b875003480008cccd55cfa8039280b11999aab9f35744a0104a66a60186ae85402484d4064488c00800c5405c9405c054050940540440409404c9404c9404c9404c0444d55cea80209aba25001135744a00226aae7940044dd500091919191999999aba400423333573466e1d40092002233335573ea0084a02446666aae7cd5d128029299a98061aba1500621350151223001003150132501301101023333573466e1d400d2000233335573ea00a4a02646666aae7cd5d128031299a98069aba150072135016122300200315014250140120112501200e00d2501025010250102501000e135573aa00426aae7940044dd500091919191999999aba400423333573466e1cd55cea8022400046666aae7d4010940448cccd55cfa8021280911999aab9f35744a00a4a66a60166ae85401c854cd4c02cd5d0a803909a80b09198008018010a80a0a80992809808808007928080061280792807928079280780689aba25001135573ca00226ea80048ccccccd5d200092805928059280591a8061bad0022500b009232323333333574800646666ae68cdc39aab9d5003480008cccd55cfa8019280711999aab9f35744a0084a66a60106ae85401484d40440045403c9403c03403094034024940309403094030940300284d55cf280089baa0012333333357480024a0124a0124a0124a01246a0146eb800801c488c8c8c8ccccccd5d200211999ab9a3370ea004900211999aab9f500423500f12220012500e00c23333573466e1d400d2002233335573ea00a4a01e46666aae7cd5d128031299a98051aba15007213501212223003004150102501000e00d23333573466e1d40112000233335573ea00c46a02224440044a02001c4a01e0160140124a0184a0184a0184a01801426aae7540084d55cf280089baa00123232323333333574800846666ae68cdc3a8012400446666aae7d40108d4034040940300288cccd5cd19b875003480008cccd55cfa80291a80700812806805928060040039280512805128051280500409aab9d5002135573ca00226ea800444888c8c8c8ccccccd5d200211999ab9a3370e6aae7540112000233335573ea0084a01a46666aae7d4010940388cccd55cf9aba2500525335300b35742a00e42a66a60166ae85401c84d4048cd5403c008004540405403c9403c03403002c940300209402c9402c9402c9402c0244d5d1280089aab9e500113754002930891091980080180109000890911801001889100091199ab9a3370e0040020080062440042440022246460020024466006600400400210581840100d87980821a002d162a1a48ceb84cf5f6").unwrap(); - let raw_inputs = hex::decode("86825820a0bfcb30c19402a5bc79ecd33ddea4d67d8d6cb2ebe694c5ac2f14abc47092f400825820a0bfcb30c19402a5bc79ecd33ddea4d67d8d6cb2ebe694c5ac2f14abc47092f401825820cd3589fae0ae4ad33dbc8a8d99b4e99b4a78c2b0473040aab34da8e44fba9fa300825820f375a19211ee8ce75b8306a2604e2a0e8c50dfae7a103dd3688f980bec5e29b200825820f375a19211ee8ce75b8306a2604e2a0e8c50dfae7a103dd3688f980bec5e29b201825820c5bc1437117c200f325467dcede3c09fbfca32f9fe399bd40c778ab2fa832f4301").unwrap(); - let raw_outputs = hex::decode("86825839010af00cc47500bb64cfffb783e8c42f746b4e8b8a70ede9c08c7113acf3bde34d1041f5a2076ef9aa6cf4539ab1a96ed462a0300acbdb65d51a000f4240825839010af00cc47500bb64cfffb783e8c42f746b4e8b8a70ede9c08c7113acf3bde34d1041f5a2076ef9aa6cf4539ab1a96ed462a0300acbdb65d5821a005da7c4ac581c1e852216c006c55490cd85b6e0ba523a37c2be3526f479e61cca41eba2444e616d6902454e616d693201581c21514b6c51f0aaa0c9c337329ce93c52fad208cfd0b4ccd51074d9dcab4d50494e4b44494e4f4331494439014d50494e4b44494e4f4332494439014d50494e4b44494e4f4333494439014d50494e4b44494e4f4334494439014d50494e4b44494e4f4335494439014d50494e4b44494e4f4336494439014d50494e4b44494e4f4337494439014d50494e4b44494e4f4338494439014d50494e4b44494e4f4339494439014e50494e4b44494e4f433130494439014e50494e4b44494e4f43313149443901581c321668648736a09a40bc3ef5fbd05590530be624e39af84fab3bc6bba84d435033503050726f6d6f333431014f4b696e67447572616e747574323531015053616d757257686950726f6d6f313933015143727970746f6d626f50726f6d6f3134360154536b756c6c62616c6c4c6f676f50726f6d6f35320155536b756c6c62616c6c4c6f676f50726f6d6f33313301581b425345647761726473536c616d6d696e48616e647330303034313201581c42697a61727265537461727344726561646c696f6e526f736533323401581c9ec93fd47d1e43ec5bb5dad70af92b6498b92d20d4325f9027ac4743a1574a6f736570684d6972616e64615754503030353754323601581ca7dc26584358f5ca8d99d7aa646a7b658120296a94588e1cefad8940a157546573744e616d69467269656e645368696e794a50454701581cbc5a0f0f3f1bfa92286410388c54655687bb518f47e12b88c0d0728ca14b566563746f724669656c6401581cc4c00fbd8fa227442a5e7cdecde33b24588494d05a2c50fda8938c6da1444b49445a19c346581cd068fe47123ec4c86460eeb74c7d7765c67d2df295a3ac86d664ed45a156506c757475734669727374436c61737350686f746f3101581cd3b65744dd067fd7103cc6a4019cc9cd5f8627b78174c05dc67a9ad6a1544c696665496e4c6f636b646f776e53314d31503201581cd973d8df645da318bb331dbe4af8eb0270079470225d955c6183445ca15148617070794269727468646179416c657301581cdf9974c2192744f3b6dac92990769fe26c36b0ac8bcc623fb457a45da14d575450303035466c796572323401581cee47c1521b55a006c345f739f084f5c205aeb295e3e42fa66b9d1dd2a151446965666e6643727970746f6e6965726505825839010af00cc47500bb64cfffb783e8c42f746b4e8b8a70ede9c08c7113acf3bde34d1041f5a2076ef9aa6cf4539ab1a96ed462a0300acbdb65d51a000f4240825839010af00cc47500bb64cfffb783e8c42f746b4e8b8a70ede9c08c7113acf3bde34d1041f5a2076ef9aa6cf4539ab1a96ed462a0300acbdb65d51a004c4b40825839010af00cc47500bb64cfffb783e8c42f746b4e8b8a70ede9c08c7113acf3bde34d1041f5a2076ef9aa6cf4539ab1a96ed462a0300acbdb65d51a054fedba825839010af00cc47500bb64cfffb783e8c42f746b4e8b8a70ede9c08c7113acf3bde34d1041f5a2076ef9aa6cf4539ab1a96ed462a0300acbdb65d51a0028a3c6").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(); @@ -1278,6 +1278,260 @@ fn test_eval_7() { }; } +#[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 + 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(); + + println!("{:?}", redeemers.len()); + + 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: 40211433, + mem: 114126 + } + ); + } + _ => unreachable!(), + }; +} + #[test] fn eval_missing_redeemer() { let tx_bytes = hex::decode("84a30082825820275b5da338c8b899035081eb34bfa950b634911a5dd3271b3ad6cf4c2bba0c5000825820275b5da338c8b899035081eb34bfa950b634911a5dd3271b3ad6cf4c2bba0c50010181825839000af00cc47500bb64cfffb783e8c42f746b4e8b8a70ede9c08c7113acf3bde34d1041f5a2076ef9aa6cf4539ab1a96ed462a0300acbdb65d51a02cf47c8021a00028d89a1068149480100002221200101f5f6").unwrap(); diff --git a/crates/uplc/src/tx/to_plutus_data.rs b/crates/uplc/src/tx/to_plutus_data.rs index 7747509e..a68b504f 100644 --- a/crates/uplc/src/tx/to_plutus_data.rs +++ b/crates/uplc/src/tx/to_plutus_data.rs @@ -1,9 +1,9 @@ use pallas_addresses::{Address, ShelleyDelegationPart, ShelleyPaymentPart}; use pallas_codec::utils::{AnyUInt, Bytes, Int, KeyValuePairs}; use pallas_crypto::hash::Hash; -use pallas_primitives::babbage::{AssetName, BigInt, Constr, PlutusData, ScriptRef}; +use pallas_primitives::babbage::{AssetName, BigInt, Constr, Mint, PlutusData, ScriptRef}; use pallas_primitives::babbage::{ - Certificate, DatumOption, PolicyId, Redeemer, Script, StakeCredential, TransactionInput, + Certificate, DatumOption, Redeemer, Script, StakeCredential, TransactionInput, TransactionOutput, Value, }; use pallas_traverse::ComputeHash; @@ -43,6 +43,11 @@ pub trait ToPlutusData { fn to_plutus_data(&self) -> PlutusData; } +#[derive(Debug, PartialEq, Clone)] +pub struct MintValue { + pub mint_value: Mint, +} + impl ToPlutusData for Address { fn to_plutus_data(&self) -> PlutusData { match self { @@ -201,7 +206,7 @@ impl ToPlutusData for Value { fn to_plutus_data(&self) -> PlutusData { match self { Value::Coin(coin) => PlutusData::Map(KeyValuePairs::Def(vec![( - PolicyId::from([0; 28]).to_plutus_data(), + Bytes::from(vec![]).to_plutus_data(), PlutusData::Map(KeyValuePairs::Def(vec![( AssetName::from(vec![]).to_plutus_data(), coin.to_plutus_data(), @@ -209,7 +214,7 @@ impl ToPlutusData for Value { )])), Value::Multiasset(coin, multiassets) => { let mut data_vec: Vec<(PlutusData, PlutusData)> = vec![( - PolicyId::from([0; 28]).to_plutus_data(), + Bytes::from(vec![]).to_plutus_data(), PlutusData::Map(KeyValuePairs::Def(vec![( AssetName::from(vec![]).to_plutus_data(), coin.to_plutus_data(), @@ -233,6 +238,31 @@ impl ToPlutusData for Value { } } +impl ToPlutusData for MintValue { + fn to_plutus_data(&self) -> PlutusData { + let mut data_vec: Vec<(PlutusData, PlutusData)> = vec![( + Bytes::from(vec![]).to_plutus_data(), + PlutusData::Map(KeyValuePairs::Def(vec![( + AssetName::from(vec![]).to_plutus_data(), + 0_i64.to_plutus_data(), + )])), + )]; + + for (policy_id, assets) in self.mint_value.iter() { + let mut assets_vec = vec![]; + for (asset, amount) in assets.iter() { + assets_vec.push((asset.to_plutus_data(), amount.to_plutus_data())); + } + data_vec.push(( + policy_id.to_plutus_data(), + PlutusData::Map(KeyValuePairs::Def(assets_vec)), + )); + } + + PlutusData::Map(KeyValuePairs::Def(data_vec)) + } +} + impl ToPlutusData for ScriptRef { fn to_plutus_data(&self) -> PlutusData { match &self.0 {