diff --git a/crates/aiken-lang/src/builtins.rs b/crates/aiken-lang/src/builtins.rs index e3099568a..e9825cedb 100644 --- a/crates/aiken-lang/src/builtins.rs +++ b/crates/aiken-lang/src/builtins.rs @@ -23,6 +23,7 @@ pub const RESULT: &str = "Result"; pub const STRING: &str = "String"; pub const OPTION: &str = "Option"; pub const ORDERING: &str = "Ordering"; +pub const REDEEMER_WRAPPER: &str = "RedeemerWrapper"; /// Build a prelude that can be injected /// into a compiler pipeline @@ -1057,3 +1058,12 @@ pub fn unbound_var(id: u64) -> Arc { Arc::new(Type::Var { tipo }) } + +pub fn wrapped_redeemer(redeemer: Arc) -> Arc { + Arc::new(Type::App { + public: true, + module: "".to_string(), + name: REDEEMER_WRAPPER.to_string(), + args: vec![redeemer], + }) +} diff --git a/crates/aiken-project/src/blueprint/validator.rs b/crates/aiken-project/src/blueprint/validator.rs index c0b10ecdc..73958b0cf 100644 --- a/crates/aiken-project/src/blueprint/validator.rs +++ b/crates/aiken-project/src/blueprint/validator.rs @@ -1,3 +1,5 @@ +use std::collections::HashMap; + use super::{ definitions::{Definitions, Reference}, error::Error, @@ -6,6 +8,7 @@ use super::{ use crate::module::{CheckedModule, CheckedModules}; use aiken_lang::{ ast::{TypedArg, TypedFunction, TypedValidator}, + builtins::wrapped_redeemer, uplc::CodeGenerator, }; use miette::NamedSource; @@ -144,7 +147,11 @@ impl Validator> { ), }) .map(|schema| match datum { - Some(..) if is_multi_validator => todo!(), + Some(..) if is_multi_validator => { + let wrap_redeemer_type = wrapped_redeemer(redeemer.tipo); + + definitions.register(&wrap_redeemer_type, &HashMap::new(), todo!()); + } _ => Argument { title: Some(redeemer.arg_name.get_label()), schema, @@ -305,11 +312,12 @@ mod test { let validator = validators .get(0) .unwrap() + .as_ref() .expect("Failed to create validator blueprint"); - println!("{}", serde_json::to_string_pretty(&validator).unwrap()); + println!("{}", serde_json::to_string_pretty(validator).unwrap()); - assert_json_eq!(serde_json::to_value(&validator).unwrap(), expected); + assert_json_eq!(serde_json::to_value(validator).unwrap(), expected); } #[test]