73 lines
1.6 KiB
Plaintext
73 lines
1.6 KiB
Plaintext
use aiken/builtin
|
|
use aiken/dict
|
|
use aiken/hash.{blake2b_256}
|
|
use aiken/list
|
|
use aiken/transaction.{DatumHash, InlineDatum, ScriptContext}
|
|
use aiken/transaction/credential.{Inline, VerificationKeyCredential}
|
|
|
|
fn spend(datum: Data, _redeemer: Data, ctx: ScriptContext) {
|
|
[
|
|
assert_datum(datum),
|
|
assert_datums(ctx.transaction.datums),
|
|
assert_outputs(ctx.transaction.outputs),
|
|
]
|
|
|> list.and
|
|
}
|
|
|
|
fn assert_datum(datum) {
|
|
let my_datum: Data = Void
|
|
datum == my_datum
|
|
}
|
|
|
|
type MyDatum {
|
|
MyDatum(Int)
|
|
}
|
|
|
|
fn assert_datums(datums) {
|
|
let my_datum = MyDatum(42)
|
|
|
|
expect Some(datum) =
|
|
dict.get(datums, blake2b_256(builtin.serialise_data(my_datum)))
|
|
|
|
expect datum: MyDatum = datum
|
|
|
|
my_datum == datum && dict.size(datums) == 2
|
|
}
|
|
|
|
fn assert_outputs(outputs) {
|
|
when outputs is {
|
|
[output_1, output_2, ..] ->
|
|
assert_first_output(output_1) && assert_second_output(output_2)
|
|
_ -> error("expected transaction to have (at least) 2 outputs")
|
|
}
|
|
}
|
|
|
|
fn assert_first_output(output) {
|
|
[
|
|
output.datum == DatumHash(
|
|
#"fcaa61fb85676101d9e3398a484674e71c45c3fd41b492682f3b0054f4cf3273",
|
|
),
|
|
output.reference_script == Some(
|
|
#"e37db487fbd58c45d059bcbf5cd6b1604d3bec16cf888f1395a4ebc4",
|
|
),
|
|
]
|
|
|> list.and
|
|
}
|
|
|
|
fn assert_second_output(output) {
|
|
[
|
|
output.address.stake_credential == Some(
|
|
Inline(
|
|
VerificationKeyCredential(
|
|
#"66666666666666666666666666666666666666666666666666666666",
|
|
),
|
|
),
|
|
),
|
|
when output.datum is {
|
|
InlineDatum(_) -> True
|
|
_ -> error("expected inline datum")
|
|
},
|
|
]
|
|
|> list.and
|
|
}
|