Skip to content

Commit

Permalink
feat(codegen): support multi-validators
Browse files Browse the repository at this point in the history
* rename force_wrap to force
* add a bunch of builder methods to Term<Name>
* refactor one tiny location to show off builder methods
* split generate into `generate` and `generate_test`
* create wrap_as_multi_validator function

Co-authored-by: Kasey White <kwhitemsg@gmail.com>
  • Loading branch information
rvcas and MicroProofs committed Mar 17, 2023
1 parent 87493bb commit c3870e3
Show file tree
Hide file tree
Showing 18 changed files with 327 additions and 234 deletions.
76 changes: 42 additions & 34 deletions crates/aiken-lang/src/builder.rs
Expand Up @@ -4,7 +4,10 @@ use indexmap::{IndexMap, IndexSet};
use itertools::Itertools;
use uplc::{
ast::{
builder::{apply_wrap, delayed_choose_list, delayed_if_else, if_else},
builder::{
apply_wrap, constr_index_exposer, delayed_choose_list, delayed_if_else, if_else,
CONSTR_FIELDS_EXPOSER,
},
Constant as UplcConstant, Name, Term, Type as UplcType,
},
builtins::DefaultFunction,
Expand Down Expand Up @@ -193,10 +196,7 @@ pub fn convert_type_to_data(term: Term<Name>, field_type: &Arc<Type>) -> Term<Na
apply_wrap(DefaultFunction::IData.into(), term)
} else if field_type.is_void() {
apply_wrap(
apply_wrap(
Term::Builtin(DefaultFunction::ChooseUnit).force_wrap(),
term,
),
apply_wrap(Term::Builtin(DefaultFunction::ChooseUnit).force(), term),
Term::Constant(
UplcConstant::Data(PlutusData::Constr(Constr {
tag: convert_constr_to_tag(0).unwrap(),
Expand Down Expand Up @@ -225,11 +225,9 @@ pub fn convert_type_to_data(term: Term<Name>, field_type: &Arc<Type>) -> Term<Na
DefaultFunction::ListData.into(),
apply_wrap(
apply_wrap(
Term::Builtin(DefaultFunction::MkCons).force_wrap(),
Term::Builtin(DefaultFunction::MkCons).force(),
apply_wrap(
Term::Builtin(DefaultFunction::FstPair)
.force_wrap()
.force_wrap(),
Term::Builtin(DefaultFunction::FstPair).force().force(),
Term::Var(
Name {
text: "__pair".to_string(),
Expand All @@ -241,11 +239,9 @@ pub fn convert_type_to_data(term: Term<Name>, field_type: &Arc<Type>) -> Term<Na
),
apply_wrap(
apply_wrap(
Term::Builtin(DefaultFunction::MkCons).force_wrap(),
Term::Builtin(DefaultFunction::MkCons).force(),
apply_wrap(
Term::Builtin(DefaultFunction::SndPair)
.force_wrap()
.force_wrap(),
Term::Builtin(DefaultFunction::SndPair).force().force(),
Term::Var(
Name {
text: "__pair".to_string(),
Expand Down Expand Up @@ -303,9 +299,7 @@ pub fn convert_data_to_type(term: Term<Name>, field_type: &Arc<Type>) -> Term<Na
Term::Constant(UplcConstant::Integer(0.into()).into()),
),
apply_wrap(
Term::Builtin(DefaultFunction::FstPair)
.force_wrap()
.force_wrap(),
Term::Builtin(DefaultFunction::FstPair).force().force(),
apply_wrap(DefaultFunction::UnConstrData.into(), term),
),
),
Expand Down Expand Up @@ -338,7 +332,7 @@ pub fn convert_data_to_type(term: Term<Name>, field_type: &Arc<Type>) -> Term<Na
apply_wrap(
Term::Builtin(DefaultFunction::MkPairData),
apply_wrap(
Term::Builtin(DefaultFunction::HeadList).force_wrap(),
Term::Builtin(DefaultFunction::HeadList).force(),
Term::Var(
Name {
text: "__list_data".to_string(),
Expand All @@ -349,7 +343,7 @@ pub fn convert_data_to_type(term: Term<Name>, field_type: &Arc<Type>) -> Term<Na
),
),
apply_wrap(
Term::Builtin(DefaultFunction::HeadList).force_wrap(),
Term::Builtin(DefaultFunction::HeadList).force(),
Term::Var(
Name {
text: "__tail".to_string(),
Expand All @@ -362,7 +356,7 @@ pub fn convert_data_to_type(term: Term<Name>, field_type: &Arc<Type>) -> Term<Na
.into(),
},
apply_wrap(
Term::Builtin(DefaultFunction::TailList).force_wrap(),
Term::Builtin(DefaultFunction::TailList).force(),
Term::Var(
Name {
text: "__list_data".to_string(),
Expand All @@ -385,9 +379,7 @@ pub fn convert_data_to_type(term: Term<Name>, field_type: &Arc<Type>) -> Term<Na
Term::Constant(UplcConstant::Integer(1.into()).into()),
),
apply_wrap(
Term::Builtin(DefaultFunction::FstPair)
.force_wrap()
.force_wrap(),
Term::Builtin(DefaultFunction::FstPair).force().force(),
apply_wrap(DefaultFunction::UnConstrData.into(), term),
),
)
Expand Down Expand Up @@ -576,7 +568,7 @@ pub fn list_access_to_uplc(
&& is_list_accessor
{
apply_wrap(
Term::Builtin(DefaultFunction::HeadList).force_wrap(),
Term::Builtin(DefaultFunction::HeadList).force(),
Term::Var(
Name {
text: format!("tail_index_{}_{}", current_index, id_list[current_index]),
Expand All @@ -588,7 +580,7 @@ pub fn list_access_to_uplc(
} else {
convert_data_to_type(
apply_wrap(
Term::Builtin(DefaultFunction::HeadList).force_wrap(),
Term::Builtin(DefaultFunction::HeadList).force(),
Term::Var(
Name {
text: format!(
Expand Down Expand Up @@ -631,7 +623,7 @@ pub fn list_access_to_uplc(
body: term.into(),
},
apply_wrap(
Term::Builtin(DefaultFunction::TailList).force_wrap(),
Term::Builtin(DefaultFunction::TailList).force(),
Term::Var(
Name {
text: format!(
Expand Down Expand Up @@ -690,7 +682,7 @@ pub fn list_access_to_uplc(
body: term.into(),
},
apply_wrap(
Term::Builtin(DefaultFunction::TailList).force_wrap(),
Term::Builtin(DefaultFunction::TailList).force(),
Term::Var(
Name {
text: format!(
Expand Down Expand Up @@ -725,7 +717,7 @@ pub fn list_access_to_uplc(
body: if check_last_item {
delayed_choose_list(
apply_wrap(
Term::Builtin(DefaultFunction::TailList).force_wrap(),
Term::Builtin(DefaultFunction::TailList).force(),
Term::Var(
Name {
text: format!(
Expand All @@ -740,7 +732,7 @@ pub fn list_access_to_uplc(
term,
apply_wrap(
apply_wrap(
Term::Builtin(DefaultFunction::Trace).force_wrap(),
Term::Builtin(DefaultFunction::Trace).force(),
Term::Constant(
UplcConstant::String(
"List/Tuple/Constr contains more items than expected"
Expand All @@ -751,7 +743,7 @@ pub fn list_access_to_uplc(
),
Term::Delay(Term::Error.into()),
)
.force_wrap(),
.force(),
)
.into()
} else {
Expand All @@ -775,7 +767,7 @@ pub fn list_access_to_uplc(
body: if check_last_item {
delayed_choose_list(
apply_wrap(
Term::Builtin(DefaultFunction::TailList).force_wrap(),
Term::Builtin(DefaultFunction::TailList).force(),
Term::Var(
Name {
text: format!(
Expand All @@ -790,7 +782,7 @@ pub fn list_access_to_uplc(
term,
apply_wrap(
apply_wrap(
Term::Builtin(DefaultFunction::Trace).force_wrap(),
Term::Builtin(DefaultFunction::Trace).force(),
Term::Constant(
UplcConstant::String(
"List/Tuple/Constr contains more items than it expected"
Expand All @@ -801,7 +793,7 @@ pub fn list_access_to_uplc(
),
Term::Delay(Term::Error.into()),
)
.force_wrap(),
.force(),
)
.into()
} else {
Expand Down Expand Up @@ -845,7 +837,7 @@ pub fn list_access_to_uplc(
body: apply_wrap(
list_access_inner,
apply_wrap(
Term::Builtin(DefaultFunction::TailList).force_wrap(),
Term::Builtin(DefaultFunction::TailList).force(),
Term::Var(
Name {
text: format!(
Expand Down Expand Up @@ -936,7 +928,7 @@ pub fn list_access_to_uplc(
body: apply_wrap(
list_access_inner,
apply_wrap(
Term::Builtin(DefaultFunction::TailList).force_wrap(),
Term::Builtin(DefaultFunction::TailList).force(),
Term::Var(
Name {
text: format!(
Expand Down Expand Up @@ -1358,6 +1350,22 @@ pub fn wrap_validator_args(term: Term<Name>, arguments: &[TypedArg]) -> Term<Nam
term
}

pub fn wrap_as_multi_validator(spend: Term<Name>, mint: Term<Name>) -> Term<Name> {
Term::equals_integer()
.apply(Term::integer(0.into()))
.apply(constr_index_exposer(Term::var("__second_arg")))
.delayed_if_else(
mint.apply(Term::var("__first_arg"))
.apply(Term::var("__second_arg")),
spend.apply(Term::var("__first_arg")).apply(
Term::head_list()
.apply(Term::var(CONSTR_FIELDS_EXPOSER).apply(Term::var("__second_arg"))),
),
)
.lambda("__second_arg")
.lambda("__first_arg")
}

pub fn monomorphize(
ir: Vec<Air>,
mono_types: IndexMap<u64, Arc<Type>>,
Expand Down

0 comments on commit c3870e3

Please sign in to comment.