From e3966db607e33b79f9ade756e37d977eabc1c5b8 Mon Sep 17 00:00:00 2001 From: Dr Maxim Orlovsky Date: Wed, 13 Mar 2024 15:41:04 +0100 Subject: [PATCH] epic: abstract script and type libraries out of consensus structures --- src/schema/schema.rs | 12 +- src/schema/script.rs | 56 +-- src/stl.rs | 2 +- src/validation/consignment.rs | 27 +- src/validation/logic.rs | 51 +-- src/validation/schema.rs | 27 +- src/validation/script.rs | 17 +- src/validation/status.rs | 21 +- src/validation/validator.rs | 17 +- src/vm/mod.rs | 2 +- src/vm/runtime.rs | 27 +- src/vm/script.rs | 125 +------ stl/AnchoredBundle.vesper | 230 ++++++------ stl/RGB@0.1.0.sta | 656 +++++++++++++++++----------------- stl/RGB@0.1.0.stl | Bin 18462 -> 17820 bytes stl/RGB@0.1.0.sty | 26 +- stl/Schema.vesper | 81 ++--- stl/Transition.vesper | 162 ++++----- 18 files changed, 674 insertions(+), 865 deletions(-) diff --git a/src/schema/schema.rs b/src/schema/schema.rs index 22456c50..11b66263 100644 --- a/src/schema/schema.rs +++ b/src/schema/schema.rs @@ -29,7 +29,9 @@ use amplify::{ByteArray, Bytes32}; use armor::StrictArmor; use baid58::{Baid58ParseError, Chunking, FromBaid58, ToBaid58, CHUNKING_32}; use commit_verify::{CommitEncode, CommitEngine, CommitId, CommitmentId, DigestExt, Sha256}; -use strict_encoding::{StrictDecode, StrictDeserialize, StrictEncode, StrictSerialize, StrictType}; +use strict_encoding::{ + StrictDecode, StrictDeserialize, StrictDumb, StrictEncode, StrictSerialize, StrictType, +}; use super::{ AssignmentType, ExtensionSchema, GenesisSchema, Script, StateSchema, TransitionSchema, @@ -141,7 +143,7 @@ impl SchemaId { pub fn to_mnemonic(&self) -> String { self.to_baid58().mnemonic() } } -pub trait SchemaRoot: Clone + Eq + StrictType + StrictEncode + StrictDecode + Default { +pub trait SchemaRoot: Clone + Eq + StrictType + StrictEncode + StrictDecode + StrictDumb { fn schema_id(&self) -> SchemaId; } impl SchemaRoot for () { @@ -153,8 +155,8 @@ impl SchemaRoot for RootSchema { pub type RootSchema = Schema<()>; pub type SubSchema = Schema; -#[derive(Clone, Eq, Default, Debug)] -#[derive(StrictType, StrictEncode, StrictDecode)] +#[derive(Clone, Eq, Debug)] +#[derive(StrictType, StrictDumb, StrictEncode, StrictDecode)] #[strict_type(lib = LIB_NAME_RGB)] #[cfg_attr( feature = "serde", @@ -194,7 +196,7 @@ impl CommitEncode for Schema { e.commit_to_map(&self.extensions); e.commit_to_map(&self.transitions); - e.commit_to_serialized(&self.types.id()); + e.commit_to_serialized(&*self.types); e.commit_to_serialized(&self.script); } } diff --git a/src/schema/script.rs b/src/schema/script.rs index 84db3cfb..56bba809 100644 --- a/src/schema/script.rs +++ b/src/schema/script.rs @@ -27,7 +27,7 @@ use std::ops::Deref; -use strict_types::TypeSystem; +use strict_types::TypeSysId; use crate::vm::AluScript; use crate::LIB_NAME_RGB; @@ -83,16 +83,21 @@ impl Script { /// Types used by a schema and virtual machine #[derive(Clone, Eq, PartialEq, Debug, From)] -#[derive(StrictType, StrictEncode, StrictDecode)] -#[strict_type(lib = LIB_NAME_RGB, tags = custom)] +#[derive(StrictType, StrictDumb, StrictEncode, StrictDecode)] +#[strict_type(lib = LIB_NAME_RGB, tags = custom, dumb = Self::Strict(strict_dumb!()))] +#[cfg_attr( + feature = "serde", + derive(Serialize, Deserialize), + serde(crate = "serde_crate", rename_all = "camelCase", tag = "type") +)] pub enum Types { #[from] #[strict_type(tag = 0x01)] - Strict(TypeSystem), + Strict(TypeSysId), } impl Deref for Types { - type Target = TypeSystem; + type Target = TypeSysId; fn deref(&self) -> &Self::Target { match self { @@ -101,47 +106,10 @@ impl Deref for Types { } } -impl Default for Types { - fn default() -> Self { Types::Strict(none!()) } -} - impl Types { - pub fn as_strict(&self) -> &TypeSystem { + pub fn as_strict(&self) -> &TypeSysId { match self { - Types::Strict(ts) => ts, - } - } -} - -#[cfg(feature = "serde")] -mod _serde { - use armor::AsciiArmor; - use serde_crate::de::Error; - use serde_crate::{Deserialize, Deserializer, Serialize, Serializer}; - - use super::*; - - impl Serialize for Types { - fn serialize(&self, serializer: S) -> Result - where S: Serializer { - if serializer.is_human_readable() { - serializer.serialize_str(&self.as_strict().to_ascii_armored_string()) - } else { - self.as_strict().serialize(serializer) - } - } - } - - impl<'de> Deserialize<'de> for Types { - fn deserialize(deserializer: D) -> Result - where D: Deserializer<'de> { - if deserializer.is_human_readable() { - let s = String::deserialize(deserializer)?; - let sys = TypeSystem::from_ascii_armored_str(&s).map_err(D::Error::custom)?; - Ok(Types::Strict(sys)) - } else { - Ok(Types::Strict(TypeSystem::deserialize(deserializer)?)) - } + Types::Strict(id) => id, } } } diff --git a/src/stl.rs b/src/stl.rs index ca97f162..a6b799af 100644 --- a/src/stl.rs +++ b/src/stl.rs @@ -34,7 +34,7 @@ use crate::{ /// Strict types id for the library providing data types for RGB consensus. pub const LIB_ID_RGB: &str = - "urn:ubideco:stl:6NAFZspAZ14Y1NynHeQBJVNqep4arKkKx8zchhHrESvr#airport-border-match"; + "urn:ubideco:stl:2YLR1EqJCDGB97JAD22mTwNdg6Gpbzi8PwkGKE6UsDx8#hotel-comet-grand"; fn _rgb_core_stl() -> Result { LibBuilder::new(libname!(LIB_NAME_RGB), tiny_bset! { diff --git a/src/validation/consignment.rs b/src/validation/consignment.rs index 83d53b7f..5cd943dd 100644 --- a/src/validation/consignment.rs +++ b/src/validation/consignment.rs @@ -27,6 +27,12 @@ use std::collections::{BTreeMap, BTreeSet}; use std::rc::Rc; +use aluvm::isa::Instr; +use aluvm::library::LibId; +use aluvm::Program; +use strict_types::{TypeSysId, TypeSystem}; + +use crate::vm::RgbIsa; use crate::{ AnchoredBundle, AssetTag, AssignmentType, BundleId, Genesis, OpId, OpRef, Operation, SecretSeal, SubSchema, WitnessId, XChain, @@ -40,6 +46,7 @@ impl<'consignment, C: ConsignmentApi> CheckedConsignment<'consignment, C> { impl<'consignment, C: ConsignmentApi> ConsignmentApi for CheckedConsignment<'consignment, C> { type Iter<'placeholder> = C::Iter<'placeholder>; + type Program = C::Program; fn schema(&self) -> &SubSchema { self.0.schema() } @@ -62,6 +69,15 @@ impl<'consignment, C: ConsignmentApi> ConsignmentApi for CheckedConsignment<'con } fn op_witness_id(&self, opid: OpId) -> Option { self.0.op_witness_id(opid) } + + fn program<'a>( + &self, + libs: impl IntoIterator, + ) -> Result<&Self::Program, LibId> { + self.0.program(libs) + } + + fn type_system(&self, id: TypeSysId) -> Option<&TypeSystem> { self.0.type_system(id) } } /// Trait defining common data access API for all storage-related RGB structures @@ -75,13 +91,15 @@ pub trait ConsignmentApi { /// Iterator for all bundle ids present in the consignment. type Iter<'a>: Iterator; + type Program: Program>; + /// Returns reference to the schema object used by the consignment. fn schema(&self) -> &SubSchema; /// Asset tags uses in the confidential asset validation. fn asset_tags(&self) -> &BTreeMap; - /// Retrieves reference to a operation (genesis, state transition or state + /// Retrieves reference to an operation (genesis, state transition or state /// extension) matching the provided id, or `None` otherwise fn operation(&self, opid: OpId) -> Option; @@ -107,4 +125,11 @@ pub trait ConsignmentApi { /// Returns witness id for a given operation. fn op_witness_id(&self, opid: OpId) -> Option; + + fn program<'a>( + &self, + libs: impl IntoIterator, + ) -> Result<&Self::Program, LibId>; + + fn type_system(&self, id: TypeSysId) -> Option<&TypeSystem>; } diff --git a/src/validation/logic.rs b/src/validation/logic.rs index 9a3f8d8b..306b9aa5 100644 --- a/src/validation/logic.rs +++ b/src/validation/logic.rs @@ -24,10 +24,10 @@ use std::collections::{BTreeMap, BTreeSet}; use amplify::confinement::{Confined, SmallBlob}; use amplify::Wrapper; -use strict_types::SemId; +use strict_types::{SemId, TypeSystem}; use crate::schema::{AssignmentsSchema, GlobalSchema, ValencySchema}; -use crate::validation::{CheckedConsignment, ConsignmentApi, VirtualMachine}; +use crate::validation::{CheckedConsignment, ConsignmentApi, Failure, VirtualMachine}; use crate::{ validation, AssetTag, AssignmentType, Assignments, AssignmentsRef, ContractId, ExposedSeal, GlobalState, GlobalStateSchema, GlobalValues, GraphSeal, Inputs, OpFullType, OpId, OpRef, @@ -135,10 +135,16 @@ impl Schema { let mut status = validation::Status::new(); + let sys_id = *consignment.schema().types; + let Some(type_sys) = consignment.type_system(sys_id) else { + status.add_failure(Failure::TypesAbsent(sys_id)); + return status; + }; + // Validate type system status += self.validate_type_system(); - status += self.validate_metadata(id, *metadata_schema, op.metadata()); - status += self.validate_global_state(id, op.globals(), global_schema); + status += self.validate_metadata(id, type_sys, *metadata_schema, op.metadata()); + status += self.validate_global_state(id, type_sys, op.globals(), global_schema); let prev_state = if let OpRef::Transition(transition) = op { let prev_state = extract_prev_state(consignment, id, &transition.inputs, &mut status); status += self.validate_prev_state(id, &prev_state, owned_schema); @@ -155,10 +161,10 @@ impl Schema { } status += match op.assignments() { AssignmentsRef::Genesis(assignments) => { - self.validate_owned_state(id, assignments, assign_schema) + self.validate_owned_state(id, type_sys, assignments, assign_schema) } AssignmentsRef::Graph(assignments) => { - self.validate_owned_state(id, assignments, assign_schema) + self.validate_owned_state(id, type_sys, assignments, assign_schema) } }; @@ -196,13 +202,13 @@ impl Schema { fn validate_metadata( &self, opid: OpId, + type_sys: &TypeSystem, sem_id: SemId, metadata: &SmallBlob, ) -> validation::Status { let mut status = validation::Status::new(); - if self - .types + if type_sys .strict_deserialize_type(sem_id, metadata.as_ref()) .is_err() { @@ -215,6 +221,7 @@ impl Schema { fn validate_global_state( &self, opid: OpId, + type_sys: &TypeSystem, global: &GlobalState, global_schema: &GlobalSchema, ) -> validation::Status { @@ -258,8 +265,7 @@ impl Schema { // Validating data types for data in set { - if self - .types + if type_sys .strict_deserialize_type(*sem_id, data.value.as_ref()) .is_err() { @@ -334,6 +340,7 @@ impl Schema { fn validate_owned_state( &self, id: OpId, + type_sys: &TypeSystem, owned_state: &Assignments, assign_schema: &AssignmentsSchema, ) -> validation::Status { @@ -370,18 +377,18 @@ impl Schema { match owned_state.get(state_id) { None => {} - Some(TypedAssigns::Declarative(set)) => set.iter().for_each(|data| { - status += assignment.validate(&self.types, &id, *state_id, data) - }), - Some(TypedAssigns::Fungible(set)) => set.iter().for_each(|data| { - status += assignment.validate(&self.types, &id, *state_id, data) - }), - Some(TypedAssigns::Structured(set)) => set.iter().for_each(|data| { - status += assignment.validate(&self.types, &id, *state_id, data) - }), - Some(TypedAssigns::Attachment(set)) => set.iter().for_each(|data| { - status += assignment.validate(&self.types, &id, *state_id, data) - }), + Some(TypedAssigns::Declarative(set)) => set + .iter() + .for_each(|data| status += assignment.validate(type_sys, &id, *state_id, data)), + Some(TypedAssigns::Fungible(set)) => set + .iter() + .for_each(|data| status += assignment.validate(type_sys, &id, *state_id, data)), + Some(TypedAssigns::Structured(set)) => set + .iter() + .for_each(|data| status += assignment.validate(type_sys, &id, *state_id, data)), + Some(TypedAssigns::Attachment(set)) => set + .iter() + .for_each(|data| status += assignment.validate(type_sys, &id, *state_id, data)), }; } diff --git a/src/validation/schema.rs b/src/validation/schema.rs index 45ff3ee5..0d68a0e8 100644 --- a/src/validation/schema.rs +++ b/src/validation/schema.rs @@ -21,7 +21,7 @@ // limitations under the License. use crate::validation::Status; -use crate::{validation, OpFullType, OpSchema, Schema, StateSchema, SubSchema, TransitionType}; +use crate::{validation, OpFullType, OpSchema, Schema, SubSchema, TransitionType}; impl SubSchema { pub fn verify(&self) -> validation::Status { @@ -52,37 +52,12 @@ impl SubSchema { status.add_failure(validation::Failure::SchemaBlankTransitionRedefined); } - for (type_id, schema) in &self.global_types { - if !self.types.contains_key(&schema.sem_id) { - status.add_failure(validation::Failure::SchemaGlobalSemIdUnknown( - *type_id, - schema.sem_id, - )); - } - } - - for (type_id, schema) in &self.owned_types { - if let StateSchema::Structured(sem_id) = schema { - if !self.types.contains_key(sem_id) { - status.add_failure(validation::Failure::SchemaOwnedSemIdUnknown( - *type_id, *sem_id, - )); - } - } - } - status } fn verify_operation(&self, op_type: OpFullType, schema: &impl OpSchema) -> Status { let mut status = validation::Status::new(); - if !self.types.contains_key(&schema.metadata()) { - status.add_failure(validation::Failure::SchemaOpMetaSemIdUnknown( - op_type, - schema.metadata(), - )); - } if matches!(schema.inputs(), Some(inputs) if inputs.is_empty()) { status.add_failure(validation::Failure::SchemaOpEmptyInputs(op_type)); } diff --git a/src/validation/script.rs b/src/validation/script.rs index 142cdaf2..3359e20e 100644 --- a/src/validation/script.rs +++ b/src/validation/script.rs @@ -20,9 +20,12 @@ // See the License for the specific language governing permissions and // limitations under the License. +use aluvm::isa::Instr; +use aluvm::Program; + +use crate::validation; use crate::validation::OpInfo; -use crate::vm::AluRuntime; -use crate::{validation, Script}; +use crate::vm::{AluRuntime, RgbIsa}; /// Trait for concrete types wrapping virtual machines to be used from inside /// RGB schema validation routines. @@ -32,15 +35,7 @@ pub trait VirtualMachine { fn validate(&self, info: OpInfo) -> Result<(), validation::Failure>; } -impl VirtualMachine for Script { - fn validate(&self, info: OpInfo) -> Result<(), validation::Failure> { - match self { - Script::AluVM(script) => AluRuntime::new(script).validate(info), - } - } -} - -impl<'script> VirtualMachine for AluRuntime<'script> { +impl<'consignment, P: Program>> VirtualMachine for AluRuntime<'consignment, P> { fn validate(&self, info: OpInfo) -> Result<(), validation::Failure> { let id = info.id; self.run_validations(&info) diff --git a/src/validation/status.rs b/src/validation/status.rs index 993ff63b..50a48e65 100644 --- a/src/validation/status.rs +++ b/src/validation/status.rs @@ -24,9 +24,10 @@ use core::iter::FromIterator; use core::ops::AddAssign; use std::fmt::{self, Display, Formatter}; +use aluvm::library::LibId; use bp::Txid; use commit_verify::mpc::InvalidProof; -use strict_types::SemId; +use strict_types::{SemId, TypeSysId}; use crate::contract::Opout; use crate::schema::{self, SchemaId}; @@ -205,16 +206,6 @@ pub enum Failure { /// schema uses reserved type for the blank state transition. SchemaBlankTransitionRedefined, - /// schema global state #{0} uses semantic data type absent in type library - /// ({1}). - SchemaGlobalSemIdUnknown(schema::GlobalStateType, SemId), - /// schema owned state #{0} uses semantic data type absent in type library - /// ({1}). - SchemaOwnedSemIdUnknown(schema::AssignmentType, SemId), - /// schema metadata in {0} uses semantic data type absent in type library - /// ({1}). - SchemaOpMetaSemIdUnknown(OpFullType, SemId), - /// schema for {0} has zero inputs. SchemaOpEmptyInputs(OpFullType), /// schema for {0} references undeclared global state type {1}. @@ -391,10 +382,14 @@ pub enum Failure { expected: schema::FungibleType, found: schema::FungibleType, }, - /// invalid bulletproofs in {0}:{1}: {2} + /// invalid bulletproofs in {0}:{1}: {2}. BulletproofsInvalid(OpId, schema::AssignmentType, String), + /// Strict types system {0} is not found. + TypesAbsent(TypeSysId), + /// AluVM library {0} is not found. + LibraryAbsent(LibId), /// evaluation of AluVM script for operation {0} has failed with the code - /// {1:?} + /// {1:?}. ScriptFailure(OpId, Option), /// Custom error by external services on top of RGB Core. diff --git a/src/validation/validator.rs b/src/validation/validator.rs index 5e07e962..86a038fa 100644 --- a/src/validation/validator.rs +++ b/src/validation/validator.rs @@ -22,6 +22,7 @@ use std::collections::{BTreeMap, BTreeSet, VecDeque}; +use aluvm::library::LibId; use bp::dbc::Anchor; use bp::seals::txout::{CloseMethod, TxoSeal, Witness}; use bp::{dbc, Outpoint}; @@ -73,13 +74,14 @@ pub struct Validator<'consignment, 'resolver, C: ConsignmentApi, R: ResolveWitne impl<'consignment, 'resolver, C: ConsignmentApi, R: ResolveWitness> Validator<'consignment, 'resolver, C, R> { - fn init(consignment: &'consignment C, resolver: &'resolver R) -> Self { + fn init(consignment: &'consignment C, resolver: &'resolver R) -> Result { // We use validation status object to store all detected failures and // warnings let mut status = Status::default(); let vm = match consignment.schema().script { - Script::AluVM(ref lib) => { - Box::new(AluRuntime::new(lib)) as Box + Script::AluVM(ref script) => { + Box::new(AluRuntime::new(consignment.program(&script.libs)?, &script.entry_points)) + as Box } }; let consignment = CheckedConsignment::new(consignment); @@ -123,7 +125,7 @@ impl<'consignment, 'resolver, C: ConsignmentApi, R: ResolveWitness> let mut layers1 = bset! { Layer1::Bitcoin }; layers1.extend(genesis.alt_layers1.iter().map(AltLayer1::layer1)); - Self { + Ok(Self { consignment, status, schema_id, @@ -134,7 +136,7 @@ impl<'consignment, 'resolver, C: ConsignmentApi, R: ResolveWitness> validated_op_seals, vm, resolver, - } + }) } /// Validation procedure takes a schema object, root schema (if any), @@ -147,7 +149,10 @@ impl<'consignment, 'resolver, C: ConsignmentApi, R: ResolveWitness> /// rest of the consignment data. This can help it debugging and /// detecting all problems with the consignment. pub fn validate(consignment: &'consignment C, resolver: &'resolver R, testnet: bool) -> Status { - let mut validator = Validator::init(consignment, resolver); + let mut validator = match Validator::init(consignment, resolver) { + Ok(v) => v, + Err(id) => return Status::with_failure(Failure::LibraryAbsent(id)), + }; // If the network mismatches there is no point in validating the contract since // all witness transactions will be missed. if testnet != validator.consignment.genesis().testnet { diff --git a/src/vm/mod.rs b/src/vm/mod.rs index 8a3a7772..e3745060 100644 --- a/src/vm/mod.rs +++ b/src/vm/mod.rs @@ -38,4 +38,4 @@ pub use isa::RgbIsa; pub use op_contract::ContractOp; pub use op_timechain::TimechainOp; pub use runtime::AluRuntime; -pub use script::{AluLib, AluScript, EntryPoint, LIBS_MAX_TOTAL}; +pub use script::{AluScript, EntryPoint, LIBS_MAX_TOTAL}; diff --git a/src/vm/runtime.rs b/src/vm/runtime.rs index 18ab3697..4071791c 100644 --- a/src/vm/runtime.rs +++ b/src/vm/runtime.rs @@ -24,20 +24,31 @@ use std::collections::{BTreeMap, BTreeSet}; use aluvm::data::{ByteStr, Number}; use aluvm::isa::Instr; +use aluvm::library::LibSite; use aluvm::reg::{Reg32, RegA, RegAFR, RegS}; -use aluvm::Vm; +use aluvm::{Program, Vm}; +use amplify::confinement::SmallOrdMap; use amplify::Wrapper; use crate::validation::OpInfo; -use crate::vm::{AluScript, EntryPoint, RgbIsa}; +use crate::vm::{EntryPoint, RgbIsa}; use crate::OpFullType; -pub struct AluRuntime<'script> { - script: &'script AluScript, +pub struct AluRuntime<'consignment, P: Program>> { + program: &'consignment P, + entry_points: &'consignment SmallOrdMap, } -impl<'script> AluRuntime<'script> { - pub fn new(script: &'script AluScript) -> Self { AluRuntime { script } } +impl<'consignment, P: Program>> AluRuntime<'consignment, P> { + pub fn new( + program: &'consignment P, + entry_points: &'consignment SmallOrdMap, + ) -> Self { + AluRuntime { + program, + entry_points, + } + } pub fn run_validations(&self, info: &OpInfo) -> Result<(), Option> { let mut regs = RegSetup::default(); @@ -97,8 +108,8 @@ impl<'script> AluRuntime<'script> { ); } - match self.script.entry_points.get(&entry) { - Some(site) => match vm.call(self.script, *site, info) { + match self.entry_points.get(&entry) { + Some(site) => match vm.call(self.program, *site, info) { true => Ok(()), false => { let val: Option = vm.registers.get_n(RegA::A8, Reg32::Reg31).into(); diff --git a/src/vm/script.rs b/src/vm/script.rs index 524e38ab..b9a2b5bb 100644 --- a/src/vm/script.rs +++ b/src/vm/script.rs @@ -20,22 +20,17 @@ // See the License for the specific language governing permissions and // limitations under the License. -use std::collections::{btree_map, BTreeMap}; -use std::ops::Deref; -use std::{io, iter}; +use std::collections::BTreeSet; +use std::io; -use aluvm::data::encoding::{Decode, Encode}; -use aluvm::isa::Instr; use aluvm::library::{LibId, LibSite}; -use aluvm::Program; -use amplify::confinement::{Confined, SmallBlob, SmallOrdMap, TinyOrdMap}; +use amplify::confinement::{Confined, SmallOrdMap}; use amplify::Wrapper; use strict_encoding::{ - DecodeError, ReadStruct, StrictDecode, StrictEncode, StrictProduct, StrictStruct, StrictTuple, - StrictType, TypedRead, TypedWrite, WriteStruct, + DecodeError, StrictDecode, StrictEncode, StrictProduct, StrictTuple, StrictType, TypedRead, + TypedWrite, }; -use crate::vm::RgbIsa; use crate::{AssignmentType, ExtensionType, GlobalStateType, TransitionType, LIB_NAME_RGB}; /// Maximum total number of libraries which may be used by a single program; @@ -127,46 +122,9 @@ impl StrictDecode for EntryPoint { } } -#[derive(Wrapper, Clone, Eq, PartialEq, Ord, PartialOrd, Hash, Debug, Default, From)] -#[wrapper(Deref, Display)] -pub struct AluLib(pub aluvm::library::Lib); - -#[cfg(feature = "serde")] -mod _serde { - use aluvm::library::Lib; - use armor::AsciiArmor; - use serde_crate::de::Error; - use serde_crate::{Deserialize, Deserializer, Serialize, Serializer}; - - use super::*; - - impl Serialize for AluLib { - fn serialize(&self, serializer: S) -> Result - where S: Serializer { - if serializer.is_human_readable() { - serializer.serialize_str(&self.0.to_ascii_armored_string()) - } else { - Serialize::serialize(&self.0, serializer) - } - } - } - - impl<'de> Deserialize<'de> for AluLib { - fn deserialize(deserializer: D) -> Result - where D: Deserializer<'de> { - if deserializer.is_human_readable() { - let s: String = Deserialize::deserialize(deserializer)?; - let lib = Lib::from_ascii_armored_str(&s).map_err(D::Error::custom)?; - Ok(lib.into()) - } else { - let lib: Lib = Deserialize::deserialize(deserializer)?; - Ok(lib.into()) - } - } - } -} - #[derive(Clone, Eq, PartialEq, Ord, PartialOrd, Hash, Debug, Default)] +#[derive(StrictType, StrictEncode, StrictDecode)] +#[strict_type(lib = LIB_NAME_RGB)] #[cfg_attr( feature = "serde", derive(Serialize, Deserialize), @@ -174,75 +132,8 @@ mod _serde { )] pub struct AluScript { /// Libraries known to the runtime, identified by their hashes. - pub libs: Confined, 0, LIBS_MAX_TOTAL>, + pub libs: Confined, 0, LIBS_MAX_TOTAL>, /// Set of entry points. pub entry_points: SmallOrdMap, } - -// TODO: Remove this once aluvm::Lib will support strict encoding -impl StrictType for AluScript { - const STRICT_LIB_NAME: &'static str = LIB_NAME_RGB; -} -impl StrictProduct for AluScript {} -impl StrictStruct for AluScript { - const ALL_FIELDS: &'static [&'static str] = &["libs", "entryPoints"]; -} -impl StrictEncode for AluScript { - fn strict_encode(&self, writer: W) -> io::Result { - let libs = self.libs.iter().map(|(id, lib)| { - let lib = SmallBlob::try_from(lib.serialize()).expect( - "the RGB Core library must not be used to create AluVM library size exceeding 2^16", - ); - (*id, lib) - }); - - writer.write_struct::(|w| { - Ok(w.write_field( - fname!("libs"), - &TinyOrdMap::try_from_iter(libs).expect( - "the RGB Core library must not be used to create AluVM scripts with more than \ - 255 libraries", - ), - )? - .write_field(fname!("entryPoints"), &self.entry_points)? - .complete()) - }) - } -} -impl StrictDecode for AluScript { - fn strict_decode(reader: &mut impl TypedRead) -> Result { - reader.read_struct(|r| { - let libs = r - .read_field::>(fname!("libs"))? - .into_iter() - .map(|(id, lib)| { - let lib = aluvm::library::Lib::deserialize(lib) - .map_err(|err| DecodeError::DataIntegrityError(err.to_string()))?; - Ok((id, AluLib(lib))) - }) - .collect::, DecodeError>>()?; - - let entry_points = r.read_field(fname!("entryPoints"))?; - Ok(AluScript { - libs: Confined::try_from(libs).expect("strict decoder guarantees"), - entry_points, - }) - }) - } -} - -impl Program for AluScript { - type Isa = Instr; - type Iter<'a> = iter::Map, fn(&'a AluLib) -> &'a ::Target> where Self: 'a; - - fn lib_count(&self) -> u16 { self.libs.len() as u16 } - - fn libs(&self) -> Self::Iter<'_> { self.libs.values().map(AluLib::deref) } - - fn lib(&self, id: LibId) -> Option<&aluvm::library::Lib> { - self.libs.get(&id).map(AluLib::deref) - } - - fn entrypoint(&self) -> LibSite { panic!("AluScript doesn't have a single entry point") } -} diff --git a/stl/AnchoredBundle.vesper b/stl/AnchoredBundle.vesper index fc5a56f1..a20ec1ee 100644 --- a/stl/AnchoredBundle.vesper +++ b/stl/AnchoredBundle.vesper @@ -15,98 +15,98 @@ _ map len=1..MAX16 aka=InputMap value bytes len=32 aka=OpId AnchoredBundle rec - anchor union -- XChainAnchorSet - bitcoin union wrapped tag=0 -- AnchorSet - tapret rec wrapped tag=0 -- AnchorMerkleProofTapretProof + anchor union XChainAnchorSet + bitcoin union AnchorSet wrapped tag=0 + tapret rec AnchorMerkleProofTapretProof wrapped tag=0 txid bytes len=32 aka=Txid - mpcProof rec -- MerkleProof + mpcProof rec MerkleProof pos is U32 cofactor is U16 path list len=0..32 element bytes len=32 aka=MerkleHash - dbcProof rec -- TapretProof - pathProof rec -- TapretPathProof - some union option wrapped tag=1 -- TapretNodePartner - rightBranch rec wrapped tag=2 -- TapretRightBranch + dbcProof rec TapretProof + pathProof rec TapretPathProof + some union TapretNodePartner option wrapped tag=1 + rightBranch rec TapretRightBranch wrapped tag=2 nonce is U8 - opret rec wrapped tag=1 -- AnchorMerkleProofOpretProof + opret rec AnchorMerkleProofOpretProof wrapped tag=1 txid bytes len=32 aka=Txid - mpcProof rec -- MerkleProof + mpcProof rec MerkleProof pos is U32 cofactor is U16 path list len=0..32 element bytes len=32 aka=MerkleHash dbcProof is Unit aka=OpretProof dual rec tag=2 - tapret rec -- AnchorMerkleProofTapretProof + tapret rec AnchorMerkleProofTapretProof txid bytes len=32 aka=Txid - mpcProof rec -- MerkleProof + mpcProof rec MerkleProof pos is U32 cofactor is U16 path list len=0..32 element bytes len=32 aka=MerkleHash - dbcProof rec -- TapretProof - pathProof rec -- TapretPathProof - some union option wrapped tag=1 -- TapretNodePartner - rightBranch rec wrapped tag=2 -- TapretRightBranch + dbcProof rec TapretProof + pathProof rec TapretPathProof + some union TapretNodePartner option wrapped tag=1 + rightBranch rec TapretRightBranch wrapped tag=2 nonce is U8 - opret rec -- AnchorMerkleProofOpretProof + opret rec AnchorMerkleProofOpretProof txid bytes len=32 aka=Txid - mpcProof rec -- MerkleProof + mpcProof rec MerkleProof pos is U32 cofactor is U16 path list len=0..32 element bytes len=32 aka=MerkleHash dbcProof is Unit aka=OpretProof - liquid union wrapped tag=1 -- AnchorSet - tapret rec wrapped tag=0 -- AnchorMerkleProofTapretProof + liquid union AnchorSet wrapped tag=1 + tapret rec AnchorMerkleProofTapretProof wrapped tag=0 txid bytes len=32 aka=Txid - mpcProof rec -- MerkleProof + mpcProof rec MerkleProof pos is U32 cofactor is U16 path list len=0..32 element bytes len=32 aka=MerkleHash - dbcProof rec -- TapretProof - pathProof rec -- TapretPathProof - some union option wrapped tag=1 -- TapretNodePartner - rightBranch rec wrapped tag=2 -- TapretRightBranch + dbcProof rec TapretProof + pathProof rec TapretPathProof + some union TapretNodePartner option wrapped tag=1 + rightBranch rec TapretRightBranch wrapped tag=2 nonce is U8 - opret rec wrapped tag=1 -- AnchorMerkleProofOpretProof + opret rec AnchorMerkleProofOpretProof wrapped tag=1 txid bytes len=32 aka=Txid - mpcProof rec -- MerkleProof + mpcProof rec MerkleProof pos is U32 cofactor is U16 path list len=0..32 element bytes len=32 aka=MerkleHash dbcProof is Unit aka=OpretProof dual rec tag=2 - tapret rec -- AnchorMerkleProofTapretProof + tapret rec AnchorMerkleProofTapretProof txid bytes len=32 aka=Txid - mpcProof rec -- MerkleProof + mpcProof rec MerkleProof pos is U32 cofactor is U16 path list len=0..32 element bytes len=32 aka=MerkleHash - dbcProof rec -- TapretProof - pathProof rec -- TapretPathProof - some union option wrapped tag=1 -- TapretNodePartner - rightBranch rec wrapped tag=2 -- TapretRightBranch + dbcProof rec TapretProof + pathProof rec TapretPathProof + some union TapretNodePartner option wrapped tag=1 + rightBranch rec TapretRightBranch wrapped tag=2 nonce is U8 - opret rec -- AnchorMerkleProofOpretProof + opret rec AnchorMerkleProofOpretProof txid bytes len=32 aka=Txid - mpcProof rec -- MerkleProof + mpcProof rec MerkleProof pos is U32 cofactor is U16 path list len=0..32 element bytes len=32 aka=MerkleHash dbcProof is Unit aka=OpretProof - bundle rec -- TransitionBundle + bundle rec TransitionBundle inputMap map len=1..MAX16 aka=InputMap key is U32 aka=Vout value bytes len=32 aka=OpId knownTransitions map len=1..MAX16 key bytes len=32 aka=OpId - Transition rec -- mapped to + value rec Transition ffv is U16 aka=Ffv contractId bytes len=32 aka=ContractId transitionType is U16 aka=TransitionType @@ -119,34 +119,34 @@ AnchoredBundle rec salt is U128 inputs set len=0..MAX16 aka=Inputs Input rec - prevOut rec -- Opout + prevOut rec Opout op bytes len=32 aka=OpId ty is U16 aka=AssignmentType no is U16 reserved bytes len=2 aka=ReservedBytes2 assignments map len=0..MAX8 aka=AssignmentsBlindSealTxPtr key is U16 aka=AssignmentType - TypedAssignsBlindSealTxPtr union -- mapped to + value union TypedAssignsBlindSealTxPtr declarative list len=0..MAX16 wrapped tag=0 AssignVoidStateBlindSealTxPtr union confidential rec tag=0 - seal union -- XChainSecretSeal + seal union XChainSecretSeal bitcoin bytes len=32 wrapped aka=SecretSeal tag=0 liquid bytes len=32 wrapped aka=SecretSeal tag=1 state is Unit aka=VoidState lock bytes len=2 aka=ReservedBytes2 confidentialState rec tag=1 - seal union -- XChainBlindSealTxPtr - bitcoin rec wrapped tag=0 -- BlindSealTxPtr - method enum opretFirst=0 tapretFirst=1 -- Method - txid union -- TxPtr + seal union XChainBlindSealTxPtr + bitcoin rec BlindSealTxPtr wrapped tag=0 + method enum Method opretFirst=0 tapretFirst=1 + txid union TxPtr witnessTx is Unit tag=0 txid bytes len=32 wrapped aka=Txid tag=1 vout is U32 aka=Vout blinding is U64 - liquid rec wrapped tag=1 -- BlindSealTxPtr - method enum opretFirst=0 tapretFirst=1 -- Method - txid union -- TxPtr + liquid rec BlindSealTxPtr wrapped tag=1 + method enum Method opretFirst=0 tapretFirst=1 + txid union TxPtr witnessTx is Unit tag=0 txid bytes len=32 wrapped aka=Txid tag=1 vout is U32 aka=Vout @@ -154,23 +154,23 @@ AnchoredBundle rec state is Unit aka=VoidState lock bytes len=2 aka=ReservedBytes2 confidentialSeal rec tag=2 - seal union -- XChainSecretSeal + seal union XChainSecretSeal bitcoin bytes len=32 wrapped aka=SecretSeal tag=0 liquid bytes len=32 wrapped aka=SecretSeal tag=1 state is Unit aka=VoidState lock bytes len=2 aka=ReservedBytes2 revealed rec tag=3 - seal union -- XChainBlindSealTxPtr - bitcoin rec wrapped tag=0 -- BlindSealTxPtr - method enum opretFirst=0 tapretFirst=1 -- Method - txid union -- TxPtr + seal union XChainBlindSealTxPtr + bitcoin rec BlindSealTxPtr wrapped tag=0 + method enum Method opretFirst=0 tapretFirst=1 + txid union TxPtr witnessTx is Unit tag=0 txid bytes len=32 wrapped aka=Txid tag=1 vout is U32 aka=Vout blinding is U64 - liquid rec wrapped tag=1 -- BlindSealTxPtr - method enum opretFirst=0 tapretFirst=1 -- Method - txid union -- TxPtr + liquid rec BlindSealTxPtr wrapped tag=1 + method enum Method opretFirst=0 tapretFirst=1 + txid union TxPtr witnessTx is Unit tag=0 txid bytes len=32 wrapped aka=Txid tag=1 vout is U32 aka=Vout @@ -180,61 +180,61 @@ AnchoredBundle rec fungible list len=0..MAX16 wrapped tag=1 AssignRevealedValueBlindSealTxPtr union confidential rec tag=0 - seal union -- XChainSecretSeal + seal union XChainSecretSeal bitcoin bytes len=32 wrapped aka=SecretSeal tag=0 liquid bytes len=32 wrapped aka=SecretSeal tag=1 - state rec -- ConcealedFungible + state rec ConcealedFungible commitment bytes len=33 aka=PedersenCommitment rangeProof bytes len=33 aka=PedersenCommitment lock bytes len=2 aka=ReservedBytes2 confidentialState rec tag=1 - seal union -- XChainBlindSealTxPtr - bitcoin rec wrapped tag=0 -- BlindSealTxPtr - method enum opretFirst=0 tapretFirst=1 -- Method - txid union -- TxPtr + seal union XChainBlindSealTxPtr + bitcoin rec BlindSealTxPtr wrapped tag=0 + method enum Method opretFirst=0 tapretFirst=1 + txid union TxPtr witnessTx is Unit tag=0 txid bytes len=32 wrapped aka=Txid tag=1 vout is U32 aka=Vout blinding is U64 - liquid rec wrapped tag=1 -- BlindSealTxPtr - method enum opretFirst=0 tapretFirst=1 -- Method - txid union -- TxPtr + liquid rec BlindSealTxPtr wrapped tag=1 + method enum Method opretFirst=0 tapretFirst=1 + txid union TxPtr witnessTx is Unit tag=0 txid bytes len=32 wrapped aka=Txid tag=1 vout is U32 aka=Vout blinding is U64 - state rec -- ConcealedFungible + state rec ConcealedFungible commitment bytes len=33 aka=PedersenCommitment rangeProof bytes len=33 aka=PedersenCommitment lock bytes len=2 aka=ReservedBytes2 confidentialSeal rec tag=2 - seal union -- XChainSecretSeal + seal union XChainSecretSeal bitcoin bytes len=32 wrapped aka=SecretSeal tag=0 liquid bytes len=32 wrapped aka=SecretSeal tag=1 - state rec -- RevealedFungible - value union -- FungibleState + state rec RevealedFungible + value union FungibleState bits64 is U64 wrapped tag=0 blinding bytes len=32 aka=BlindingFactor tag bytes len=32 aka=AssetTag lock bytes len=2 aka=ReservedBytes2 revealed rec tag=3 - seal union -- XChainBlindSealTxPtr - bitcoin rec wrapped tag=0 -- BlindSealTxPtr - method enum opretFirst=0 tapretFirst=1 -- Method - txid union -- TxPtr + seal union XChainBlindSealTxPtr + bitcoin rec BlindSealTxPtr wrapped tag=0 + method enum Method opretFirst=0 tapretFirst=1 + txid union TxPtr witnessTx is Unit tag=0 txid bytes len=32 wrapped aka=Txid tag=1 vout is U32 aka=Vout blinding is U64 - liquid rec wrapped tag=1 -- BlindSealTxPtr - method enum opretFirst=0 tapretFirst=1 -- Method - txid union -- TxPtr + liquid rec BlindSealTxPtr wrapped tag=1 + method enum Method opretFirst=0 tapretFirst=1 + txid union TxPtr witnessTx is Unit tag=0 txid bytes len=32 wrapped aka=Txid tag=1 vout is U32 aka=Vout blinding is U64 - state rec -- RevealedFungible - value union -- FungibleState + state rec RevealedFungible + value union FungibleState bits64 is U64 wrapped tag=0 blinding bytes len=32 aka=BlindingFactor tag bytes len=32 aka=AssetTag @@ -242,23 +242,23 @@ AnchoredBundle rec structured list len=0..MAX16 wrapped tag=2 AssignRevealedDataBlindSealTxPtr union confidential rec tag=0 - seal union -- XChainSecretSeal + seal union XChainSecretSeal bitcoin bytes len=32 wrapped aka=SecretSeal tag=0 liquid bytes len=32 wrapped aka=SecretSeal tag=1 state bytes len=32 aka=ConcealedData lock bytes len=2 aka=ReservedBytes2 confidentialState rec tag=1 - seal union -- XChainBlindSealTxPtr - bitcoin rec wrapped tag=0 -- BlindSealTxPtr - method enum opretFirst=0 tapretFirst=1 -- Method - txid union -- TxPtr + seal union XChainBlindSealTxPtr + bitcoin rec BlindSealTxPtr wrapped tag=0 + method enum Method opretFirst=0 tapretFirst=1 + txid union TxPtr witnessTx is Unit tag=0 txid bytes len=32 wrapped aka=Txid tag=1 vout is U32 aka=Vout blinding is U64 - liquid rec wrapped tag=1 -- BlindSealTxPtr - method enum opretFirst=0 tapretFirst=1 -- Method - txid union -- TxPtr + liquid rec BlindSealTxPtr wrapped tag=1 + method enum Method opretFirst=0 tapretFirst=1 + txid union TxPtr witnessTx is Unit tag=0 txid bytes len=32 wrapped aka=Txid tag=1 vout is U32 aka=Vout @@ -266,53 +266,53 @@ AnchoredBundle rec state bytes len=32 aka=ConcealedData lock bytes len=2 aka=ReservedBytes2 confidentialSeal rec tag=2 - seal union -- XChainSecretSeal + seal union XChainSecretSeal bitcoin bytes len=32 wrapped aka=SecretSeal tag=0 liquid bytes len=32 wrapped aka=SecretSeal tag=1 - state rec -- RevealedData + state rec RevealedData value bytes len=0..MAX16 aka=DataState salt is U128 lock bytes len=2 aka=ReservedBytes2 revealed rec tag=3 - seal union -- XChainBlindSealTxPtr - bitcoin rec wrapped tag=0 -- BlindSealTxPtr - method enum opretFirst=0 tapretFirst=1 -- Method - txid union -- TxPtr + seal union XChainBlindSealTxPtr + bitcoin rec BlindSealTxPtr wrapped tag=0 + method enum Method opretFirst=0 tapretFirst=1 + txid union TxPtr witnessTx is Unit tag=0 txid bytes len=32 wrapped aka=Txid tag=1 vout is U32 aka=Vout blinding is U64 - liquid rec wrapped tag=1 -- BlindSealTxPtr - method enum opretFirst=0 tapretFirst=1 -- Method - txid union -- TxPtr + liquid rec BlindSealTxPtr wrapped tag=1 + method enum Method opretFirst=0 tapretFirst=1 + txid union TxPtr witnessTx is Unit tag=0 txid bytes len=32 wrapped aka=Txid tag=1 vout is U32 aka=Vout blinding is U64 - state rec -- RevealedData + state rec RevealedData value bytes len=0..MAX16 aka=DataState salt is U128 lock bytes len=2 aka=ReservedBytes2 attachment list len=0..MAX16 wrapped tag=3 AssignRevealedAttachBlindSealTxPtr union confidential rec tag=0 - seal union -- XChainSecretSeal + seal union XChainSecretSeal bitcoin bytes len=32 wrapped aka=SecretSeal tag=0 liquid bytes len=32 wrapped aka=SecretSeal tag=1 state bytes len=32 aka=ConcealedAttach lock bytes len=2 aka=ReservedBytes2 confidentialState rec tag=1 - seal union -- XChainBlindSealTxPtr - bitcoin rec wrapped tag=0 -- BlindSealTxPtr - method enum opretFirst=0 tapretFirst=1 -- Method - txid union -- TxPtr + seal union XChainBlindSealTxPtr + bitcoin rec BlindSealTxPtr wrapped tag=0 + method enum Method opretFirst=0 tapretFirst=1 + txid union TxPtr witnessTx is Unit tag=0 txid bytes len=32 wrapped aka=Txid tag=1 vout is U32 aka=Vout blinding is U64 - liquid rec wrapped tag=1 -- BlindSealTxPtr - method enum opretFirst=0 tapretFirst=1 -- Method - txid union -- TxPtr + liquid rec BlindSealTxPtr wrapped tag=1 + method enum Method opretFirst=0 tapretFirst=1 + txid union TxPtr witnessTx is Unit tag=0 txid bytes len=32 wrapped aka=Txid tag=1 vout is U32 aka=Vout @@ -320,33 +320,33 @@ AnchoredBundle rec state bytes len=32 aka=ConcealedAttach lock bytes len=2 aka=ReservedBytes2 confidentialSeal rec tag=2 - seal union -- XChainSecretSeal + seal union XChainSecretSeal bitcoin bytes len=32 wrapped aka=SecretSeal tag=0 liquid bytes len=32 wrapped aka=SecretSeal tag=1 - state rec -- RevealedAttach + state rec RevealedAttach id bytes len=32 aka=AttachId - mediaType enum any=255 -- MediaType + mediaType enum MediaType any=255 salt is U64 lock bytes len=2 aka=ReservedBytes2 revealed rec tag=3 - seal union -- XChainBlindSealTxPtr - bitcoin rec wrapped tag=0 -- BlindSealTxPtr - method enum opretFirst=0 tapretFirst=1 -- Method - txid union -- TxPtr + seal union XChainBlindSealTxPtr + bitcoin rec BlindSealTxPtr wrapped tag=0 + method enum Method opretFirst=0 tapretFirst=1 + txid union TxPtr witnessTx is Unit tag=0 txid bytes len=32 wrapped aka=Txid tag=1 vout is U32 aka=Vout blinding is U64 - liquid rec wrapped tag=1 -- BlindSealTxPtr - method enum opretFirst=0 tapretFirst=1 -- Method - txid union -- TxPtr + liquid rec BlindSealTxPtr wrapped tag=1 + method enum Method opretFirst=0 tapretFirst=1 + txid union TxPtr witnessTx is Unit tag=0 txid bytes len=32 wrapped aka=Txid tag=1 vout is U32 aka=Vout blinding is U64 - state rec -- RevealedAttach + state rec RevealedAttach id bytes len=32 aka=AttachId - mediaType enum any=255 -- MediaType + mediaType enum MediaType any=255 salt is U64 lock bytes len=2 aka=ReservedBytes2 valencies set len=0..MAX8 aka=Valencies diff --git a/stl/RGB@0.1.0.sta b/stl/RGB@0.1.0.sta index c3a9c086..77e15d4c 100644 --- a/stl/RGB@0.1.0.sta +++ b/stl/RGB@0.1.0.sta @@ -1,5 +1,5 @@ -----BEGIN STRICT TYPE LIB----- -Id: urn:ubideco:stl:6NAFZspAZ14Y1NynHeQBJVNqep4arKkKx8zchhHrESvr#airport-border-match +Id: urn:ubideco:stl:2YLR1EqJCDGB97JAD22mTwNdg6Gpbzi8PwkGKE6UsDx8#hotel-comet-grand Name: RGB Dependency: 5teCJyjMWaxbQK8vdga2soWh2U7waERS3ev8KHShJcgv#trumpet-scratch-pelican Dependency: 7qvjR4HCwJKF3mxE5GqsAaADces5JDRwb8ajAse9mkz3#exhibit-karate-ritual @@ -7,7 +7,7 @@ Dependency: BeAiDVK898mzgHrmWgxHtysDhmffgMEoDwBgNuZo7QeZ#connect-verona-secret Dependency: DVtm25LRKU4TjbyZmVxPhvCmctZ6vKkPKqfpU2QsDNUo#exodus-axiom-tommy Dependency: DzTvt9gGhPUKD8Dkkjk9PDBhkJ4gtWxXWQjxnmUYLNrs#voyage-kimono-disco Dependency: HX2UBak8vPsTokug1DGMDvTpzns3xUdwZ7QJdyt4qBA9#speed-atlanta-trilogy -Checksum-SHA256: 4c5c6caa9696714569f28468625105bc9ca18685314e9cec06688db9125ec93b +Checksum-SHA256: e63a203bfec8712a9c8f37439b78fd313159c5c88d98cc94d54ec183192413ed 15!sq21u!F?8_As^WnPDotHzoVsdtr@aSRwVWi2G1l#x)zY9}za%p39RC#b^b7ii Q;}PlOTz3o-rV4|wcnm{tZEb0ER%LQ&W_g|(R>}VzkYu @@ -37,339 +37,327 @@ pc`qB!?qLT4_IWLkGYA9oIT@flkQ>Ol4taR%LShqNggpk^aqssIi!kV?X)a%pCH0{}RlLxv|61vo|x*OcO&#*^E;5@PQ20HKbE5LJk_Il(3r -%HmYiwmua&K>D15sWD3szxrX<=@ -3PGN0jBxBmYd`j`^ks$BCfWpU#p;waB@%y7JSePTR4{0I#2~curZE19Ac4b4eKzFwpifU>+kL+OPUE)K_!kK4Mr@gozMVVRC6x!ZDnLeX=Q9=b5mt)Nn~a_Hy^=Ra -zA{q4mp$>6&gjh6mW-8UF9q5R4M#zVZjhiVQpn(MrmbiWOGwxZAoNjR*)DI9k(f( -pV)&)mz!uTslgsaqN#1;VGFe2#7}?ioJpYH;+t0eX -2w~A!Q+0eaZ{MVycPK^aqWo=1heReWQ^$)wLRjVX&@^5L6#o!4Vg6R|#+oDj`CuG -Oy1xaLOZghduEF{;%=rY;EV*SYUkC2@|hbX)(!!T*!6CpSAZ@ZpjiDMu$$f>uzFMDM-zty -UwM{z*RC!ZnZAoOz*VP7EGy*S=nP^gIFHh@#z{+#L^D9E+qxG=WVR;M(R$+2!VQz -HrPArtZUYsn1#>3pADvHfH$;e<5S!D{TQ^>7ijMb15Rc>i-ZdPG(X<=@3b5mt)Nn -}?52|;XhOksItaxnt|25f0@b!lV)3_)ykOksItaxqh7bOiwb2?5A!f_n>Eea4XlB -y!~!YxB>-laB^jI00jX -8o*Guk{~eHIrl#SNsfzjY4qm@aO)e`?2zD-{ZNB9WYoxJ*r=1Ym781z2z}Xa8AUD -L%7X0(MZ+m5XM3^r;0|aDsVQc^f0tR$paB^jI0-hRH$^RXYWTvL!lBtUM^A29WO- -(K!YxCL);a%FS^o -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 +G50uWWZob97;JWdUeYG$0JzQ^rk +p;_>4e9YQ#rfba;u!+d5tm#=h2RwFCuob +YXO50dNgv5VC@SZy&ck? +Q(lLJ=>rBY$70^roXTE)+&>InpFZ)0l#%eXB&=4kVCWpXCpfvNCW7iR%TNc7%ZG- +!6Ur?3G50uWc;WdH^P1ao +C!YypA{4XEgn0epQk*PX+nL>xOm%pK>soMo}bYXO50dNgv5VC@SZy +&ck_>4e9 +YQ#rfba;u!+d5tm#=h2RwFCuobYXO50sm-Yz<5%CY59k^g5#W{6D&GDo53%OaP0& +iRq*O1aoC!YypA{4XEgn0epQk*PX+nL>xOm%pK>soMo}bYXO50s +m-Yz<5%CY59k^g5#W{6D&GDo53%OaP0&iRq_>4e9YQ#rfba;u!+d5t +m#=h2RwFCuobYXO50ZM3k2aq_tRM}}F91B-Lz;+I~gZl(*Z)0l#%eXB&=4kVCWpXCpfvNCW +7iR%TNc7%ZG-!6Ur?3G50uW_>4e9YQ#rfba; +u!+d5tm#=h2RwFCuobYXO50ZM3k2aq_tRM}}WZob97;J +WdTZPdIyj=yj0m~TwLF91B-Lz;+I~gZl(*Z)0l#%eXB&=4kVCWpXC +pfvNCW7iR%TNc7%ZG-!6Ur?3G50uWWZob97;JWdUtO#`G_01v*0&52ohAEX3$~xYW^+v~7{W03rq(;firJ1#@& +^bY%f9vZekPz%WEGnBZKS8(M7E9_@AwVcyGtCevi|7U8=DY;R+00n4~8JLYKfb7g +WS-+`&{Sr=ykNJ#YFTr_BQwWqKF0Rj+XZ*FF3WMyu2X<=+rWnpXp1_K0hWnpXq+l +pEmf)o&SDDwD>KtpQ8M_qJyiO1VIUJ=H=)@ii_1#@&^bY%f9vZekPz%WEGnBZKS8 +(M7E9_@AwVcyGtCevi|7U8=DY;R+00n4~8JLYKfb7gWS-+`&{Sr=ykNJ#YFTr_BQ +wWqKF0RsqfWp-s@Y-MBs1_K0hWnpXqkGsO?N19ILP2yc~f4%w>xYW^+v~7{W03rq +(;firJ1#@&^bY%f9vZekPz%WEGnBZKS8(M7E9_@AwVcyGtCevi|7U8=DY;R+00n4 +~8JLYKfb7gWS-+`&{Sr=ykNJ#YFTr_BQwWqKF0USYdb7^O8R&Qx!Q*>c;WkPIeZe +&wsVQf@*X=DTh01RVqZf0p@Wo~q7VQc^f0|awrVQc~0idq_i6cBYN^7xEELu$lFU +37Sf$J;ty5yrmOX|)6eb97;JWdSa-rT!PdFhnqz;9Q#YyC6KtpQ8M_qJyiO1VIUJ=H=)@ii_1#@&^bY%f(Q#2q9+*8I)cH*`! -s%9_RI@yuG2CFF!ywLV~14_&UY;R+00n4~8JLYKfb7gWS-+`&{Sr=ykNJ#YFTr_B -QwWqKF0RsqfWp-s@Y-MBs1_K0hWnpXqkGsO?N19ILP2yc~f4%w>xYW^+v~7{W03r -q(;firJ1#@&^bY%f(Q#2q9+*8I)cH*`!s%9_RI@yuG2CFF!ywLV~14_&UY;R+00n -4~8JLYKfb7gWS-+`&{Sr=ykNJ#YFTr_BQwWqKF0U<$ib7^O8Qe}2!VQgh&L3DIsV -`xHbX>MdwWnpYocxhw=1ON -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 -Ehq;JX*6>IA>9E^!~{d-M)UE&DsCMj_000 -0000000|NsC00000024Qq`VPj|j2?4>GwFIPNm9p@0Q=N4quj=`j_>&t6$4Wi|KW -;46+RXp}0000000960|Nj60000U@Z*FvQVPkYjWCZ~L2LJ#-AOH*EJ#X>)XM -a(Mw(=vZ=c&j?2kZ}m2l1S)3m|2(paO!_1u7=ROpoS?f2L}7GcQ*>c;Wd#8M2mk; -;0000000000|Nj60000002}O8xWo~n6Z*B$(17>D+0ot2U6Id2jc94hrndMfLayE -e1ISdA&%p{mB1!VWk)e2*8Zgg^CV{}Pm0iOsgNjk^^qPoT1+zTRnAg`3vXv9d*8d -@RXy~6c6G7V*TbY*UHX>V>+d2nR`WOW`wsTH9-LlJ`2|Ay5Z(?oEikl{+~pis;@Q -*TJ#2yJC_VPs)+VFBT3XYt3uXDDBzV~Y{PMVQdbhM>^D^r|Pn&u&Un5eElnY;R&= -Y;ytH_t7`^Pr5ftu@@z<*O39}j`u& -O7io3b$Is?RA$O$T>rbZ%vHa{-h0V0dsu5sjwLjgQcrOsaG1F{QvR+LMR3-^ZN{x -OxV2V{&P5bODq1V0dsu5sjwLjgQcrOsaG1F{QvR+LMR3-^ZN{xOxvocywiMb7^mG -Q)6glZD9rl2yJC_VPs)+VFF00Z0ySw6Z7G^(Vdq=xngp5lioJpYH;+t0eX2w~A!Q+0eaZ{MVycPK^g=Y;R&=Y;yn#0oCr34oQf!Y4K -`P(FaQVwIle)QgI&pHa%8Z1>xis%Ku=2wF+7z(Wqt=tdZk -`V^s(Ana000000093000000000MaWn^V#ZF2w#0Y>fS!w4MxxaL=+DqP^k2!wz9A -HH68xp8!<%Jqp^&Hw-a000000RI300000001IJrb7^O8ZDnqBa{vkfhyLPaScq)s -9KMExvw34D6J>+NwrBxfixd_%u|$Wt0XD%jq57bK6Q|uUfIMEX^1}Vv6tLB!)|10 --o)0prc>n+a000000RI3000000010+sY-Mg^X=QT&2?0j!=EDda{kY~=q$*tC#t4 -Le{2#tvcDZqMsmk?$e)17>D+0ot2U6Id2jc94hrndMfLayEe1 -ISdA&%p{mB1!VWk)d+KAXk~3-Nn`<(Qq$W5tE;F{pQrXd&=l*`O?@#x{Qdy?T_k! -`1dtE~W^7?+a{-h0V0dsu5sjwLjgQcrOsaG1F{QvR+LMR3-^ZN{xOxe6X>Db5bYX -39002k_bY*jNZe?@=!34}kUMys8WKDQu6}!mpvbyE1r(Y~+*plEP2LQK-VTK~nd# ->^D -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 -qB00jX7LNH;4h{)8d6ed8&{mBV=@3I -k?lb^+R(Q4?4eR(6nw`@6CZd7@2WdSr&53UoI -8eY9A{1GERg--GiI0S#x1is&)M%fmnGH3{GWprU=VRT^u;b~{_$H8YPU!!A-5yM5 -8(94FP(7*JmC%?~bN>dRB2WM<=Vqt7^0owP`H}~XwW|nkt{7-&IWbpPi(wX$0pXU -qF<#0Z84+d#&aCLNZ0jZ*TSChz_$|Xx}eRkFNAr%^eLl(1e@}~9=0-ijXfD2)Bb7 -^O8ZDnqBa{-_NKl5dJcM298OG8$&jbSVxRABjfu-DqG-s#fI$h8S}VQgh?V`*h`0 -o{dW0B>Pr5ftu@@z<*O39}j`u&O7io3b$Is?RA$O$T>rbZ%vHa{-h0V0dsu5sjwL -jgQcrOsaG1F{QvR+LMR3-^ZN{xOxV2V{&P5bODq1V0dsu5sjwLjgQcrOsaG1F{Qv -R+LMR3-^ZN{xOxy&a$#@6CZbEf#WNc*y0tjhtaCLM|VQ>KznP+6nwW~k}RP! -NmuV?G015$>$mV(;bz)!CmQ -_M(k?Vd!kfCo{nDM?)_qK{868FUcCeJU3<#S4?QFnz{&xo9|Yu2bKb!28ehQ8E-B -WCD{0RR9100000|Nj60000005L9wuZgXjLX>V>*V`ybVZDn*}WMOn+0!XQB -?8_As^WnPDotHzoVsdtr@aSRwVWi2G1l#x)ziR}e6rQG)02XJT?*g=|B=zREie$* -y(7k2+*P~cYjR$9JZ(?C=a{vkf)$WoGNrn+a000000RI300000000 -wDpaCLNZ015$z{^Dg=h-~N_zJ`Red1EINWrM}GXaQb}6c#qIM2EQnHo-KZ`k;Xmr -`<4sJYKN!!u{G5u+^j1lf!PF4>GEG0000000000{{R30000003t@9}X=iS2Wo~qH -015$z{^Dg=h-~N_zJ`Red1EINWrM}GXaQb}6c#qIM2EQnHo-KZ`k;Xmr`<4sJYKN -!!u{G5u+^j1lf!PF4>GEG0000000000{{R300000033g#@Wo~0>Wpe-t0Y>fS!w4 -MxxaL=+DqP^k2!wz9AHH68xp8!<%Jqp^&Hw-a000000RI300000001i}gVQzD2bZ -KvHRC#b^1pxp60uEGpaAiYpZEb0EZDnqB1OosEXJu|>b7^w`1pxtHPfp^mpD;#5t -2l9$ndf%REf13|ADS+2w>k^=#h!x!3UqQ|ZgXjLX>V=-1p)z|2rNlD$O59e#ogQs -B77jPl+h5j^*S;EG*S<)6P6lYy(#<=BR_>s@(?%#f7ArN-=Rj?7Ns( -10tsb!bY*UHX>V=-1p)z|2rNlD$O59e#ogQsB77jPl+h5j^*S;EWOW -`wsTH9-LlJ`2|Ay5Z(?oEikl{+~pis;@Q*TJ#8dQ03Wn@8fb7^O8b3$xsZe&wsVQ -f@*P;_zx1ON+UWn*k%a$$67c4Yts0RRXAIVbbqN^4g)WDG0#SSGl-+Q@e<+6H_!d ->A}?>eLb#i5700jX -62myf}=a&wUzgq*nHzp%O_gxL;Ro0E2(00 -00000000|Nj60000008B}?2Wn@8fb7^O8b3$xsZe&wsVQf@*X=DTh01ISgV{Bn^V -RUJBWdH>M00;q-z?57PmRE;x*JyQZ??N1%-?X%h&UrM00;s9(nscpRQseH2M_=0H1c!=>Px#000000RR60000000RIYMbaY{3Xl-R~bN~eb00 -;reGP>7z&ZQf?Gib;@a|Hna2?0j!=EDd -a{kY~=q$*tC#t4Le{2#tvcDZqMsmk?c;Wd#8M000eFX>@L7b8|s%V`y)31_BCqX>@L7b8}B}WC -6k+?A!p;zT)eT0-JI=`>_zfHkawo185nP6{Z9SY03$AX>@L7b8|^#0f}o^CC$c=U -szhlV5m?Ru@{iVU*wrVdeH+Q@FPbX@d{UIbZ%vHb5C+)1OfmDZ*D_qVQFpv1pxsL -zqsuE4_HHJVQFqbZewU~a#Lk=1OfmDVrg -_^Z)t7-1pxut;9)08u!CeLKyU8YAgL0^vpn5O4pIusYuPIV!b?p725f0@b!lV(1p -xut;9)08u!CeLKyU8YAgL0^vpn5O4pIusYuPIV!b?pQSVL%GX>LMnX>MdwWnpYoc -u;h51OfmDVrg_^Z)t7-1pxw{8dk~w9gt+Ers0yQiuv;nUcXIEE-O$7b}poCzU2-^ -C#Wt^wA&hNfbvI8l{tqo-}{|djZ8YAkJtUQVz<=+25f0@b!lV(1pxw{8dk~w9gt+ -Ers0yQiuv;nUcXIEE-O$7b}poCzU2-^C#Wt^wA&hNfbvI8l{tqo-}{|djZ8YAkJt -UQVz<>3SVL%GX>LMnX>MdwWnpYocxhw=0sseMX>?<6X>I@o0Ro;HR>}VzkYuK&;g -YF}`ST85zfDapD^Lh_E~IU~}VzkYuK&;gYF}`ST85zfDapD^Lh_E~IU~$vY*ct@WCQ{ -L2V!Y-V{d7000jX8o*Guk{~eHIrl#SNsfzjY4qm@aO)e`?2zD-{ZNB9W1JyK;>qK ->mX$cszrKCL=@F5H{a;)B(Tlt4rog*WC0S0Voadl~A00jX8o*Guk{~eHIrl#SNsf -zjY4qm@aO)e`?2zD-{ZNB9W1JyK;>qK>mX$cszrKCL=@F5H{a;)B(Tlt4rog*WC5 -LiQKVQFqtWn*$>bW>$vYy<)T2V!Y-V{d7000jX8o*Guk{~eHIrl#SNsfzjY4qm@a -O)e`?2zD-{ZNB9WXc_Cg)w39@m$R6qOEzWQ+NTC@=;?<6X>I@o0Rr`G6JjIwIj -2eqliWu}$@z+_xPw?-wb>Rw7=FYk8VaL=Li5Yl(a@n1+Ku60FILp}Zw|!7cE!MGS -xid=WmW+OY-w?IX=DHe0Rr`G6JjIwIj2eqliWu}$@z+_xPw?-wb>Rw7=FYk8VaL= -Li5Yl(a@n1+Ku60FILp}Zw|!7cE!MGSxid=WmW +lpEmf)o&SDDwD>KtpQ8M_qJyiO1VIUJ=H=)@ii_1#@&^bY%f9vZekPz%WEGnBZKS +8(M7E9_@AwVcyGtCevi|7U8=DY;R+00n4~8JLYKfb7gWS-+`&{Sr=ykNJ#YFTr_B +QwWqKF0RsqfWp-s@Y-MBs1_K0hWnpXqf(#9>YyC6+NwrBxfixd_%u|$Wt0kTqpWa!AqL5CyGhTo +B&v$lUF3cJOWQ(rxP5=M^000000RI300000002o1Yb7^O8ZDnqBb3$xsZe +&wsVQf@*X=DWf015$z{^Dg=h-~N_zJ`Red1EINWrM}GXaQb}6c#qIM2EQnrZvzfl +YVT_Zm!qAeYC3gKu#utw+iBX$0nNtaPW050000000000{{R30000002tjmoVPj}X +WCZ~L2LJ#-AOH?RVRL0eZ*6U9bZupBbOr_mW^7?+a{-h0V0dsu5sjwLjgQcrOsaG +1F{QvR+LMR3-^ZN{xOxb4V`yb~Wpi|4ZEyepNC$Lfb98QHbOONy%tl@;WNu_lcw-g2$nLVb<*lb*EN +Ix0;35YAw}@eeBGG%U@MZ$v=XJ?|;InIPy66cFfOYp#JM2r7_Du?5Y;;Uvd1Z2QF +#=_-!77y98=A@kp`8#)*>u>l8sib^<6L(P5~d1+uy}2+t;O}HAO^^zqT0%g+nC0; +-MWK<)&Ge4`aq}l(*_1u>l8sib^<6L(P5~d1 ++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 +$N>Em2?3=*aagRpowoM?Jba +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 +t7`^M?JbaMfzqIy@8$eYR~OKp92 +)%PJ48iGR>vvBgJ_74J{JehzCVRLh7XKrm}Zgg`2paMVhWqNlC78^@LRWpe@Dg=PS6VPp{$?vC--s`v@B8YHl)C#jpVFzB +k!DMw8QcWHEPWpi@@llNeFa6}P}rq7L!(40)FbL%msz%JU8hqvFyoea2o26JO_X> +fD_llNeFa6}P}rq7L!(40)FbL%msz%JU8hqvFyoea2o5L9wuZgXjLX>V>qb#7#AW +d;HWX>M?JbWLG!0Tr2NWXrXyKnGOwA#t$mH2bG7pQ)aE=^FQF!@KkQh!AUTZ+C7~ +a$#@6CZgT(%0hP$+dLDIRU(}XWLTZugenOC;Z(5k~zEJnJiX;;E#Q`SIFNo! +HN~lqHg;>vsoU&`ys3~=1W<7?!)Pf^s=!pRU000000096000000000nFa$#@ +6CZc}4uWo=;w1qf|rbYWy+bYTKWsch`a6%+H}y3w7NL%Cvdc9ihwVg6yH$(01#_! +hrw1fvw5rj-B|XP@r^w5ufb=C_Ju$l1`nW&GEpSWb-xXKZg`VQg~%3IWybk`76Tv +uW{aQ_%-X`?VwZ$5L?~`!+pRSq0(b70UrO!8D=zpn(&o-7tVWUa<1Q{n`|;)uYyv +!)~4rGOBq100000000300000000006X>M?JbaMa-0f+wLWmt%8=p4R=gtK{LClh6 +Z#kObxUW*hKHnBv9xdAr8G@<&SffJ|QFn~N>u=2wF+7z(Wqt=tdZk`V^s(Ana000 +000093000000000YNb8~5DZf#|5baMa-0f+wLWmt%8=p4R=gtK{LClh6Z#kObxUW +*hKHnBv9xdAr8G@<&SffJ|QFn~N>u=2wF+7z(Wqt=tdZk`V^s(Ana00000009300 +0000000SgVQgh?V`*h`00{v`?dHP>9R0ZFSEMRj;Km4qfBYZ5UUs>0bg9bqiCNA7 +0000000030000000000ERB~Z%b7^#GZ*Ek1aAgGn0006GRC#b^LvL+uX>@I6Zgd0 +#00(DfZe??6a{vVa0bfr};;)}DMntPPag~|pcFiphlPw>bE^oIw3-`sIg8>S3a$# +@6CZU6-W0iOsgNjk^^qPoT1+zTRnAg`3vXv9d*8d@RXy~6c6G66JF53UoI8e +Y9A{1GERg--GiI0S#x1is&)M%fmnGH3z`Wq5RDZgXjGZU6-W0iOsgNjk^^qPoT1+ +zTRnAg`3vXv9d*8d@RXy~6c6G67_D9zv-Vp*%wog4O?q)g04AaHEjnO6;Ie%sNwV +NZuM$d2nT9L349yXKr&sY-w&}Q)OXnRCrKyas&hb3uI+uY+-U?bZK^F00jX62mv` +K^WREqS2tt~EBII@xVqZNcP`ond^UU-JbUWd$~FK100000009600000000039W_5 +07X<}?;00jX62m#u~=^e=I{=p`1zMng|0+NmwUpUW`Z@54^_oW>WVpRYD0000000 +960000000006Cb98cbV{~&L00;qEk8=qnO(R<<%JIK<1B78x*e6}1oxDzJ3ElvocGBqp0000000030 +{{R30000303So3~VPj}*Wo~o;1pxpE0m(AD*LcpQ8@w}U$Ufy>Q8MyKC)}>Xt~#} +1xwH`_Bme*a000000RR600000000mTeaAk7@0RaYcbaH89bN~eb0!XQB?8_As^Wn +PDotHzoVsdtr@aSRwVWi2G1l#x)zb*rpecOmKc~&SlT?hBfE3SSg1O~Ul@EA1yHAPayt955WqH<>CXdb8I%> +K1P5u#33q99Ze??GNn`>o?Kom?q=ULN^A!11b?H{wM>P}NCm0qyW4 +7Umu>lBgW@bZZVQFpv000VCX>@L7b8}E{a|QwiXk}?oOFWB>&L0oveUCrPk_WG6sx?${uy634SV-AWEp3d?K +RD+IzzO%zx|Xklq?LTqVnWK(5fY*ctqbaDg&00&}ebYpL6ZU6-V0-hRH$^RXYWTv +L!lBtUM^A29WO-(KN`F8f<{_M@^MEhcVy#omh=bI-rl&{j +_4Y)d2=oOFWB>&L0-hRH$^RXYWTvL!lBtUM^A29WO-(KN`F8f<{_M@^MEhcVy#omh=bI-rl&{j_4Y)e~4lXklq?LTqVnWK(5fY*ct@WCQ{L +2V!Y-V{d7000jX8o*Guk{~eHIrl#SNsfzjY4qm@aO)e`?2zD-{ZNB9Wu*Pw&hI`x +NV4B0;>oUbhHyi-Y#=22)QEgSwgoUbhHyi-Y#=22)QEgSwg?<6X>I@o0Ro;HR>}VzkYuK&;gYF}` +ST85zfDapD^Lh_E~IU~T7_z0LJs9vI3^Q`9-kMwahgh8>BYgn| +Y-w?IX=DHe0Ro;HR>}VzkYuK&;gYF}`ST85zfDapD^Lh_E~IU~ +T7_z0LJs9vI3^Q`9-kMwahgh8>BYhB9Lug@XZc}Ara%FT=WnpXt0sseMX>?<6X>I +@o0Ro;HR>}VzkYuK&;gYF}`ST85zfDapD^Lh_E~IU~%7&o7^|1Fn59cLW! +>7R25;!;B}VzkYuK&;gYF}`ST85zfDapD +^Lh_E~IU~%7&o7^|1Fn59cLW!>7R25;!;B#Kd;Rz-U=aO9W+B0S0Voadl~A00jX8^=uPjBlbC`N(q +zPM@Gr{imSMTSY5T*7C#t%#3&jHqk=;7%h%D+p%U7S;b1RT)c9`>#Kd;Rz-U=aO9 +W+B -----END STRICT TYPE LIB----- diff --git a/stl/RGB@0.1.0.stl b/stl/RGB@0.1.0.stl index 56c2b8b8431d4f3659351bacd08441804875a9e8..3ee18f4cab17de28794508d9a8544fb92c621bd3 100644 GIT binary patch delta 427 zcmbO?fpJbZP}QuVu8Vgcws{dN^1}V} YQ}!lcU~fKbWy7IBD4aLTJO5_^090SI4gdfE delta 1093 zcmbQ!%{XrYE~n^t7z2Jdz?mi?~R?psWqQ>XTPxypnm zYxx{=3NjM?N^^bkQxc0axPwcIGLuU}DhpDJ`5B~ls5Pz7NngoQc)CJ+cWhXkg6Va^ zdo{bnlzE;cTil<>9hO*>nV47NmzbNXl6-4_jn~Il6BXX?Z#ZcPqkl%X#UAfJSYHiG_sELun7{v zvfDLh&A-v?F@1K1&dP&wu8UUYK2GG`^5BSn0~gqIu;G(8C@Ivlf|<2tMxI~!cdrax zty1(UKePYn15T-?mm(s!7X@5XPdWaA)iWhEucYy^j>`4JFN|&;PWpS|OaFwq_U#&b zjQo6`_$++bIa`vAEjY6(GcSFT(5_ESp0CTd{eLI)a^ITkntO^n#dpke7v0>?JUvLK zp2sz>G#45;^~Fmz$aY@3sm%3|U1XQdufW;Qx%pBJR%wF>!F~gU$iYj8rsp11JfN(Q zyUC+>p_I$X+SUX6qUOim*XqBy)z_Lmq!R4!Gojb7vPGFN>G#jf2+Gj+e_emzRPlk& z+D=avf8B63v66=!>dp^-I#c$=&CzK&cKFUBt**0{Cr=~@MW%AC3_h_ospskhVBBTq z=Rp-0Pu5_|XXKjvk4 ^ ..0xff [Byte]}, entryPoints {[Byte ^ 3] -> AluVM.LibSite#mission-papa-mercy} +@mnemonic(zebra-decide-sherman) +data AluScript : libs {AluVM.LibId#rebel-factor-rodeo ^ ..0x400}, entryPoints {[Byte ^ 3] -> AluVM.LibSite#mission-papa-mercy} @mnemonic(aurora-blast-brown) data AnchorSet : tapret#1 BPCore.AnchorMerkleProofTapretProof#forward-chemist-panda @@ -493,8 +479,8 @@ data TypedAssignsBlindSealTxid : declarative [AssignVoidStateBlindSealTxid] | structured [AssignRevealedDataBlindSealTxid] | attachment#255 [AssignRevealedAttachBlindSealTxid] -@mnemonic(titanic-front-courage) -data Types : strict#1 StrictTypes.TypeSystem#panel-data-lazarus +@mnemonic(vibrate-size-mozart) +data Types : strict#1 StrictTypes.TypeSysId#clara-tonight-office @mnemonic(andy-mango-brother) data Valencies : {ValencyType ^ ..0xff} diff --git a/stl/Schema.vesper b/stl/Schema.vesper index 38fd7a64..a583786c 100644 --- a/stl/Schema.vesper +++ b/stl/Schema.vesper @@ -35,119 +35,80 @@ Schema rec some is Unit option wrapped tag=1 globalTypes map len=0..MAX8 key is U16 aka=GlobalStateType - GlobalStateSchema rec -- mapped to + value rec GlobalStateSchema semId bytes len=32 aka=SemId maxItems is U16 ownedTypes map len=0..MAX8 key is U16 aka=AssignmentType - StateSchema union -- mapped to + value union StateSchema declarative is Unit tag=0 - fungible enum wrapped unsigned64Bit=8 tag=1 -- FungibleType + fungible enum FungibleType wrapped unsigned64Bit=8 tag=1 structured bytes len=32 wrapped aka=SemId tag=2 - attachment enum wrapped any=255 tag=3 -- MediaType + attachment enum MediaType wrapped any=255 tag=3 valencyTypes set len=0..MAX8 element is U16 aka=ValencyType - genesis rec -- GenesisSchema + genesis rec GenesisSchema metadata bytes len=32 aka=SemId globals map len=0..MAX8 key is U16 aka=GlobalStateType - Occurrences rec -- mapped to + value rec Occurrences min is U16 max is U16 assignments map len=0..MAX8 key is U16 aka=AssignmentType - Occurrences rec -- mapped to + value rec Occurrences min is U16 max is U16 valencies set len=0..MAX8 element is U16 aka=ValencyType extensions map len=0..MAX8 key is U16 aka=ExtensionType - ExtensionSchema rec -- mapped to + value rec ExtensionSchema metadata bytes len=32 aka=SemId globals map len=0..MAX8 key is U16 aka=GlobalStateType - Occurrences rec -- mapped to + value rec Occurrences min is U16 max is U16 redeems set len=0..MAX8 element is U16 aka=ValencyType assignments map len=0..MAX8 key is U16 aka=AssignmentType - Occurrences rec -- mapped to + value rec Occurrences min is U16 max is U16 valencies set len=0..MAX8 element is U16 aka=ValencyType transitions map len=0..MAX8 key is U16 aka=TransitionType - TransitionSchema rec -- mapped to + value rec TransitionSchema metadata bytes len=32 aka=SemId globals map len=0..MAX8 key is U16 aka=GlobalStateType - Occurrences rec -- mapped to + value rec Occurrences min is U16 max is U16 inputs map len=0..MAX8 key is U16 aka=AssignmentType - Occurrences rec -- mapped to + value rec Occurrences min is U16 max is U16 assignments map len=0..MAX8 key is U16 aka=AssignmentType - Occurrences rec -- mapped to + value rec Occurrences min is U16 max is U16 valencies set len=0..MAX8 element is U16 aka=ValencyType - types union -- Types - strict map len=0..MAX24 wrapped aka=TypeSystem tag=0 - key bytes len=32 aka=SemId - TySemId union -- mapped to - primitive is U8 wrapped aka=Primitive tag=0 - unicode is Unit tag=1 - enum set len=1..MAX8 wrapped aka=EnumVariants tag=2 - Variant rec - name ascii len=1..100 aka=VariantName aka=Ident charset=AlphaNumLodash - tag is U8 - union map len=0..MAX8 wrapped aka=UnionVariantsSemId tag=3 - key is U8 - VariantInfoSemId rec -- mapped to - name ascii len=1..100 aka=VariantName aka=Ident charset=AlphaNumLodash - ty bytes len=32 aka=SemId - tuple list len=1..MAX8 wrapped aka=UnnamedFieldsSemId tag=4 - element bytes len=32 aka=SemId - struct list len=1..MAX8 wrapped aka=NamedFieldsSemId tag=5 - FieldSemId rec - name ascii len=1..100 aka=FieldName aka=Ident charset=AlphaNumLodash - ty bytes len=32 aka=SemId - array tuple tag=6 - _ bytes len=32 aka=SemId - _ is U16 - list tuple tag=7 - _ bytes len=32 aka=SemId - Sizing rec - min is U64 - max is U64 - set tuple tag=8 - _ bytes len=32 aka=SemId - Sizing rec - min is U64 - max is U64 - map tuple tag=9 - _ bytes len=32 aka=SemId - _ bytes len=32 aka=SemId - Sizing rec - min is U64 - max is U64 - script union -- Script - aluVm rec wrapped tag=0 -- AluScript - libs map len=0..MAX8 - key bytes len=32 aka=LibId - value bytes len=0..MAX16 + types union Types + strict bytes len=32 wrapped aka=TypeSysId tag=0 + script union Script + aluVm rec AluScript wrapped tag=0 + libs set len=0..1024 + element bytes len=32 aka=LibId entryPoints map len=0..MAX16 key bytes len=3 - LibSite rec -- mapped to + value rec LibSite lib bytes len=32 aka=LibId pos is U16 diff --git a/stl/Transition.vesper b/stl/Transition.vesper index d21c6c89..43499b91 100644 --- a/stl/Transition.vesper +++ b/stl/Transition.vesper @@ -12,12 +12,12 @@ OpId commitment hasher=SHA256 tagged=urn:lnp-bp:rgb:operation#2024-02-03 OpCommitment rec ffv is U16 aka=Ffv - opType union -- TypeCommitment - genesis rec wrapped tag=0 -- BaseCommitment + opType union TypeCommitment + genesis rec BaseCommitment wrapped tag=0 flags bytes len=1 aka=ReservedBytes1 schemaId bytes len=32 aka=SchemaId timestamp is I64 - testnet enum false=0 true=1 -- Bool + testnet enum Bool false=0 true=1 altLayers1 bytes len=32 aka=StrictHash issuer bytes len=32 aka=StrictHash transition tuple tag=1 @@ -48,34 +48,34 @@ Transition rec salt is U128 inputs set len=0..MAX16 aka=Inputs Input rec - prevOut rec -- Opout + prevOut rec Opout op bytes len=32 aka=OpId ty is U16 aka=AssignmentType no is U16 reserved bytes len=2 aka=ReservedBytes2 assignments map len=0..MAX8 aka=AssignmentsBlindSealTxPtr key is U16 aka=AssignmentType - TypedAssignsBlindSealTxPtr union -- mapped to + value union TypedAssignsBlindSealTxPtr declarative list len=0..MAX16 wrapped tag=0 AssignVoidStateBlindSealTxPtr union confidential rec tag=0 - seal union -- XChainSecretSeal + seal union XChainSecretSeal bitcoin bytes len=32 wrapped aka=SecretSeal tag=0 liquid bytes len=32 wrapped aka=SecretSeal tag=1 state is Unit aka=VoidState lock bytes len=2 aka=ReservedBytes2 confidentialState rec tag=1 - seal union -- XChainBlindSealTxPtr - bitcoin rec wrapped tag=0 -- BlindSealTxPtr - method enum opretFirst=0 tapretFirst=1 -- Method - txid union -- TxPtr + seal union XChainBlindSealTxPtr + bitcoin rec BlindSealTxPtr wrapped tag=0 + method enum Method opretFirst=0 tapretFirst=1 + txid union TxPtr witnessTx is Unit tag=0 txid bytes len=32 wrapped aka=Txid tag=1 vout is U32 aka=Vout blinding is U64 - liquid rec wrapped tag=1 -- BlindSealTxPtr - method enum opretFirst=0 tapretFirst=1 -- Method - txid union -- TxPtr + liquid rec BlindSealTxPtr wrapped tag=1 + method enum Method opretFirst=0 tapretFirst=1 + txid union TxPtr witnessTx is Unit tag=0 txid bytes len=32 wrapped aka=Txid tag=1 vout is U32 aka=Vout @@ -83,23 +83,23 @@ Transition rec state is Unit aka=VoidState lock bytes len=2 aka=ReservedBytes2 confidentialSeal rec tag=2 - seal union -- XChainSecretSeal + seal union XChainSecretSeal bitcoin bytes len=32 wrapped aka=SecretSeal tag=0 liquid bytes len=32 wrapped aka=SecretSeal tag=1 state is Unit aka=VoidState lock bytes len=2 aka=ReservedBytes2 revealed rec tag=3 - seal union -- XChainBlindSealTxPtr - bitcoin rec wrapped tag=0 -- BlindSealTxPtr - method enum opretFirst=0 tapretFirst=1 -- Method - txid union -- TxPtr + seal union XChainBlindSealTxPtr + bitcoin rec BlindSealTxPtr wrapped tag=0 + method enum Method opretFirst=0 tapretFirst=1 + txid union TxPtr witnessTx is Unit tag=0 txid bytes len=32 wrapped aka=Txid tag=1 vout is U32 aka=Vout blinding is U64 - liquid rec wrapped tag=1 -- BlindSealTxPtr - method enum opretFirst=0 tapretFirst=1 -- Method - txid union -- TxPtr + liquid rec BlindSealTxPtr wrapped tag=1 + method enum Method opretFirst=0 tapretFirst=1 + txid union TxPtr witnessTx is Unit tag=0 txid bytes len=32 wrapped aka=Txid tag=1 vout is U32 aka=Vout @@ -109,61 +109,61 @@ Transition rec fungible list len=0..MAX16 wrapped tag=1 AssignRevealedValueBlindSealTxPtr union confidential rec tag=0 - seal union -- XChainSecretSeal + seal union XChainSecretSeal bitcoin bytes len=32 wrapped aka=SecretSeal tag=0 liquid bytes len=32 wrapped aka=SecretSeal tag=1 - state rec -- ConcealedFungible + state rec ConcealedFungible commitment bytes len=33 aka=PedersenCommitment rangeProof bytes len=33 aka=PedersenCommitment lock bytes len=2 aka=ReservedBytes2 confidentialState rec tag=1 - seal union -- XChainBlindSealTxPtr - bitcoin rec wrapped tag=0 -- BlindSealTxPtr - method enum opretFirst=0 tapretFirst=1 -- Method - txid union -- TxPtr + seal union XChainBlindSealTxPtr + bitcoin rec BlindSealTxPtr wrapped tag=0 + method enum Method opretFirst=0 tapretFirst=1 + txid union TxPtr witnessTx is Unit tag=0 txid bytes len=32 wrapped aka=Txid tag=1 vout is U32 aka=Vout blinding is U64 - liquid rec wrapped tag=1 -- BlindSealTxPtr - method enum opretFirst=0 tapretFirst=1 -- Method - txid union -- TxPtr + liquid rec BlindSealTxPtr wrapped tag=1 + method enum Method opretFirst=0 tapretFirst=1 + txid union TxPtr witnessTx is Unit tag=0 txid bytes len=32 wrapped aka=Txid tag=1 vout is U32 aka=Vout blinding is U64 - state rec -- ConcealedFungible + state rec ConcealedFungible commitment bytes len=33 aka=PedersenCommitment rangeProof bytes len=33 aka=PedersenCommitment lock bytes len=2 aka=ReservedBytes2 confidentialSeal rec tag=2 - seal union -- XChainSecretSeal + seal union XChainSecretSeal bitcoin bytes len=32 wrapped aka=SecretSeal tag=0 liquid bytes len=32 wrapped aka=SecretSeal tag=1 - state rec -- RevealedFungible - value union -- FungibleState + state rec RevealedFungible + value union FungibleState bits64 is U64 wrapped tag=0 blinding bytes len=32 aka=BlindingFactor tag bytes len=32 aka=AssetTag lock bytes len=2 aka=ReservedBytes2 revealed rec tag=3 - seal union -- XChainBlindSealTxPtr - bitcoin rec wrapped tag=0 -- BlindSealTxPtr - method enum opretFirst=0 tapretFirst=1 -- Method - txid union -- TxPtr + seal union XChainBlindSealTxPtr + bitcoin rec BlindSealTxPtr wrapped tag=0 + method enum Method opretFirst=0 tapretFirst=1 + txid union TxPtr witnessTx is Unit tag=0 txid bytes len=32 wrapped aka=Txid tag=1 vout is U32 aka=Vout blinding is U64 - liquid rec wrapped tag=1 -- BlindSealTxPtr - method enum opretFirst=0 tapretFirst=1 -- Method - txid union -- TxPtr + liquid rec BlindSealTxPtr wrapped tag=1 + method enum Method opretFirst=0 tapretFirst=1 + txid union TxPtr witnessTx is Unit tag=0 txid bytes len=32 wrapped aka=Txid tag=1 vout is U32 aka=Vout blinding is U64 - state rec -- RevealedFungible - value union -- FungibleState + state rec RevealedFungible + value union FungibleState bits64 is U64 wrapped tag=0 blinding bytes len=32 aka=BlindingFactor tag bytes len=32 aka=AssetTag @@ -171,23 +171,23 @@ Transition rec structured list len=0..MAX16 wrapped tag=2 AssignRevealedDataBlindSealTxPtr union confidential rec tag=0 - seal union -- XChainSecretSeal + seal union XChainSecretSeal bitcoin bytes len=32 wrapped aka=SecretSeal tag=0 liquid bytes len=32 wrapped aka=SecretSeal tag=1 state bytes len=32 aka=ConcealedData lock bytes len=2 aka=ReservedBytes2 confidentialState rec tag=1 - seal union -- XChainBlindSealTxPtr - bitcoin rec wrapped tag=0 -- BlindSealTxPtr - method enum opretFirst=0 tapretFirst=1 -- Method - txid union -- TxPtr + seal union XChainBlindSealTxPtr + bitcoin rec BlindSealTxPtr wrapped tag=0 + method enum Method opretFirst=0 tapretFirst=1 + txid union TxPtr witnessTx is Unit tag=0 txid bytes len=32 wrapped aka=Txid tag=1 vout is U32 aka=Vout blinding is U64 - liquid rec wrapped tag=1 -- BlindSealTxPtr - method enum opretFirst=0 tapretFirst=1 -- Method - txid union -- TxPtr + liquid rec BlindSealTxPtr wrapped tag=1 + method enum Method opretFirst=0 tapretFirst=1 + txid union TxPtr witnessTx is Unit tag=0 txid bytes len=32 wrapped aka=Txid tag=1 vout is U32 aka=Vout @@ -195,53 +195,53 @@ Transition rec state bytes len=32 aka=ConcealedData lock bytes len=2 aka=ReservedBytes2 confidentialSeal rec tag=2 - seal union -- XChainSecretSeal + seal union XChainSecretSeal bitcoin bytes len=32 wrapped aka=SecretSeal tag=0 liquid bytes len=32 wrapped aka=SecretSeal tag=1 - state rec -- RevealedData + state rec RevealedData value bytes len=0..MAX16 aka=DataState salt is U128 lock bytes len=2 aka=ReservedBytes2 revealed rec tag=3 - seal union -- XChainBlindSealTxPtr - bitcoin rec wrapped tag=0 -- BlindSealTxPtr - method enum opretFirst=0 tapretFirst=1 -- Method - txid union -- TxPtr + seal union XChainBlindSealTxPtr + bitcoin rec BlindSealTxPtr wrapped tag=0 + method enum Method opretFirst=0 tapretFirst=1 + txid union TxPtr witnessTx is Unit tag=0 txid bytes len=32 wrapped aka=Txid tag=1 vout is U32 aka=Vout blinding is U64 - liquid rec wrapped tag=1 -- BlindSealTxPtr - method enum opretFirst=0 tapretFirst=1 -- Method - txid union -- TxPtr + liquid rec BlindSealTxPtr wrapped tag=1 + method enum Method opretFirst=0 tapretFirst=1 + txid union TxPtr witnessTx is Unit tag=0 txid bytes len=32 wrapped aka=Txid tag=1 vout is U32 aka=Vout blinding is U64 - state rec -- RevealedData + state rec RevealedData value bytes len=0..MAX16 aka=DataState salt is U128 lock bytes len=2 aka=ReservedBytes2 attachment list len=0..MAX16 wrapped tag=3 AssignRevealedAttachBlindSealTxPtr union confidential rec tag=0 - seal union -- XChainSecretSeal + seal union XChainSecretSeal bitcoin bytes len=32 wrapped aka=SecretSeal tag=0 liquid bytes len=32 wrapped aka=SecretSeal tag=1 state bytes len=32 aka=ConcealedAttach lock bytes len=2 aka=ReservedBytes2 confidentialState rec tag=1 - seal union -- XChainBlindSealTxPtr - bitcoin rec wrapped tag=0 -- BlindSealTxPtr - method enum opretFirst=0 tapretFirst=1 -- Method - txid union -- TxPtr + seal union XChainBlindSealTxPtr + bitcoin rec BlindSealTxPtr wrapped tag=0 + method enum Method opretFirst=0 tapretFirst=1 + txid union TxPtr witnessTx is Unit tag=0 txid bytes len=32 wrapped aka=Txid tag=1 vout is U32 aka=Vout blinding is U64 - liquid rec wrapped tag=1 -- BlindSealTxPtr - method enum opretFirst=0 tapretFirst=1 -- Method - txid union -- TxPtr + liquid rec BlindSealTxPtr wrapped tag=1 + method enum Method opretFirst=0 tapretFirst=1 + txid union TxPtr witnessTx is Unit tag=0 txid bytes len=32 wrapped aka=Txid tag=1 vout is U32 aka=Vout @@ -249,33 +249,33 @@ Transition rec state bytes len=32 aka=ConcealedAttach lock bytes len=2 aka=ReservedBytes2 confidentialSeal rec tag=2 - seal union -- XChainSecretSeal + seal union XChainSecretSeal bitcoin bytes len=32 wrapped aka=SecretSeal tag=0 liquid bytes len=32 wrapped aka=SecretSeal tag=1 - state rec -- RevealedAttach + state rec RevealedAttach id bytes len=32 aka=AttachId - mediaType enum any=255 -- MediaType + mediaType enum MediaType any=255 salt is U64 lock bytes len=2 aka=ReservedBytes2 revealed rec tag=3 - seal union -- XChainBlindSealTxPtr - bitcoin rec wrapped tag=0 -- BlindSealTxPtr - method enum opretFirst=0 tapretFirst=1 -- Method - txid union -- TxPtr + seal union XChainBlindSealTxPtr + bitcoin rec BlindSealTxPtr wrapped tag=0 + method enum Method opretFirst=0 tapretFirst=1 + txid union TxPtr witnessTx is Unit tag=0 txid bytes len=32 wrapped aka=Txid tag=1 vout is U32 aka=Vout blinding is U64 - liquid rec wrapped tag=1 -- BlindSealTxPtr - method enum opretFirst=0 tapretFirst=1 -- Method - txid union -- TxPtr + liquid rec BlindSealTxPtr wrapped tag=1 + method enum Method opretFirst=0 tapretFirst=1 + txid union TxPtr witnessTx is Unit tag=0 txid bytes len=32 wrapped aka=Txid tag=1 vout is U32 aka=Vout blinding is U64 - state rec -- RevealedAttach + state rec RevealedAttach id bytes len=32 aka=AttachId - mediaType enum any=255 -- MediaType + mediaType enum MediaType any=255 salt is U64 lock bytes len=2 aka=ReservedBytes2 valencies set len=0..MAX8 aka=Valencies