From b300cf38db8d0134433ca1c70686155a457a7a22 Mon Sep 17 00:00:00 2001 From: KtorZ Date: Wed, 15 Feb 2023 12:49:56 +0100 Subject: [PATCH] Add new script context test scenario covering minting & values. --- .../acceptance_tests/script_context/README.md | 37 ++++++++++++++++++ .../ctx/mint/inputs.cbor.template | 1 + .../ctx/mint/outputs.cbor.template | 1 + .../script_context/ctx/mint/tx.cbor.template | 1 + .../script_context/ctx/mint/tx.diag.template | 23 +++++++++++ .../script_context/plutus.json | 14 ++++++- .../acceptance_tests/script_context/test.sh | 2 +- .../script_context/validators/basic.ak | 11 +++++- .../script_context/validators/mint.ak | 38 +++++++++++++++++++ 9 files changed, 124 insertions(+), 4 deletions(-) create mode 100644 examples/acceptance_tests/script_context/ctx/mint/inputs.cbor.template create mode 100644 examples/acceptance_tests/script_context/ctx/mint/outputs.cbor.template create mode 100644 examples/acceptance_tests/script_context/ctx/mint/tx.cbor.template create mode 100644 examples/acceptance_tests/script_context/ctx/mint/tx.diag.template create mode 100644 examples/acceptance_tests/script_context/validators/mint.ak diff --git a/examples/acceptance_tests/script_context/README.md b/examples/acceptance_tests/script_context/README.md index dc31ed3b..699c70bb 100644 --- a/examples/acceptance_tests/script_context/README.md +++ b/examples/acceptance_tests/script_context/README.md @@ -16,3 +16,40 @@ for convenience. ``` ./test.sh [VALIDATOR_TITLE] ``` + +## Test Coverage + +- [ ] Purpose + - [x] Spend + - [x] Mint + - [ ] Withdraw + - [ ] Publish + +- [ ] Transaction + - [ ] inputs + - [ ] reference inputs + - [ ] outputs + - [ ] address + - [x] verification key + - [ ] script + - [x] value + - [ ] datum + - [x] None + - [ ] Hash + - [ ] Inline + - [ ] script + - [x] None + - [ ] Reference + - [x] values + - [x] Pure Ada + - [x] Native assets + - [x] fee + - [x] mint + - [ ] certificates + - [x] withdrawals + - [x] verification key + - [x] script + - [ ] validity range + - [x] extra signatories + - [x] redeemers + - [ ] datums diff --git a/examples/acceptance_tests/script_context/ctx/mint/inputs.cbor.template b/examples/acceptance_tests/script_context/ctx/mint/inputs.cbor.template new file mode 100644 index 00000000..e7f75b49 --- /dev/null +++ b/examples/acceptance_tests/script_context/ctx/mint/inputs.cbor.template @@ -0,0 +1 @@ +81825820000000000000000000000000000000000000000000000000000000000000000000 diff --git a/examples/acceptance_tests/script_context/ctx/mint/outputs.cbor.template b/examples/acceptance_tests/script_context/ctx/mint/outputs.cbor.template new file mode 100644 index 00000000..155c6800 --- /dev/null +++ b/examples/acceptance_tests/script_context/ctx/mint/outputs.cbor.template @@ -0,0 +1 @@ +81A200581D60FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF011A000F4240 diff --git a/examples/acceptance_tests/script_context/ctx/mint/tx.cbor.template b/examples/acceptance_tests/script_context/ctx/mint/tx.cbor.template new file mode 100644 index 00000000..522ca566 --- /dev/null +++ b/examples/acceptance_tests/script_context/ctx/mint/tx.cbor.template @@ -0,0 +1 @@ +84A400818258200000000000000000000000000000000000000000000000000000000000000000000180020109A1581C{{ VALIDATOR_HASH }}A143666F6F190539A20581840100D87980821A000F42401A05F5E1000681{{ VALIDATOR }}F5F6 diff --git a/examples/acceptance_tests/script_context/ctx/mint/tx.diag.template b/examples/acceptance_tests/script_context/ctx/mint/tx.diag.template new file mode 100644 index 00000000..cea0be17 --- /dev/null +++ b/examples/acceptance_tests/script_context/ctx/mint/tx.diag.template @@ -0,0 +1,23 @@ +[ + { 0: + [ [h'0000000000000000000000000000000000000000000000000000000000000000', 0] + ] + + , 1: + [] + + , 2: 1 + + , 9: + { h'{{ VALIDATOR_HASH }}': { h'666f6f': 1337 } + } + }, + + { 5: [[1, 0, 121([]), [1000000, 100000000]]] + + , 6: [h'{{ VALIDATOR }}'] + + }, + true, + null +] diff --git a/examples/acceptance_tests/script_context/plutus.json b/examples/acceptance_tests/script_context/plutus.json index 1250babe..b8f71434 100644 --- a/examples/acceptance_tests/script_context/plutus.json +++ b/examples/acceptance_tests/script_context/plutus.json @@ -4,6 +4,16 @@ "version": "0.0.0" }, "validators": [ + { + "title": "mint", + "purpose": "mint", + "redeemer": { + "title": "Data", + "description": "Any Plutus data." + }, + "compiledCode": "59049e010000323232323232323232323222533300532323232323001003300100122533300f00114a226464a6660180042660080080022940c04c008cdc3a4004601a6ea8c044004cc034ccc01cc8c8c8c8c8c8c94ccc04cc0580084c8c8cdc78018009bae3016001300932533300f3370e900018091baa0011001153301149012a4173736572746564206f6e20696e636f727265637420636f6e7374727563746f722076617269616e742e00163300830090034800854cc0412401364c6973742f5475706c652f436f6e73747220636f6e7461696e73206d6f7265206974656d73207468616e2069742065787065637465640016375c602800264646464600c00200200264640026644660100040020029110000137566600c600e6600c600e00290002401000e600200244a666020002297ae01323232323301537520026600c00c0066eb8c04400cdd59808801180a0011809000980080091129998078010a5eb7bdb1804c8c8c8c94ccc038cdc7802800880189980a19bb037520026e98008ccc01c01c00c014dd718080019bab3010002301300330110024c103d87a80004c0103d87980003300d333007323232323322323232323253330123370e00290010a9980a2490f746f6b656e206e6f7420666f756e640016132323370e00290790a1bad301a001300d00230143754002664466010004002002910103666f6f0033223233223253330153370e00290010801099190009bab301d00130100033017375400400297adef6c6033223300b002001002001375666012601400690040009bae30150013008533300d3370e900018081baa0021002153300f49012a4173736572746564206f6e20696e636f727265637420636f6e7374727563746f722076617269616e742e001633005300600748008cc014c01801d20003001001222533301100213374a900125eb804c8c8c8c94ccc040cdc7802800899ba548000cc058dd400125eb804ccc01c01c00c014dd718090019bad3012002301500330130023001001222533300f00213374a900125eb804c8c8c8c94ccc038cdc7802800899ba548000cc050dd300125eb804ccc01c01c00c014dd718080019bab3010002301300330110024c103d87a80004c0103d87980003300d3330073232323233223232533300f3375e006002266e1cc8c018004dd5998049805198049805002240009009240042940c054004c020c94ccc038cdc3a400060226ea8004400454cc0412412a4173736572746564206f6e20696e636f727265637420636f6e7374727563746f722076617269616e742e001633223300700200137566600e60106600e60100049000240246600e6010004900100380418008009129998080008a400026466e0120023300300300130130013001001222533300f00213374a900125eb804c8c8c8c94ccc038cdd7802800899ba548000cc0500092f5c0266600e00e00600a6020006602000460260066022004980103d87a80004c0103d87980004bd701119199800800a4000006444666601666e1c0100080488ccc010010cdc0001a40046028002002460146ea8004526163001001222533300900214984cc014c004c02c008ccc00c00cc0300080055cd2b9b5738aae7555cf2ab9f5740ae855d11", + "hash": "c941d5e9386a58d33f19ed088fc631bf0ded090d148268803e3dce7b" + }, { "title": "withdrawals", "purpose": "spend", @@ -57,8 +67,8 @@ } ] }, - "compiledCode": "59042a010000323232323232323232323222253330063232323232300200132323232323233016333010323253330123370e002900109919299980a19baf3300d300e0014800130126d8799f58200000000000000000000000000000000000000000000000000000000000000000ff0013370e6eb4cc034c038005200248000528180d00098060010a9980a2491c73637269707420707572706f73652069736e277420275370656e6427001630143754002660126014016900126103d87a80004c0103d87980003301633301032325333017001153301449011c756e6578706563746564206e756d626572206f66206f7574707574730016132533301800113232300c0013301a3330143375e6e98dd5998069807000a40046e98c0152080a8d6b9074c103d87a80004c0103d87980003301a3330143375e6601a601c6601a601c002900024000980122d8799f581c11111111111111111111111111111111111111111111111111111111ff004c0103d87a80004c0103d87980003301a333014323253330163370e0029000099250301000214a260306ea8004cc034c038cc034c038005200048009300103d87a80004c0103d87980004bd70180d0010a9980aa491c756e6578706563746564206e756d626572206f66206f7574707574730016301a00137586601460160029002198049805005a4000980103d87a80004c0103d879800033016333010323375e6e98dd5998051805800a400c6e98c009205433009300a00b4800130103d87a80004c0103d87980004bd7011999111919000999991111999805002001801000a5eb7bdb180010004020cccc8888cccc03001000c0080052f5bded8c000400200e9101004881000013001001222225333017004133018337606ea400cdd300125eb7bdb1804c8c8c8c94ccc058cdd79980280380099ba5480012f5c026603866ec0dd48039ba6006008153330163371e00e00226603866ec0dd48039ba600600313301c337606ea4004dd3001199998048048018038030029bae301800337566030004603600a603200844a66601c66e400080044cdd2a400097ae01533300e3371e004002266e9520024bd70099ba5480112f5c0600200244444a66602800826602a66ec0dd48019ba80024bd6f7b630099191919299980999baf330050070013374a900025eb804cc064cdd81ba9007375000c0102a66602666e3c01c0044cc064cdd81ba9007375000c00626603266ec0dd48009ba800233333009009003007006005375c602a0066eb4c054008c060014c058010c004004894ccc03c0045288991929998060010998020020008a5030130023370e900118069baa301100122323330010014800000c888cccc030cdc3802001009919980200219b8000348008c0540040048c02cdd50008a4c2c6002002444a666012004293099802980098058011998018019806001000ab9a5736ae7155ceaab9e5573eae815d0aba201", - "hash": "1afe9a73274c140722127c27511395d861b5ed8e0bee1e7e9171c47a" + "compiledCode": "5904cb010000323232323232323232323222253330063232323232300200132323232323233016333010323330113375e660146016002900b26126d8799f58200000000000000000000000000000000000000000000000000000000000000000ff004a0944cc024c02802d20004c0103d87a80004c0103d879800033016333010323253330123370e002900109919299980a19baf3300d300e00148001300126d8799f58200000000000000000000000000000000000000000000000000000000000000000ff0013370e6eb4cc034c038005200248000528180d00098060010a9980a2491c73637269707420707572706f73652069736e277420275370656e6427001630143754002660126014016900126103d87a80004c0103d87980003301633301032325333017001153301449011c756e6578706563746564206e756d626572206f66206f7574707574730016132533301800113232300c0013301a3330143375e6e98dd5998069807000a40046e98c0152080a8d6b9074c103d87a80004c0103d87980003301a3330143375e6601a601c6601a601c002900024000980122d8799f581c11111111111111111111111111111111111111111111111111111111ff004c0103d87a80004c0103d87980003301a333014323253330163370e0029000099250301000214a260306ea8004cc034c038cc034c038005200048009300103d87a80004c0103d87980003301a3330143375e6601a601c002900219ba5480012f5c098103d87a80004c0103d87980003301a3330143375e6601a601c002900319ba5480092f5c098103d87a80004c0103d87980004bd70180d0010a9980aa491c756e6578706563746564206e756d626572206f66206f7574707574730016301a00137586601460160029002198049805005a4000980103d87a80004c0103d879800033016333010323375e6e98dd5998051805800a400c6e98c009205433009300a00b4800130103d87a80004c0103d87980004bd7011999111919000999991111999805002001801000a5eb7bdb180010004020cccc8888cccc03001000c0080052f5bded8c000400200e9101004881000013001001222225333017004133018337606ea400cdd300125eb7bdb1804c8c8c8c94ccc058cdd79980280380099ba5480012f5c026603866ec0dd48039ba6006008153330163371e00e00226603866ec0dd48039ba600600313301c337606ea4004dd3001199998048048018038030029bae301800337566030004603600a603200844a66601c66e400080044cdd2a400097ae01533300e3371e004002266e9520024bd70099ba5480112f5c0600200244444a66602800826602a66ec0dd48019ba80024bd6f7b630099191919299980999baf330050070013374a900025eb804cc064cdd81ba9007375000c0102a66602666e3c01c0044cc064cdd81ba9007375000c00626603266ec0dd48009ba800233333009009003007006005375c602a0066eb4c054008c060014c058010c004004894ccc03c0045288991929998060010998020020008a5030130023370e900118069baa301100122323330010014800000c888cccc030cdc3802001009919980200219b8000348008c0540040048c02cdd50008a4c2c6002002444a666012004293099802980098058011998018019806001000ab9a5736ae7155ceaab9e5573eae815d0aba201", + "hash": "dfee0efa0f0c05bf6f3b69d626911891396a6c21d50da7653ce91aac" } ] } \ No newline at end of file diff --git a/examples/acceptance_tests/script_context/test.sh b/examples/acceptance_tests/script_context/test.sh index bd91d6d4..f7d0f8b5 100755 --- a/examples/acceptance_tests/script_context/test.sh +++ b/examples/acceptance_tests/script_context/test.sh @@ -37,6 +37,6 @@ VALIDATOR=$(cbor-diag --to hex --from diag <<< "h'$VALIDATOR'") cp ctx/$TITLE/inputs.cbor.template ctx/$TITLE/inputs.cbor sed "s/{{ VALIDATOR_HASH }}/$VALIDATOR_HASH/" ctx/$TITLE/outputs.cbor.template > ctx/$TITLE/outputs.cbor -sed "s/{{ VALIDATOR }}/$VALIDATOR/" ctx/$TITLE/tx.cbor.template > ctx/$TITLE/tx.cbor +sed "s/{{ VALIDATOR }}/$VALIDATOR/" ctx/$TITLE/tx.cbor.template | sed "s/{{ VALIDATOR_HASH }}/$VALIDATOR_HASH/" > ctx/$TITLE/tx.cbor cargo run --quiet -- tx simulate ctx/$TITLE/tx.cbor ctx/$TITLE/inputs.cbor ctx/$TITLE/outputs.cbor diff --git a/examples/acceptance_tests/script_context/validators/basic.ak b/examples/acceptance_tests/script_context/validators/basic.ak index 79351baa..0f8ec11a 100644 --- a/examples/acceptance_tests/script_context/validators/basic.ak +++ b/examples/acceptance_tests/script_context/validators/basic.ak @@ -1,11 +1,12 @@ use aiken/list use aiken/option -use aiken/transaction.{ScriptContext, Spend, TransactionId} +use aiken/transaction.{NoDatum, ScriptContext, Spend, TransactionId} use aiken/transaction/credential.{VerificationKeyCredential} use aiken/transaction/value fn spend(_datum: Void, _redeemer: Void, ctx: ScriptContext) { [ + assert_id(ctx.transaction), assert_purpose(ctx.purpose), assert_outputs(ctx.transaction), assert_fee(ctx.transaction), @@ -13,6 +14,12 @@ fn spend(_datum: Void, _redeemer: Void, ctx: ScriptContext) { |> list.and } +fn assert_id(transaction) { + transaction.id != TransactionId( + #"0000000000000000000000000000000000000000000000000000000000000000", + ) +} + fn assert_purpose(purpose) { when purpose is { Spend(ref) -> @@ -36,6 +43,8 @@ fn assert_outputs(transaction) { #"11111111111111111111111111111111111111111111111111111111", ), option.is_none(output.address.stake_credential), + output.datum == NoDatum, + output.reference_script == None, ] |> list.and _ -> error("unexpected number of outputs") diff --git a/examples/acceptance_tests/script_context/validators/mint.ak b/examples/acceptance_tests/script_context/validators/mint.ak new file mode 100644 index 00000000..6f12b155 --- /dev/null +++ b/examples/acceptance_tests/script_context/validators/mint.ak @@ -0,0 +1,38 @@ +use aiken/dict +use aiken/list +use aiken/transaction.{Mint, ScriptContext} +use aiken/transaction/value + +fn mint(redeemer: Data, ctx: ScriptContext) { + [ + assert_purpose(ctx), + assert_mint(ctx.purpose, ctx.transaction), + assert_redeemers(ctx, redeemer), + ] + |> list.and +} + +fn assert_purpose(ctx) { + expect [my_policy_id] = + ctx.transaction.mint + |> value.without_lovelace + |> value.policies + expect Mint(policy_id) = ctx.purpose + + my_policy_id == policy_id +} + +fn assert_mint(purpose, transaction) { + expect Mint(policy_id) = purpose + let tokens = value.tokens(transaction.mint, policy_id) + + when dict.get(tokens, #"666f6f") is { + None -> error("token not found") + Some(quantity) -> quantity == 1337 + } +} + +fn assert_redeemers(ctx, my_redeemer) { + expect Some(redeemer) = dict.get(ctx.transaction.redeemers, ctx.purpose) + my_redeemer == redeemer && dict.size(ctx.transaction.redeemers) == 1 +}