diff --git a/crates/aiken-project/src/blueprint/snapshots/aiken_project__blueprint__validator__tests__generics.snap b/crates/aiken-project/src/blueprint/snapshots/aiken_project__blueprint__validator__tests__generics.snap index 55ac598c..9cadc4db 100644 --- a/crates/aiken-project/src/blueprint/snapshots/aiken_project__blueprint__validator__tests__generics.snap +++ b/crates/aiken-project/src/blueprint/snapshots/aiken_project__blueprint__validator__tests__generics.snap @@ -1,9 +1,15 @@ --- source: crates/aiken-project/src/blueprint/validator.rs -description: "Code:\n\ntype Either {\n Left(left)\n Right(right)\n}\n\ntype Interval {\n Finite(a)\n Infinite\n}\n\nvalidator {\n fn generics(redeemer: Either>, ctx: Void) {\n True\n }\n}\n" +description: "Code:\n\npub type Either {\n Left(left)\n Right(right)\n}\n\npub type Interval {\n Finite(a)\n Infinite\n}\n\nvalidator generics {\n spend(datum: Option, redeemer: Either>, output_reference: Data, transaction: Data) {\n True\n }\n}\n" --- { - "title": "test_module.generics", + "title": "test_module.generics_spend", + "datum": { + "title": "datum", + "schema": { + "$ref": "#/definitions/Data" + } + }, "redeemer": { "title": "redeemer", "schema": { @@ -16,6 +22,10 @@ description: "Code:\n\ntype Either {\n Left(left)\n Right(rig "ByteArray": { "dataType": "bytes" }, + "Data": { + "title": "Data", + "description": "Any Plutus data." + }, "Int": { "dataType": "integer" }, diff --git a/crates/aiken-project/src/blueprint/snapshots/aiken_project__blueprint__validator__tests__list_2_tuples_as_list.snap b/crates/aiken-project/src/blueprint/snapshots/aiken_project__blueprint__validator__tests__list_2_tuples_as_list.snap index ed44c249..6932765c 100644 --- a/crates/aiken-project/src/blueprint/snapshots/aiken_project__blueprint__validator__tests__list_2_tuples_as_list.snap +++ b/crates/aiken-project/src/blueprint/snapshots/aiken_project__blueprint__validator__tests__list_2_tuples_as_list.snap @@ -1,9 +1,9 @@ --- source: crates/aiken-project/src/blueprint/validator.rs -description: "Code:\n\ntype Dict {\n inner: List<(ByteArray, value)>\n}\n\ntype UUID { UUID }\n\nvalidator {\n fn list_2_tuples_as_list(redeemer: Dict, ctx: Void) {\n True\n }\n}\n" +description: "Code:\n\npub type Dict {\n inner: List<(ByteArray, value)>\n}\n\npub type UUID { UUID }\n\nvalidator list_2_tuples_as_list {\n mint(redeemer: Dict, policy_id: ByteArray, transaction: Data) {\n True\n }\n}\n" --- { - "title": "test_module.list_2_tuples_as_list", + "title": "test_module.list_2_tuples_as_list_mint", "redeemer": { "title": "redeemer", "schema": { diff --git a/crates/aiken-project/src/blueprint/snapshots/aiken_project__blueprint__validator__tests__mint_parameterized.snap b/crates/aiken-project/src/blueprint/snapshots/aiken_project__blueprint__validator__tests__mint_parameterized.snap index 125395a1..882d5820 100644 --- a/crates/aiken-project/src/blueprint/snapshots/aiken_project__blueprint__validator__tests__mint_parameterized.snap +++ b/crates/aiken-project/src/blueprint/snapshots/aiken_project__blueprint__validator__tests__mint_parameterized.snap @@ -1,9 +1,9 @@ --- source: crates/aiken-project/src/blueprint/validator.rs -description: "Code:\n\nvalidator(utxo_ref: Int) {\n fn mint(redeemer: Data, ctx: Data) {\n True\n }\n}\n// " +description: "Code:\n\nvalidator thing(utxo_ref: Int) {\n mint(redeemer: Data, policy_id: ByteArray, transaction: Data) {\n True\n }\n}\n// " --- { - "title": "test_module.mint", + "title": "test_module.thing_mint", "redeemer": { "title": "redeemer", "schema": { diff --git a/crates/aiken-project/src/blueprint/snapshots/aiken_project__blueprint__validator__tests__nested_data.snap b/crates/aiken-project/src/blueprint/snapshots/aiken_project__blueprint__validator__tests__nested_data.snap index e97ecaed..fd3b7257 100644 --- a/crates/aiken-project/src/blueprint/snapshots/aiken_project__blueprint__validator__tests__nested_data.snap +++ b/crates/aiken-project/src/blueprint/snapshots/aiken_project__blueprint__validator__tests__nested_data.snap @@ -1,9 +1,9 @@ --- source: crates/aiken-project/src/blueprint/validator.rs -description: "Code:\n\npub type Foo {\n foo: Data\n}\n\nvalidator {\n fn nested_data(datum: Foo, redeemer: Int, ctx: Void) {\n True\n }\n}\n" +description: "Code:\n\npub type Foo {\n foo: Data\n}\n\nvalidator nested_data {\n spend(datum: Option, redeemer: Int, output_reference: Data, transaction: Data) {\n True\n }\n}\n" --- { - "title": "test_module.nested_data", + "title": "test_module.nested_data_spend", "datum": { "title": "datum", "schema": { diff --git a/crates/aiken-project/src/blueprint/snapshots/aiken_project__blueprint__validator__tests__opaque_singleton_multi_variants.snap b/crates/aiken-project/src/blueprint/snapshots/aiken_project__blueprint__validator__tests__opaque_singleton_multi_variants.snap index d3565900..247a3abe 100644 --- a/crates/aiken-project/src/blueprint/snapshots/aiken_project__blueprint__validator__tests__opaque_singleton_multi_variants.snap +++ b/crates/aiken-project/src/blueprint/snapshots/aiken_project__blueprint__validator__tests__opaque_singleton_multi_variants.snap @@ -1,6 +1,6 @@ --- source: crates/aiken-project/src/blueprint/validator.rs -description: "Code:\n\npub opaque type Rational {\n numerator: Int,\n denominator: Int,\n}\n\nvalidator opaque_singleton_multi_variants {\n spend(redeemer: Rational, oref: Data, ctx: Void) {\n True\n }\n}\n" +description: "Code:\n\npub opaque type Rational {\n numerator: Int,\n denominator: Int,\n}\n\nvalidator opaque_singleton_multi_variants {\n spend(datum: Option, redeemer: Rational, oref: Data, transaction: Data) {\n True\n }\n}\n" --- Schema { error: Error { @@ -16,7 +16,7 @@ Schema { }, ], }, - location: 120..138, + location: 141..159, source_code: NamedSource { name: "", source: "", diff --git a/crates/aiken-project/src/blueprint/snapshots/aiken_project__blueprint__validator__tests__recursive_generic_types.snap b/crates/aiken-project/src/blueprint/snapshots/aiken_project__blueprint__validator__tests__recursive_generic_types.snap index 6b20e160..d4408e21 100644 --- a/crates/aiken-project/src/blueprint/snapshots/aiken_project__blueprint__validator__tests__recursive_generic_types.snap +++ b/crates/aiken-project/src/blueprint/snapshots/aiken_project__blueprint__validator__tests__recursive_generic_types.snap @@ -1,9 +1,9 @@ --- source: crates/aiken-project/src/blueprint/validator.rs -description: "Code:\n\npub type LinkedList {\n Cons(a, LinkedList)\n Nil\n}\n\npub type Foo {\n Foo {\n foo: LinkedList,\n }\n Bar {\n bar: Int,\n baz: (ByteArray, List>)\n }\n}\n\nvalidator {\n fn recursive_generic_types(datum: Foo, redeemer: LinkedList, ctx: Void) {\n True\n }\n}\n" +description: "Code:\n\npub type LinkedList {\n Cons(a, LinkedList)\n Nil\n}\n\npub type Foo {\n Foo {\n foo: LinkedList,\n }\n Bar {\n bar: Int,\n baz: (ByteArray, List>)\n }\n}\n\nvalidator recursive_generic_types {\n spend(datum: Option, redeemer: LinkedList, output_reference: Data, transaction: Data) {\n True\n }\n}\n" --- { - "title": "test_module.recursive_generic_types", + "title": "test_module.recursive_generic_types_spend", "datum": { "title": "datum", "schema": { diff --git a/crates/aiken-project/src/blueprint/snapshots/aiken_project__blueprint__validator__tests__recursive_types.snap b/crates/aiken-project/src/blueprint/snapshots/aiken_project__blueprint__validator__tests__recursive_types.snap index 9a931f7f..7cc67148 100644 --- a/crates/aiken-project/src/blueprint/snapshots/aiken_project__blueprint__validator__tests__recursive_types.snap +++ b/crates/aiken-project/src/blueprint/snapshots/aiken_project__blueprint__validator__tests__recursive_types.snap @@ -1,9 +1,15 @@ --- source: crates/aiken-project/src/blueprint/validator.rs -description: "Code:\n\npub type Expr {\n Val(Int)\n Sum(Expr, Expr)\n Mul(Expr, Expr)\n}\n\nvalidator {\n fn recursive_types(redeemer: Expr, ctx: Void) {\n True\n }\n}\n" +description: "Code:\n\npub type Expr {\n Val(Int)\n Sum(Expr, Expr)\n Mul(Expr, Expr)\n}\n\nvalidator recursive_types {\n spend(datum: Option, redeemer: Expr, output_reference: Data, transaction: Data) {\n True\n }\n}\n" --- { - "title": "test_module.recursive_types", + "title": "test_module.recursive_types_spend", + "datum": { + "title": "datum", + "schema": { + "$ref": "#/definitions/Data" + } + }, "redeemer": { "title": "redeemer", "schema": { @@ -13,6 +19,10 @@ description: "Code:\n\npub type Expr {\n Val(Int)\n Sum(Expr, Expr)\n Mul(Exp "compiledCode": "", "hash": "", "definitions": { + "Data": { + "title": "Data", + "description": "Any Plutus data." + }, "Int": { "dataType": "integer" }, diff --git a/crates/aiken-project/src/blueprint/snapshots/aiken_project__blueprint__validator__tests__simplified_hydra.snap b/crates/aiken-project/src/blueprint/snapshots/aiken_project__blueprint__validator__tests__simplified_hydra.snap index 0fefe40f..f715b907 100644 --- a/crates/aiken-project/src/blueprint/snapshots/aiken_project__blueprint__validator__tests__simplified_hydra.snap +++ b/crates/aiken-project/src/blueprint/snapshots/aiken_project__blueprint__validator__tests__simplified_hydra.snap @@ -1,9 +1,9 @@ --- source: crates/aiken-project/src/blueprint/validator.rs -description: "Code:\n\n/// On-chain state\ntype State {\n /// The contestation period as a number of seconds\n contestationPeriod: ContestationPeriod,\n /// List of public key hashes of all participants\n parties: List,\n utxoHash: Hash,\n}\n\n/// A Hash digest for a given algorithm.\ntype Hash = ByteArray\n\ntype Blake2b_256 { Blake2b_256 }\n\n/// Whatever\ntype ContestationPeriod {\n /// A positive, non-zero number of seconds.\n ContestationPeriod(Int)\n}\n\ntype Party =\n ByteArray\n\ntype Input {\n CollectCom\n Close\n /// Abort a transaction\n Abort\n}\n\nvalidator {\n fn simplified_hydra(datum: State, redeemer: Input, ctx: Data) {\n True\n }\n}\n" +description: "Code:\n\n/// On-chain state\npub type State {\n /// The contestation period as a number of seconds\n contestationPeriod: ContestationPeriod,\n /// List of public key hashes of all participants\n parties: List,\n utxoHash: Hash,\n}\n\n/// A Hash digest for a given algorithm.\npub type Hash = ByteArray\n\npub type Blake2b_256 { Blake2b_256 }\n\n/// Whatever\npub type ContestationPeriod {\n /// A positive, non-zero number of seconds.\n ContestationPeriod(Int)\n}\n\npub type Party =\n ByteArray\n\npub type Input {\n CollectCom\n Close\n /// Abort a transaction\n Abort\n}\n\nvalidator simplified_hydra {\n spend(datum: Option, redeemer: Input, output_reference: Data, transaction: Data) {\n True\n }\n}\n" --- { - "title": "test_module.simplified_hydra", + "title": "test_module.simplified_hydra_spend", "datum": { "title": "datum", "schema": { diff --git a/crates/aiken-project/src/blueprint/snapshots/aiken_project__blueprint__validator__tests__tuples.snap b/crates/aiken-project/src/blueprint/snapshots/aiken_project__blueprint__validator__tests__tuples.snap index 309e9c7b..ecaab8dd 100644 --- a/crates/aiken-project/src/blueprint/snapshots/aiken_project__blueprint__validator__tests__tuples.snap +++ b/crates/aiken-project/src/blueprint/snapshots/aiken_project__blueprint__validator__tests__tuples.snap @@ -1,9 +1,9 @@ --- source: crates/aiken-project/src/blueprint/validator.rs -description: "Code:\n\nvalidator {\n fn tuples(datum: (Int, ByteArray), redeemer: (Int, Int, Int), ctx: Void) {\n True\n }\n}\n" +description: "Code:\n\nvalidator tuples {\n spend(datum: Option<(Int, ByteArray)>, redeemer: (Int, Int, Int), output_reference: Data, transaction: Data) {\n True\n }\n}\n" --- { - "title": "test_module.tuples", + "title": "test_module.tuples_spend", "datum": { "title": "datum", "schema": { diff --git a/crates/aiken-project/src/blueprint/validator.rs b/crates/aiken-project/src/blueprint/validator.rs index 8b936ac2..2c75f26c 100644 --- a/crates/aiken-project/src/blueprint/validator.rs +++ b/crates/aiken-project/src/blueprint/validator.rs @@ -7,7 +7,7 @@ use super::{ }; use crate::module::{CheckedModule, CheckedModules}; use aiken_lang::{ - ast::{Annotation, TypedArg, TypedFunction, TypedValidator}, + ast::{well_known, Annotation, TypedArg, TypedFunction, TypedValidator}, gen_uplc::CodeGenerator, plutus_version::PlutusVersion, tipo::Type, @@ -124,19 +124,31 @@ impl Validator { let datum = datum .map(|datum| { - Annotated::from_type( - modules.into(), - tipo_or_annotation(module, datum), - &mut definitions, - ) - .map_err(|error| Error::Schema { - error, - location: datum.location, - source_code: NamedSource::new( - module.input_path.display().to_string(), - module.code.clone(), - ), - }) + match datum.tipo.as_ref() { + Type::App { module: module_name, name, args, .. } if module_name.is_empty() && name == well_known::OPTION => { + Annotated::from_type( + modules.into(), + tipo_or_annotation(module, &TypedArg { + arg_name: datum.arg_name.clone(), + location: datum.location, + annotation: datum.annotation.clone(), + doc: datum.doc.clone(), + is_validator_param: datum.is_validator_param, + tipo: args.first().expect("Option always have a single type argument.").clone() + }), + &mut definitions, + ) + .map_err(|error| Error::Schema { + error, + location: datum.location, + source_code: NamedSource::new( + module.input_path.display().to_string(), + module.code.clone(), + ), + }) + }, + _ => panic!("Datum isn't an option but should be; this should have been caught by the type-checker!"), + } }) .transpose()? .map(|schema| Parameter { @@ -395,7 +407,7 @@ mod tests { assert_validator!( r#" validator thing { - mint(redeemer: Data, policy_id: Data, transaction: Data) { + mint(redeemer: Data, policy_id: ByteArray, transaction: Data) { True } } @@ -408,7 +420,7 @@ mod tests { assert_validator!( r#" validator thing(utxo_ref: Int) { - mint(redeemer: Data, ctx: Data) { + mint(redeemer: Data, policy_id: ByteArray, transaction: Data) { True } } @@ -451,7 +463,7 @@ mod tests { } validator simplified_hydra { - spend(datum: State, redeemer: Input, ctx: Data) { + spend(datum: Option, redeemer: Input, output_reference: Data, transaction: Data) { True } } @@ -464,7 +476,7 @@ mod tests { assert_validator!( r#" validator tuples { - spend(datum: (Int, ByteArray), redeemer: (Int, Int, Int), ctx: Void) { + spend(datum: Option<(Int, ByteArray)>, redeemer: (Int, Int, Int), output_reference: Data, transaction: Data) { True } } @@ -487,7 +499,7 @@ mod tests { } validator generics { - spend(redeemer: Either>, ctx: Void) { + spend(datum: Option, redeemer: Either>, output_reference: Data, transaction: Data) { True } } @@ -500,7 +512,7 @@ mod tests { assert_validator!( r#" validator generics { - mint(redeemer: a, policy_id: ByteArray, ctx: Void) { + mint(redeemer: a, policy_id: ByteArray, transaction: Data) { True } } @@ -519,7 +531,7 @@ mod tests { pub type UUID { UUID } validator list_2_tuples_as_list { - mint(redeemer: Dict, ctx: Void) { + mint(redeemer: Dict, policy_id: ByteArray, transaction: Data) { True } } @@ -538,7 +550,7 @@ mod tests { pub type UUID { UUID } validator list_pairs_as_map { - spend(redeemer: Dict, ctx: Void) { + spend(datum: Option, redeemer: Dict, ctx: Void) { True } } @@ -557,7 +569,7 @@ mod tests { pub type UUID { UUID } validator opaque_singleton_variants { - spend(redeemer: Dict, ctx: Void) { + spend(datum: Option, redeemer: Dict, output_reference: Data, transaction: Data) { True } } @@ -575,7 +587,7 @@ mod tests { } validator opaque_singleton_multi_variants { - spend(redeemer: Rational, oref: Data, ctx: Void) { + spend(datum: Option, redeemer: Rational, oref: Data, transaction: Data) { True } } @@ -592,7 +604,7 @@ mod tests { } validator nested_data { - spend(datum: Foo, redeemer: Int, ctx: Void) { + spend(datum: Option, redeemer: Int, output_reference: Data, transaction: Data) { True } } @@ -611,7 +623,7 @@ mod tests { } validator recursive_types { - spend(redeemer: Expr, ctx: Void) { + spend(datum: Option, redeemer: Expr, output_reference: Data, transaction: Data) { True } } @@ -639,7 +651,7 @@ mod tests { } validator recursive_generic_types { - spend(datum: Foo, redeemer: LinkedList, ctx: Void) { + spend(datum: Option, redeemer: LinkedList, output_reference: Data, transaction: Data) { True } } @@ -656,7 +668,7 @@ mod tests { } validator annotated_data { - spend(datum: Data, redeemer: Data, ctx: Void) { + spend(datum: Option>, redeemer: Data, output_reference: Data, transpose: Data) { True } } @@ -846,11 +858,13 @@ mod tests { let mut definitions = fixture_definitions(); definitions.insert( &schema, - Schema::Data(Data::AnyOf(vec![Constructor { - index: 0, - fields: vec![Declaration::Referenced(Reference::new("Bool")).into()], - } - .into()])) + Schema::Data(Data::AnyOf(vec![ + Constructor { + index: 0, + fields: vec![Declaration::Referenced(Reference::new("Bool")).into()], + } + .into(), + ])) .into(), );