diff --git a/crates/aiken-lang/src/uplc.rs b/crates/aiken-lang/src/uplc.rs index 822202a7..15384e91 100644 --- a/crates/aiken-lang/src/uplc.rs +++ b/crates/aiken-lang/src/uplc.rs @@ -1205,7 +1205,9 @@ impl<'a> CodeGenerator<'a> { indices: arguments_index .iter() .map(|(label, var_name, index)| { - let field_type = type_map.get(label).unwrap(); + let field_type = type_map + .get(label) + .unwrap_or_else(|| type_map.get_index(*index).unwrap().1); (*index, var_name.clone(), field_type.clone()) }) .collect_vec(), diff --git a/examples/acceptance_tests/055/aiken.lock b/examples/acceptance_tests/055/aiken.lock new file mode 100644 index 00000000..00bfb887 --- /dev/null +++ b/examples/acceptance_tests/055/aiken.lock @@ -0,0 +1,13 @@ +# This file was generated by Aiken +# You typically do not need to edit this file + +[[requirements]] +name = "aiken-lang/stdlib" +version = "cf89161cbcd5e2c9519e7ea5d61986473b708179" +source = "github" + +[[packages]] +name = "aiken-lang/stdlib" +version = "cf89161cbcd5e2c9519e7ea5d61986473b708179" +requirements = [] +source = "github" diff --git a/examples/acceptance_tests/055/aiken.toml b/examples/acceptance_tests/055/aiken.toml new file mode 100644 index 00000000..e1b10c5d --- /dev/null +++ b/examples/acceptance_tests/055/aiken.toml @@ -0,0 +1,6 @@ +name = "aiken-lang/acceptance_test_036" +version = "0.0.0" + +dependencies = [ + { name = "aiken-lang/stdlib", version="cf89161cbcd5e2c9519e7ea5d61986473b708179", source = "github" }, +] diff --git a/examples/acceptance_tests/055/lib/tests.ak b/examples/acceptance_tests/055/lib/tests.ak new file mode 100644 index 00000000..482e6035 --- /dev/null +++ b/examples/acceptance_tests/055/lib/tests.ak @@ -0,0 +1,66 @@ +use aiken/bytearray +use aiken/hash.{Hash, Sha2_256, sha2_256} +use aiken/list +use aiken/string + +// MerkleTree in Aiken (ported from: https://github.com/input-output-hk/hydra/blob/master/plutus-merkle-tree/src/Plutus/MerkleTree.hs) + +pub type MerkleTree { + Empty + Leaf { hash: Hash, value: ByteArray } + Node { hash: Hash, left: MerkleTree, right: MerkleTree } +} + +pub fn root_hash(t: MerkleTree) -> Hash { + when t is { + Empty -> #"" + Leaf { hash, .. } -> hash + Node { hash, .. } -> hash + } +} + +pub fn is_equal(a: MerkleTree, b: MerkleTree) -> Bool { + root_hash(a) == root_hash(b) +} + +pub fn size(t: MerkleTree) -> Int { + when t is { + Empty -> 0 + Leaf{..} -> 1 + Node { left, right, .. } -> size(left) + size(right) + } +} + +fn combine_hash(h1: Hash, h2: Hash) -> Hash { + sha2_256(bytearray.concat(h1, h2)) +} + +pub fn from_list(items0: List) -> MerkleTree { + do_from_list(items0, list.length(items0)) +} + +fn do_from_list(items: List, len: Int) -> MerkleTree { + when items is { + [] -> Empty + [value] -> Leaf { hash: sha2_256(value), value } + all -> { + let cutoff: Int = len / 2 + let left = + all + |> list.take(cutoff) + |> do_from_list(cutoff) + let right = + all + |> list.drop(cutoff) + |> do_from_list(len - cutoff) + let hash = combine_hash(root_hash(left), root_hash(right)) + Node { hash, left, right } + } + } +} + +test foo() { + let items = [#"aa", #"bb", #"cc"] + let mt = from_list(items) + size(mt) == 3 +}