Use a better algorithm for inlining single occurrences

This commit is contained in:
microproofs 2023-10-30 22:32:19 -04:00 committed by Kasey
parent 49bd4ba33d
commit 598ec5eaef
27 changed files with 187 additions and 89 deletions

View File

@ -201,7 +201,10 @@ impl<'a> CodeGenerator<'a> {
term, term,
}; };
// println!("Program: {}", program.to_pretty());
program = aiken_optimize_and_intern(program); program = aiken_optimize_and_intern(program);
// println!("Program After: {}", program.to_pretty());
// This is very important to call here. // This is very important to call here.
// If this isn't done, re-using the same instance // If this isn't done, re-using the same instance

View File

@ -1,4 +1,4 @@
use std::rc::Rc; use std::{rc::Rc, vec};
use indexmap::IndexMap; use indexmap::IndexMap;
use itertools::Itertools; use itertools::Itertools;
@ -15,10 +15,31 @@ pub struct Occurrence {
lambda_count: usize, lambda_count: usize,
} }
pub struct IdGen {
id: u64,
}
impl IdGen {
pub fn new() -> Self {
Self { id: 0 }
}
pub fn next_id(&mut self) -> u64 {
self.id += 1;
self.id
}
}
impl Default for IdGen {
fn default() -> Self {
Self::new()
}
}
impl Program<Name> { impl Program<Name> {
pub fn lambda_reducer(self) -> Program<Name> { pub fn lambda_reducer(self) -> Program<Name> {
let mut term = self.term; let mut term = self.term;
lambda_reducer(&mut term); lambda_reducer(&mut term, &mut vec![], &mut vec![], &mut IdGen::new());
Program { Program {
version: self.version, version: self.version,
term, term,
@ -50,7 +71,7 @@ impl Program<Name> {
pub fn inline_reducer(self) -> Program<Name> { pub fn inline_reducer(self) -> Program<Name> {
let mut term = self.term; let mut term = self.term;
inline_single_occurrence_reducer(&mut term); inline_single_occurrence_reducer(&mut term, &mut vec![], &mut vec![], &mut IdGen::new());
inline_direct_reducer(&mut term); inline_direct_reducer(&mut term);
inline_identity_reducer(&mut term); inline_identity_reducer(&mut term);
@ -168,42 +189,63 @@ fn force_delay_reducer(term: &mut Term<Name>) {
} }
} }
fn lambda_reducer(term: &mut Term<Name>) { fn lambda_reducer(
term: &mut Term<Name>,
reduce_stack: &mut Vec<Option<(Term<Name>, u64)>>,
lambda_applied_ids: &mut Vec<u64>,
id_gen: &mut IdGen,
) {
match term { match term {
// TODO: change this to handle any amount of consecutive applies and lambdas // TODO: change this to handle any amount of consecutive applies and lambdas
Term::Apply { function, argument } => { Term::Apply { function, argument } => {
let func = Rc::make_mut(function);
lambda_reducer(func);
let arg = Rc::make_mut(argument); let arg = Rc::make_mut(argument);
lambda_reducer(arg); // SO args can't have existing stack args applied to them anyway, so we pass in empty list
let mut arg_stack = vec![];
lambda_reducer(arg, &mut arg_stack, lambda_applied_ids, id_gen);
if let Term::Lambda { let next_id = id_gen.next_id();
parameter_name,
body, let arg_applied = match arg {
} = func Term::Constant(c) if matches!(c.as_ref(), Constant::String(_)) => None,
{ Term::Constant(_) | Term::Var(_) | Term::Builtin(_) => Some((arg.clone(), next_id)),
match arg { _ => None,
Term::Constant(c) if matches!(c.as_ref(), Constant::String(_)) => (), };
Term::Constant(_) | Term::Var(_) | Term::Builtin(_) => {
let body = Rc::make_mut(body); reduce_stack.push(arg_applied);
*term = substitute_term(body, parameter_name.clone(), arg);
} let func = Rc::make_mut(function);
_ => (), lambda_reducer(func, reduce_stack, lambda_applied_ids, id_gen);
} // The reason we don't need to pop is because the Lambda case and will pop for us
// It is guaranteed to pop otherwise the script is not valid anyways
if lambda_applied_ids.contains(&next_id) {
// we inlined the arg so now remove the apply and arg from the program
*term = func.clone();
} }
} }
Term::Delay(d) => { Term::Delay(d) => {
let d = Rc::make_mut(d); let d = Rc::make_mut(d);
lambda_reducer(d); lambda_reducer(d, reduce_stack, lambda_applied_ids, id_gen);
} }
Term::Lambda { body, .. } => { Term::Lambda {
parameter_name,
body,
} => {
// pops stack here no matter what
// match on only Some(Some(arg)) because we don't want to inline None
if let Some(Some((arg_term, arg_id))) = reduce_stack.pop() {
let body = Rc::make_mut(body); let body = Rc::make_mut(body);
lambda_reducer(body); *body = substitute_term(body, parameter_name.clone(), &arg_term);
lambda_reducer(body, reduce_stack, lambda_applied_ids, id_gen);
lambda_applied_ids.push(arg_id);
*term = body.clone();
} else {
let body = Rc::make_mut(body);
lambda_reducer(body, reduce_stack, lambda_applied_ids, id_gen);
}
} }
Term::Force(f) => { Term::Force(f) => {
let f = Rc::make_mut(f); let f = Rc::make_mut(f);
lambda_reducer(f); lambda_reducer(f, reduce_stack, lambda_applied_ids, id_gen);
} }
Term::Case { .. } => todo!(), Term::Case { .. } => todo!(),
Term::Constr { .. } => todo!(), Term::Constr { .. } => todo!(),
@ -312,43 +354,71 @@ fn inline_identity_reducer(term: &mut Term<Name>) {
} }
} }
fn inline_single_occurrence_reducer(term: &mut Term<Name>) { fn inline_single_occurrence_reducer(
term: &mut Term<Name>,
reduce_stack: &mut Vec<(Term<Name>, u64)>,
lambda_applied_ids: &mut Vec<u64>,
id_gen: &mut IdGen,
) {
match term { match term {
Term::Delay(d) => {
let d = Rc::make_mut(d);
inline_single_occurrence_reducer(d);
}
Term::Lambda { body, .. } => {
let body = Rc::make_mut(body);
inline_single_occurrence_reducer(body);
}
// TODO: change this to handle any amount of consecutive applies and lambdas // TODO: change this to handle any amount of consecutive applies and lambdas
Term::Apply { function, argument } => { Term::Apply { function, argument } => {
let func = Rc::make_mut(function);
let arg = Rc::make_mut(argument); let arg = Rc::make_mut(argument);
// SO args can't have existing stack args applied to them anyway, so we pass in empty list
let mut arg_stack = vec![];
inline_single_occurrence_reducer(arg, &mut arg_stack, lambda_applied_ids, id_gen);
inline_single_occurrence_reducer(func); let next_id = id_gen.next_id();
inline_single_occurrence_reducer(arg);
if let Term::Lambda { let arg_applied = (arg.clone(), next_id);
reduce_stack.push(arg_applied);
let func = Rc::make_mut(function);
inline_single_occurrence_reducer(func, reduce_stack, lambda_applied_ids, id_gen);
// The reason we don't need to pop is because the Lambda case and will pop for us
// It is guaranteed to pop otherwise the script is not valid anyways
if lambda_applied_ids.contains(&next_id) {
// we inlined the arg so now remove the apply and arg from the program
*term = func.clone();
}
}
Term::Delay(d) => {
let d = Rc::make_mut(d);
inline_single_occurrence_reducer(d, reduce_stack, lambda_applied_ids, id_gen);
}
Term::Lambda {
parameter_name, parameter_name,
body, body,
} = func } => {
{ // pops stack here no matter what
// match on only Some(Some(arg)) because we don't want to inline None
if let Some((arg_term, arg_id)) = reduce_stack.pop() {
let body = Rc::make_mut(body);
inline_single_occurrence_reducer(body, reduce_stack, lambda_applied_ids, id_gen);
let occurrences = var_occurrences(body, parameter_name.clone()); let occurrences = var_occurrences(body, parameter_name.clone());
let delays = delayed_execution(body.as_ref()); let delays = delayed_execution(body);
let is_recursive_call = false;
if occurrences == 1 { if occurrences == 1 {
if delays == 0 { if !is_recursive_call
*term = substitute_term(body.as_ref(), parameter_name.clone(), arg); && (delays == 0
} else if let Term::Var(_) || matches!(
&arg_term,
Term::Var(_)
| Term::Constant(_) | Term::Constant(_)
| Term::Error
| Term::Delay(_) | Term::Delay(_)
| Term::Lambda { .. } | Term::Lambda { .. }
| Term::Builtin(_) = arg | Term::Builtin(_),
))
{ {
*term = substitute_term(body.as_ref(), parameter_name.clone(), arg); *body = substitute_term(body, parameter_name.clone(), &arg_term);
lambda_applied_ids.push(arg_id);
*term = body.clone();
} }
// This will strip out unused terms that can't throw an error by themselves // This will strip out unused terms that can't throw an error by themselves
} else if occurrences == 0 { } else if occurrences == 0 {
@ -356,16 +426,20 @@ fn inline_single_occurrence_reducer(term: &mut Term<Name>) {
| Term::Constant(_) | Term::Constant(_)
| Term::Delay(_) | Term::Delay(_)
| Term::Lambda { .. } | Term::Lambda { .. }
| Term::Builtin(_) = arg | Term::Builtin(_) = &arg_term
{ {
*term = body.as_ref().clone(); lambda_applied_ids.push(arg_id);
*term = body.clone();
} }
} }
} else {
let body = Rc::make_mut(body);
inline_single_occurrence_reducer(body, reduce_stack, lambda_applied_ids, id_gen);
} }
} }
Term::Force(f) => { Term::Force(f) => {
let f = Rc::make_mut(f); let f = Rc::make_mut(f);
inline_single_occurrence_reducer(f); inline_single_occurrence_reducer(f, reduce_stack, lambda_applied_ids, id_gen);
} }
Term::Case { .. } => todo!(), Term::Case { .. } => todo!(),
Term::Constr { .. } => todo!(), Term::Constr { .. } => todo!(),
@ -373,6 +447,27 @@ fn inline_single_occurrence_reducer(term: &mut Term<Name>) {
} }
} }
fn contains_recursive_call(body: &Term<Name>) -> bool {
match body {
Term::Delay(d) => contains_recursive_call(d.as_ref()),
Term::Lambda { body, .. } => contains_recursive_call(body.as_ref()),
Term::Apply { function, argument } => {
contains_recursive_call(function.as_ref())
|| contains_recursive_call(argument.as_ref())
|| {
let func = function.as_ref();
let arg = argument.as_ref();
matches!(func, Term::Var(_)) && *func == *arg
}
}
Term::Force(f) => contains_recursive_call(f.as_ref()),
Term::Case { .. } => todo!(),
Term::Constr { .. } => todo!(),
_ => false,
}
}
fn cast_data_reducer(term: &mut Term<Name>) { fn cast_data_reducer(term: &mut Term<Name>) {
match term { match term {
Term::Delay(d) => { Term::Delay(d) => {

View File

@ -13,4 +13,4 @@ requirements = []
source = "github" source = "github"
[etags] [etags]
"aiken-lang/stdlib@main" = [{ secs_since_epoch = 1696706816, nanos_since_epoch = 863972000 }, "a721cf2738274f806efefb5a33c6ff9ae049476f0d45a42049b71793949f4d1d"] "aiken-lang/stdlib@main" = [{ secs_since_epoch = 1698716845, nanos_since_epoch = 204842000 }, "a721cf2738274f806efefb5a33c6ff9ae049476f0d45a42049b71793949f4d1d"]

View File

@ -5,7 +5,7 @@
"plutusVersion": "v2", "plutusVersion": "v2",
"compiler": { "compiler": {
"name": "Aiken", "name": "Aiken",
"version": "v1.0.19-alpha+fba89a9" "version": "v1.0.20-alpha+49bd4ba"
} }
}, },
"validators": [ "validators": [
@ -25,8 +25,8 @@
} }
} }
], ],
"compiledCode": "589101000032323232323232322225333005323253330073370e90000008a5114a0600e6ea8004c8cc88c8cc00400400c894ccc0340045300103d87a800013232533300c300500213374a90001980800125eb804cc010010004c044008c03c004dd61800980298009802801119baf300230060010052300b00114984d9588c010dd5000ab9a5573aaae7955cfaba05742ae881", "compiledCode": "588c01000032323232323232322225333005323253330073370e90000008a5114a0600e6ea8004c8c8c8cc004004008894ccc0300045300103d87a800013232533300b3375e600c6014004012266e9520003300f0024bd70099802002000980800118070009bac30013005300130050022300b00114984d9588c010dd5000ab9a5573aaae7955cfaba05742ae881",
"hash": "3b827f248a63f0205f83d56e749e9ead2271bf220b53fc7615a5f9d3" "hash": "38ee17fb5d1ca9bdb5284f9913eebdbc395331bbb1f0dc0ca7673777"
}, },
{ {
"title": "spend.spend", "title": "spend.spend",
@ -42,8 +42,8 @@
"$ref": "#/definitions/Data" "$ref": "#/definitions/Data"
} }
}, },
"compiledCode": "58e80100003232323232323232222533300532323300100100222533300b00114a026464a66601466601464a66601c00229445281991199119299980799b874800800440084dd5980a180700198079baa002323300100100322533301100114c0103d87a800013232323253330123371e00e004266e95200033016374c00297ae0133006006003375660260066eb8c044008c054008c04c0052f5bded8c06eacc03cc040c024009221050000000000004a0944528899802002000980780118068009bac300a300b300b3004300a300400114984d9588c010dd5000ab9a5573aaae7955cfaba05742ae89", "compiledCode": "58ef010000323232323232323222253330053232323300100100322533300c00114a026464a666016600a00429444cc010010004c040008c0380048c8ccc020c94ccc0300045288a50323232533300b3370e90010008a5eb7bdb1804dd59808180500118059baa00133002001489050000000000003756601a601c600e004941289119198008008019129998070008a60103d87a8000132323232533300f3371e00e004266e95200033013374c00297ae0133006006003375660200066eb8c038008c048008c040004dd61805180598059802180518020008a4c26cac460086ea80055cd2ab9d5573caae7d5d02ba15745",
"hash": "17aaea8892c949437d908569b1426f5e290789e16ba56627b0d393e5" "hash": "9443522a4b0f3aadcaad00154d7d05fa299da8dea69ae24a97b10f70"
} }
], ],
"definitions": { "definitions": {

View File

@ -5,7 +5,7 @@
"plutusVersion": "v2", "plutusVersion": "v2",
"compiler": { "compiler": {
"name": "Aiken", "name": "Aiken",
"version": "v1.0.19-alpha+fba89a9" "version": "v1.0.20-alpha+49bd4ba"
} }
}, },
"validators": [ "validators": [

View File

@ -13,4 +13,4 @@ requirements = []
source = "github" source = "github"
[etags] [etags]
"aiken-lang/stdlib@main" = [{ secs_since_epoch = 1696706808, nanos_since_epoch = 625676000 }, "a721cf2738274f806efefb5a33c6ff9ae049476f0d45a42049b71793949f4d1d"] "aiken-lang/stdlib@main" = [{ secs_since_epoch = 1698716843, nanos_since_epoch = 556908000 }, "a721cf2738274f806efefb5a33c6ff9ae049476f0d45a42049b71793949f4d1d"]

View File

@ -13,4 +13,4 @@ requirements = []
source = "github" source = "github"
[etags] [etags]
"aiken-lang/stdlib@main" = [{ secs_since_epoch = 1696706829, nanos_since_epoch = 84658000 }, "a721cf2738274f806efefb5a33c6ff9ae049476f0d45a42049b71793949f4d1d"] "aiken-lang/stdlib@main" = [{ secs_since_epoch = 1698716846, nanos_since_epoch = 459057000 }, "a721cf2738274f806efefb5a33c6ff9ae049476f0d45a42049b71793949f4d1d"]

View File

@ -13,4 +13,4 @@ requirements = []
source = "github" source = "github"
[etags] [etags]
"aiken-lang/stdlib@main" = [{ secs_since_epoch = 1696706898, nanos_since_epoch = 359504000 }, "a721cf2738274f806efefb5a33c6ff9ae049476f0d45a42049b71793949f4d1d"] "aiken-lang/stdlib@main" = [{ secs_since_epoch = 1698716857, nanos_since_epoch = 45623000 }, "a721cf2738274f806efefb5a33c6ff9ae049476f0d45a42049b71793949f4d1d"]

View File

@ -13,4 +13,4 @@ requirements = []
source = "github" source = "github"
[etags] [etags]
"aiken-lang/stdlib@main" = [{ secs_since_epoch = 1696706834, nanos_since_epoch = 974459000 }, "a721cf2738274f806efefb5a33c6ff9ae049476f0d45a42049b71793949f4d1d"] "aiken-lang/stdlib@main" = [{ secs_since_epoch = 1698716847, nanos_since_epoch = 25388000 }, "a721cf2738274f806efefb5a33c6ff9ae049476f0d45a42049b71793949f4d1d"]

View File

@ -13,4 +13,4 @@ requirements = []
source = "github" source = "github"
[etags] [etags]
"aiken-lang/stdlib@main" = [{ secs_since_epoch = 1696706916, nanos_since_epoch = 111453000 }, "a721cf2738274f806efefb5a33c6ff9ae049476f0d45a42049b71793949f4d1d"] "aiken-lang/stdlib@main" = [{ secs_since_epoch = 1698716859, nanos_since_epoch = 117810000 }, "a721cf2738274f806efefb5a33c6ff9ae049476f0d45a42049b71793949f4d1d"]

View File

@ -13,4 +13,4 @@ requirements = []
source = "github" source = "github"
[etags] [etags]
"aiken-lang/stdlib@main" = [{ secs_since_epoch = 1696706906, nanos_since_epoch = 630999000 }, "a721cf2738274f806efefb5a33c6ff9ae049476f0d45a42049b71793949f4d1d"] "aiken-lang/stdlib@main" = [{ secs_since_epoch = 1698716857, nanos_since_epoch = 470985000 }, "a721cf2738274f806efefb5a33c6ff9ae049476f0d45a42049b71793949f4d1d"]

View File

@ -13,4 +13,4 @@ requirements = []
source = "github" source = "github"
[etags] [etags]
"aiken-lang/stdlib@main" = [{ secs_since_epoch = 1696706780, nanos_since_epoch = 710429000 }, "a721cf2738274f806efefb5a33c6ff9ae049476f0d45a42049b71793949f4d1d"] "aiken-lang/stdlib@main" = [{ secs_since_epoch = 1698716808, nanos_since_epoch = 234542000 }, "a721cf2738274f806efefb5a33c6ff9ae049476f0d45a42049b71793949f4d1d"]

View File

@ -5,7 +5,7 @@
"plutusVersion": "v2", "plutusVersion": "v2",
"compiler": { "compiler": {
"name": "Aiken", "name": "Aiken",
"version": "v1.0.19-alpha+fba89a9" "version": "v1.0.20-alpha+49bd4ba"
} }
}, },
"validators": [ "validators": [

View File

@ -13,4 +13,4 @@ requirements = []
source = "github" source = "github"
[etags] [etags]
"aiken-lang/stdlib@main" = [{ secs_since_epoch = 1696706868, nanos_since_epoch = 407664000 }, "a721cf2738274f806efefb5a33c6ff9ae049476f0d45a42049b71793949f4d1d"] "aiken-lang/stdlib@main" = [{ secs_since_epoch = 1698716853, nanos_since_epoch = 236259000 }, "a721cf2738274f806efefb5a33c6ff9ae049476f0d45a42049b71793949f4d1d"]

View File

@ -13,4 +13,4 @@ requirements = []
source = "github" source = "github"
[etags] [etags]
"aiken-lang/stdlib@main" = [{ secs_since_epoch = 1696706857, nanos_since_epoch = 777183000 }, "a721cf2738274f806efefb5a33c6ff9ae049476f0d45a42049b71793949f4d1d"] "aiken-lang/stdlib@main" = [{ secs_since_epoch = 1698716850, nanos_since_epoch = 270215000 }, "a721cf2738274f806efefb5a33c6ff9ae049476f0d45a42049b71793949f4d1d"]

View File

@ -13,4 +13,4 @@ requirements = []
source = "github" source = "github"
[etags] [etags]
"aiken-lang/stdlib@main" = [{ secs_since_epoch = 1696706755, nanos_since_epoch = 497541000 }, "a721cf2738274f806efefb5a33c6ff9ae049476f0d45a42049b71793949f4d1d"] "aiken-lang/stdlib@main" = [{ secs_since_epoch = 1698716807, nanos_since_epoch = 474081000 }, "a721cf2738274f806efefb5a33c6ff9ae049476f0d45a42049b71793949f4d1d"]

View File

@ -5,7 +5,7 @@
"plutusVersion": "v2", "plutusVersion": "v2",
"compiler": { "compiler": {
"name": "Aiken", "name": "Aiken",
"version": "v1.0.19-alpha+fba89a9" "version": "v1.0.20-alpha+49bd4ba"
} }
}, },
"validators": [ "validators": [
@ -31,8 +31,8 @@
} }
} }
], ],
"compiledCode": "5901cb01000032323232323232323223222232533300932323232533300d3370e9000180600089919191919191919191919299980d980f0010991919299980d99b874800000454ccc06cc8cc004004030894ccc08000452809919299980f99baf3024301d00201a14a2266008008002604800460440022a66603666e1c009200213371e00602e29405858c064050dd6980d8011bae301900116301c00132332232533301a3370e9001000880109bab301f30180033018002323300100100222533301c00114c0103d87a8000132323232533301d3371e01e004266e95200033021374c00297ae01330060060033756603c0066eb8c070008c080008c0780052f5bded8c0646600200200444a666036002297adef6c60132323232533301c3371e911000021003133020337606ea4008dd3000998030030019bab301d003375c6036004603e004603a0026eacc068004c068004c064004c060004c05c008dd6180a80098068029bae3013001300b0011630110013011002300f001300700214984d958c94ccc024cdc3a40000022a666018600e0062930b0a99980499b874800800454ccc030c01c00c52616163007002375c0024600a6ea80048c00cdd5000ab9a5573aaae7955cfaba05742ae89", "compiledCode": "5901d801000032323232323232323223222232533300932323232533300d3370e9000180600089919191919191919191919299980d980f0010991919299980d99b874800000454ccc06cc8cc004004030894ccc08000452809919299980f99baf3024301d00201a14a2266008008002604800460440022a66603666e1c009200213371e00602e29405858c064050dd6980d8011bae301900116301c00132323232533301a3370e90010008a5eb7bdb1804dd5980f980c001180c0009980080100511191980080080191299980f0008a60103d87a8000132323232533301f3371e00e004266e95200033023374c00297ae0133006006003375660400066eb8c078008c088008c080004c8cc00400922010022323300100100322533301d00114bd6f7b630099191919299980f19b8f0070021003133022337606ea4008dd3000998030030019bab301f003375c603a0046042004603e0026eacc068004c068004c064004c060004c05c008dd6180a80098068029bae3013001300b0011630110013011002300f001300700214984d958c94ccc024cdc3a40000022a666018600e0062930b0a99980499b874800800454ccc030c01c00c52616163007002375c0024600a6ea80048c00cdd5000ab9a5573aaae7955cfaba05742ae89",
"hash": "74ea61c630a70bf38419c2e025e82a014d90897dc668de7314da8f3b" "hash": "6d2b4c88ef6a86a3b87e78ef19e679ea4143e8f04b942295938f911b"
} }
], ],
"definitions": { "definitions": {

View File

@ -5,7 +5,7 @@
"plutusVersion": "v2", "plutusVersion": "v2",
"compiler": { "compiler": {
"name": "Aiken", "name": "Aiken",
"version": "v1.0.19-alpha+fba89a9" "version": "v1.0.20-alpha+49bd4ba"
} }
}, },
"validators": [ "validators": [

View File

@ -13,4 +13,4 @@ requirements = []
source = "github" source = "github"
[etags] [etags]
"aiken-lang/stdlib@main" = [{ secs_since_epoch = 1696706798, nanos_since_epoch = 379573000 }, "a721cf2738274f806efefb5a33c6ff9ae049476f0d45a42049b71793949f4d1d"] "aiken-lang/stdlib@main" = [{ secs_since_epoch = 1698716809, nanos_since_epoch = 524620000 }, "a721cf2738274f806efefb5a33c6ff9ae049476f0d45a42049b71793949f4d1d"]

View File

@ -13,4 +13,4 @@ requirements = []
source = "github" source = "github"
[etags] [etags]
"aiken-lang/stdlib@main" = [{ secs_since_epoch = 1696706766, nanos_since_epoch = 666302000 }, "a721cf2738274f806efefb5a33c6ff9ae049476f0d45a42049b71793949f4d1d"] "aiken-lang/stdlib@main" = [{ secs_since_epoch = 1698716807, nanos_since_epoch = 480618000 }, "a721cf2738274f806efefb5a33c6ff9ae049476f0d45a42049b71793949f4d1d"]

View File

@ -13,4 +13,4 @@ requirements = []
source = "github" source = "github"
[etags] [etags]
"aiken-lang/stdlib@main" = [{ secs_since_epoch = 1696706772, nanos_since_epoch = 628073000 }, "a721cf2738274f806efefb5a33c6ff9ae049476f0d45a42049b71793949f4d1d"] "aiken-lang/stdlib@main" = [{ secs_since_epoch = 1698716807, nanos_since_epoch = 474125000 }, "a721cf2738274f806efefb5a33c6ff9ae049476f0d45a42049b71793949f4d1d"]

View File

@ -13,4 +13,4 @@ requirements = []
source = "github" source = "github"
[etags] [etags]
"aiken-lang/stdlib@main" = [{ secs_since_epoch = 1696706791, nanos_since_epoch = 935736000 }, "a721cf2738274f806efefb5a33c6ff9ae049476f0d45a42049b71793949f4d1d"] "aiken-lang/stdlib@main" = [{ secs_since_epoch = 1698716808, nanos_since_epoch = 236108000 }, "a721cf2738274f806efefb5a33c6ff9ae049476f0d45a42049b71793949f4d1d"]

View File

@ -13,4 +13,4 @@ requirements = []
source = "github" source = "github"
[etags] [etags]
"aiken-lang/stdlib@main" = [{ secs_since_epoch = 1696706874, nanos_since_epoch = 289174000 }, "a721cf2738274f806efefb5a33c6ff9ae049476f0d45a42049b71793949f4d1d"] "aiken-lang/stdlib@main" = [{ secs_since_epoch = 1698716853, nanos_since_epoch = 191816000 }, "a721cf2738274f806efefb5a33c6ff9ae049476f0d45a42049b71793949f4d1d"]

View File

@ -5,7 +5,7 @@
"plutusVersion": "v2", "plutusVersion": "v2",
"compiler": { "compiler": {
"name": "Aiken", "name": "Aiken",
"version": "v1.0.19-alpha+fba89a9" "version": "v1.0.20-alpha+49bd4ba"
} }
}, },
"validators": [ "validators": [
@ -23,8 +23,8 @@
"$ref": "#/definitions/Data" "$ref": "#/definitions/Data"
} }
}, },
"compiledCode": "5901d40100003232323232323232222533300632323232533300a3370e90000008a5114a0600e0026018002600c008664464a66601266e1d200000113232533300e3010002132498c94ccc030cdc3a400000226464a66602260260042649319299980799b87480000044c8c94ccc050c0580084c9263253330123370e9000000899191919299980c980d8010991924c64a66603066e1d200000113232533301d301f002132498c94ccc06ccdc3a400000226464a666040604400426493180b8008b1810000980d0010a99980d99b87480080044c8c8c8c8c8c94ccc090c09800852616375a604800260480046eb4c088004c088008dd69810000980d0010b180c0008b180e800980b8018a99980c19b874800800454ccc06cc05c00c52616163015002301000316301900130190023017001301100216300f001163014001300e00216300c001163011001300b0021533300c3370e90010008a99980798058010a4c2c2c60120022c601c00260100042c600c002464a66601066e1d200000113232533300d300f002149858dd7180680098038010a99980419b87480080044c8c94ccc034c03c00852616375c601a002600e0042c600a00200629309b2b118021baa001230043754002ae6955ceaab9e5573eae855d101", "compiledCode": "5901d10100003232323232323232222533300632323232533300a3370e90000008a5114a0600e0026018002600c0086464a66601066e1d200000113232533300d300f002132498c94ccc02ccdc3a400000226464a66602060240042649319299980719b87480000044c8c94ccc04cc0540084c9263253330113370e9000000899191919299980c180d0010991924c64a66602e66e1d200000113232533301c301e002132498c94ccc068cdc3a400000226464a66603e604200426493180b0008b180f800980c8010a99980d19b87480080044c8c8c8c8c8c94ccc08cc09400852616375a604600260460046eb4c084004c084008dd6980f800980c8010b180b8008b180e000980b0018a99980b99b874800800454ccc068c05800c52616163014002300f00316301800130180023016001301000216300e001163013001300d00216300b001163010001300a0021533300b3370e90010008a99980718050010a4c2c2c60100022c601a002600e00a2c600a008464a66601066e1d200000113232533300d300f002149858dd7180680098038010a99980419b87480080044c8c94ccc034c03c00852616375c601a002600e0042c600a00229309b2b118021baa001230043754002ae6955ceaab9e5573eae855d11",
"hash": "976408e30dc4c59008e5e44bc23771f926b55e9b4de505fb3b5ede43" "hash": "2c0c9ae697fdda3aed4aa647b854b6ef9e2fdae23df1ae516d9f4984"
} }
], ],
"definitions": { "definitions": {

View File

@ -13,4 +13,4 @@ requirements = []
source = "github" source = "github"
[etags] [etags]
"aiken-lang/stdlib@main" = [{ secs_since_epoch = 1696706851, nanos_since_epoch = 929421000 }, "a721cf2738274f806efefb5a33c6ff9ae049476f0d45a42049b71793949f4d1d"] "aiken-lang/stdlib@main" = [{ secs_since_epoch = 1698716850, nanos_since_epoch = 207153000 }, "a721cf2738274f806efefb5a33c6ff9ae049476f0d45a42049b71793949f4d1d"]

View File

@ -13,4 +13,4 @@ requirements = []
source = "github" source = "github"
[etags] [etags]
"aiken-lang/stdlib@main" = [{ secs_since_epoch = 1696706886, nanos_since_epoch = 86575000 }, "a721cf2738274f806efefb5a33c6ff9ae049476f0d45a42049b71793949f4d1d"] "aiken-lang/stdlib@main" = [{ secs_since_epoch = 1698716853, nanos_since_epoch = 778242000 }, "a721cf2738274f806efefb5a33c6ff9ae049476f0d45a42049b71793949f4d1d"]

View File

@ -13,4 +13,4 @@ requirements = []
source = "github" source = "github"
[etags] [etags]
"aiken-lang/stdlib@main" = [{ secs_since_epoch = 1696706844, nanos_since_epoch = 775723000 }, "a721cf2738274f806efefb5a33c6ff9ae049476f0d45a42049b71793949f4d1d"] "aiken-lang/stdlib@main" = [{ secs_since_epoch = 1698716849, nanos_since_epoch = 96268000 }, "a721cf2738274f806efefb5a33c6ff9ae049476f0d45a42049b71793949f4d1d"]