feat: Make traces produced by expect dependent on

the value of the tracing flag.
This commit is contained in:
microproofs 2023-06-23 13:36:41 -04:00 committed by Kasey
parent dbfa08a5a7
commit db369da96e
11 changed files with 79 additions and 45 deletions

View File

@ -10,6 +10,8 @@
```
compare_with(a, >=, b) == compare_with(a, fn(l, r) { l >= r }, b)
```
- **aiken-lang**: Make traces produced by expect dependent on the value of the
tracing flag.
### Fixed

View File

@ -1139,6 +1139,15 @@ impl From<bool> for Tracing {
}
}
impl From<Tracing> for bool {
fn from(value: Tracing) -> Self {
match value {
Tracing::NoTraces => false,
Tracing::KeepTraces => true,
}
}
}
#[derive(Copy, Clone, PartialEq, Eq)]
pub struct Span {
pub start: usize,

View File

@ -3,9 +3,7 @@ use std::{rc::Rc, sync::Arc};
use indexmap::{IndexMap, IndexSet};
use itertools::Itertools;
use uplc::{
ast::{
Constant as UplcConstant, DeBruijn, Name, NamedDeBruijn, Program, Term, Type as UplcType,
},
ast::{Constant as UplcConstant, Name, NamedDeBruijn, Program, Term, Type as UplcType},
builder::{CONSTR_FIELDS_EXPOSER, CONSTR_GET_FIELD, CONSTR_INDEX_EXPOSER, EXPECT_ON_LIST},
builtins::DefaultFunction,
machine::cost_model::ExBudget,
@ -59,7 +57,7 @@ pub struct CodeGenerator<'a> {
needs_field_access: bool,
code_gen_functions: IndexMap<String, CodeGenFunction>,
zero_arg_functions: IndexMap<FunctionAccessKey, Vec<Air>>,
uplc_to_function: IndexMap<Program<DeBruijn>, FunctionAccessKey>,
tracing: bool,
}
impl<'a> CodeGenerator<'a> {
@ -67,6 +65,7 @@ impl<'a> CodeGenerator<'a> {
functions: IndexMap<FunctionAccessKey, &'a TypedFunction>,
data_types: IndexMap<DataTypeKey, &'a TypedDataType>,
module_types: IndexMap<&'a String, &'a TypeInfo>,
tracing: bool,
) -> Self {
CodeGenerator {
defined_functions: IndexMap::new(),
@ -77,7 +76,7 @@ impl<'a> CodeGenerator<'a> {
id_gen: IdGenerator::new().into(),
code_gen_functions: IndexMap::new(),
zero_arg_functions: IndexMap::new(),
uplc_to_function: IndexMap::new(),
tracing,
}
}
@ -87,7 +86,6 @@ impl<'a> CodeGenerator<'a> {
self.id_gen = IdGenerator::new().into();
self.needs_field_access = false;
self.defined_functions = IndexMap::new();
self.uplc_to_function = IndexMap::new();
}
pub fn generate(
@ -2624,9 +2622,11 @@ impl<'a> CodeGenerator<'a> {
);
}
if self.tracing {
trace_stack.trace(tipo.clone());
trace_stack.string("Constr index did not match any type variant");
}
trace_stack.error(tipo.clone());
@ -4054,6 +4054,7 @@ impl<'a> CodeGenerator<'a> {
inner_types,
check_last_item,
true,
self.tracing,
)
.apply(value);
@ -4406,13 +4407,16 @@ impl<'a> CodeGenerator<'a> {
let mut term = arg_stack.pop().unwrap();
let error_term =
Term::Error.trace(Term::string("Expected on incorrect constructor variant."));
let trace_term = if self.tracing {
Term::Error.trace(Term::string("Expected on incorrect constructor variant."))
} else {
Term::Error
};
term = Term::equals_integer()
.apply(Term::integer(constr_index.into()))
.apply(Term::var(CONSTR_INDEX_EXPOSER).apply(constr))
.delayed_if_else(term, error_term);
.delayed_if_else(term, trace_term);
arg_stack.push(term);
}
@ -4420,13 +4424,16 @@ impl<'a> CodeGenerator<'a> {
let value = arg_stack.pop().unwrap();
let mut term = arg_stack.pop().unwrap();
let error_term =
Term::Error.trace(Term::string("Expected on incorrect boolean variant"));
let trace_term = if self.tracing {
Term::Error.trace(Term::string("Expected on incorrect boolean variant"))
} else {
Term::Error
};
if is_true {
term = value.delayed_if_else(term, error_term)
term = value.delayed_if_else(term, trace_term)
} else {
term = value.delayed_if_else(error_term, term)
term = value.delayed_if_else(trace_term, term)
}
arg_stack.push(term);
}
@ -4747,6 +4754,7 @@ impl<'a> CodeGenerator<'a> {
inner_types,
check_last_item,
false,
self.tracing,
)
} else {
term
@ -4762,12 +4770,15 @@ impl<'a> CodeGenerator<'a> {
let value = arg_stack.pop().unwrap();
let mut term = arg_stack.pop().unwrap();
let trace_term = if self.tracing {
Term::Error.trace(Term::string("Expected no fields for Constr"))
} else {
Term::Error
};
term = Term::var(CONSTR_FIELDS_EXPOSER)
.apply(value)
.delayed_choose_list(
term,
Term::Error.trace(Term::string("Expected no fields for Constr")),
);
.delayed_choose_list(term, trace_term);
arg_stack.push(term);
}
@ -4775,10 +4786,13 @@ impl<'a> CodeGenerator<'a> {
let value = arg_stack.pop().unwrap();
let mut term = arg_stack.pop().unwrap();
term = value.delayed_choose_list(
term,
Term::Error.trace(Term::string("Expected no items for List")),
);
let trace_term = if self.tracing {
Term::Error.trace(Term::string("Expected no items for List"))
} else {
Term::Error
};
term = value.delayed_choose_list(term, trace_term);
arg_stack.push(term);
}
@ -5026,6 +5040,7 @@ impl<'a> CodeGenerator<'a> {
tipo.get_inner_types(),
check_last_item,
false,
self.tracing,
)
.apply(value);
}

View File

@ -508,7 +508,16 @@ pub fn list_access_to_uplc(
tipos: Vec<Arc<Type>>,
check_last_item: bool,
is_list_accessor: bool,
tracing: bool,
) -> Term<Name> {
let trace_term = if tracing {
Term::Error.trace(Term::string(
"List/Tuple/Constr contains more items than expected",
))
} else {
Term::Error
};
if let Some((first, names)) = names.split_first() {
let (current_tipo, tipos) = tipos.split_first().unwrap();
@ -567,12 +576,7 @@ pub fn list_access_to_uplc(
"tail_index_{}_{}",
current_index, id_list[current_index]
)))
.delayed_choose_list(
term,
Term::Error.trace(Term::string(
"List/Tuple/Constr contains more items than expected",
)),
)
.delayed_choose_list(term, trace_term)
} else {
term
}
@ -588,12 +592,7 @@ pub fn list_access_to_uplc(
"tail_index_{}_{}",
current_index, id_list[current_index]
)))
.delayed_choose_list(
term,
Term::Error.trace(Term::string(
"List/Tuple/Constr contains more items than expected",
)),
)
.delayed_choose_list(term, trace_term)
} else {
term
}
@ -614,6 +613,7 @@ pub fn list_access_to_uplc(
tipos.to_owned(),
check_last_item,
is_list_accessor,
tracing,
);
list_access_inner = match &list_access_inner {
@ -652,6 +652,7 @@ pub fn list_access_to_uplc(
tipos.to_owned(),
check_last_item,
is_list_accessor,
tracing,
);
list_access_inner = match &list_access_inner {

View File

@ -205,6 +205,7 @@ mod test {
&project.functions,
&project.data_types,
&project.module_types,
true,
);
let (validator, def) = modules

View File

@ -267,6 +267,7 @@ where
&self.functions,
&self.data_types,
&self.module_types,
options.tracing.into(),
);
let blueprint = Blueprint::new(&self.config, &self.checked_modules, &mut generator)
@ -295,7 +296,8 @@ where
verbose,
exact_match,
} => {
let tests = self.collect_tests(verbose, match_tests, exact_match)?;
let tests =
self.collect_tests(verbose, match_tests, exact_match, options.tracing.into())?;
if !tests.is_empty() {
self.event_listener.handle_event(Event::RunningTests);
@ -598,6 +600,7 @@ where
verbose: bool,
match_tests: Option<Vec<String>>,
exact_match: bool,
tracing: bool,
) -> Result<Vec<Script>, Error> {
let mut scripts = Vec::new();
@ -690,6 +693,7 @@ where
&self.functions,
&self.data_types,
&self.module_types,
tracing,
);
let evaluation_hint = func_def.test_hint().map(|(bin_op, left_src, right_src)| {

View File

@ -297,6 +297,7 @@ impl CheckedModules {
builtin_functions: &'a IndexMap<FunctionAccessKey, TypedFunction>,
builtin_data_types: &'a IndexMap<DataTypeKey, TypedDataType>,
module_types: &'a HashMap<String, TypeInfo>,
tracing: bool,
) -> CodeGenerator<'a> {
let mut functions = IndexMap::new();
for (k, v) in builtin_functions {
@ -343,7 +344,7 @@ impl CheckedModules {
let mut module_types_index = IndexMap::new();
module_types_index.extend(module_types);
CodeGenerator::new(functions, data_types, module_types_index)
CodeGenerator::new(functions, data_types, module_types_index, tracing)
}
}

View File

@ -31,6 +31,7 @@ fn assert_uplc(source_code: &str, expected: Term<Name>, should_fail: bool) {
&project.functions,
&project.data_types,
&project.module_types,
true,
);
let Some(checked_module) = modules.values().next()

View File

@ -19,8 +19,8 @@
"$ref": "#/definitions/spend~1PoolRedeemer"
}
},
"compiledCode": "590722010000323232323232323232323232222323232533300b3232323232323253330123370e90000008992513010007153330123370e9001000899191919299980b19b87480080044c8c8c8c8c8c8c9289811000980c99299980e19b8748000c06c004400454cc07524012a4578706563746564206f6e20696e636f727265637420636f6e7374727563746f722076617269616e742e00163300d0140033020001301732533301a3370e9000180c80088008a9980da4812a4578706563746564206f6e20696e636f727265637420636f6e7374727563746f722076617269616e742e00163300a012001300848901ff00301d001301400214a0602800266020602401a9001180c8009808003899191919299980b19b87480080044c8c8c8c8c8c8c9289811000980c99299980e19b8748000c06c004400454cc0752412a4578706563746564206f6e20696e636f727265637420636f6e7374727563746f722076617269616e742e00163300d0140033020001301732533301a3370e9000180c80088008a9980da4812a4578706563746564206f6e20696e636f727265637420636f6e7374727563746f722076617269616e742e00163300a012001300848901ff00301d001301400214a0602800266020602401a9001180c80098080039808003119ba548000cc058cdd2a40046602c6ea40052f5c06602c98103d87a80004bd7011198021bac3300d300f3300d300f00248001200423375e6601c6020002900000111198019bac3300c300e3300c300e00248001200023375e6601a601e6601a601e0029001240000046002002444a6660260042980103d87a8000132325333011300300213374a90001980b00125eb804ccc01401400400cc05c00cc054008cc01cc0240092000149858c8018c94ccc02ccdc3a40000022646464646464a66602a60300042649318048028a99809249334c6973742f5475706c652f436f6e73747220636f6e7461696e73206d6f7265206974656d73207468616e2065787065637465640016375a602c002602c0046eb4c050004c050008c048004c02401854cc0312412b436f6e73747220696e64657820646964206e6f74206d6174636820616e7920747970652076617269616e74001630090053200432533300a3370e9000000899192999808180980109924c64a66601a66e1d20000011323253330133016002149854cc041241334c6973742f5475706c652f436f6e73747220636f6e7461696e73206d6f7265206974656d73207468616e2065787065637465640016375a602800260160042a66601a66e1d20020011323253330133016002132498c94ccc040cdc3a4000002264646464a66603060360042649318060018a9980aa481334c6973742f5475706c652f436f6e73747220636f6e7461696e73206d6f7265206974656d73207468616e2065787065637465640016375a60320026032004602e002601c0042a660229212b436f6e73747220696e64657820646964206e6f74206d6174636820616e7920747970652076617269616e740016300e00115330104901334c6973742f5475706c652f436f6e73747220636f6e7461696e73206d6f7265206974656d73207468616e20657870656374656400163014001300b0021533300d3370e9002000899192999809980b00109924c64a66602066e1d20000011323232325333018301b002132498c03000c54cc055241334c6973742f5475706c652f436f6e73747220636f6e7461696e73206d6f7265206974656d73207468616e2065787065637465640016375a60320026032004602e002601c0042a660229212b436f6e73747220696e64657820646964206e6f74206d6174636820616e7920747970652076617269616e740016300e00115330104901334c6973742f5475706c652f436f6e73747220636f6e7461696e73206d6f7265206974656d73207468616e20657870656374656400163014001300b002153300e4912b436f6e73747220696e64657820646964206e6f74206d6174636820616e7920747970652076617269616e740016300b001153300d4901334c6973742f5475706c652f436f6e73747220636f6e7461696e73206d6f7265206974656d73207468616e206578706563746564001630110013008004153300b4912b436f6e73747220696e64657820646964206e6f74206d6174636820616e7920747970652076617269616e7400163008003232533300a3370e90000008991919192999809180a8010a4c2a6601e921334c6973742f5475706c652f436f6e73747220636f6e7461696e73206d6f7265206974656d73207468616e2065787065637465640016375c602600260260046eb8c044004c02000854cc02d2412b436f6e73747220696e64657820646964206e6f74206d6174636820616e7920747970652076617269616e740016300800133001001480008888cccc01ccdc38008018069199980280299b8000448008c03c0040080088c018dd5000918021baa0015734ae7155ceaab9e5573eae815d0aba21",
"hash": "b0e1ce90ece6e3bbb745025cce93a6361e1c9f4c06d8cdebd65a5a8a"
"compiledCode": "59035b0100003232323232323232323232222323232533300b3232323232323253330123370e90000008992513010007153330123370e9001000899191919299980b19b87480080044c8c8c8c8c8c8c9289810800980c99299980e19b8748000c06c004400458cc03405000cc07c004c05cc94ccc068cdc3a4000603200220022c66014024002601091101ff00301c001301400214a0602800266020602401a9001180c0009808003899191919299980b19b87480080044c8c8c8c8c8c8c9289810800980c99299980e19b8748000c06c004400458cc03405000cc07c004c05cc94ccc068cdc3a4000603200220022c660140240026010910101ff00301c001301400214a0602800266020602401a9001180c00098080039808003119ba548000cc054cdd2a40046602a6ea40052f5c06602a98103d87a80004bd7011198021bac3300d300f3300d300f00248001200423375e6601c6020002900000111198019bac3300c300e3300c300e00248001200023375e6601a601e6601a601e0029001240000046002002444a6660240042980103d87a8000132325333011300300213374a90001980a80125eb804ccc01401400400cc05800cc050008cc01cc0240092000149858c8018c94ccc02ccdc3a40000022646464646464a666028602e0042649318048028b1bad30150013015002375a602600260260046022002601200c2c601200a6400864a66601466e1d200000113232533300f3012002132498c94ccc034cdc3a400000226464a666024602a0042930b1bad3013001300b0021533300d3370e9001000899192999809180a80109924c64a66602066e1d20000011323232325333017301a002132498c03000c58dd6980c000980c001180b00098070010b18070008b180980098058010a99980699b87480100044c8c94ccc048c0540084c9263253330103370e9000000899191919299980b980d00109924c60180062c6eb4c060004c060008c058004c03800858c03800458c04c004c02c00858c02c00458c040004c02001058c02000c8c94ccc028cdc3a4000002264646464a66602260280042930b1bae30120013012002375c602000260100042c60100026600200290001111199980399b8700100300c233330050053370000890011807000801001118029baa001230033754002ae6955ceaab9e5573eae815d0aba21",
"hash": "0cacc32c28d8b9724b7ce935bdfade75a3807ab9a7cf4c4e95bbdad8"
}
],
"definitions": {

View File

@ -27,8 +27,8 @@
}
}
],
"compiledCode": "5902d601000032323232323232323232323223222232533300b323232323232323232323232323232533301e30210021323232533301d3370e90000008a99980e9999180080091129998120010a50132325333022300300214a2266600a00a0020066050006604c004016466ebccc068c07000520000171533301d3370e0049001099b8f00301714a02a6603c921254578706563746564206f6e20696e636f727265637420626f6f6c65616e2076617269616e74001616301b012375a603c0046eb8c07000454cc06d2401334c6973742f5475706c652f436f6e73747220636f6e7461696e73206d6f7265206974656d73207468616e2065787065637465640016301f001333232223232533301e3370e90010008a5eb7bdb1804c8dd59812800980e001180e000998018010009800800911299980f8010a6103d87a8000132323232533301f3371e00a002266e95200033024374c00497ae01333007007003005375c60400066eacc080008c08c00cc084008004020dd5980e800980e800980e000980d800980d0011bac3018001300f005375c602c002601aa66601e66e1d2000300e001100115330104912a4578706563746564206f6e20696e636f727265637420636f6e7374727563746f722076617269616e742e00163014001301400230120013009002149858c800cc94ccc02ccdc3a40000022a66601e60120062930a998062491d4578706563746564206e6f206669656c647320666f7220436f6e73747200161533300b3370e90010008a99980798048018a4c2a6601892011d4578706563746564206e6f206669656c647320666f7220436f6e7374720016153300c4912b436f6e73747220696e64657820646964206e6f74206d6174636820616e7920747970652076617269616e7400163009002375c0026600200290001111199980399b8700100300d233330050053370000890011807800801001118031baa001230043754002ae695ce2ab9d5573caae7d5d02ba15745",
"hash": "47f04b17991835e079855a20d5c4506bee37d7917260a688ceae8266"
"compiledCode": "5901c2010000323232323232323232323223222232533300b323232323232323232323232323232533301d30200021323232533301d3370e90000008a99980e9999180080091129998118010a50132325333022300300214a2266600a00a002006604e006604a004016466ebccc068c07000520000171533301d3370e0049001099b8f00301714a02c2c60360246eb4c074008dd7180d8008b180f000999919111919299980f19b874800800452f5bded8c02646eacc090004c070008c070004cc00c008004c0040048894ccc0780085300103d87a8000132323232533301f3371e00a002266e95200033023374c00497ae01333007007003005375c603e0066eacc07c008c08800cc080008004020dd5980e000980e000980d800980d000980c8011bac3017001300f005375c602a002601aa66601e66e1d2000300e0011001163013001301300230110013009002149858c800cc94ccc02ccdc3a40000022a66601c60120062930b0a99980599b874800800454ccc038c02400c52616163009002375c0026600200290001111199980399b8700100300c233330050053370000890011807000801001118029baa001230033754002ae6955ceaab9e5573eae815d0aba21",
"hash": "e413cd6136ea78be9b974e540f4acd04ab1274353e63b430018433b7"
}
],
"definitions": {

View File

@ -36,8 +36,8 @@
"$ref": "#/definitions/Data"
}
},
"compiledCode": "5903b1010000323232323232323232323232322223232533300a3230020013301033300a323375e00c0026601693260103d87980004c0103d87a80004c0103d87980003301033300a332323232232323253330123375e98106d8799f182aff0000213370e600a00890020a503253330123370e900000089919299980c980e0010a4c2a6602c921334c6973742f5475706c652f436f6e73747220636f6e7461696e73206d6f7265206974656d73207468616e2065787065637465640016375a603400260200042a660289212b436f6e73747220696e64657820646964206e6f74206d6174636820616e7920747970652076617269616e74001630100013017001300d3253330103370e9000180780088008a9980924812a4578706563746564206f6e20696e636f727265637420636f6e7374727563746f722076617269616e742e001632330050020013237280026ecd300106d8799f182aff0030010012253330130011480004c8cdc02400466006006002602c0026002002444a6660240042980103d87a800013232323253330113371e00a002266e952000330170024bd7009998038038018029bae301300330130023016003301400237566600c60106600c6010006900024028980103d87a80004c0103d87980003301033300a325333010001161325333011001161323232325333010323008001330163330103375e66018601c004900226126d87a9f5820fcaa61fb85676101d9e3398a484674e71c45c3fd41b492682f3b0054f4cf3273ff004c0103d87a80004c0103d8798000330163330103375e66018601c0049003260122d8799f581ce37db487fbd58c45d059bcbf5cd6b1604d3bec16cf888f1395a4ebc4ff004c0103d87a80004c0103d87980004bd7009918040009980b19980819baf3300c300e3300c300e0014800120024c12ad8799fd8799fd8799f581c66666666666666666666666666666666666666666666666666666666ffffff004c0103d87a80004c0103d879800033016333010323253330123370e900200089925130100021630100013300c300e0014801130103d87a80004c0103d87980004bd700a5030160043015004163014001301300137586600c60106600c601000690002400898103d87a80004c0103d87980004bd700a4c2c600200244a66601e00229444c8c94ccc0300084cc010010004528180980119b8748008c034dd5180880099800800a40004444666600e66e1c00400c0388cccc014014cdc00022400460200020040044600e6ea80048c014dd5000ab9a5736ae7155ceaab9e5573eae815d0aba21",
"hash": "a29971e3525c7d2f66af7b40e5cb700aa4fa9fc2dad3ddd078bb2c30"
"compiledCode": "5903100100003232323232323232323232322223232533300a3230020013300f33300a323375e00c0026601693260103d87980004c0103d87a80004c0103d87980003300f33300a332323232232323253330123375e98106d8799f182aff0000213370e600a00890020a503253330123370e900000089919299980c180d8010a4c2c6eb4c064004c04000858c040004c058004c034c94ccc040cdc3a4000601e00220022c646600a004002646e50004dd9a60106d8799f182aff0030010012253330120011480004c8cdc02400466006006002602a0026002002444a6660220042980103d87a800013232323253330113371e00a002266e952000330160024bd7009998038038018029bae301200330120023015003301300237566600c60106600c6010006900024028980103d87a80004c0103d87980003300f33300a32533300f001161325333010001161323232325333010323008001330153330103375e66018601c004900226126d87a9f5820fcaa61fb85676101d9e3398a484674e71c45c3fd41b492682f3b0054f4cf3273ff004c0103d87a80004c0103d8798000330153330103375e66018601c0049003260122d8799f581ce37db487fbd58c45d059bcbf5cd6b1604d3bec16cf888f1395a4ebc4ff004c0103d87a80004c0103d87980004bd7009918040009980a99980819baf3300c300e3300c300e0014800120024c12ad8799fd8799fd8799f581c66666666666666666666666666666666666666666666666666666666ffffff004c0103d87a80004c0103d879800033015333010323253330123370e900200089925130100021630100013300c300e0014801130103d87a80004c0103d87980004bd700a5030150043014004163013001301200137586600c60106600c601000690002400898103d87a80004c0103d87980004bd700a4c2c600200244a66601c00229444c8c94ccc0300084cc010010004528180900119b8748008c030dd5180800099800800a40004444666600e66e1c00400c0348cccc014014cdc000224004601e0020040044600c6ea80048c010dd5000ab9a5736aae7555cf2ab9f5740ae855d11",
"hash": "7430b07ebb41177b84d49ffed5e102eff7ffee61ad2b81c3f3ab3dbb"
},
{
"title": "mint.mint",
@ -47,8 +47,8 @@
"$ref": "#/definitions/Data"
}
},
"compiledCode": "59043401000032323232323232323232323222533300732332300100122533300e00114a226464a6660180042660080080022940c048008cdc3a400460186ea8c040004004cc030ccc01ccc8c8c8c88c8c94ccc048c0540084c8c8cdc78018009bae3015001300c32533300f3370e9000180700088008a998082492a4578706563746564206f6e20696e636f727265637420636f6e7374727563746f722076617269616e742e00163300a300c0034800854cc03d2401334c6973742f5475706c652f436f6e73747220636f6e7461696e73206d6f7265206974656d73207468616e2065787065637465640016375c6026002646460080026600a0029101003756660106014660106014002900024010600200244a66601e002297ae013232323301337520026600a00a0046eb8c03c008c04c008c044004c0040048894ccc03800852f5bded8c0264646464a66601c66e3c014004400c4cc04ccdd81ba9001374c00466600e00e00600a6eb8c03c00cdd5980780118090019808001000a6103d87a80004c0103d87980003300c333007333232323222323232323253330123370e90010008b0991919b87001483c850dd6980c8009808001180800099803000a44103666f6f003322323253330133370e90010008a5eb7bdb1804c8dd5980d00098088011808800998048010009bab3300b300d00348020004dd7180a0009805a99980699b8748000c030008400854cc03924012a4578706563746564206f6e20696e636f727265637420636f6e7374727563746f722076617269616e742e00163001001222533301000214c103d87a800013232323253330103371e00a002266e95200033015375000497ae01333007007003005375c60220066eb4c044008c05000cc048008c0040048894ccc038008530103d87a8000132323232533300e3371e00a002266e95200033013374c00497ae01333007007003005375c601e0066eacc03c008c04800cc040008cc00cc01400520023300330050014800130103d87a80004c0103d87980003300c3330073332323232223232533300f3375e006002266e1cc8c018004dd5998059806998059806802240009009240042940c050004c02cc94ccc038cdc3a4000601a00220022a6601e9212a4578706563746564206f6e20696e636f727265637420636f6e7374727563746f722076617269616e742e00163322330070020013756660126016660126016004900024024660126016004900118008009129998078008a400026466e0120023300300300130120013001001222533300e00214c103d87a8000132323232533300e3375e00a002266e952000330130024bd7009998038038018029807801980780118090019808001000801260103d87a80004c0103d87980004bd700a4c2c6600200290001111199980399b8700100300d233330050053370000890011807800801001118031baa001230043754002ae695ce2ab9d5573caae7d5d02ba157441",
"hash": "0323607667c44dd282e59f9e3ae4049235264933be9e8404a641b81a"
"compiledCode": "590363010000323232323232323232323222533300732332300100122533300d00114a226464a6660180042660080080022940c044008cdc3a400460166ea8c03c004004cc02cccc01ccc8c8c8c88c8c94ccc044c0500084c8c8cdc78018009bae3014001300c32533300f3370e9000180700088008b198051806001a40042c6eb8c048004c8c8c010004cc014005221003756660106014660106014002900024010600200244a66601c002297ae013232323301237520026600a00a0046eb8c038008c048008c040004c0040048894ccc03400852f5bded8c0264646464a66601c66e3c014004400c4cc048cdd81ba9001374c00466600e00e00600a6eb8c03800cdd5980700118088019807801000a6103d87a80004c0103d87980003300b333007333232323222323232323253330123370e90010008b0991919b87001483c850dd6980c0009808001180800099803000a44103666f6f003322323253330133370e90010008a5eb7bdb1804c8dd5980c80098088011808800998048010009bab3300b300d00348020004dd718098009805a99980699b8748000c030008400858c0040048894ccc03c0085300103d87a800013232323253330103371e00a002266e95200033014375000497ae01333007007003005375c60200066eb4c040008c04c00cc044008c0040048894ccc034008530103d87a8000132323232533300e3371e00a002266e95200033012374c00497ae01333007007003005375c601c0066eacc038008c04400cc03c008cc00cc01400520023300330050014800130103d87a80004c0103d87980003300b3330073332323232223232533300f3375e006002266e1cc8c018004dd5998059806998059806802240009009240042940c04c004c02cc94ccc038cdc3a4000601a00220022c66446600e0040026eaccc024c02ccc024c02c009200048048cc024c02c0092002300100122533300e0011480004c8cdc0240046600600600260220026002002444a66601a004298103d87a8000132323232533300e3375e00a002266e952000330120024bd7009998038038018029807001980700118088019807801000801260103d87a80004c0103d87980004bd700a4c2c6600200290001111199980399b8700100300c233330050053370000890011807000801001118029baa001230033754002ae6955ceaab9e5573eae815d0aba21",
"hash": "af428f3f11ea2384e5105bc172b778576324039e95050066cb8a006f"
},
{
"title": "withdrawals.spend",