diff --git a/Cargo.lock b/Cargo.lock index cff088e1..4cecfc4f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -166,6 +166,12 @@ dependencies = [ "thiserror", ] +[[package]] +name = "bech32" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d86b93f97252c47b41663388e6d155714a9d0c398b99f1005cbc5f978b29f445" + [[package]] name = "bitcoin-io" version = "0.1.2" @@ -259,6 +265,33 @@ dependencies = [ "strict_encoding", ] +[[package]] +name = "bp-derive" +version = "0.11.0-beta.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65e52af1dc2c8c8efd82ae24e48a556cae7f35de9cb42745aae3a79b8fd8cd3d" +dependencies = [ + "amplify", + "bp-consensus", + "bp-invoice", + "commit_verify", + "hmac", + "indexmap", + "sha2", +] + +[[package]] +name = "bp-invoice" +version = "0.11.0-beta.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "929663905dd8447a01a14fe35b31e62a4763c77f0757899cb9442b6d906fe701" +dependencies = [ + "amplify", + "bech32", + "bp-consensus", + "commit_verify", +] + [[package]] name = "bp-seals" version = "0.11.0-beta.9" @@ -276,6 +309,23 @@ dependencies = [ "strict_encoding", ] +[[package]] +name = "bp-std" +version = "0.11.0-beta.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe06ed7abc1faf9b8dd7d2e6b08ca0b8dbaff0b0f487926b8e1724938628f31c" +dependencies = [ + "amplify", + "bp-consensus", + "bp-derive", + "bp-invoice", + "descriptors", + "getrandom", + "psbt", + "secp256k1", + "wasm-bindgen", +] + [[package]] name = "bumpalo" version = "3.16.0" @@ -394,6 +444,17 @@ dependencies = [ "typenum", ] +[[package]] +name = "descriptors" +version = "0.11.0-beta.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "644bbfd06245939d6d61f937362c1870ef9e5af169aa85920452d70dd75b5993" +dependencies = [ + "amplify", + "bp-derive", + "indexmap", +] + [[package]] name = "digest" version = "0.10.7" @@ -402,6 +463,7 @@ checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ "block-buffer", "crypto-common", + "subtle", ] [[package]] @@ -464,6 +526,15 @@ dependencies = [ "arrayvec", ] +[[package]] +name = "hmac" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" +dependencies = [ + "digest", +] + [[package]] name = "iana-time-zone" version = "0.1.61" @@ -592,6 +663,20 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "psbt" +version = "0.11.0-beta.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fc697c385d5829ae4d92ea388ebb6f5fa657f1e328a6a3320e06d75dac8a437" +dependencies = [ + "amplify", + "base64", + "bp-derive", + "chrono", + "descriptors", + "indexmap", +] + [[package]] name = "quote" version = "1.0.37" @@ -639,6 +724,7 @@ dependencies = [ "amplify", "baid64", "bp-core", + "bp-std", "chrono", "commit_verify", "getrandom", @@ -851,6 +937,12 @@ dependencies = [ "serde_str_helpers", ] +[[package]] +name = "subtle" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" + [[package]] name = "syn" version = "1.0.109" diff --git a/Cargo.toml b/Cargo.toml index 2a9f5ea6..2fa53eec 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -30,6 +30,7 @@ aluvm = { version = "~0.11.0-beta.9", features = ["std", "ascii-armor"] } commit_verify = { version = "~0.11.0-beta.9", features = ["rand", "derive"] } single_use_seals = "~0.11.0-beta.9" bp-core = { version = "~0.11.0-beta.9" } +bp-std = { version = "~0.11.0-beta.9.1" } secp256k1 = { version = "0.30.0", features = ["global-context"] } mime = "~0.3.17" serde_crate = { package = "serde", version = "1", features = ["derive"], optional = true } diff --git a/src/operation/commit.rs b/src/operation/commit.rs index 5326913a..ee993511 100644 --- a/src/operation/commit.rs +++ b/src/operation/commit.rs @@ -37,11 +37,11 @@ use commit_verify::{ use strict_encoding::StrictDumb; use crate::{ - impl_serde_baid64, Assign, AssignmentType, Assignments, BundleId, ConcealedAttach, + impl_serde_baid64, Assign, AssignmentType, Assignments, BundleId, ChainNet, ConcealedAttach, ConcealedData, ConcealedState, ConcealedValue, ConfidentialState, DataState, ExposedSeal, - ExposedState, Extension, ExtensionType, Ffv, Genesis, GlobalState, GlobalStateType, Layer1, - Operation, Redeemed, SchemaId, SecretSeal, Transition, TransitionBundle, TransitionType, - TypedAssigns, LIB_NAME_RGB_COMMIT, + ExposedState, Extension, ExtensionType, Ffv, Genesis, GlobalState, GlobalStateType, Operation, + Redeemed, SchemaId, SecretSeal, Transition, TransitionBundle, TransitionType, TypedAssigns, + LIB_NAME_RGB_COMMIT, }; /// Unique contract identifier equivalent to the contract genesis commitment @@ -236,8 +236,7 @@ pub struct BaseCommitment { pub schema_id: SchemaId, pub timestamp: i64, pub issuer: StrictHash, - pub layer1: Layer1, - pub testnet: bool, + pub chain_net: ChainNet, } #[derive(Copy, Clone, Eq, PartialEq, Hash, Debug)] @@ -279,8 +278,7 @@ impl Genesis { flags: self.flags, schema_id: self.schema_id, timestamp: self.timestamp, - layer1: self.layer1, - testnet: self.testnet, + chain_net: self.chain_net, issuer: self.issuer.commit_id(), }; OpCommitment { diff --git a/src/operation/layer1.rs b/src/operation/layer1.rs index 051c6a4c..9cc3e93a 100644 --- a/src/operation/layer1.rs +++ b/src/operation/layer1.rs @@ -20,6 +20,10 @@ // See the License for the specific language governing permissions and // limitations under the License. +use std::str::FromStr; + +use bp::BlockHash; +use bpstd::{AddressNetwork, Network}; use strict_encoding::{StrictDecode, StrictEncode, StrictType}; use crate::LIB_NAME_RGB_COMMIT; @@ -40,3 +44,125 @@ pub enum Layer1 { Bitcoin = 0, Liquid = 1, } + +#[derive(Copy, Clone, Ord, PartialOrd, Eq, PartialEq, Hash, Debug, Display)] +#[display(inner)] +#[derive(StrictType, StrictEncode, StrictDecode)] +#[strict_type(lib = LIB_NAME_RGB_COMMIT, tags = repr, into_u8, try_from_u8)] +#[cfg_attr( + feature = "serde", + derive(Serialize, Deserialize), + serde(crate = "serde_crate", rename_all = "camelCase") +)] +#[repr(u8)] +#[derive(Default)] +pub enum ChainNet { + BitcoinMainnet = 0, + BitcoinTestnet3 = 1, + #[default] + BitcoinTestnet4 = 2, + BitcoinSignet = 3, + BitcoinRegtest = 4, + LiquidMainnet = 5, + LiquidTestnet = 6, +} + +impl ChainNet { + pub fn prefix(&self) -> &str { + match self { + ChainNet::BitcoinMainnet => "bc", + ChainNet::BitcoinTestnet3 => "tb3", + ChainNet::BitcoinTestnet4 => "tb4", + ChainNet::BitcoinRegtest => "bcrt", + ChainNet::BitcoinSignet => "sb", + ChainNet::LiquidMainnet => "lq", + ChainNet::LiquidTestnet => "tl", + } + } + + pub fn layer1(&self) -> Layer1 { + match self { + ChainNet::BitcoinMainnet + | ChainNet::BitcoinTestnet3 + | ChainNet::BitcoinTestnet4 + | ChainNet::BitcoinSignet + | ChainNet::BitcoinRegtest => Layer1::Bitcoin, + ChainNet::LiquidMainnet | ChainNet::LiquidTestnet => Layer1::Liquid, + } + } + + pub fn address_network(&self) -> AddressNetwork { + match self { + ChainNet::BitcoinMainnet => AddressNetwork::Mainnet, + ChainNet::BitcoinTestnet3 | ChainNet::BitcoinTestnet4 | ChainNet::BitcoinSignet => { + AddressNetwork::Testnet + } + ChainNet::BitcoinRegtest => AddressNetwork::Regtest, + ChainNet::LiquidMainnet => AddressNetwork::Mainnet, + ChainNet::LiquidTestnet => AddressNetwork::Testnet, + } + } + + pub fn genesis_block_hash(&self) -> BlockHash { + BlockHash::from_str(match self { + ChainNet::BitcoinMainnet => { + "000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f" + } + ChainNet::BitcoinTestnet3 => { + "000000000933ea01ad0ee984209779baaec3ced90fa3f408719526f8d77f4943" + } + ChainNet::BitcoinTestnet4 => { + "00000000da84f2bafbbc53dee25a72ae507ff4914b867c565be350b0da8bf043" + } + ChainNet::BitcoinSignet => { + "00000008819873e925422c1ff0f99f7cc9bbb232af63a077a480a3633bee1ef6" + } + ChainNet::BitcoinRegtest => { + "0f9188f13cb7b2c71f2a335e3a4fc328bf5beb436012afca590b1a11466e2206" + } + ChainNet::LiquidMainnet => { + "4f4eac81e5f9f04f5d2a17b03e6726e6a1af69d9c3f00d820f1c82fcb6000000" + } + ChainNet::LiquidTestnet => { + "f9f21a7636b35c12f080ff73fc8bb16bb7c3ceafdc2eb1b673f0ea7a40c00000" + } + }) + .unwrap() + } +} + +impl From for ChainNet { + fn from(value: Network) -> Self { + match value { + Network::Mainnet => ChainNet::BitcoinMainnet, + Network::Regtest => ChainNet::BitcoinRegtest, + Network::Signet => ChainNet::BitcoinSignet, + Network::Testnet3 => ChainNet::BitcoinTestnet3, + Network::Testnet4 => ChainNet::BitcoinTestnet4, + } + } +} + +#[derive(Debug, Display, Error, From)] +#[display(doc_comments)] +pub enum ChainNetParseError { + /// invalid chain-network pair {0}. + Invalid(String), +} + +impl FromStr for ChainNet { + type Err = ChainNetParseError; + + fn from_str(s: &str) -> Result { + match s.to_lowercase() { + x if ChainNet::BitcoinMainnet.prefix() == x => Ok(ChainNet::BitcoinMainnet), + x if ChainNet::BitcoinRegtest.prefix() == x => Ok(ChainNet::BitcoinRegtest), + x if ChainNet::BitcoinSignet.prefix() == x => Ok(ChainNet::BitcoinSignet), + x if ChainNet::BitcoinTestnet3.prefix() == x => Ok(ChainNet::BitcoinTestnet3), + x if ChainNet::BitcoinTestnet4.prefix() == x => Ok(ChainNet::BitcoinTestnet4), + x if ChainNet::LiquidMainnet.prefix() == x => Ok(ChainNet::LiquidMainnet), + x if ChainNet::LiquidTestnet.prefix() == x => Ok(ChainNet::LiquidTestnet), + _ => Err(ChainNetParseError::Invalid(s.to_owned())), + } + } +} diff --git a/src/operation/mod.rs b/src/operation/mod.rs index 33919647..c56d0d9a 100644 --- a/src/operation/mod.rs +++ b/src/operation/mod.rs @@ -46,7 +46,7 @@ pub use commit::{ pub use data::{ConcealedData, DataState, RevealedData, VoidState}; pub use fungible::{ConcealedValue, FungibleState, RevealedValue}; pub use global::{GlobalState, GlobalValues}; -pub use layer1::Layer1; +pub use layer1::{ChainNet, Layer1}; pub use meta::{MetaValue, Metadata, MetadataError}; pub use operations::{ Extension, Genesis, Identity, Input, Inputs, Operation, Opout, OpoutParseError, Redeemed, diff --git a/src/operation/operations.rs b/src/operation/operations.rs index 3a59b174..a4498816 100644 --- a/src/operation/operations.rs +++ b/src/operation/operations.rs @@ -37,9 +37,9 @@ use strict_encoding::{RString, StrictDeserialize, StrictEncode, StrictSerialize} use crate::schema::{self, ExtensionType, OpFullType, OpType, SchemaId, TransitionType}; use crate::{ - Assign, AssignmentIndex, AssignmentType, Assignments, AssignmentsRef, ConcealedAttach, - ConcealedData, ConcealedValue, ContractId, DiscloseHash, ExposedState, Ffv, GenesisSeal, - GlobalState, GraphSeal, Layer1, Metadata, OpDisclose, OpId, SecretSeal, TypedAssigns, + Assign, AssignmentIndex, AssignmentType, Assignments, AssignmentsRef, ChainNet, + ConcealedAttach, ConcealedData, ConcealedValue, ContractId, DiscloseHash, ExposedState, Ffv, + GenesisSeal, GlobalState, GraphSeal, Metadata, OpDisclose, OpId, SecretSeal, TypedAssigns, VoidState, LIB_NAME_RGB_COMMIT, }; @@ -343,8 +343,7 @@ pub struct Genesis { pub flags: ReservedBytes<1, 0>, pub timestamp: i64, pub issuer: Identity, - pub layer1: Layer1, - pub testnet: bool, + pub chain_net: ChainNet, pub metadata: Metadata, pub globals: GlobalState, pub assignments: Assignments, diff --git a/src/stl.rs b/src/stl.rs index d3d7ec67..7f158ed7 100644 --- a/src/stl.rs +++ b/src/stl.rs @@ -38,10 +38,10 @@ use crate::{ /// Strict types id for the library providing data types for RGB consensus. pub const LIB_ID_RGB_COMMIT: &str = - "stl:FjjU0$$o-dgf5dmK-ohaEobc-Y6Vz3rp-TqLj3kS-8F7NMQQ#capsule-arthur-quest"; + "stl:n4BoS9Kd-oZ1mUgb-6Hqg9hY-q$JXa84-YoWed1a-!6AZCTM#raymond-open-organic"; /// Strict types id for the library providing data types for RGB consensus. pub const LIB_ID_RGB_LOGIC: &str = - "stl:iLZ2rLhr-oAp7rHh-cX2LO3T-7evttnL-KT6MX!V-m64WEyQ#janet-mineral-phone"; + "stl:HffUFU0Z-oNyZXNs-O8u1dRc-Q4Z5mOo-3bqPppu-A0f5iTo#permit-helena-lorenzo"; fn _rgb_commit_stl() -> Result { LibBuilder::new(libname!(LIB_NAME_RGB_COMMIT), tiny_bset! { diff --git a/src/validation/status.rs b/src/validation/status.rs index 49da5206..ba3402ec 100644 --- a/src/validation/status.rs +++ b/src/validation/status.rs @@ -31,7 +31,9 @@ use strict_types::SemId; use crate::schema::{self, SchemaId}; use crate::validation::WitnessResolverError; -use crate::{BundleId, ContractId, OccurrencesMismatch, OpFullType, OpId, Opout, StateType, Vin}; +use crate::{ + BundleId, ChainNet, ContractId, OccurrencesMismatch, OpFullType, OpId, Opout, StateType, Vin, +}; #[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Debug, Display)] #[repr(u8)] @@ -160,9 +162,13 @@ impl Status { )] #[display(doc_comments)] pub enum Failure { - /// the contract network doesn't match (validator runs in testnet={0} + /// the contract chain-network pair doesn't match (validator runs in chain_net={0} /// configuration). - NetworkMismatch(bool), + ContractChainNetMismatch(ChainNet), + + /// the resolver chain-network pair doesn't match (validator runs in chain_net={0} + /// configuration). + ResolverChainNetMismatch(ChainNet), /// schema {actual} provided for the consignment validation doesn't match /// schema {expected} used by the contract. This means that the consignment diff --git a/src/validation/validator.rs b/src/validation/validator.rs index aa800029..20dba826 100644 --- a/src/validation/validator.rs +++ b/src/validation/validator.rs @@ -35,8 +35,8 @@ use super::{CheckedConsignment, ConsignmentApi, DbcProof, EAnchor, OpRef, Status use crate::operation::seal::ExposedSeal; use crate::vm::{ContractStateAccess, ContractStateEvolve, OrdOpRef, WitnessOrd}; use crate::{ - validation, BundleId, ContractId, OpId, OpType, Operation, Opout, OutputSeal, Schema, SchemaId, - TransitionBundle, + validation, BundleId, ChainNet, ContractId, OpId, OpType, Operation, Opout, OutputSeal, Schema, + SchemaId, TransitionBundle, }; #[derive(Clone, PartialEq, Eq, Debug, Display, Error, From)] @@ -53,6 +53,8 @@ pub enum WitnessResolverError { Unknown(Txid), /// unable to retrieve witness {0}, {1} Other(Txid, String), + /// resolver is for another chain-network pair + WrongChainNet, } pub trait ResolveWitness { @@ -61,6 +63,8 @@ pub trait ResolveWitness { fn resolve_pub_witness_ord(&self, witness_id: Txid) -> Result; + + fn check_chain_net(&self, chain_net: ChainNet) -> Result<(), WitnessResolverError>; } impl ResolveWitness for &T { @@ -74,6 +78,10 @@ impl ResolveWitness for &T { ) -> Result { ResolveWitness::resolve_pub_witness_ord(*self, witness_id) } + + fn check_chain_net(&self, chain_net: ChainNet) -> Result<(), WitnessResolverError> { + ResolveWitness::check_chain_net(*self, chain_net) + } } struct CheckedWitnessResolver { @@ -104,6 +112,10 @@ impl ResolveWitness for CheckedWitnessResolver { ) -> Result { self.inner.resolve_pub_witness_ord(witness_id) } + + fn check_chain_net(&self, chain_net: ChainNet) -> Result<(), WitnessResolverError> { + self.inner.check_chain_net(chain_net) + } } pub struct Validator< @@ -119,6 +131,7 @@ pub struct Validator< schema_id: SchemaId, contract_id: ContractId, + chain_net: ChainNet, contract_state: Rc>, validated_op_seals: RefCell>, @@ -145,6 +158,7 @@ impl< let genesis = consignment.genesis(); let contract_id = genesis.contract_id(); let schema_id = genesis.schema_id; + let chain_net = genesis.chain_net; // Prevent repeated validation of single-use seals let validated_op_seals = RefCell::new(BTreeSet::::new()); @@ -155,6 +169,7 @@ impl< status: RefCell::new(status), schema_id, contract_id, + chain_net, validated_op_seals, input_assignments: input_transitions, resolver: CheckedWitnessResolver::from(resolver), @@ -174,17 +189,24 @@ impl< pub fn validate( consignment: &'consignment C, resolver: &'resolver R, - testnet: bool, + chain_net: ChainNet, context: S::Context<'_>, ) -> Status { let mut validator = Self::init(consignment, resolver, context); - // 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 { + // If the chain-network pair doesn't match there is no point in validating the contract + // since all witness transactions will be missed. + if validator.chain_net != chain_net { + validator + .status + .borrow_mut() + .add_failure(Failure::ContractChainNetMismatch(chain_net)); + return validator.status.into_inner(); + } + if resolver.check_chain_net(chain_net).is_err() { validator .status .borrow_mut() - .add_failure(Failure::NetworkMismatch(testnet)); + .add_failure(Failure::ResolverChainNetMismatch(chain_net)); return validator.status.into_inner(); } diff --git a/stl/RGBCommit@0.1.0.sta b/stl/RGBCommit@0.1.0.sta index 4dccc426..ced2066b 100644 --- a/stl/RGBCommit@0.1.0.sta +++ b/stl/RGBCommit@0.1.0.sta @@ -1,5 +1,5 @@ -----BEGIN STRICT TYPE LIB----- -Id: stl:FjjU0$$o-dgf5dmK-ohaEobc-Y6Vz3rp-TqLj3kS-8F7NMQQ#capsule-arthur-quest +Id: stl:n4BoS9Kd-oZ1mUgb-6Hqg9hY-q$JXa84-YoWed1a-!6AZCTM#raymond-open-organic Name: RGBCommit Dependencies: BPCore#symbol-tropic-grand, @@ -8,7 +8,7 @@ Dependencies: CommitVerify#miller-pancake-elastic, Std#ralph-blue-lucky, Bitcoin#signal-color-cipher -Check-SHA256: d962ea87194c00a283f546c2787a30e2a16c396deabb107af66218664d63e270 +Check-SHA256: 88954d8b1822bdd4fb13a2f1eb7fc7eec49e010e69dcbd009e07aff60255070a 2~tNwLvL+uX>6v={gsJ=SZlTl1iF5eQ8IAl(q%E@>So406W2vm7+Wlmvj -WorbZ6rQG)02XJT?*g=|B=zREie$*y(7k2+*P~cYjRjL>ZAoN303tzib7^O8Qe}2!VQgh&L3DIsV`xHb -X>MdwWnpYocu;h51OxyKV{dL|X=G(?bZKF100sjDb7f&{0wHj#q4l6D4ZcK)2hLYH81C&KXiWu&flb+s -{C0G-{Ad~Lyw$T9tCzEwrAszt-P)%HZ|LbH=L2A=l(W4CP6cyxVRU5y{4_<~U(XE-|Ev|Hdb$N7;9H9; -8!%;3hl7uME$faw1Z;0(YXW)$9p7nv%krpqNc;WdH^P1aoC!Yyu&0tD*IvDh<9wi3iSCIT-Hk -A81Vlhk;Gmjr?|WwEU;2^0@;NPlb{-n1xko1uZcKL=FhMw)iW@^B~GyS4IVMbYXO50sJ&Y-CxfQ3;(PY -q10COKearHwcS=7M7YzYaI8*bvhMOc?)(rkC#nUFsxGg*8 -X!CPrawgw_sqk4BX8}k^^xj-FXm+)yumJ%A5Mys{W@%()Zggp3Y*S@nYybuW1aoC!Yyu&0tD*IvDh<9w -i3iSCIT-HkA81Vlhk;Gmjr?|WwESop>%7&o7^|1Fn59cLW!>7R25;!;B10COKearHwcS=7M7YzYaI8*bvhMOc?)(rkC -#nUFsxGg*8X!CPrawgw_sqk4BX8}k^^xj-FXm+)yumJ%B2y$h1WnpY(WB>*O1aoC!Yyu&0tD*IvDh<9w -i3iSCIT-HkA81Vlhk;Gmjr?|WwEU;2^0@;NPlb{-n1xko1uZcKL=FhMw)iW@^B~GyS4IVMbYXO50p}%) -{+CCYqok=CI6O*0D2Q5~XK8~xVetWFewK9hZ3Jv@V`~C>10COKearHwcS=7M7YzYaI8*bvhMOc?)(rkC -#nUFsxGg*8X!CPrawgw_sqk4BX8}k^^xj-FXm+)yumJ%fL349yXKqquc4c8~Wn@8gbYWv?LTqVnWK(5f -Y*ct@WCR2N3}bI@W@%()Zggp3YybuW1aoC!Yyu&0tD*IvDh<9wi3iSCIT-HkA81Vlhk;Gmjr?|WwESop ->%7&o7^|1Fn59cLW!>7R25;!;B10COKearHwcS=7M7YzYaI8*bvhMOc?)(rkC#nUFsxGg*8X!CPrawgw_sqk4BX8}k^ -^xj-FXm+)yumJ%95o2#|W@%()Zggp3Y*Tb$bY%br0|awrVQc~+aI2y9pehZ%M2QE^S2-B&?H_1O1&4u6 -*^T^mbhP{|1C2;aNA(0eXS#L;%_oib8;tKCLQ=nuAv#{`SnN;*b97;JWdZy&McrS|4GaIQ6{LE)1tQ>E -iz^#2Wm1QOk9#fajy(iyZ)0l$dIKHbX?@G`sCP;~6&DQwR5(-fxrUo0Th%7&o7^|1F -n59cLW!>7R25;!;B10COKearHwcS=7M7YzYaI8*bvhMOc?)(rkC#nUFsxGg*8X!CPrawgw_sqk4BX8}k^^xj-FXm+)y -umJ%95o2#|W@%()Zggp3Y*Tb$bY%br0|awrVQc~+aI2y9pehZ%M2QE^S2-B&?H_1O1&4u6*^T^mbhP}Z -sPef35>JJaHJF7}X$37Y21E`BySDf%$MYb{T~|g0b97;JWdU#vWe~E0fo~tTJ>?Q(lLJ=>rBY$70^roX -TE)+&>InpFZ)0l$dIKHbX?@G`sCP;~6&DQwR5(-fxrUo0ThJJaHJF7}X$37Y21E`BySDf%$MYb{T~|g0b97;JWdZ+aW59S)fNA-MxPs%HqZ2GT -KAXWWi*W4(A64;XFkb|0Z)0l$dIKHbX?@G`sCP;~6&DQwR5(-fxrUo0Thc;WdH^P1aoC!Yyu&0tD*IvDh<9wi3iSCIT-HkA81Vlhk;Gmjr?|WwEQdsjYvyJ^#nX; -x^@N4Cyn`(=BbYXO50dNgv5VC@SZy&ck10COKearHwcS=7M7YzYaI8*bvhMOc?)(rkC#nUFsxGg*8X!CPrawgw_sqk4BX8}k^^xj-FXm+)y -umJ%A5Mys{W@%()Zggp3Y*S@nYybuW1aoC!Yyu&0tD*IvDh<9wi3iSCIT-HkA81Vlhk;Gmjr?|WwESop ->%7&o7^|1Fn59cLW!>7R25;!;B10COKearHwcS=7M7YzYaI8*bvhMOc?)(rkC#nUFsxGg*8X!CPrawgw_sqk4BX8}k^ -^xj-FXm+)yumJ%B2y$h1WnpY(WB>*O1aoC!Yyu&0tD*IvDh<9wi3iSCIT-HkA81Vlhk;Gmjr?|WwEQds -jYvyJ^#nX;x^@N4Cyn`(=BbYXO50sm-Yz<5%CY59k^g5#W{6D&GDo53%OaP0&i -Rq10COKearHwcS=7M7YzYaI8*bvhMOc?)(rkC#nUFsxGg*8X!CPrawgw_sqk4BX8}k^ -^xj-FXm+)yumJ%fL349yXKqquc4c8~Wn@-iY;|QqY-w&}Q)OXnRCrKyas&hb3}bI@W@%()Zggp3YybuW -1aoC!Yyu&0tD*IvDh<9wi3iSCIT-HkA81Vlhk;Gmjr?|WwESop>%7&o7^|1Fn59cLW!>7R25;!;B+kk4W|0D0)10COKearHwcS=7M -7YzYaI8*bvhMOc?)(rkC#nUFsxGg*8X!CPrawgw_sqk4BX8}k^^xj-FXm+)yumJ%95o2#|W@%()Zggp3 -Y*Tb$bY%br0|awrVQc~+aI2y9pehZ%M2QE^S2-B&?H_1O1&4u6*^T^mbhP}ZsPef35>JJaHJF7}X$37Y -21E`BySDf%$MYb{T~|g0b97;JWdWb2;)g%0j&kVcqmr((TU76^nC$%1sKzB<;E +QA|)S-x88IWKN#S$#@T&w`gPtRC#b^PGN0jYXqYdo~D%m7H6OD0<^0n_2##VWXRdjy=DB@qgYOj1yf~h +Nn||$B0+O=X=iRyWp-s@Y-MCYbaY{3XhLjhZe&wsVQf@*P;_zx1ONyAAHY;R+00(t`--)Viz@~C%8KNS}Z0aQ3s +^SOqbBwN-D{wl@OCd;@jJLYKfb7gWS-+`&{Sr=ykNJ#YFTr_BQwWqKF0Ra(XZ*FF3WMyu2X<=+rbYXO5 +00sjDb7f&{0wHj#q4l6D4ZcK)2hLYH81C&KXiWu&flb+s{C0G-{HLh$xdReUg_1Rxg;i+JW4?*h+3X!X@fjr@d0IimUQ-Q1Z;0(YXW)$ +9p7nv%krpqNJW4?*h+3X!X@fjr@d0IimUQ-Q1Z;0(YXW)$ +9p7nv%krpqNc;WdH^P1aoC! +Yyu&0tD*IvDh<9wi3iSCIT-HkA81Vlhk;Gmjr?|WwEQdsjYvyJ^#nX;x^@N4Cyn`(=BbYXO50sJ&Y-CxfQ3;(PYq10COKearHwcS=7M7YzYa +I8*bvhMOc?)(rkC#nUFsxGg*8X!CPrawgw_sqk4BX8}k^^xj-FXm+)yumJ%A5Mys{W@%()Zggp3Y*S@n +YybuW1aoC!Yyu&0tD*IvDh<9wi3iSCIT-HkA81Vlhk;Gmjr?|WwESop>%7&o7^|1Fn59cLW!>7R25;!; +B10COKearHw +cS=7M7YzYaI8*bvhMOc?)(rkC#nUFsxGg*8X!CPrawgw_sqk4BX8}k^^xj-FXm+)yumJ%B2y$h1WnpY( +WB>*O1aoC!Yyu&0tD*IvDh<9wi3iSCIT-HkA81Vlhk;Gmjr?|WwEQdsjYvyJ^#nX;x^@N4Cyn`(=BbYXO50p}%){+CCYqok=CI6O*0D2Q5~XK8~xVetWFewK9hZ3Jv@V`~C>10COKearHw +cS=7M7YzYaI8*bvhMOc?)(rkC#nUFsxGg*8X!CPrawgw_sqk4BX8}k^^xj-FXm+)yumJ%eL349yXKqqu +c4c8~Wn@HQbYVhlX>MdwWnpYocu;h51OxyKV{dL|X=G(?bZKF100sjDb7f&{0wHj#q4l6D4ZcK)2hLYH +81C&KXiWu&flb+s{C0G-{Ad~Lyw$T9tCzEwrAszt-P)%HZ|LbH=L2A=l(W4CP6cyxVRU5ya1CV;vVwtc +AGbZ_5@VACR|ut2VXXq-)V^B9&!_4M1Z;0(YXW)$9p7nv%krpqNc;WdH^P1aoC!Yyu&0tD*Iv +Dh<9wi3iSCIT-HkA81Vlhk;Gmjr?|WwEU;2^0@;NPlb{-n1xko1uZcKL=FhMw)iW@^B~GyS4IVMbYXO5 +0dNgv5VC@SZy&ck10COKearHwcS=7M7YzYaI8*bvhMOc? +)(rkC#nUFsxGg*8X!CPrawgw_sqk4BX8}k^^xj-FXm+)yumJ%A5Mys{W@%()Zggp3Y*S@nYybuW1aoC! +Yyu&0tD*IvDh<9wi3iSCIT-HkA81Vlhk;Gmjr?|WwESop>%7&o7^|1Fn59cLW!>7R25;!;B10COKearHwcS=7M7YzYa +I8*bvhMOc?)(rkC#nUFsxGg*8X!CPrawgw_sqk4BX8}k^^xj-FXm+)yumJ%B2y$h1WnpY(WB>*O1aoC! +Yyu&0tD*IvDh<9wi3iSCIT-HkA81Vlhk;Gmjr?|WwEU;2^0@;NPlb{-n1xko1uZcKL=FhMw)iW@^B~Gy +S4IVMbYXO50sm-Yz<5%CY59k^g5#W{6D&GDo53%OaP0&iRq10COKearHwcS=7M7YzYa +I8*bvhMOc?)(rkC#nUFsxGg*8X!CPrawgw_sqk4BX8}k^^xj-FXm+)yumJ%dL349yXKqquc4c8~Wn@HQ +bYVhlX>MdwWnpYocxhw=1ON4P_9rf`M-zw>{+&W0M0{ +2&GbCtpecGzFNi4r|Jm=Y;R+00(t`--)Viz@~C%8KNS}Z0aQ3s^SOqbBwN-D{wl@OCd;@jJLYKfb7gWS +-+`&{Sr=ykNJ#YFTr_BQwWqKF0Ra(XZ*FF3WMyu2X<=+rbYXO500sjDb7f&{0wHj#q4l6D4ZcK)2hLYH +81C&KXiWu&flb+s{C0G-{44{FNJ~fc1UzTDb_LBRjrSXj?;k=^zm6d~Uh7!wPz7^zVRU5ya1CV;vVwtc +AGbZ_5@VACR|ut2VXXq-)V^B9&!_4M1Z;0(YXW)$9p7nv%krpqNfIfIMdw +WnpYocu;h51OxyKV{dL|X=G(?bZKF100sjDb7f&{0wHj#q4l6D4ZcK)2hLYH81C&KXiWu&flb+s{C0G- +{Ad~Lyw$T9tCzEwrAszt-P)%HZ|LbH=L2A=l(W4CP6cyxVRU5ypQhuJc;WdH^P1aoC!Yyu&0tD*IvDh<9wi3iSCIT-HkA81Vl +hk;Gmjr?|WwEU;2^0@;NPlb{-n1xko1uZcKL=FhMw)iW@^B~GyS4IVMbYXO50iUMhljH@EE6X_{Tzmee +W|2gfem?>+kk4W|0D0)10COKearHwcS=7M7YzYaI8*bvhMOc?)(rkC#nUFsxGg*8X!CPr +awgw_sqk4BX8}k^^xj-FXm+)yumJ%A5Mys{W@%()Zggp3Y*S@nYybuW1aoC!Yyu&0tD*IvDh<9wi3iSC +IT-HkA81Vlhk;Gmjr?|WwESop>%7&o7^|1Fn59cLW!>7R25;!;B4{Q314kUM@UiqyMDEzyxe>V`~C>10COKearHwcS=7M7YzYaI8*bvhMOc?)(rkC#nUFs +xGg*8X!CPrawgw_sqk4BX8}k^^xj-FXm+)yumJ%B2y$h1WnpY(WB>*O1aoC!Yyu&0tD*IvDh<9wi3iSC +IT-HkA81Vlhk;Gmjr?|WwEU;2^0@;NPlb{-n1xko1uZcKL=FhMw)iW@^B~GyS4IVMbYXO50W~^?7W_p; +3l@ykBm9id47>4{Q314kUM@UiqyMDEzyxe>V`~C>10COKearHwcS=7M7YzYaI8*bvhMOc?)(rkC#nUFs +xGg*8X!CPrawgw_sqk4BX8}k^^xj-FXm+)yumJ%eL349yXKqquc4c8~Wn@-iY;|QqY-w&}Q)OXnRCsA* +1OxyKV{dL|X=G(?bZKF100sjDb7f&{0wHj#q4l6D4ZcK)2hLYH81C&KXiWu&flb+s{C0G-{Ad~Lyw$T9 +tCzEwrAszt-P)%HZ|LbH=L2A=l(W4CP6cyxVRU5ypQhuJc;WdH^P1aoC!Yyu&0tD*IvDh<9wi3iSCIT-HkA81Vlhk;Gmjr?|W +wEQdsjYvyJ^#nX;x^@N4Cyn`(=BbYXO50iUMhljH@EE6X_{TzmeeW|2gfem?>+ +kk4W|0D0)10COKearHwcS=7M7YzYaI8*bvhMOc?)(rkC#nUFsxGg*8X!CPrawgw_sqk4B +X8}k^^xj-FXm+)yumJ%A5Mys{W@%()Zggp3Y*S@nYybuW1aoC!Yyu&0tD*IvDh<9wi3iSCIT-HkA81Vl +hk;Gmjr?|WwESop>%7&o7^|1Fn59cLW!>7R25;!;B4{Q314kUM@UiqyMDEzyxe>V`~C>10COKearHwcS=7M7YzYaI8*bvhMOc?)(rkC#nUFsxGg*8X!CPr +awgw_sqk4BX8}k^^xj-FXm+)yumJ%B2y$h1WnpY(WB>*O1aoC!Yyu&0tD*IvDh<9wi3iSCIT-HkA81Vl +hk;Gmjr?|WwEQdsjYvyJ^#nX;x^@N4Cyn`(=BbYXO50W~^?7W_p;3l@ykBm9id +47>4{Q314kUM@UiqyMDEzyxe>V`~C>10COKearHwcS=7M7YzYaI8*bvhMOc?)(rkC#nUFsxGg*8X!CPr +awgw_sqk4BX8}k^^xj-FXm+)yumJ%bL349yXKq$+X=GD$VRU6eY-w&}Q)OXnRCrKyas&hb3}bI@W@%() +Zggp3YybuW1aoC!Yyu&0tD*IvDh<9wi3iSCIT-HkA81Vlhk;Gmjr?|WwESop>%7&o7^|1Fn59cLW!>7R +25;!;BwOY}Ov_b`4?P%YY`+Wb+o`y98`+V`~C>10COK +earHwcS=7M7YzYaI8*bvhMOc?)(rkC#nUFsxGg*8X!CPrawgw_sqk4BX8}k^^xj-FXm+)yumJ%95o2#| +W@%()Zggp3Y*Tb$bY%br0|awrVQc~+aI2y9pehZ%M2QE^S2-B&?H_1O1&4u6*^T^mbhP}ZsPef35>JJa +HJF7}X$37Y21E`BySDf%$MYb{T~|g0b97;JWdSa-rT!PdFhnqz;9Q#JJa -HJF7}X$37Y21E`BySDf%$MYb{T~|g0b97;JWdSuhh8FxqMGF>;)g%0j&kVcqmr((%7&o7^|1Fn59cLW!>7R25;!;B+kk4W|0D0)10COKearHwcS=7M7YzYaI8*bv -hMOc?)(rkC#nUFsxGg*8X!CPrawgw_sqk4BX8}k^^xj-FXm+)yumJ%95o2#|W@%()Zggp3Y*Tb$bY%br -0|awrVQc~+aI2y9pehZ%M2QE^S2-B&?H_1O1&4u6*^T^mbhP{|1C2;aNA(0eXS#L;%_oib8;tKCLQ=nu -Av#{`SnN;*b97;JWdWb2;)g%0j&kVcqmr((;)g%0j&kVcqmr((OF|0}@Y#k~NrxRcQq+F$P2q2)nlUE64L7%3W7R1#@&^ -bY%f9vZekPz%WEGnBZKS8(M7E9_@AwVcyGtCevi|7U8=DY;R+00(t`--)Viz@~C%8KNS}Z0aQ3s^SOqb -BwN-D{wl@OCd;@jJLYKfb7gWS-+`&{Sr=ykNJ#YFTr_BQwWqKF0Rj+XZ*FF3WMyu2X<=+rWnpXp1_K0h -WnpXrA#kgq^`I&ZzC?)!&R01Y?(H9FO$CR6P1%k7c67A-Xc_Cg)w39@m$R6qOEzWQ+NTC@=;OF|0}@Y#k~NrxRcQq+F$P2q2)nlUE64L7 -%3W7R1#@&^bY%f9vZekPz%WEGnBZKS8(M7E9_@AwVcyGtCevi|7U8=DY;R+00(t`--)Viz@~C%8KNS}Z -0aQ3s^SOqbBwN-D{wl@OCd;@jJLYKfb7gWS-+`&{Sr=ykNJ#YFTr_BQwWqKF0USYdb7^O8R&Qx!Q*>c; -WkPIeZe&wsVQf@*X=DTh01RVqZf0p@Wo~q7VQc^f0|awrVQc~+aI2y9pehZ%M2QE^S2-B&?H_1O1&4u6 -*^T^mbhP|v8SA{&vly$FvzVnzHf7z~rv`86=_Ka^V5yX|y#`JNb97;JWdSa-rT!PdFhnqz;9Q#5OGottJZHLg1Ujv+c;>sahi1#@&^bY%f9vZekPz%WEG -nBZKS8(M7E9_@AwVcyGtCevi|7U8=DY;R+00(t`--)Viz@~C%8KNS}Z0aQ3s^SOqbBwN-D{wl@OCd;@j -JLYKfb7gWS-+`&{Sr=ykNJ#YFTr_BQwWqKF0Rj+XZ*FF3WMyu2X<=+rWnpXp1_K0hWnpXrA#kgq^`I&Z -zC?)!&R01Y?(H9FO$CR6P1%k7c67A-Xc_Cg)w39@m$R6qOEzWQ+NTC@=;5OGottJZHLg1Ujv+c;>sahi1#@&^bY%f9 -vZekPz%WEGnBZKS8(M7E9_@AwVcyGtCevi|7U8=DY;R+00(t`--)Viz@~C%8KNS}Z0aQ3s^SOqbBwN-D -{wl@OCd;@jJLYKfb7gWS-+`&{Sr=ykNJ#YFTr_BQwWqKF0S-ZPb7^O8ZDnqBRC#b^1pxp60vSPbb7^O8 -ZDnqBb3$xsZe&wsVQf@*P;_zy0RRdChyLPaScq)s9KMExvw34D6J>+NwrBxfixd_%u|$Wt0Swd4UcIF} -!D=gP*{lG^S_lNT7e3^i+oSY<(XJZneEFcgmDd% -EKc;pw+KsVi?D}qDSkO*B!5Mb*xG|_(S5o&32kL$X<<}(aAg5PFkyv=$keM8CP2si$rmim(Ekws4U>QX -M0|*v-OPCoLSb`dLvL+uX>@I6Zgd6)1!invXLAC210COKearHwcS=7M7YzYaI8*bvhMOc?)(rkC#nUE} -_h5K%L=laq&yA1JoJ^{7>oKLkF4~iax8KK|47hp-b7N>_ZDC1d0hChH+XJhss8OG%_CC-Q>(otsF+cqN -0Qy}ddQ=3E5D9c?ZDn(GVQp{#07wRDb8~fNasqk-9p7nv%krpqNb8F#&nR*hvU%Hiwm>NkB*5l*n^F-s9AWUWw-# -$_-O$8W0C`Wpi|HWpo0{EFN!zncXl9K5w2;FV{y1jDTJCC^p$-mHEbO0#qkqh9c2>uJC38-{*D7fZ(%h -Zo23R4S;p`Q9JBQllDyyLvLn+a3PW#hbaG*1bV+0d0RRU806-uB2}EIZVN-NrbY%qr00;m8KmY&$000000RR6000000 -00~8SbY*UHX>V=@3j=0mb^+R(Q4?4eR(6nw`S$_F2)vN@Mb6UJ-F(lri_dqerx4lR4>iBsz -2WM<=Vqt7^0p25#Yo@G%*b#-tU^&3KX?w7l?~*Sh8@1jRRblZzybED-b7^O8ZDnqBa{*as?yI5TY8=l| -S=)-UH4bo3Ym}-0prjaef_E>x{+|ePWn^V#ZDnKu-_NO$^@rt6M7IGITmUKjm1~>v&8b0-V>p(oz$%02 -33g#@Wo~0>Wpe@Dg=PS6VPp{$?vC--s`v@B8YHl)C#jpVFzBk!DMw8Sc42I3WMOn~asqk-9p7nv%krpq -N@L7b8`ZE -10COKearHwcS=7M7YzYaI8*bvhMOc?)(rkC#nUFsxGg*8X!CPrawgw_sqk4BX8}k^^xj-FXm+)yumJ%N -MR;^&ZgXjGZc}4uWo=;w1_*6sbYWy+bYTDq0d?d}_}|Wp0vpvv$c&#PW69R$ltr%da5t5w^x+8!q5uE@ -000000RI300000000(DmZ(?C=a{vkf)$WoGNrn+a000000RI300000000(kqWMyS-a{vheM(yUq2ps*m=2xUD -T;RqCgn#@WzFu~@adfH5^@&-|0000000000{{R30000003t@9}X=iS2Wo~qH015$z{^Dg=h-~N_zJ`Re +r?3G50uWJJaHJF7}X$37Y21E`BySDf%$MYb{T~|g0b97;JWdSa-rT!PdFhnqz;9Q#%7&o7^|1Fn59cLW!>7R25;!;BwOY}Ov_b`4?P%YY`+Wb+o`y98`+V`~C>10COKearHwcS=7M7YzYa +I8*bvhMOc?)(rkC#nUFsxGg*8X!CPrawgw_sqk4BX8}k^^xj-FXm+)yumJ%95o2#|W@%()Zggp3Y*Tb$ +bY%br0|awrVQc~+aI2y9pehZ%M2QE^S2-B&?H_1O1&4u6*^T^mbhP{|1C2;aNA(0eXS#L;%_oib8;tKC +LQ=nuAv#{`SnN;*b97;JWdSa-rT!PdFhnqz;9Q#KfZ0H=mhJ>?uVso3EIu+3*)t78850@mnbX00000000300000000008L3DIsV`xca1pxpD +002NB01H8MbYWv?Q*>c;Wd;HQX=DL}aSf9!PV~dK2uo>;u!nFdemP_$e?^hl+JkM;eY!XaZDnL>VN`i= +WdTAkVTFju)T~Wpi|4ZEyepNCs(hb9H5M0(t`--)Viz +@~C%8KNS}Z0aQ3s^SOqbBwN-D{wl@OCT*{+#r3Bk2FRnL+RBXEn8vr=x`Tq%|A_kfK&ST81_)zlVQFqo +Wpn|p9zT>IUvP{mXY}ey+|ZdtG&qC*MSg*Y`lhfb^DEW}Lug@XZcb%%0|yRbX>?<6X>LtnX>M+1bN~-x +X>?<6X>L?yb98QHbTa`DVrg_^Z)t8+Wpi|HWpp$G4Pt3@V{d70Q)y>zWpo1$Vrg_^Z)t8)WoL9{b94j^ +Y-w?IX=F`dX>M+1bOjA;X>oOFWK?BybZ%vI1`k7TZewL(Y-MCYbaY{3XaxZP2LJ#-AOHbaG*1bV+0Zp9m~TI>-W|y2ahx3nF|Vuawki#7NH?S|Q-Q!u2{b1#WL{V`TsU2n}U;bY*UHX>V>+ +d2nR`WOW`wsTH9-LlJ`2|Ay5Z(?oEikl{+~pis;@Q*TJ#2yJC_VPs)+VFC4eO*mP8`7qV21dnrCyk{{a +-lF$FG0V5TNAc?Tc{K-TY;R&=Y;ytLBav&Stb*7Pg~wnyz`1FAu$k|YFC-ha-WFA1@jtu^VRLh7XKrm} +Zgg`2S!nL7q2Ov9&rw<1inBEia8GNLssNy*7Pr5ftu@@z<*O39}j`u&O7io3b$Is?RA$O$l~kY-wa+ +bZ>G3dIKHbX?@G`sCP;~6&DQwR5(-fxrUo0ThV>*V`ybf+ +2?0j!=EDda{kY~=q$*tC#t4Le{2#tvcDZqMsmk?u=2wF+7z(Wqt=tdZk`V^ +s(Ana000000093000000000SgVQgh?V`*h`00{v`?dHP>9R0ZFSEMRj;Km4qfBYZ5UUs>0bg9bqiCNA7 +00000000300000000009c42I3WMOn~asUJZ00eGtZe;)f009JZZ*64&1pxwLa5aA+<>R2XhQO_4{AcS- +HH^7AVzASV8M4NYxyCka@1Z8)ymjIKNK5;L!8FkfGTe+FK;UUh9M-4n+}vReMR;^&ZgXjGZd7@2Wd#8M +00IL>W_ASu0006FMs;pyX<}?;Q*>c;Wds2T24ZP+b2c;p1pxp62noKLkF4~iax8KK|47hp;bZKp6b97;CZ~y>E25ED1b!Bn^w&;L{ +94K`ndk%K5+?9Jv$dw7jc}U5p5@2#$kUJ%u2xDkrX>LwsbOEg%Ka?O}aEvKu^y*67(3wRvID`L1eu0Pj +rm!gUE7k~YWprU=VRT^u^?FS>S$_F2)vN@Mb6UJ-F(lri_dqerx4lR4>iBsz2WM<=Vqt7^0p25#Yo@G% +*b#-tU^&3KX?w7l?~*Sh8@1jRRblZzybED-b7^O8ZDnqBa{*as?yI5TY8=l|S=)-UH4bo3Ym}-0prjae +f_E>x{+|hUVQgh?V`*h`0o{dW0B>Pr5ftu@@z<*O39}j`u&O7io3b$Is?RA$O$l~kY-wa+bZ>G3dIKHb +X?@G`sCP;~6&DQwR5(-fxrUo0ThvO>-_DBy8`Vb0jGrW9$=2qSMXvL3HGEG0000000000{{R30000003t@9}X=iS2Wo~qH015$z{^Dg=h-~N_zJ`Re d1EINWrM}GXaQb}6c#qIM2EQnHo-KZ`k;Xmr`<4sJYKN!!u{G5u+^j1lf!PF4>GEG0000000000{{R30 0000033g#@Wo~0>Wpe-t0Y>fS!w4MxxaL=+DqP^k2!wz9AHH68xp8!<%Jqp^&Hw-a000000RI3000000 010+sY-wa+bZ>G11OfmAZf|a7000011aog~WdH>M0%CAAe<9`Lptgpr6F_xjAC6(~TLj#*ewi -Hf`^rCgHqw;r~cW`-QV>+d2nR~0RR9314d?c1pxp60u4rW -Zf9v?Y-Lk)VRU5#0SE?SX>@ZoGynww000OKMs;pyX<}?;RC#b^0|5bs~EXcCXx(drQcb -3B`Fx$)^%va$Ar)C7cFqVR>b8F#&nR*hvU%Hiwm>NkB*5l*n^F-s9AWUWw-#$_-O$8W0C`Wpi|HWpo0{ -EFN!zncXl9K5w2;FV{y1jDTJCC^p$-mHEbO0#qkqh9c2>uJC38-{*D7fZ(%hZo23R4S;p`Q9JBQllDyr -ZDn*}WMOn+0rh%KI9Y!AFx9LCk8@hQXE7w+qW3^C%eTEp@#^?_H3w&GZ(?C=a{=BXk!z-`g4hv-$6z_Y -xoLZ_neUP>BpbEf7FA*KKfDWJb8~5DZf#|5baMe&Xzr__;A$MtQCZuHvo#KIPivH_0HCB8b%J*a{=9jW&m$tWDykZj`7#3_zANbB(SO{shhGe=&H{tM@n+a000000RI300000001IJrb7^O8ZDnqBa{vkfhyLPaScq)s9KMExvw34D6J>+N -wrBxfixd_%u|$Wt0XD%jq57bK6Q|uUfIMEX^1}Vv6tLB!)|10-o)0prc>n+a000000RI3000000010+s -Y-Mg^X=QT&2?0j!=EDda{kY~=q$*tC#t4Le{2#tvcDZqMsmk?aU=OZ$bvG|>z)+>9PT;Au-7)~D;-++hnxY;R&=Y*Tb$bY%qr015%s?vf5kh_h+&YE#h%O8d1V_{UOl -9{V;uR#^q%$8ES^HwOl>wiJc;WmI`^Wd#8M -00In0Y;R&=Y*t}xb!Bq}0RRXAGM-jZ2Kh}DE2o;HYydTtf}Q!WH{}bI!u)W*#(e~Z0RR9100000|Nj60 -000002uWmRZggpMc?AIg1p)%fEFN!zncXl9K5w2;FV{y1jDTJCC^p$-mHEbO0#qkRz9SbZ=!8X@=Yuq$ -20sb<4l#S`iz7Vef}@Ca=a#qt2m;D19&dx0-7pM3Z=O*v*GCA9fL-<|HrZsA`NnJlR3}KjBNr;@ghiU? -gEXK9KMDE{F?;HZBRuDVqlk6qmbd@_000000093F00000000F^Zg6#U1_B3ga%FZ;b#wuf5WIk~G+K)< -!&p-84^3#$9k=>5%bR49t5yk`^qQ9la%FR6a&~280(t`--)Viz@~C%8KNS}Z0aQ3s^SOqbBwN-D{wl@O -Cd;@jJLYKfb7gWS-+`&{Sr=ykNJ#YFTr_BQwWqKF0SHNMaCLM|VQ>Wj015*2Y!hN5_Bp3Y36tDMM#=e# -tGI($UA5U3KNx<*C>jbO<32;hs$B9ZCsU(1!DsC|W1LOd&b_IRG-(&Q$wPGkmB{9L9(7`0)Rt93YLV-H -LXe?vTA1;^Q1`ZqBog<<0RR9100000|Nj600000021#ykb#!wD0RRaB)s0^W44ZsX>oOFWC00HWn^h#RC#b^ -0|5hJZh8L*O=WapRC#b^1pxp60troJbYWIuY;|P?0RRX906+i$000000096000000000P0WprU=VRT^y -0RRdCb>vO>-_DBy8`Vb0jGrW9$=2qSMXvL3Hj|@I6Zgd6< -17>D+0ot2U6Id2jc94hrndMfLayEe1ISdA&%p{mB1!VWk)dg;EZewKt00;(ea8!A4WdX}UJd-&DojN<3 -_MFxkGDSwL&NBN&quehMB5_>HrR)f8WprU=VRT^vdIKHbX?@G`sCP;~6&DQwR5(-fxrUo0ThsZfv!yd427@;7veO2zMB=|GX`mHaCLNZ0(t`--)Viz@~C%8KNS}Z -0aQ3s^SOqbBwN-D{wl@OCODo$h9?yTI7S;;e;>sZfv!yd427@;7veO2zMB=|GYesJb7^O8ZDnqBa{_t; -9p7nv%krpqNWpe_010COKearHwcS=7M7YzYaI8*bvhMOc?)(rkC#nUEjudT)PryvH%qoUf% -jN6#Tx81sfg4O?s`uaep_R|IjcWHEPWpi@^dIKHbX?@G`sCP;~6&DQwR5(-fxrUo0Th -Clv)aMjKgwAH@`bu1x<7g|G$};xvA~n-$_S33g#@X=Gt^Z*l^910COKearHwcS=7M7YzYaI8*bvhMOc? -)(rkC#nUEjudT)PryvH%qoUf%jN6#Tx81sfg4O?s`uaep_R|IgPjE?O1pxpD002NB00mEQZ*_DA0|IYw -0hP$+dLDIRU(}XWLTZugenOC;Z(5k~zEJnJiX;;E#R7DB0f+wLWmt%8=p4R=gtK{LClh6Z#kObxUW*hK -HnBv9xdLu)0006IPj_x*WK(oubY)XxXk~3-1OxyJWMyM)VRB(~X?A4*00039W_507X<}?;00jX7`Sh#^ -X0AbZX4L%*5q$))*;M@wXI>IJVg&1PPwC}G0t$0Lb#i5700jX8Me3tp+xFv-0Xp&G?S=|}9rRae -U`~uMrbA>C`}q*rYXqYdo~D%m7H6OD0<^0n_2##VWXRdjy=DB@qgYOj0}5eubYWv?ZDnqB00jX7LNH;4 -h{)8d6ed8&{mBoKLkF4~iax8KK|47hp(ZeeX@0!8YhU)%QMkO4aJ;_ZeCe;xE! -X<$x_Fs4If6Z`oP*;5t>gcQkwbf~^M){{|8P%hsRk~m~ep32F151Y4WWC?U>ZDn(GVQp{#07waBWp-t3 -Z*XOD0k-IXh8!q$B6|*YuiTY;OURW8#d%1{rxIXtTaY^?oC$4ZbYWC^aAk7<3ITQGP59r=ivkZ4!V_T!KNI`QJ|h6;Zj^jB$MPK+?7Lu3>C`4HJ_1fvw5rj-B|XP@r^ -w5ufb=C_Ju$l1`nW&GEpSWb-q0000000030000000000BXKZg`VQf@+aAk7<3IWybk`76TvuW{aQ_%-X -`?VwZ$5L?~`!+pRSq0(b70Urr5zRxYEK#t?kH-RPfvS1oe0PQO`VOrdl$-fvv-}wV000000003000000 -0000AZ+C8GWK?-@Wpe-u0f+wLWmt%8=p4R=gtK{LClh6Z#kObxUW*hKHnBv9xdA0bbiTp4ZzpWVEhda; -c-OlKZN9QQ?CZI;=cI(fPVxW%000000093000000000bjVQgh?V|i40aAk7<2?0j!=EDda{kY~=q$*tC -#t4Le{2#tvcDZqMsmk?$P>NY&HCT(P)^FVARS*Zg3m2dUS* -m(weL9PhQe$_)hyWq5RDZgXjGZgT(%0c3R^La7y@JVOzJ)&GXo9MeQ_qmbcB?4VH0I#X{*-T?z>0?er0 -_e!9%6%WL6o5Q7yVM7GXa@w44CHDB`4cq_#000000093000000000Yga$#@6CZgT(%0W?w%t`n9T -UcD*&5hFi^PVx{q1b@^7zTcrn*%qZTXaRP$8)%E7`<-;ovk@YSJ+V~kNcmIwC6DJ=V=(On#Ml4;00000 -0093000000000PbWpib6c4cG&dIKHbX?@G`sCP;~6&DQwR5(-fxrUo0Th -;v2Uql0Ev@(iYu*+LHGLwE58<2vcKdWo=@6CZUzejW@dH)+M7`mSQb`x -kca!3baG*1bV+0Zp9m~TI>-W|y2ahx3nF|Vuawki#7NH?S|Q-Q -!u2{b1#WL{V`TsU2o7{|VQzD2bZKvHRC#b^0W?w%t`n9TUcD*&5hFi^PVx{q1b@^7zTcrn*%qZTXb5d( -bYWy+bYTJYdQCW4e)%xftOSp9TD)g5B;KO;Krzd=y+`rt_<1!4XKZg`VQg~&-XoD~rmTY45rxNKIl#GT -d$5`Bk}o71wcZw0Vevn_25D|^b#!w9siJyUlgOLOB};96cGdSG6&iv=7PD~jruGj4o;;a=3t@9}X=iS2 -Wo~qH0V7K5`QQxvp%1~nHeX@`*OLp!#R+y{Y-Mg^X=QT(-GycVZ((E+6z-1k*Q)pl -vl=9@swb(NvM}hX&nZVu33g#@X=Gt^Z*l^910COKearHwcS=7M7YzYaI8*bvhMOc?)(rkC#nUE}_h5K% -L=laq&yA1JoJ^{7>oKLkF4~iax8KK|47hp+cWHEPWpi@^dIKHbX?@G`sCP;~6&DQwR5(-fxrUo0ThV>qb#7#AWd;HWX>M?JbWLG! -0Tr2NWXrXyKnGOwA#t$mH2bG7pQ)aE=^FQF!@KkQh!AUTZ+C7~a$#@6CZgT(%0hP$+dLDIRU(}XW -LTZugenOC;Z(5k~zEJnJiX;;E#Q`ZqTgX&RNcu#n=_UwiF^M06JjoLIN%Gc`$lAmqrAYw*0000000960 -00000000nFa$#@6CZc}4uWo=;w1_*6sbYWy+bYTDq0d?d}_}|Wp0vpvv$c&#PW69R$ltr%da5t5w -^x+8!q5uE@000000RI300000000(DmZ(?C=a{vkf)$WoGNrn+a000000RI300000000wDpaCLNZ015$z{^Dg= -h-~N_zJ`Red1EINWrM}GXaQb}6c#qIM2EQnHo-KZ`k;Xmr`<4sJYKN!!u{G5u+^j1lf!PF4>GEG00000 -00000{{R30000003t@9}X=iS2Wo~qH015$z{^Dg=h-~N_zJ`Red1EINWrM}GXaQb}6c#qIM2EQnHo-KZ -`k;Xmr`<4sJYKN!!u{G5u+^j1lf!PF4>GEG0000000000{{R300000033g#@Wo~0>Wpe-t0Y>fS!w4Mx -xaL=+DqP^k2!wz9AHH68xp8!<%Jqp^&Hw-a000000RI3000000010+sY-wa+bZ>G11OfmAZf|a700001 -1aog~WdH>M0%CAAe<9`Lptgpr6F_xjAC6(~TLj#*ewiHf`^rCgHqw;r~cW`-Qb7^w`1pxsDzvXSG -Et_XXj-M{lb@e1rR|F?^_eg+WH6=cDl?g!s3UqQ|ZgXjLX>V=-1p)z|2rNlD$O59e#ogQsB77jPl+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#8dQ03 -Wn@8fb7^O8b3$xsZe&wsVQf@*P;_zx1ON+UWn*k%a$$67c4Yts0RRXAB%)2d$+)#qWOeU-&^BHT8-%*B -3Y<=;rA~cRW%6F~0000000000|Nj60000000SIPwZf9v?Y-Ioi0RRXAr57?J?AUubvJ5Fv?pC_?qom2p -Tb=oxFB9UYk2^CG0000000000|Nj60000000t$0Lb#i5700jX62myc1hz+(e+q|0DOh?)N_UyZE -huA*+>b)o!7M00;rn7?bqvS$Bf>-Q+C^$m`VY*=h^4IMF^Ss(Ik^>!qv!0000000030{{R3000001 -2xfI|XK7+=WdH>M00;ps(tSy%VHU7e`WnAjFrW9Z#Sgd)Lpt2{^**VE9X59W0000000030{{R3000002 -3UhRFbz^jOa%E%y1pxpE0iXL~h(7$9T>%9lJ^39m#ia|Hna2?0j!=EDda{kY~=q$*tC#t4Le{2#tvcDZqMsmk?c;Wd#8M000 +Hf`^rCgHqw;r~cW`-Qc;Wd#8M3IWybk`76TvuW{aQ_%-X +`?VwZ$5L?~`!+pRSq0(b70Uq%!}cPEJ+)wh?w~HsM>Kh32^DD>YKF13Ts`WEp!#kA000000003000000 +0000HM{I9mVQf=$VRU6vV`ybC`}q*rYXqYdo~D%m7H6OD0<^0n_2##VWXRdjy=DB@qgYOj2yJ0_Npxjxa{vGX4@YcoVqt7kbYXO5 +RC#b^1pxp60t`oNZ(?C=R$**)Wpf1q00;pxo>ox?`Aroor<$W|05z3@o%ygg4E?M+l67UG^w8*<_XZ#%uyqCrG{{ +7b@t4MVjY>G@u4Q3HlB(d+LiLJm-R=h;`?dxBvhE000000RImF0000000l{IaCLMB0taw%Wp+<>bODnP +ynwMZT8l5kSW@l}O=!>^xB4~9n`Dx!RtcK)nwJQ2Wpib6c4cG&dIKHbX?@G`sCP;~6&DQwR5(-fxrUo0 +ThRw7=FYk8VVufK10Q-T=FR=Q=>S+XYD&lVN`i=Wd#8M +00Ie3WprUyVQh6}1pxpE002M$0000000030{{R3000008O=WapWMOn+1pxpG0d?d}_}|Wp0vpvv$c&#P +W69R$ltr%da5t5w^x+8!q5%{oJdRMsrjHBJ^EIe4enz&iEACnc`NWk%>en!wdoTb1000000093000000 +000Y5V`Fu4a%FB~Wpf4s18r$;00065ZDDu-00In8a6@lxZE19EWo~o^3j=0mb^+R(Q4?4eR(6nw`MZ*F5{000OEZ*Ww3aAg4vwe)9Jc)1;Ny;KQyMvhey?Qbc}K{+YF2{;w< +&v$4DZDn*}WMOn+0(t`--)Viz@~C%8KNS}Z0aQ3s^SOqbBwN-D{wl@OCT*{+#r3Bk2FRnL+RBXEn8vr= +x`Tq%|A_kfK&ST81_x(sZ(?C=a{_t;9p7nv%krpqN0-0(t`--)Viz@~C%8 +KNS}Z0aQ3s^SOqbBwN-D{wl@OCT*{+#r3Bk2FRnL+RBXEn8vr=x`Tq%|A_kfK&ST81_^dyY-Mg^X=QT) +dIKHbX?@G`sCP;~6&DQwR5(-fxrUo0ThsZfv!yd427@; +7veO2zMB=|GYNKKY-wa+bZ>G3dIKHbX?@G`sCP;~6&DQwR5(-fxrUo0ThV1_J_bZ~>Lb=6W7=VqesjRYGc!>wZFz +p>JB4@xD;^wu&SY_r(Hqc>#z1;$>KfZ0H=mhJ>?uVM0r~W-2xhK9cV^W63=w?&L0!8YhU)%QMkO4aJ;_ZeCe;xE!X<$x_Fs4If6Z`oP*=q!&6rQG) +02XJT?*g=|B=zREie$*y(7k2+*P~cYjROi{baY{3Xl-R~bN~eb0YWfgg^0-1s}v?c$Nk9{EX~mW5dRI6 +fB-~%h??EZc?eQvWMyS-Wn={b015#{?dHP>9R0ZFSEMRj;Km4qfBYZ5UUs>0bg9bqiCNA8mB{9L9(7`0 +)Rt93YLV-HLXe?vTA1;^Q1`ZqBog<<0000000000{{R30000004pL=yWnpY(WI=RvVPj|p0t9AhY-Irn +wto`e>uZ$?1z+)WysMU3t2e*Ffe9Y;*ts5D-#jc4c8~Wn@NmZf9v?Y-I)k1$JRKwa1v8ba_B>T#2Nxy=Q)6glZD9rt17>D+0ot2U6Id2jc94hrndMfLayEe1 +ISdA&%p{mB1!VWk)dgm3VP|s!dIKHbX?@G`sCP;~6&DQwR5(-fxrUo0ThOi(W05|TJ%PM*ricn_PmXk-a=X>Db5bYX39002k{WMy_`Y;SO7asjsJfQB3>bs~EXcCXx( +drQcb3B`Fx$)^%va$Ar)C7cOuWprUwd2nTO015$hC`}q*rYXqYdo~D%m7H6OD0<^0n_2##VWXRdjy=DB@qgYOj +0000000000{{R30000003ukO^Vqt7ld2nTO015%s?vf5kh_h+&YE#h%O8d1V_{UOl9{V;uR#^q%KfZ0H=mhJ>?uV9R0ZFSEMRj;Km4qfBYZ5UUs>0bg9bqiCNA7 +00000000300000000007XJu|>b7^w{7)aIA#9XnshcC})U)TI#r3b0kyqD7}ejM+$yUGm(3T1e7Wo~n6 +Z*Fq{3ISww9zv-Vp*%wog4O?q)g04AaHEjnO6;Ie%sNwVNZtVhXadZr-SPY!h`6Z9%SYt5l1;p3@00000000300000000008a%FR6a&~28 +0(t`--)Viz@~C%8KNS}Z0aQ3s^SOqbBwN-D{wl@OCjNpJN#A(BKKz&v`r;e6DUv<<*U}cD+0ot2U6Id2jc94hrndMfLayEe1ISdA&%p{mB +1!VWk)e2*8Zgg^CV{}Pm0iOsgNjk^^qPoT1+zTRnAg`3vXv9d*8d@RXy~6c6G6imLZewKt00<6ra$#@6CZd7@2WdSr&53UoI8eY9A{1GERg--GiI0S#x1is&)M%fmnGH3{GWprU=VRT^u^?FS>S$_F2)vN@M +b6UJ-F(lri_dqerx4lR4>iBsz2WM<=Vqt7^0p25#Yo@G%*b#-tU^&3KX?w7l?~*Sh8@1jRRblZzyas7* +aCLNZ0jZ*TSChz_$|Xx}eRkFNAr%^eLl(1e@}~9=0-ijXfD2)Bb7^O8ZDnqBa{(ht>-pde{GkuQzBXTA +in>IdF&9PAZ4eqJ|JRcX$HfVDVQgh?V`*h`0o{dW0B>Pr5ftu@@z<*O39}j`u&O7io3b$Is?RA$O$l~k +Y-wa+bZ>G3dIKHbX?@G`sCP;~6&DQwR5(-fxrUo0Th@@qQ +FQ2KNd+8eYXv4en`-l*0Zf|#PRB~Z%b7^#GZ*Fq{3IUbK=6W7=VqesjRYGc!>wZFzp>JB4@xD;^wu&SY +_r(DzL|e#IO-TAgsp%#NX)%c(fjr3)`APEDlE~V`A*D$H0000000030{{R300000GRB~Z%b7^#GZ*Eg# +Xk~3-1_lUiWprU=VRT^t2?2HFP59r=ivkxis%Ku=2wF ++7z(Wqt=tdZk`V^s(Ana000000093000000000JQZg6#Ua{vkfhyLPaScq)s9KMExvw34D6J>+NwrBxf +ixd_%u|$Wt0XD%jq57bK6Q|uUfIMEX^1}Vv6tLB!)|10-o)0prc>n+a000000RI300000001IJrb7^O8 +ZDnqBa{vkfhyLPaScq)s9KMExvw34D6J>+NwrBxfixd_%u|$Wt0XD%jq57bK6Q|uUfIMEX^1}Vv6tLB! +)|10-o)0prc>n+a000000RI3000000010+sY-Mg^X=QT&2?0j!=EDda{kY~=q$*tC#t4Le{2#tvcDZqM +smk?aU=OZ$bvG|>z)+>9PT;Au-7)~D;-++hw>a$#@6C +Zd7@2Wd#8M00ItFd2nSzZ*6U9bZupBbOZwc2WMq&WpinB00jX7vJ_W)4b;Oq(9r82ndje7Ko)~URBn_V +i`WE%_0zpa0Sa_-VQzD2bZKvH00ja8p9m~TI>-W|y2ahx3nF|Vuawki#7NH?S|Q-Q!u2{b0W?w%t`n9T +UcD*&5hFi^PVx{q1b@^7zTcrn*%qZTXaWgkcywiMb7^mG00ja8p9m~TI>-W|y2ahx3nF|Vuawki#7NH? +S|Q-Q!u2{b0c3R^La7y@JVOzJ)&GXo9MeQ_qmbcB?4VH0I#X{*-WpVSaAjmcb8~5DZgWCxX>MdwWnpYo +cu;h51OxyJWMyM)VRB(~X?A4*1pxpE0VJYLy~((>QDk-Reb6>u4I6~IunL?`sHIMQRAusB@&Et;00000 +0RR6000000009VQb#7;AVr*pq1pxpE0i_o*B<$FGIkF5XQSMf{_M@c9%UhlKoi7vOr;j@`5&!@I00000 +0RR600000000IhgbaHiLbairNWB>&L00;qp&4>-QG26VF*-S^-{`TyMdwWnpYocxhw=1ON+UWn*k%a$$67c4Yts0RRXA(ioHU +?OAt%_ub?z3CQcz?b&Jzv^dc|DXMwk^XsLo0000000000|Nj60000000SIPwZf9v?Y-Ioi0RRXAEz*5S +r(qVbRr(sgSTLXWu*DC!3`08H_Vqrgg&j6`0000000000|Nj60000000t$0Lb#i5700jX62mzn_ +Vu(Kcnq2_}AwBsWF~zA4={E`N$>>@ZV#d(SIc@*|0000000960000000093AVRUq1V`yzvWpf1q00{v` +?dHP>9R0ZFSEMRj;Km4qfBYZ5UUs>0bg9bqiCNA70000000030000000000BR$**qZew{=d2nR~0RR93 +307}uWK(oubY%qr0000 -----END STRICT TYPE LIB----- diff --git a/stl/RGBCommit@0.1.0.stl b/stl/RGBCommit@0.1.0.stl index f69722de..760cfd78 100644 Binary files a/stl/RGBCommit@0.1.0.stl and b/stl/RGBCommit@0.1.0.stl differ diff --git a/stl/RGBCommit@0.1.0.sty b/stl/RGBCommit@0.1.0.sty index 3fe7bab5..338d7f9f 100644 --- a/stl/RGBCommit@0.1.0.sty +++ b/stl/RGBCommit@0.1.0.sty @@ -1,5 +1,5 @@ {- - Id: stl:FjjU0$$o-dgf5dmK-ohaEobc-Y6Vz3rp-TqLj3kS-8F7NMQQ#capsule-arthur-quest + Id: stl:n4BoS9Kd-oZ1mUgb-6Hqg9hY-q$JXa84-YoWed1a-!6AZCTM#raymond-open-organic Name: RGBCommit Version: 0.1.0 Description: Consensus commitment layer for RGB smart contracts @@ -34,7 +34,6 @@ import CommitVerify#miller-pancake-elastic import Std#ralph-blue-lucky use AsciiPrintable#ultra-sunset-format - use Bool#oxygen-complex-duet use AlphaNumLodash#percent-bingo-caesar use AlphaCapsLodash#duet-hammer-labor @@ -170,13 +169,17 @@ data AttachId : [Byte ^ 32] @mnemonic(harvard-burma-bicycle) data AttachState : id AttachId, mediaType MediaType -@mnemonic(bagel-ground-provide) +@mnemonic(stadium-stadium-vacuum) data BaseCommitment : flags CommitVerify.ReservedBytes1 , schemaId SchemaId , timestamp I64 , issuer CommitVerify.StrictHash - , layer1 Layer1 - , testnet Std.Bool + , chainNet ChainNet + +@mnemonic(ringo-fashion-enrico) +data ChainNet : bitcoinMainnet | bitcoinTestnet3 | bitcoinTestnet4 | bitcoinSignet + | bitcoinRegtest | liquidMainnet | liquidTestnet + @mnemonic(meter-arizona-albino) data ConcealedAttach : [Byte ^ 32] @@ -227,14 +230,13 @@ data FungibleState : bits64#8 U64 | (|) data FungibleType : unsigned64Bit#8 | (|) -@mnemonic(friday-cliff-ticket) +@mnemonic(bazooka-couple-summer) data Genesis : ffv Ffv , schemaId SchemaId , flags CommitVerify.ReservedBytes1 , timestamp I64 , issuer Identity - , layer1 Layer1 - , testnet Std.Bool + , chainNet ChainNet , metadata Metadata , globals GlobalState , assignments AssignmentsBlindSealTxid @@ -274,10 +276,6 @@ data InputMap : {Bitcoin.Vout -> ^ 1.. OpId} @mnemonic(sector-charlie-diagram) data Inputs : {Input} -@mnemonic(camilla-basket-justin) -data Layer1 : bitcoin | liquid - - @mnemonic(isabel-heaven-north) data MediaType : any#255 | (|) diff --git a/stl/RGBLogic@0.1.0.sta b/stl/RGBLogic@0.1.0.sta index c3f6662b..1ad80616 100644 --- a/stl/RGBLogic@0.1.0.sta +++ b/stl/RGBLogic@0.1.0.sta @@ -1,14 +1,14 @@ -----BEGIN STRICT TYPE LIB----- -Id: stl:iLZ2rLhr-oAp7rHh-cX2LO3T-7evttnL-KT6MX!V-m64WEyQ#janet-mineral-phone +Id: stl:HffUFU0Z-oNyZXNs-O8u1dRc-Q4Z5mOo-3bqPppu-A0f5iTo#permit-helena-lorenzo Name: RGBLogic Dependencies: - RGBCommit#capsule-arthur-quest, BPCore#symbol-tropic-grand, + RGBCommit#raymond-open-organic, Bitcoin#signal-color-cipher -Check-SHA256: 3d7cbf9634aff9423e3c6eb8faf367617888cd6e7a7387d53f82a282dd881436 +Check-SHA256: 8d34caed4e853c7151edddfda253ec77aa3b73ceda15091820cb27240a0f5a81 -2vSEvOmAmtV*?gA)YJdyb_e-(VyK0oC~d|%S3T>cI*X5a67XKlF$4)xM?ynyZEb0EA#kgq^`I&ZzC?)! -&R01Y?(H9FO$CR6P1%k7c67A-20~CnZ*pbzY!hN5_Bp3Y36tDMM#=e#tGI($UA5U3KNx<*C>ja}LTPkk +2vSEvOmAmtV*?>@tD*IvDh<9wi3iSCIT-HkA81Vlhk;Gmjr?|WwEPA_P(yEWWuJg(OVXX8on}%7`W~n~ +g^Ir=cD&(=7J1!T`=A*KGYL{hLPKwDZE1A%Y!hN5_Bp3Y36tDMM#=e#tGI($UA5U3KNx<*C>ja}LTPkk Z)t7=20~CnZ*pY?00DdlT>wB!7L}MA7sFvK#<=RP4S#T1Vv-hhTICs&5fM~jaB^jIPH$voP+@X(Ze?;0 wjY>38tto&d&=eG4cRAF#( @@ -24,15 +24,15 @@ iRT*14O40w5C%+Pd1Z1jmB{9L9(7`0)Rt93YLV-HLXe?vTA1;^Q1`ZqBog<<1W#~DWCZ{SL}Fu5a&K>D n*!v8^Ea7rh?dzC2n+%RZ*X#DbN~eb0wHj#q4l6D4ZcK)2hLYH81C&KXiWu&flb+s{C0G-{6|jDT+rxD K6vW;JU&?LxLM72H?wDC1Zo}=N}D)4mkCE~Z(?C=PjX}i0tIhyPjX}dBrRR>2@LcryZYc>)$V)YJdyb_e-(VyK0oC~d|%S3T>cI*X5a67XKl -F$83F9zv-Vp*%wog4O?q)g04AaHEjnO6;Ie%sNwVNZti*Z*F5{000OCZ*Xa30v0&b)Bosp2l;klsD+^@ -ZN@rRJ?o`9i;sB{@LtU^1eM6@6CZU6=Z -2X|?7Ze??G0gF(#a06?0nLd|SC|>c2?4}E((!U1rl;i3pNx$ZJGXivZ0v0&b)Bosp2l;klsD+^@ZN@rR -J?o`9i;sB{@LtU^1T<0)t`n9TUcD*&5hFi^PVx{q1b@^7zTcrn*%qZTXa#O>ZewKt00;zcaA{-$7C6+? -|LArH`F3Kcg`p^I#yVF$>!mu2k9iXCUd=HCmB{9L9(7`0)Rt93YLV-HLXe?vTA1;^Q1`ZqBog<<3Rh`# +w{Qb%c9}kxS14ZbiR`8eq|(0z@s#80B}u>LcryZYc>@6CZU6=Z +2X|?7Ze??G0gF(#a06?0nLd|SC|>c2?4}E((!U1rl;i3pNx$ZJGXivZ0-u0rOVXX8on}%7`W~n~g^Ir= +cD&(=7J1!T`=A*KGc-~Ut`n9TUcD*&5hFi^PVx{q1b@^7zTcrn*%qZTXa#O>ZewKt00;zcaA{-$pMYpf +(w(85W>NmB{9L9(7`0)Rt93YLV-HLXe?vTA1;^Q1`ZqBog<<3Rh`# Ze??GPjX}g1ONwVXKrtDWn=&V009VLa${&|c4cG$00067ZE0?0WB>&L0bJY;BNZ=sBHM?<`J6+Fr=A!mu2k9iXCUd=HCdBoUB2y8Zom7+;NN8Xgkb3WeV)QDb*=NiflQ)(Iz254nzXJ~W)00aqiX>Db5 +EJ!(G_IUTS%E$nK5(5czWo~p~bZK^F0000AS7~%^Wpi^-Z*v9%25ez@WpXhBpMYpf(w(85W>NdBoUB2y8Zom7+;NN8Xgkb3WeV)QDb*=NiflQ)(Iz254nzXJ~W)00aqiX>Db5 bYX39002k -----END STRICT TYPE LIB----- diff --git a/stl/RGBLogic@0.1.0.stl b/stl/RGBLogic@0.1.0.stl index 7312516a..2fdb92b3 100644 Binary files a/stl/RGBLogic@0.1.0.stl and b/stl/RGBLogic@0.1.0.stl differ diff --git a/stl/RGBLogic@0.1.0.sty b/stl/RGBLogic@0.1.0.sty index 6a4672b3..89df3e38 100644 --- a/stl/RGBLogic@0.1.0.sty +++ b/stl/RGBLogic@0.1.0.sty @@ -1,5 +1,5 @@ {- - Id: stl:iLZ2rLhr-oAp7rHh-cX2LO3T-7evttnL-KT6MX!V-m64WEyQ#janet-mineral-phone + Id: stl:HffUFU0Z-oNyZXNs-O8u1dRc-Q4Z5mOo-3bqPppu-A0f5iTo#permit-helena-lorenzo Name: RGBLogic Version: 0.1.0 Description: Consensus logic layer for RGB smart contracts @@ -11,12 +11,6 @@ @context typelib RGBLogic -import RGBCommit#capsule-arthur-quest - use TransitionType#picture-reflex-brigade - use ExtensionType#apropos-scoop-viva - use Layer1#camilla-basket-justin - use OpId#picnic-single-gloria - import BPCore#symbol-tropic-grand use TapretNodePartner#roger-member-educate use TapretProof#marco-border-sample @@ -24,6 +18,12 @@ import BPCore#symbol-tropic-grand use TapretRightBranch#miracle-patriot-touch use OpretProof#good-village-flex +import RGBCommit#raymond-open-organic + use TransitionType#picture-reflex-brigade + use ExtensionType#apropos-scoop-viva + use Layer1#camilla-basket-justin + use OpId#picnic-single-gloria + import Bitcoin#signal-color-cipher use ScriptBytes#equator-cockpit-gong use TapNodeHash#paprika-amanda-hunter diff --git a/stl/Transition.vesper b/stl/Transition.vesper index 5839d8c4..80a7fa49 100644 --- a/stl/Transition.vesper +++ b/stl/Transition.vesper @@ -19,8 +19,7 @@ OpCommitment rec schemaId bytes len=32 aka=SchemaId timestamp is I64 issuer bytes len=32 aka=StrictHash - layer1 enum Layer1 bitcoin=0 liquid=1 - testnet enum Bool false=0 true=1 + chainNet enum ChainNet bitcoinMainnet=0 bitcoinTestnet3=1 bitcoinTestnet4=2 bitcoinSignet=3 bitcoinRegtest=4 liquidMainnet=5 liquidTestnet=6 transition tuple tag=1 _ bytes len=32 aka=ContractId _ is U16 aka=TransitionType