diff --git a/crates/aiken/src/cmd/tx/simulate.rs b/crates/aiken/src/cmd/tx/simulate.rs index d3efe67b..0751e6d9 100644 --- a/crates/aiken/src/cmd/tx/simulate.rs +++ b/crates/aiken/src/cmd/tx/simulate.rs @@ -110,8 +110,8 @@ pub fn exec( let with_redeemer = |redeemer: &Redeemer| { eprintln!( - "{} {:?} → {}", - " Redeemer" + "{} {:?}[{}]", + " Evaluating" .if_supports_color(Stderr, |s| s.purple()) .if_supports_color(Stderr, |s| s.bold()), redeemer.tag, diff --git a/crates/uplc/src/tx/error.rs b/crates/uplc/src/tx/error.rs index c1063090..28275a60 100644 --- a/crates/uplc/src/tx/error.rs +++ b/crates/uplc/src/tx/error.rs @@ -49,11 +49,11 @@ pub enum Error { #[error("can't eval without redeemers")] NoRedeemers, #[error( - "mismatch in expected redeemers\n{:>13} {}\n{:>13} {}", + "missing and/or unexpected validator(s) and/or redeemer(s)\n{:>13} {}\n{:>13} {}", "Missing", - if .missing.is_empty() { "ø".to_string() } else { .missing.join(&format!("\n{:>13}", "")) }, + if .missing.is_empty() { "ø".to_string() } else { .missing.join(&format!("\n{:>14}", "")) }, "Unexpected", - if .extra.is_empty() { "ø".to_string() } else { .extra.join(&format!("\n{:>13}", "")) }, + if .extra.is_empty() { "ø".to_string() } else { .extra.join(&format!("\n{:>14}", "")) }, )] RequiredRedeemersMismatch { missing: Vec, @@ -87,7 +87,7 @@ pub enum Error { MissingRequiredInlineDatumOrHash, #[error("redeemer points to an unsupported certificate type")] UnsupportedCertificateType, - #[error("failed script execution\n{:>13} {}", format!("{}({})", tag, index), err)] + #[error("failed script execution\n{:>13} {}", format!("{}[{}]", tag, index), err)] RedeemerError { tag: String, index: u32, diff --git a/crates/uplc/src/tx/eval.rs b/crates/uplc/src/tx/eval.rs index 636fa47d..c82f892f 100644 --- a/crates/uplc/src/tx/eval.rs +++ b/crates/uplc/src/tx/eval.rs @@ -44,7 +44,7 @@ pub fn eval_redeemer( } .apply_data(redeemer.data.clone()) .apply_data(script_context.to_plutus_data()), - ScriptContext::V3 { .. } => { + ScriptContext::V3 { .. } if datum.is_some() => { program // FIXME: Temporary, but needed until https://github.com/aiken-lang/aiken/pull/977 // is implemented. @@ -52,6 +52,13 @@ pub fn eval_redeemer( .apply_data(Data::constr(0, vec![])) .apply_data(script_context.to_plutus_data()) } + ScriptContext::V3 { .. } => { + program + // FIXME: Temporary, but needed until https://github.com/aiken-lang/aiken/pull/977 + // is implemented. + .apply_data(Data::constr(0, vec![])) + .apply_data(script_context.to_plutus_data()) + } }; let mut eval_result = if let Some(costs) = cost_mdl_opt { diff --git a/crates/uplc/src/tx/phase_one.rs b/crates/uplc/src/tx/phase_one.rs index c86436bb..9d56f055 100644 --- a/crates/uplc/src/tx/phase_one.rs +++ b/crates/uplc/src/tx/phase_one.rs @@ -185,7 +185,7 @@ pub fn has_exact_set_of_redeemers( let missing: Vec<_> = redeemers_needed .into_iter() .filter(|x| !wits_redeemer_keys.contains(&&x.0)) - .map(|x| format!("{} (key: {:?}, purpose: {:?})", x.2, x.0, x.1,)) + .map(|x| format!("{:?}[{:?}] -> {}", x.0.tag, x.0.index, x.2)) .collect(); let extra: Vec<_> = wits_redeemer_keys diff --git a/examples/acceptance_tests/script_context/v3/README.md b/examples/acceptance_tests/script_context/v3/README.md index 5dfbffc3..ecbfb2b1 100644 --- a/examples/acceptance_tests/script_context/v3/README.md +++ b/examples/acceptance_tests/script_context/v3/README.md @@ -21,7 +21,7 @@ for convenience. - Purpose - [x] spend - - [ ] mint + - [x] mint - [ ] withdraw - [ ] publish - [ ] voting diff --git a/examples/acceptance_tests/script_context/v3/ctx/mint/resolved_inputs.template b/examples/acceptance_tests/script_context/v3/ctx/mint/resolved_inputs.template new file mode 100644 index 00000000..dc99bdb5 --- /dev/null +++ b/examples/acceptance_tests/script_context/v3/ctx/mint/resolved_inputs.template @@ -0,0 +1,5 @@ +[ + { 0: h'6000000000000000000000000000000000000000000000000000000000' + , 1: 1000000 + } +] diff --git a/examples/acceptance_tests/script_context/v3/ctx/mint/tx.template b/examples/acceptance_tests/script_context/v3/ctx/mint/tx.template new file mode 100644 index 00000000..d22c8f6e --- /dev/null +++ b/examples/acceptance_tests/script_context/v3/ctx/mint/tx.template @@ -0,0 +1,65 @@ +[ + { 0: + [ [h'0000000000000000000000000000000000000000000000000000000000000000', 0] + ] + + , 1: + [ { 0: h'6000000000000000000000000000000000000000000000000000000000' + , 1: 1000000 + , 2: [1, 24(h'4463666F6F')] + } + , { 0: h'6000000000000000000000000000000000000000000000000000000000' + , 1: + [ 1000000 + , { h'{{ mint.mint_1.hash }}': { h'74756e61': 100000000000000 } + , h'{{ mint.mint_2.hash }}': { h'61696b656e': 42 } + } + ] + } + , { 0: h'6000000000000000000000000000000000000000000000000000000000' + , 1: + [ 1000000 + , { h'{{ mint.mint_2.hash }}': { h'63617264616e6f': 1 } + } + ] + , 3: 24(h'82034463666F6F') + } + ] + + , 2: 42 + + , 9: + { h'{{ mint.mint_1.hash }}': + { h'74756e61': 100000000000000 + } + , h'{{ mint.mint_2.hash }}': + { h'63617264616e6f': 1 + , h'61696b656e': -14 + } + } + + , 11: h'FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF' + + , 13: + [ [h'0000000000000000000000000000000000000000000000000000000000000000', 0] + ] + + , 16: + [ h'6000000000000000000000000000000000000000000000000000000000', 1000000000 + ] + + , 17: 1 + }, + + { 5: + [ [1, 0, 121([]), [1000000, 100000000]] + , [1, 1, 42, [1000000, 100000000]] + ] + + + }, + + true, + + null +] diff --git a/examples/acceptance_tests/script_context/v3/ctx/simple_spend/resolved_inputs.template b/examples/acceptance_tests/script_context/v3/ctx/simple_spend/resolved_inputs.template new file mode 100644 index 00000000..fc52b0ab --- /dev/null +++ b/examples/acceptance_tests/script_context/v3/ctx/simple_spend/resolved_inputs.template @@ -0,0 +1,6 @@ +[ + { 0: h'70{{ simple_spend.spend.hash }}' + , 1: 1000000000 + , 2: [1, 24(h'd87980')] + } +] diff --git a/examples/acceptance_tests/script_context/v3/ctx/spend_1/tx.template b/examples/acceptance_tests/script_context/v3/ctx/simple_spend/tx.template similarity index 80% rename from examples/acceptance_tests/script_context/v3/ctx/spend_1/tx.template rename to examples/acceptance_tests/script_context/v3/ctx/simple_spend/tx.template index f5b64f71..1796bb21 100644 --- a/examples/acceptance_tests/script_context/v3/ctx/spend_1/tx.template +++ b/examples/acceptance_tests/script_context/v3/ctx/simple_spend/tx.template @@ -4,8 +4,7 @@ ] , 1: - [ [h'6011111111111111111111111111111111111111111111111111111111', 1000000000] - ] + [] , 2: 42 @@ -24,7 +23,7 @@ { 5: [[0, 0, 121([]), [1000000, 100000000]]] - , 7: [h'{{ VALIDATOR }}'] + , 7: [h'{{ simple_spend.spend.cbor }}'] }, diff --git a/examples/acceptance_tests/script_context/v3/ctx/spend_1/resolved_inputs.template b/examples/acceptance_tests/script_context/v3/ctx/spend_1/resolved_inputs.template deleted file mode 100644 index c00435a2..00000000 --- a/examples/acceptance_tests/script_context/v3/ctx/spend_1/resolved_inputs.template +++ /dev/null @@ -1 +0,0 @@ -81a300581d70{{ VALIDATOR_HASH }}011a3b9aca00028201d818{{ DATUM }} diff --git a/examples/acceptance_tests/script_context/v3/plutus.json b/examples/acceptance_tests/script_context/v3/plutus.json index 130de03b..01fa71bd 100644 --- a/examples/acceptance_tests/script_context/v3/plutus.json +++ b/examples/acceptance_tests/script_context/v3/plutus.json @@ -12,7 +12,29 @@ }, "validators": [ { - "title": "spend_1.spend", + "title": "mint.mint_1", + "redeemer": { + "title": "_tmp2", + "schema": { + "$ref": "#/definitions/Void" + } + }, + "compiledCode": "587b0101003232323232323225333333008001153330033370e900018029baa001153330073006375400224a66600894452615330054911856616c696461746f722072657475726e65642066616c73650013656002002002002002002153300249010b5f746d70323a20566f696400165734ae7155ceaab9e5573eae91", + "hash": "12593b4cbf7fdfd8636db99fe356437cd6af8539aadaa0a401964874" + }, + { + "title": "mint.mint_2", + "redeemer": { + "title": "_tmp2", + "schema": { + "$ref": "#/definitions/Void" + } + }, + "compiledCode": "58930101003232323232323225333333008001153330033370e900018029baa001153330073006375400224a666008a6600a9201105f5f5f5f5f6d696e745f325f5f5f5f5f0014a22930a99802a4811856616c696461746f722072657475726e65642066616c73650013656002002002002002002153300249010b5f746d70323a20566f696400165734ae7155ceaab9e5573eae91", + "hash": "0c8eaf490c53afbf27e3d84a3b57da51fbafe5aa78443fcec2dc262e" + }, + { + "title": "simple_spend.spend", "datum": { "title": "_tmp1", "schema": { @@ -25,8 +47,8 @@ "$ref": "#/definitions/Void" } }, - "compiledCode": "590cb3010100323232323232323232323232322533333300e00115332330073001300937540042a66601660146ea8008494cccccc04000454ccc020c008c028dd50008a99980618059baa00112533300932533300a3371e9112078ec148ea647cf9969446891af31939c5d57b275a2455706782c6183ef0b62f100375c602060226022602260226022602260226022602260226022601a6ea8c004c034dd50010a99980519baf3374a900119807a6127d8799f5820000000000000000000000000000000000000000000000000000000000000000000ff003300f3374a900019807a6103d87980004bd7025eb80c040c044c044c034dd50010a9980599b9649108696e707574733a200037326664646464646002002444a6664666603400626464646464646601800400266e2922010128000025333016337100069007099b80483c80400c54ccc058cdc4001a410004266e00cdc0241002800690068b299980c800899b8a4881035b5d2900005133714911035b5f2000333300800133714911025d2900005223330090090023006001223330090090020013758602e0046eb4c054004c8cdd81ba83015001374e602c0026ea800c4c94ccc05c0044cdc52441027b7d00003133714911037b5f200032323300100100322533301a00110031533301a301d0011323330090093019001337149101023a2000333009009301a001004301c0011323330090093019001337149101023a2000333009009301a001300633003003301e002301c0013371491102207d000033756006264a66602e002266e29221025b5d00003133714911035b5f2000333300600133714911015d000032233300700700230040012233300700700200137580066e292201022c2000133005375a0040022646466e2922010268270000132333001001337006e3400920013371491101270000322253330153371000490000800899191919980300319b8000548004cdc599b80002533301833710004900a0a40c02903719b8b33700002a66603066e2000520141481805206e0043370c004901019b8300148080cdc70020011bae00222223233001001005225333017001100515333017301a0011330033019001005133004301900133002002301a001223233001001003225333010300a00113371491101300000315333010337100029000099b8a489012d003300200233702900000089980299b8400148050cdc599b803370a002900a240c00066002002444a66601a66e2400920001001133300300333708004900a19b8b3370066e14009201448180004c004c034dd5180098069baa00248900132533300f001007132533301030130021323232325333010300a375a602c602e0042646464646464a66602c66e1d20043018375460380042a6646602e600260326ea800854ccc05ccdc7804244120000000000000000000000000000000000000000000000000000000000000000000153330173375e6e98010dd3299980ba5014bd6f7b6300991919800800a5eb7bdb180894ccc0780044cc07ccdd82601014000374c00697adef6c60132323232533301e33720910100002133023337609801014000374c00e00a2a66603c66e3d22100002133023337609801014000374c00e00626604666ec0dd48011ba600133006006003375660400066eb8c078008c088008c080004c8cc0040052f5bded8c044a66603a00226603c66ec130010140004c01051a3b9aca00004bd6f7b630099191919299980e99b90489000021330223376098010140004c01051a3b9aca00000051533301d3371e9101000021330223376098010140004c01051a3b9aca0000003133022337606ea4008dd4000998030030019bad301f003375c603a0046042004603e00226464a666032600660366ea8c07c00854ccc064c00cc06cdd50008a99980e9bac301f3020301c3754602060386ea804454ccc074dd6180f98101810181018101810181018101810180e1baa3010301c37540222a66603266e1d2054375a603e60406040604060386ea8c040c070dd50088a99980c99baf374c6603c66ec130012bd87a9fd8799f5820000000000000000000000000000000000000000000000000000000000000000000ffff004c0103d87980004bd6f7b630180f981018101810181018101810181018101810180e1baa3010301c37540222a66603266ebd300101a000301f3020302030203020302030203020302030203020301c3754602060386ea80445288a9980d24932657870656374205b5d203d3d20646963742e746f5f7061697273286374782e7472616e73616374696f6e2e646174756d73290016153301a491ff6578706563740a2020202020205b0a202020202020202050616972285370656e64280a202020202020202020204f75747075745265666572656e6365207b0a2020202020202020202020207472616e73616374696f6e5f69643a20232230303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030222c0a2020202020202020202020206f75747075745f696e6465783a20302c0a202020202020202020207d2c0a2020202020202020292c0a2020202020202020766f6964292c0a2020202020205d203d3d206374782e7472616e73616374696f6e2e0972656465656d6572730016153301a49120657870656374203432203d3d206374782e7472616e73616374696f6e2e6665650016153301a4912d657870656374205b5d203d206374782e7472616e73616374696f6e2e65787472615f7369676e61746f726965730016153301a4912c657870656374205b5d203d206374782e7472616e73616374696f6e2e7265666572656e63655f696e707574730016016016301e301f001301a375400c2a660309213e657870656374207265736f6c7665645f696e7075745f76616c7565203d3d2076616c75652e66726f6d5f6c6f76656c61636528313030303030303030302900161533018491626578706563740a2020202020207472616e73616374696f6e5f6964203d3d20232230303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030220016370e9001009009180d980e000980d8011bab301900130190023017001301337540060186eb8c054004c044dd5180a0011809980a00098079baa001008301100137586002601a6ea8c004c034dd50010a99805a49dd6578706563740a2020202020205370656e64696e67280a20202020202020204f75747075745265666572656e6365207b0a202020202020202020207472616e73616374696f6e5f69643a20232230303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030222c0a202020202020202020206f75747075745f696e6465783a20302c0a20202020202020207d2c0a2020202020202020536f6d6528766f6964292c0a20202020202029203d3d206374782e696e666f0016153300b491666578706563740a20202020202023223738656331343865613634376366393936393434363839316166333139333963356435376232373561323435353730363738326336313833656630623632663122203d3d206374782e7472616e73616374696f6e2e6964001623010001149854cc0292411856616c696461746f722072657475726e65642066616c73650013656006006006006006006006370e90000028028028028028a99802a481ff657870656374205b0a202020202020496e707574207b0a20202020202020206f75747075745f7265666572656e63653a204f75747075745265666572656e6365207b207472616e73616374696f6e5f69642c206f75747075745f696e6465783a2030207d2c0a20202020202020206f75747075743a204f7574707574207b0a20202020202020202020616464726573732c0a2020202020202020202076616c75653a207265736f6c7665645f696e7075745f76616c75652c0a20202020202020202020646174756d3a20496e6c696e65446174756d285f292c0a202020202020202020207265666572656e63655f7363726970743a204e6f6e652c0a2020202f20202020207d2c0a2020202020207d2c0a202020205d203d206374782e7472616e73616374696f6e2e696e70757473001615330044916d6578706563742041646472657373207b0a2020202020207061796d656e745f63726564656e7469616c3a2053637269707443726564656e7469616c285f292c0a2020202020207374616b655f63726564656e7469616c3a204e6f6e652c0a202020207d203d2061646472657373001615330034910b5f746d70323a20566f6964001615330024910b5f746d70313a20566f696400165734ae7155ceaab9e5573eae815d0aba257481", - "hash": "accffdf337e522a7f4d1fccd4de2099db8e4ea268a09e9896e198f21" + "compiledCode": "5909af010100323232323232323232323232322533333300e00115332330073001300937540042a66601660146ea8008494cccccc04000454ccc020c008c028dd50008a99980618059baa001125333009323232323253330123758600660226ea8c014c044dd50030a9998091bac3014301530113754600a60226ea801854ccc048dd6180a180a980a980a980a980a980a980a980a98089baa30053011375400c2a66601c66e1d2054375a6028602a602a602a60226ea8c014c044dd5003099299980799baf4c101a0003015301630163016301630163016301630163016301630123754600c60246ea801c5288a9980824932657870656374205b5d203d3d20646963742e746f5f7061697273286374782e7472616e73616374696f6e2e646174756d73290016533300e3375e98012fa1d87a9fd8799f5820000000000000000000000000000000000000000000000000000000000000000000ffffd8798000301430153015301530153015301530153015301530113754600a60226ea8018526153300f491e86578706563740a202020205b0a20202020202050616972285370656e64280a20202020202020204f75747075745265666572656e6365207b0a202020202020202020207472616e73616374696f6e5f69643a20232230303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030222c0a202020202020202020206f75747075745f696e6465783a20302c0a20202020202020207d2c0a202020202020292c0a202020202020766f69642829292c0a202020205d203d3d2072656465656d6572730016153300f49120657870656374203432203d3d206374782e7472616e73616374696f6e2e6665650016153300f4912d657870656374205b5d203d206374782e7472616e73616374696f6e2e65787472615f7369676e61746f726965730016153300f4912c657870656374205b5d203d206374782e7472616e73616374696f6e2e7265666572656e63655f696e707574730016153300f49123657870656374205b5d203d206374782e7472616e73616374696f6e2e6f757470757473001632533301200100c132533301330160021323232325333013300d375a603260340042646464646464a66603266e1d2004301b3754603e0042a66466034600260386ea800854ccc068cdc7804245200000000000000000000000000000000000000000000000000000000000000000001533301a3375e6e98010dd3299980d25014bd6f7b6300991919800800a5eb7bdb180894ccc0840044cc088cdd82601014000374c00697adef6c60132323232533302133720910100002133026337609801014000374c00e00a2a66604266e3d22100002133026337609801014000374c00e00626604c66ec0dd48011ba600133006006003375660460066eb8c084008c094008c08c004c8cc0040052f5bded8c044a66604000226604266ec130010140004c01051a3b9aca00004bd6f7b630099191919299981019b90489000021330253376098010140004c01051a3b9aca0000005153330203371e9101000021330253376098010140004c01051a3b9aca0000003133025337606ea4008dd4000998030030019bad3022003375c60400046048004604400226464a6660386006603c6ea8c08800854ccc070c00cc078dd50008a4c03603660426044002603a6ea801854cc06d24013e657870656374207265736f6c7665645f696e7075745f76616c7565203d3d2076616c75652e66726f6d5f6c6f76656c6163652831303030303030303030290016153301b491606578706563740a202020207472616e73616374696f6e5f6964203d3d20232230303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030220016370e900100b80b980f180f800980f0011bab301c001301c002301a001301637540060226eb8c060004c050dd5180b801180b180b80098091baa00100d30140013758600860206ea8c010c040dd5002a99980619baf4c0132d87a9fd8799f5820000000000000000000000000000000000000000000000000000000000000000000ffd8799fd87980ffff003001300f37540082930a99806a49cd6578706563740a202020205370656e64696e67280a2020202020204f75747075745265666572656e6365207b0a20202020202020207472616e73616374696f6e5f69643a20232230303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030222c0a20202020202020206f75747075745f696e6465783a20302c0a2020202020207d2c0a202020202020536f6d6528766f69642829292c0a2020202029203d3d20696e666f00162301230133013001533300a3371e910120c6fbd346681a8f8337f6b3e51e6ec973f1509367eabc3a44c849af58a1d8471b00375c602060226022602260226022602260226022602260226022601a6ea8c004c034dd50010a4c2a66016921546578706563740a2020202023226336666264333436363831613866383333376636623365353165366563393733663135303933363765616263336134346338343961663538613164383437316222203d3d206964001623010001149854cc0292411856616c696461746f722072657475726e65642066616c73650013656004004004004004004004370e90000018018018018018a99802a4810b5f746d70323a20566f6964001615330044910b5f746d70313a20566f696400161533003491ff657870656374205b0a20202020496e707574207b0a2020202020206f75747075745f7265666572656e63653a204f75747075745265666572656e6365207b207472616e73616374696f6e5f69642c206f75747075745f696e6465783a2030207d2c0a2020202020206f75747075743a204f7574707574207b0a2020202020202020616464726573732c0a202020202020202076616c75653a207265736f6c7665645f696e7075745f76616c75652c0a2020202020202020646174756d3a20496e6c696e65446174756d285f292c0a20202020202020207265666572656e63655f7363726970743a204e6f6e652c0a2020202020207d2c0a202020207d2c0a200b205d203d20696e7075747300161533002491676578706563742041646472657373207b0a202020207061796d656e745f63726564656e7469616c3a2053637269707443726564656e7469616c285f292c0a202020207374616b655f63726564656e7469616c3a204e6f6e652c0a20207d203d206164647265737300165734ae7155ceaab9e5573eae815d0aba257481", + "hash": "d3f6b0abd1250e72980b29efb95269611eea030b3e96095cc001f92c" } ], "definitions": { diff --git a/examples/acceptance_tests/script_context/v3/test.sh b/examples/acceptance_tests/script_context/v3/test.sh index 1ed0c14c..183b8f73 100755 --- a/examples/acceptance_tests/script_context/v3/test.sh +++ b/examples/acceptance_tests/script_context/v3/test.sh @@ -16,13 +16,13 @@ AIKEN=${2:-"cargo run -r --quiet --"} if ! command -v jq &> /dev/null then - echo "\033[1mjq\033[0m missing from system but required." + echo -e "\033[1mjq\033[0m missing from system but required." exit 1 fi if ! command -v cbor-diag &> /dev/null then - echo "\033[1mcbor-diag\033[0m missing from system but required." + echo -e "\033[1mcbor-diag\033[0m missing from system but required." exit 1 fi @@ -31,21 +31,43 @@ if [ $? -ne 0 ]; then exit $? fi -BLUEPRINT=$(jq ".validators[] | select(.title|contains(\"$TITLE\"))" plutus.json) +declare -a VALIDATORS=($(jq -c ".validators | map(select(.title|contains(\"$TITLE\"))) | .[]" plutus.json)) -VALIDATOR_HASH=$(echo $BLUEPRINT | jq -r .hash) -VALIDATOR=$(echo $BLUEPRINT | jq -r .compiledCode) +if [ -z $VALIDATORS ]; then + echo -e "\033[31mvalidator \033[1m$TITLE\033[0m\033[31m not found!\033[0m" + exit 1 +fi -DATUM=$(cbor-diag --to hex --from diag <<< "h'$(cat ctx/$TITLE/datum.cbor)'") +TRANSACTION=$(cat ctx/$TITLE/tx.template) +RESOLVED_INPUTS=$(cat ctx/$TITLE/resolved_inputs.template) -sed "s/{{ VALIDATOR_HASH }}/$VALIDATOR_HASH/" ctx/$TITLE/resolved_inputs.template \ - | sed "s/{{ DATUM }}/$DATUM/" \ - > ctx/$TITLE/resolved_inputs.cbor +for ITEM in ${VALIDATORS[@]}; do + VALIDATOR_NAME=$(echo $ITEM | jq -r .title) + VALIDATOR_HASH=$(echo $ITEM | jq -r .hash) + VALIDATOR=$(echo $ITEM | jq -r .compiledCode) -sed "s/{{ VALIDATOR }}/$VALIDATOR/" ctx/$TITLE/tx.template \ - | sed "s/{{ VALIDATOR_HASH }}/$VALIDATOR_HASH/" \ - | cbor-diag --to hex --from diag \ - > ctx/$TITLE/tx.cbor + RESOLVED_INPUTS=$(echo $RESOLVED_INPUTS \ + | sed "s/{{ $VALIDATOR_NAME.cbor }}/$VALIDATOR/g" \ + | sed "s/{{ $VALIDATOR_NAME.hash }}/$VALIDATOR_HASH/g") + + TRANSACTION=$(echo $TRANSACTION \ + | sed "s/{{ $VALIDATOR_NAME.cbor }}/$VALIDATOR/g" \ + | sed "s/{{ $VALIDATOR_NAME.hash }}/$VALIDATOR_HASH/g") +done + +echo $RESOLVED_INPUTS | cbor-diag --to hex --from diag > ctx/$TITLE/resolved_inputs.cbor +echo $TRANSACTION | cbor-diag --to hex --from diag > ctx/$TITLE/tx.cbor + +# echo "TRANSACTION" +# cat ctx/$TITLE/tx.cbor + +# ogmios inspect transaction $(cat ctx/$TITLE/tx.cbor) | jq + +# echo -e "\n\nINPUTS" +# cat ctx/inputs.cbor +# +# echo -e "\n\nRESOLVED_INPUTS" +# cat ctx/$TITLE/resolved_inputs.cbor $AIKEN tx simulate \ ctx/$TITLE/tx.cbor \ diff --git a/examples/acceptance_tests/script_context/v3/validators/mint.ak b/examples/acceptance_tests/script_context/v3/validators/mint.ak new file mode 100644 index 00000000..4679f921 --- /dev/null +++ b/examples/acceptance_tests/script_context/v3/validators/mint.ak @@ -0,0 +1,18 @@ +use aiken/dict +use aiken/transaction.{ + InlineDatum, Input, Output, OutputReference, ScriptContext, Spend, Spending, +} +use aiken/transaction/credential.{Address, ScriptCredential} +use aiken/transaction/value + +validator { + fn mint_1(_tmp2: Void, ctx: ScriptContext) { + True + } +} + +validator { + fn mint_2(_tmp2: Void, ctx: ScriptContext) { + True + } +} diff --git a/examples/acceptance_tests/script_context/v3/validators/simple_spend.ak b/examples/acceptance_tests/script_context/v3/validators/simple_spend.ak new file mode 100644 index 00000000..139d87b8 --- /dev/null +++ b/examples/acceptance_tests/script_context/v3/validators/simple_spend.ak @@ -0,0 +1,94 @@ +use aiken/dict +use aiken/transaction.{ + InlineDatum, Input, Output, OutputReference, ScriptContext, ScriptInfo, + ScriptPurpose, Spend, Spending, +} +use aiken/transaction/credential.{Address, ScriptCredential} +use aiken/transaction/value + +validator { + fn spend(_tmp1: Void, _tmp2: Void, ctx: ScriptContext) { + assert_transaction_id(ctx.transaction.id) + + assert_script_info(ctx.info) + + assert_inputs(ctx.transaction.inputs) + + expect [] = ctx.transaction.outputs + + expect [] = ctx.transaction.reference_inputs + + expect [] = ctx.transaction.extra_signatories + + expect 42 == ctx.transaction.fee + + assert_redeemers(ctx.transaction.redeemers) + + expect [] == dict.to_pairs(ctx.transaction.datums) + + True + } +} + +fn assert_transaction_id(id: ByteArray) { + expect + #"c6fbd346681a8f8337f6b3e51e6ec973f1509367eabc3a44c849af58a1d8471b" == id + Void +} + +fn assert_script_info(info: ScriptInfo) { + expect + Spending( + OutputReference { + transaction_id: #"0000000000000000000000000000000000000000000000000000000000000000", + output_index: 0, + }, + Some(void()), + ) == info + Void +} + +fn assert_inputs(inputs: List) { + expect [ + Input { + output_reference: OutputReference { transaction_id, output_index: 0 }, + output: Output { + address, + value: resolved_input_value, + datum: InlineDatum(_), + reference_script: None, + }, + }, + ] = inputs + + expect + transaction_id == #"0000000000000000000000000000000000000000000000000000000000000000" + + expect resolved_input_value == value.from_lovelace(1000000000) + + expect Address { + payment_credential: ScriptCredential(_), + stake_credential: None, + } = address + + Void +} + +fn assert_redeemers(redeemers: Pairs) { + expect + [ + Pair(Spend( + OutputReference { + transaction_id: #"0000000000000000000000000000000000000000000000000000000000000000", + output_index: 0, + }, + ), + void()), + ] == redeemers + Void +} + +fn void() -> Data { + let void: Data = Void + void +} diff --git a/examples/acceptance_tests/script_context/v3/validators/spend_1.ak b/examples/acceptance_tests/script_context/v3/validators/spend_1.ak deleted file mode 100644 index a25f5e6d..00000000 --- a/examples/acceptance_tests/script_context/v3/validators/spend_1.ak +++ /dev/null @@ -1,69 +0,0 @@ -use aiken/dict -use aiken/transaction.{ - InlineDatum, Input, Output, OutputReference, ScriptContext, Spend, Spending, -} -use aiken/transaction/credential.{Address, ScriptCredential} -use aiken/transaction/value - -validator { - fn spend(_tmp1: Void, _tmp2: Void, ctx: ScriptContext) { - let void: Data = Void - - expect - #"78ec148ea647cf9969446891af31939c5d57b275a2455706782c6183ef0b62f1" == ctx.transaction.id - - expect - Spending( - OutputReference { - transaction_id: #"0000000000000000000000000000000000000000000000000000000000000000", - output_index: 0, - }, - Some(void), - ) == ctx.info - - trace @"inputs": ctx.transaction.inputs - - expect [ - Input { - output_reference: OutputReference { transaction_id, output_index: 0 }, - output: Output { - address, - value: resolved_input_value, - datum: InlineDatum(_), - reference_script: None, - }, - }, - ] = ctx.transaction.inputs - - expect - transaction_id == #"0000000000000000000000000000000000000000000000000000000000000000" - - expect resolved_input_value == value.from_lovelace(1000000000) - - expect Address { - payment_credential: ScriptCredential(_), - stake_credential: None, - } = address - - expect [] = ctx.transaction.reference_inputs - - expect [] = ctx.transaction.extra_signatories - - expect 42 == ctx.transaction.fee - - expect - [ - Pair(Spend( - OutputReference { - transaction_id: #"0000000000000000000000000000000000000000000000000000000000000000", - output_index: 0, - }, - ), - void), - ] == ctx.transaction.redeemers - - expect [] == dict.to_pairs(ctx.transaction.datums) - - True - } -}