feat: compile deps
This commit is contained in:
parent
b06bf610b7
commit
e34cbc8e7e
|
@ -19,7 +19,8 @@ use aiken_lang::{
|
||||||
uplc::CodeGenerator,
|
uplc::CodeGenerator,
|
||||||
IdGenerator,
|
IdGenerator,
|
||||||
};
|
};
|
||||||
use deps::UseManifest;
|
use config::PackageName;
|
||||||
|
use deps::{manifest::Package, UseManifest};
|
||||||
use miette::NamedSource;
|
use miette::NamedSource;
|
||||||
use options::{CodeGenMode, Options};
|
use options::{CodeGenMode, Options};
|
||||||
use pallas::{
|
use pallas::{
|
||||||
|
@ -61,6 +62,7 @@ where
|
||||||
{
|
{
|
||||||
config: Config,
|
config: Config,
|
||||||
defined_modules: HashMap<String, PathBuf>,
|
defined_modules: HashMap<String, PathBuf>,
|
||||||
|
checked_modules: CheckedModules,
|
||||||
id_gen: IdGenerator,
|
id_gen: IdGenerator,
|
||||||
module_types: HashMap<String, TypeInfo>,
|
module_types: HashMap<String, TypeInfo>,
|
||||||
root: PathBuf,
|
root: PathBuf,
|
||||||
|
@ -85,6 +87,7 @@ where
|
||||||
|
|
||||||
Ok(Project {
|
Ok(Project {
|
||||||
config,
|
config,
|
||||||
|
checked_modules: CheckedModules::default(),
|
||||||
defined_modules: HashMap::new(),
|
defined_modules: HashMap::new(),
|
||||||
id_gen,
|
id_gen,
|
||||||
module_types,
|
module_types,
|
||||||
|
@ -110,19 +113,29 @@ where
|
||||||
name: self.config.name.to_string(),
|
name: self.config.name.to_string(),
|
||||||
version: self.config.version.clone(),
|
version: self.config.version.clone(),
|
||||||
});
|
});
|
||||||
|
|
||||||
self.read_source_files()?;
|
self.read_source_files()?;
|
||||||
|
|
||||||
let destination = destination.unwrap_or_else(|| self.root.join("doc"));
|
let destination = destination.unwrap_or_else(|| self.root.join("doc"));
|
||||||
let mut parsed_modules = self.parse_sources()?;
|
|
||||||
|
let mut parsed_modules = self.parse_sources(self.config.name.clone())?;
|
||||||
|
|
||||||
for (_, module) in parsed_modules.iter_mut() {
|
for (_, module) in parsed_modules.iter_mut() {
|
||||||
module.attach_doc_and_module_comments();
|
module.attach_doc_and_module_comments();
|
||||||
}
|
}
|
||||||
let checked_modules = self.type_check(parsed_modules)?;
|
|
||||||
|
self.type_check(parsed_modules)?;
|
||||||
|
|
||||||
self.event_listener.handle_event(Event::GeneratingDocFiles {
|
self.event_listener.handle_event(Event::GeneratingDocFiles {
|
||||||
output_path: destination.clone(),
|
output_path: destination.clone(),
|
||||||
});
|
});
|
||||||
let doc_files =
|
|
||||||
docs::generate_all(&self.root, &self.config, checked_modules.values().collect());
|
let doc_files = docs::generate_all(
|
||||||
|
&self.root,
|
||||||
|
&self.config,
|
||||||
|
self.checked_modules.values().collect(),
|
||||||
|
);
|
||||||
|
|
||||||
for file in doc_files {
|
for file in doc_files {
|
||||||
let path = destination.join(file.path);
|
let path = destination.join(file.path);
|
||||||
fs::create_dir_all(path.parent().unwrap())?;
|
fs::create_dir_all(path.parent().unwrap())?;
|
||||||
|
@ -153,14 +166,6 @@ where
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn compile(&mut self, options: Options) -> Result<(), Error> {
|
pub fn compile(&mut self, options: Options) -> Result<(), Error> {
|
||||||
let manifest = deps::download(
|
|
||||||
&self.event_listener,
|
|
||||||
None,
|
|
||||||
UseManifest::Yes,
|
|
||||||
&self.root,
|
|
||||||
&self.config,
|
|
||||||
)?;
|
|
||||||
|
|
||||||
self.event_listener
|
self.event_listener
|
||||||
.handle_event(Event::StartingCompilation {
|
.handle_event(Event::StartingCompilation {
|
||||||
root: self.root.clone(),
|
root: self.root.clone(),
|
||||||
|
@ -168,31 +173,41 @@ where
|
||||||
version: self.config.version.clone(),
|
version: self.config.version.clone(),
|
||||||
});
|
});
|
||||||
|
|
||||||
|
self.compile_deps()?;
|
||||||
|
|
||||||
self.read_source_files()?;
|
self.read_source_files()?;
|
||||||
let parsed_modules = self.parse_sources()?;
|
|
||||||
let mut checked_modules = self.type_check(parsed_modules)?;
|
let parsed_modules = self.parse_sources(self.config.name.clone())?;
|
||||||
let validators = self.validate_validators(&mut checked_modules)?;
|
|
||||||
|
self.type_check(parsed_modules)?;
|
||||||
|
|
||||||
|
let validators = self.validate_validators()?;
|
||||||
|
|
||||||
match options.code_gen_mode {
|
match options.code_gen_mode {
|
||||||
CodeGenMode::Build(uplc_dump) => {
|
CodeGenMode::Build(uplc_dump) => {
|
||||||
self.event_listener.handle_event(Event::GeneratingUPLC {
|
self.event_listener.handle_event(Event::GeneratingUPLC {
|
||||||
output_path: self.output_path(),
|
output_path: self.output_path(),
|
||||||
});
|
});
|
||||||
let programs = self.code_gen(validators, &checked_modules)?;
|
|
||||||
|
let programs = self.code_gen(validators)?;
|
||||||
|
|
||||||
self.write_build_outputs(programs, uplc_dump)?;
|
self.write_build_outputs(programs, uplc_dump)?;
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
CodeGenMode::Test {
|
CodeGenMode::Test {
|
||||||
match_tests,
|
match_tests,
|
||||||
verbose,
|
verbose,
|
||||||
} => {
|
} => {
|
||||||
let tests = self.collect_scripts(&checked_modules, verbose, |def| {
|
let tests =
|
||||||
matches!(def, Definition::Test(..))
|
self.collect_scripts(verbose, |def| matches!(def, Definition::Test(..)))?;
|
||||||
})?;
|
|
||||||
if !tests.is_empty() {
|
if !tests.is_empty() {
|
||||||
self.event_listener.handle_event(Event::RunningTests);
|
self.event_listener.handle_event(Event::RunningTests);
|
||||||
}
|
}
|
||||||
|
|
||||||
let results = self.eval_scripts(tests, match_tests);
|
let results = self.eval_scripts(tests, match_tests);
|
||||||
|
|
||||||
let errors: Vec<Error> = results
|
let errors: Vec<Error> = results
|
||||||
.iter()
|
.iter()
|
||||||
.filter_map(|e| {
|
.filter_map(|e| {
|
||||||
|
@ -212,6 +227,7 @@ where
|
||||||
|
|
||||||
self.event_listener
|
self.event_listener
|
||||||
.handle_event(Event::FinishedTests { tests: results });
|
.handle_event(Event::FinishedTests { tests: results });
|
||||||
|
|
||||||
if !errors.is_empty() {
|
if !errors.is_empty() {
|
||||||
Err(Error::List(errors))
|
Err(Error::List(errors))
|
||||||
} else {
|
} else {
|
||||||
|
@ -222,6 +238,26 @@ where
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn compile_deps(&mut self) -> Result<(), Error> {
|
||||||
|
let manifest = deps::download(
|
||||||
|
&self.event_listener,
|
||||||
|
None,
|
||||||
|
UseManifest::Yes,
|
||||||
|
&self.root,
|
||||||
|
&self.config,
|
||||||
|
)?;
|
||||||
|
|
||||||
|
for package in manifest.packages {
|
||||||
|
self.read_package_source_files(&package)?;
|
||||||
|
|
||||||
|
let parsed_modules = self.parse_sources(package.name)?;
|
||||||
|
|
||||||
|
self.type_check(parsed_modules)?;
|
||||||
|
}
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
fn read_source_files(&mut self) -> Result<(), Error> {
|
fn read_source_files(&mut self) -> Result<(), Error> {
|
||||||
let lib = self.root.join("lib");
|
let lib = self.root.join("lib");
|
||||||
let validators = self.root.join("validators");
|
let validators = self.root.join("validators");
|
||||||
|
@ -232,7 +268,18 @@ where
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
fn parse_sources(&mut self) -> Result<ParsedModules, Error> {
|
fn read_package_source_files(&mut self, package: &Package) -> Result<(), Error> {
|
||||||
|
let lib = self
|
||||||
|
.root
|
||||||
|
.join(paths::build_deps_package(&package.name))
|
||||||
|
.join("lib");
|
||||||
|
|
||||||
|
self.aiken_files(&lib, ModuleKind::Lib)?;
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
fn parse_sources(&mut self, package_name: PackageName) -> Result<ParsedModules, Error> {
|
||||||
self.event_listener.handle_event(Event::ParsingProjectFiles);
|
self.event_listener.handle_event(Event::ParsingProjectFiles);
|
||||||
|
|
||||||
let mut errors = Vec::new();
|
let mut errors = Vec::new();
|
||||||
|
@ -257,7 +304,7 @@ where
|
||||||
name,
|
name,
|
||||||
path,
|
path,
|
||||||
extra,
|
extra,
|
||||||
package: self.config.name.to_string(),
|
package: package_name.to_string(),
|
||||||
};
|
};
|
||||||
|
|
||||||
if let Some(first) = self
|
if let Some(first) = self
|
||||||
|
@ -293,10 +340,9 @@ where
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn type_check(&mut self, mut parsed_modules: ParsedModules) -> Result<CheckedModules, Error> {
|
fn type_check(&mut self, mut parsed_modules: ParsedModules) -> Result<(), Error> {
|
||||||
self.event_listener.handle_event(Event::TypeChecking);
|
self.event_listener.handle_event(Event::TypeChecking);
|
||||||
let processing_sequence = parsed_modules.sequence()?;
|
let processing_sequence = parsed_modules.sequence()?;
|
||||||
let mut modules = HashMap::with_capacity(parsed_modules.len() + 1);
|
|
||||||
|
|
||||||
for name in processing_sequence {
|
for name in processing_sequence {
|
||||||
if let Some(ParsedModule {
|
if let Some(ParsedModule {
|
||||||
|
@ -305,8 +351,7 @@ where
|
||||||
code,
|
code,
|
||||||
kind,
|
kind,
|
||||||
extra,
|
extra,
|
||||||
// TODO: come back and figure out where to use this
|
package,
|
||||||
package: _package,
|
|
||||||
ast,
|
ast,
|
||||||
}) = parsed_modules.remove(&name)
|
}) = parsed_modules.remove(&name)
|
||||||
{
|
{
|
||||||
|
@ -339,7 +384,7 @@ where
|
||||||
self.module_types
|
self.module_types
|
||||||
.insert(name.clone(), ast.type_info.clone());
|
.insert(name.clone(), ast.type_info.clone());
|
||||||
|
|
||||||
modules.insert(
|
self.checked_modules.insert(
|
||||||
name.clone(),
|
name.clone(),
|
||||||
CheckedModule {
|
CheckedModule {
|
||||||
kind,
|
kind,
|
||||||
|
@ -347,25 +392,22 @@ where
|
||||||
name,
|
name,
|
||||||
code,
|
code,
|
||||||
ast,
|
ast,
|
||||||
|
package,
|
||||||
input_path: path,
|
input_path: path,
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Ok(modules.into())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
fn validate_validators(
|
fn validate_validators(&self) -> Result<Vec<(PathBuf, String, TypedFunction)>, Error> {
|
||||||
&self,
|
|
||||||
checked_modules: &mut CheckedModules,
|
|
||||||
) -> Result<Vec<(PathBuf, String, TypedFunction)>, Error> {
|
|
||||||
let mut errors = Vec::new();
|
let mut errors = Vec::new();
|
||||||
let mut validators = Vec::new();
|
let mut validators = Vec::new();
|
||||||
let mut indices_to_remove = Vec::new();
|
|
||||||
|
|
||||||
for module in checked_modules.validators() {
|
for module in self.checked_modules.validators() {
|
||||||
for (index, def) in module.ast.definitions().enumerate() {
|
for def in module.ast.definitions() {
|
||||||
if let Definition::Fn(func_def) = def {
|
if let Definition::Fn(func_def) = def {
|
||||||
if VALIDATOR_NAMES.contains(&func_def.name.as_str()) {
|
if VALIDATOR_NAMES.contains(&func_def.name.as_str()) {
|
||||||
// validators must return a Bool
|
// validators must return a Bool
|
||||||
|
@ -418,14 +460,9 @@ where
|
||||||
module.name.clone(),
|
module.name.clone(),
|
||||||
func_def.clone(),
|
func_def.clone(),
|
||||||
));
|
));
|
||||||
indices_to_remove.push(index);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for index in indices_to_remove.drain(0..) {
|
|
||||||
module.ast.definitions.remove(index);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if errors.is_empty() {
|
if errors.is_empty() {
|
||||||
|
@ -438,7 +475,6 @@ where
|
||||||
fn code_gen(
|
fn code_gen(
|
||||||
&mut self,
|
&mut self,
|
||||||
validators: Vec<(PathBuf, String, TypedFunction)>,
|
validators: Vec<(PathBuf, String, TypedFunction)>,
|
||||||
checked_modules: &CheckedModules,
|
|
||||||
) -> Result<Vec<Script>, Error> {
|
) -> Result<Vec<Script>, Error> {
|
||||||
let mut programs = Vec::new();
|
let mut programs = Vec::new();
|
||||||
let mut functions = HashMap::new();
|
let mut functions = HashMap::new();
|
||||||
|
@ -457,7 +493,7 @@ where
|
||||||
&option_data_type,
|
&option_data_type,
|
||||||
);
|
);
|
||||||
|
|
||||||
for module in checked_modules.values() {
|
for module in self.checked_modules.values() {
|
||||||
for def in module.ast.definitions() {
|
for def in module.ast.definitions() {
|
||||||
match def {
|
match def {
|
||||||
Definition::Fn(func) => {
|
Definition::Fn(func) => {
|
||||||
|
@ -529,7 +565,6 @@ where
|
||||||
// TODO: revisit ownership and lifetimes of data in this function
|
// TODO: revisit ownership and lifetimes of data in this function
|
||||||
fn collect_scripts(
|
fn collect_scripts(
|
||||||
&mut self,
|
&mut self,
|
||||||
checked_modules: &CheckedModules,
|
|
||||||
verbose: bool,
|
verbose: bool,
|
||||||
should_collect: fn(&TypedDefinition) -> bool,
|
should_collect: fn(&TypedDefinition) -> bool,
|
||||||
) -> Result<Vec<Script>, Error> {
|
) -> Result<Vec<Script>, Error> {
|
||||||
|
@ -550,10 +585,13 @@ where
|
||||||
&option_data_type,
|
&option_data_type,
|
||||||
);
|
);
|
||||||
|
|
||||||
// let mut indices_to_remove = Vec::new();
|
|
||||||
let mut scripts = Vec::new();
|
let mut scripts = Vec::new();
|
||||||
|
|
||||||
for module in checked_modules.values() {
|
for module in self
|
||||||
|
.checked_modules
|
||||||
|
.values()
|
||||||
|
.filter(|checked| checked.package == self.config.name.to_string())
|
||||||
|
{
|
||||||
for (_index, def) in module.ast.definitions().enumerate() {
|
for (_index, def) in module.ast.definitions().enumerate() {
|
||||||
match def {
|
match def {
|
||||||
Definition::Fn(func) => {
|
Definition::Fn(func) => {
|
||||||
|
@ -595,10 +633,6 @@ where
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// for index in indices_to_remove.drain(0..) {
|
|
||||||
// module.ast.definitions.remove(index);
|
|
||||||
// }
|
|
||||||
}
|
}
|
||||||
|
|
||||||
for (input_path, module_name, func_def) in scripts {
|
for (input_path, module_name, func_def) in scripts {
|
||||||
|
|
|
@ -219,11 +219,12 @@ pub struct CheckedModule {
|
||||||
pub code: String,
|
pub code: String,
|
||||||
pub input_path: PathBuf,
|
pub input_path: PathBuf,
|
||||||
pub kind: ModuleKind,
|
pub kind: ModuleKind,
|
||||||
|
pub package: String,
|
||||||
pub ast: TypedModule,
|
pub ast: TypedModule,
|
||||||
pub extra: ModuleExtra,
|
pub extra: ModuleExtra,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Clone)]
|
#[derive(Default, Debug, Clone)]
|
||||||
pub struct CheckedModules(HashMap<String, CheckedModule>);
|
pub struct CheckedModules(HashMap<String, CheckedModule>);
|
||||||
|
|
||||||
impl From<HashMap<String, CheckedModule>> for CheckedModules {
|
impl From<HashMap<String, CheckedModule>> for CheckedModules {
|
||||||
|
@ -239,10 +240,8 @@ impl From<CheckedModules> for HashMap<String, CheckedModule> {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl CheckedModules {
|
impl CheckedModules {
|
||||||
pub fn validators(&mut self) -> impl Iterator<Item = &mut CheckedModule> {
|
pub fn validators(&self) -> impl Iterator<Item = &CheckedModule> {
|
||||||
self.0
|
self.0.values().filter(|module| module.kind.is_validator())
|
||||||
.values_mut()
|
|
||||||
.filter(|module| module.kind.is_validator())
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn into_validators(self) -> impl Iterator<Item = CheckedModule> {
|
pub fn into_validators(self) -> impl Iterator<Item = CheckedModule> {
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
addr1w9ke4flw57jhv5tjefm8xwkfdc56et559npkcycd6u9ascc07drtu
|
|
@ -1 +0,0 @@
|
||||||
addr1wyqlmv9mg7cc5gcrhkxsnund3640hrfmj7ynxpcpc5kux2c6u6ewl
|
|
|
@ -1,5 +1,5 @@
|
||||||
{
|
{
|
||||||
"type": "PlutusScriptV2",
|
"type": "PlutusScriptV2",
|
||||||
"description": "Generated by Aiken",
|
"description": "Generated by Aiken",
|
||||||
"cborHex": "5854585201000022253335734646466e3cdd7198009801002a40006eb8cc004c008011200022323330010014800000c888cccd5cd19b870040025742466600800866e0000d20023574400200246aae78dd50008a4c2d"
|
"cborHex": "58c058be0100002225333573464646464a666ae68008400452819191919800801919b8f001375c6600c600e01490001800800911192999aab9f00114a026464a666ae68c01000852889998030030008021aba2002375c6ae84004008dd619801180199801180180224000900819b97323001375c66004600600a900011b9900149010d48656c6c6f2c20576f726c64210022323330010014800000c888cccd5cd19b870040025742466600800866e0000d20023574400200246aae78dd50008a4c2d"
|
||||||
}
|
}
|
|
@ -1,141 +0,0 @@
|
||||||
(program
|
|
||||||
1.0.0
|
|
||||||
(lam
|
|
||||||
datum
|
|
||||||
(lam
|
|
||||||
rdmr
|
|
||||||
(lam
|
|
||||||
_
|
|
||||||
(force
|
|
||||||
[
|
|
||||||
[
|
|
||||||
[
|
|
||||||
(force (builtin ifThenElse))
|
|
||||||
[
|
|
||||||
(lam
|
|
||||||
__constr_fields_exposer
|
|
||||||
[
|
|
||||||
(lam
|
|
||||||
__constr_get_field
|
|
||||||
[
|
|
||||||
(lam
|
|
||||||
x
|
|
||||||
[
|
|
||||||
[
|
|
||||||
(builtin equalsByteString)
|
|
||||||
[
|
|
||||||
(builtin unBData)
|
|
||||||
[
|
|
||||||
[
|
|
||||||
__constr_get_field
|
|
||||||
[ __constr_fields_exposer datum ]
|
|
||||||
]
|
|
||||||
(con integer 0)
|
|
||||||
]
|
|
||||||
]
|
|
||||||
]
|
|
||||||
[
|
|
||||||
(builtin unBData)
|
|
||||||
[
|
|
||||||
[
|
|
||||||
__constr_get_field
|
|
||||||
[ __constr_fields_exposer rdmr ]
|
|
||||||
]
|
|
||||||
(con integer 0)
|
|
||||||
]
|
|
||||||
]
|
|
||||||
]
|
|
||||||
)
|
|
||||||
[
|
|
||||||
[
|
|
||||||
(builtin mkCons)
|
|
||||||
[ (builtin bData) (con bytestring #f4) ]
|
|
||||||
]
|
|
||||||
[
|
|
||||||
[ (builtin mkCons) rdmr ]
|
|
||||||
[ [ (builtin mkCons) datum ] (con listdata []) ]
|
|
||||||
]
|
|
||||||
]
|
|
||||||
]
|
|
||||||
)
|
|
||||||
(lam
|
|
||||||
__constr_list
|
|
||||||
(lam
|
|
||||||
__arg_number
|
|
||||||
[
|
|
||||||
(lam
|
|
||||||
__recurse
|
|
||||||
[
|
|
||||||
[ [ __recurse __recurse ] (con integer 0) ]
|
|
||||||
__constr_list
|
|
||||||
]
|
|
||||||
)
|
|
||||||
(lam
|
|
||||||
__self_recursor
|
|
||||||
(lam
|
|
||||||
__current_arg_number
|
|
||||||
(lam
|
|
||||||
__list_of_constr_args
|
|
||||||
[
|
|
||||||
[
|
|
||||||
[
|
|
||||||
[
|
|
||||||
(force (builtin ifThenElse))
|
|
||||||
[
|
|
||||||
[
|
|
||||||
(builtin equalsInteger)
|
|
||||||
__arg_number
|
|
||||||
]
|
|
||||||
__current_arg_number
|
|
||||||
]
|
|
||||||
]
|
|
||||||
(force (builtin headList))
|
|
||||||
]
|
|
||||||
(lam
|
|
||||||
__current_list_of_constr_args
|
|
||||||
[
|
|
||||||
[
|
|
||||||
[ __self_recursor __self_recursor ]
|
|
||||||
[
|
|
||||||
[
|
|
||||||
(builtin addInteger)
|
|
||||||
__current_arg_number
|
|
||||||
]
|
|
||||||
(con integer 1)
|
|
||||||
]
|
|
||||||
]
|
|
||||||
[
|
|
||||||
(force (builtin tailList))
|
|
||||||
__current_list_of_constr_args
|
|
||||||
]
|
|
||||||
]
|
|
||||||
)
|
|
||||||
]
|
|
||||||
__list_of_constr_args
|
|
||||||
]
|
|
||||||
)
|
|
||||||
)
|
|
||||||
)
|
|
||||||
]
|
|
||||||
)
|
|
||||||
)
|
|
||||||
]
|
|
||||||
)
|
|
||||||
(lam
|
|
||||||
__constr_var
|
|
||||||
[
|
|
||||||
(force (force (builtin sndPair)))
|
|
||||||
[ (builtin unConstrData) __constr_var ]
|
|
||||||
]
|
|
||||||
)
|
|
||||||
]
|
|
||||||
]
|
|
||||||
(delay (con unit ()))
|
|
||||||
]
|
|
||||||
(delay (error ))
|
|
||||||
]
|
|
||||||
)
|
|
||||||
)
|
|
||||||
)
|
|
||||||
)
|
|
||||||
)
|
|
|
@ -0,0 +1 @@
|
||||||
|
58be0100002225333573464646464a666ae68008400452819191919800801919b8f001375c6600c600e01490001800800911192999aab9f00114a026464a666ae68c01000852889998030030008021aba2002375c6ae84004008dd619801180199801180180224000900819b97323001375c66004600600a900011b9900149010d48656c6c6f2c20576f726c64210022323330010014800000c888cccd5cd19b870040025742466600800866e0000d20023574400200246aae78dd50008a4c2d
|
|
@ -1 +0,0 @@
|
||||||
585201000022253335734646466e3cdd7198009801002a40006eb8cc004c008011200022323330010014800000c888cccd5cd19b870040025742466600800866e0000d20023574400200246aae78dd50008a4c2d
|
|
|
@ -0,0 +1 @@
|
||||||
|
addr_test1wpke4flw57jhv5tjefm8xwkfdc56et559npkcycd6u9ascc5kelye
|
|
@ -1 +0,0 @@
|
||||||
addr_test1wqqlmv9mg7cc5gcrhkxsnund3640hrfmj7ynxpcpc5kux2cp5w9p6
|
|
|
@ -1,18 +1,24 @@
|
||||||
use sample
|
use aiken/list
|
||||||
|
use aiken/string
|
||||||
|
use aiken/hash.{Blake2b_224, Hash}
|
||||||
|
use aiken/transaction.{ScriptContext}
|
||||||
|
use aiken/transaction/credential.{VerificationKey}
|
||||||
|
|
||||||
// Stuff
|
pub type Datum {
|
||||||
|
owner: Hash<Blake2b_224, VerificationKey>,
|
||||||
|
}
|
||||||
|
|
||||||
/// Spend validator
|
pub type Redeemer {
|
||||||
pub fn spend(datum: sample.Datum, rdmr: sample.Redeemer, _ctx: Nil) -> Bool {
|
msg: ByteArray,
|
||||||
let x = #(datum, rdmr, #[244])
|
}
|
||||||
|
|
||||||
let y = [#(#[222], #[222]), #(#[233], #[52])]
|
pub fn spend(datum: Datum, redeemer: Redeemer, context: ScriptContext) -> Bool {
|
||||||
|
let must_say_hello = string.from_bytearray(redeemer.msg) == "Hello, World!"
|
||||||
|
let must_be_signed =
|
||||||
|
context.transaction.extra_signatories
|
||||||
|
|> list.any(fn(vk) { vk == datum.owner })
|
||||||
|
|
||||||
let [z, f, ..g] = y
|
must_say_hello && must_be_signed
|
||||||
|
|
||||||
let #(a, b, _) = x
|
|
||||||
|
|
||||||
z == #(#[222], #[222])
|
|
||||||
}
|
}
|
||||||
|
|
||||||
test foo() {
|
test foo() {
|
||||||
|
|
Loading…
Reference in New Issue