diff --git a/.rustfmt.toml b/.rustfmt.toml index 9017cd7..6d14899 100644 --- a/.rustfmt.toml +++ b/.rustfmt.toml @@ -1,5 +1,5 @@ edition = "2021" -version = "Two" +style_edition = "2021" max_width = 100 array_width = 100 diff --git a/Cargo.lock b/Cargo.lock index 2b691cd..b764046 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4,9 +4,8 @@ version = 3 [[package]] name = "aluvm" -version = "0.11.0-beta.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db04c1d697d7f5b86d935bfe06cfd0310fd8a6c491b043118bec228597dcede9" +version = "0.11.0-beta.9" +source = "git+https://github.com/AluVM/rust-aluvm?branch=develop#7adf61dbe4a3b39834bc3d665800024d66658e9c" dependencies = [ "amplify", "ascii-armor", @@ -34,7 +33,6 @@ dependencies = [ "amplify_num", "amplify_syn", "ascii", - "rand", "serde", "stringly_conversions", "wasm-bindgen", @@ -101,9 +99,9 @@ dependencies = [ [[package]] name = "arrayref" -version = "0.3.8" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d151e35f61089500b617991b791fc8bfd237ae50cd5950803758a179b41e67a" +checksum = "76a2e8124351fda1ef8aaaa3bbd7ebbcb486bbcd4225aca0aa0d84bb2db8fecb" [[package]] name = "arrayvec" @@ -135,9 +133,9 @@ dependencies = [ [[package]] name = "autocfg" -version = "1.3.0" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0" +checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" [[package]] name = "baid64" @@ -173,10 +171,20 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d86b93f97252c47b41663388e6d155714a9d0c398b99f1005cbc5f978b29f445" [[package]] -name = "bitcoin-private" -version = "0.1.0" +name = "bitcoin-io" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "340e09e8399c7bd8912f495af6aa58bea0c9214773417ffaa8f6460f93aaee56" + +[[package]] +name = "bitcoin_hashes" +version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73290177011694f38ec25e165d0387ab7ea749a4b81cd4c80dae5988229f7a57" +checksum = "bb18c03d0db0247e147a21a6faafd5a7eb851c743db062de72018b6b7e8e4d16" +dependencies = [ + "bitcoin-io", + "hex-conservative", +] [[package]] name = "bitflags" @@ -214,8 +222,8 @@ dependencies = [ [[package]] name = "bp-consensus" -version = "0.11.0-beta.8" -source = "git+https://github.com/BP-WG/bp-core?branch=develop#6ae56d5a005f0e0fc761516fb96c2c47bb13de46" +version = "0.11.0-beta.9" +source = "git+https://github.com/BP-WG/bp-core?branch=develop#0f591b4bcbd16d4bab3c9fe7134b9eaf8d397023" dependencies = [ "amplify", "chrono", @@ -228,8 +236,8 @@ dependencies = [ [[package]] name = "bp-core" -version = "0.11.0-beta.8" -source = "git+https://github.com/BP-WG/bp-core?branch=develop#6ae56d5a005f0e0fc761516fb96c2c47bb13de46" +version = "0.11.0-beta.9" +source = "git+https://github.com/BP-WG/bp-core?branch=develop#0f591b4bcbd16d4bab3c9fe7134b9eaf8d397023" dependencies = [ "amplify", "bp-consensus", @@ -246,8 +254,8 @@ dependencies = [ [[package]] name = "bp-dbc" -version = "0.11.0-beta.8" -source = "git+https://github.com/BP-WG/bp-core?branch=develop#6ae56d5a005f0e0fc761516fb96c2c47bb13de46" +version = "0.11.0-beta.9" +source = "git+https://github.com/BP-WG/bp-core?branch=develop#0f591b4bcbd16d4bab3c9fe7134b9eaf8d397023" dependencies = [ "amplify", "base85", @@ -260,9 +268,8 @@ dependencies = [ [[package]] name = "bp-invoice" -version = "0.11.0-beta.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f29c4f672b4b82ce7a218b2900254ac8e4b15b0022ed13abffa722571e73d375" +version = "0.11.0-beta.9" +source = "git+https://github.com/BP-WG/bp-std?branch=develop#b83739dc1ee3299a85f4cb040e061597dd9be2db" dependencies = [ "amplify", "bech32", @@ -272,8 +279,8 @@ dependencies = [ [[package]] name = "bp-seals" -version = "0.11.0-beta.8" -source = "git+https://github.com/BP-WG/bp-core?branch=develop#6ae56d5a005f0e0fc761516fb96c2c47bb13de46" +version = "0.11.0-beta.9" +source = "git+https://github.com/BP-WG/bp-core?branch=develop#0f591b4bcbd16d4bab3c9fe7134b9eaf8d397023" dependencies = [ "amplify", "baid64", @@ -300,9 +307,9 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "cc" -version = "1.1.16" +version = "1.1.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e9d013ecb737093c0e86b151a7b837993cf9ec6c502946cfb44bedc392421e0b" +checksum = "b16803a61b81d9eabb7eae2588776c4c1e584b738ede45fdbb4c972cec1e9945" dependencies = [ "shlex", ] @@ -330,9 +337,8 @@ dependencies = [ [[package]] name = "commit_encoding_derive" -version = "0.11.0-beta.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea07c5ad73a637276dc4f8a957f8285764018d45bdefef35eb9137f32d0e3c81" +version = "0.11.0-beta.9" +source = "git+https://github.com/LNP-BP/client_side_validation?branch=develop#4015f1fb9e99fdc536c69b957fa5727da9cfa6a9" dependencies = [ "amplify", "amplify_syn", @@ -343,9 +349,8 @@ dependencies = [ [[package]] name = "commit_verify" -version = "0.11.0-beta.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82a1982dc6c54d2dcfa2bf4398d97e4e80a93f24d2537e58d6110b2b272cff0c" +version = "0.11.0-beta.9" +source = "git+https://github.com/LNP-BP/client_side_validation?branch=develop#4015f1fb9e99fdc536c69b957fa5727da9cfa6a9" dependencies = [ "amplify", "commit_encoding_derive", @@ -382,9 +387,9 @@ checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" [[package]] name = "cpufeatures" -version = "0.2.13" +version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51e852e6dc9a5bed1fae92dd2375037bf2b768725bf3be87811edee3249d09ad" +checksum = "608697df725056feaccfa42cffdaeeec3fccc4ffc38358ecd19b243e716a78e0" dependencies = [ "libc", ] @@ -421,12 +426,6 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" -[[package]] -name = "fast32" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "27ea9bdb2356e5a92403cf23ac493f9b43bd71e4ffd0f800862b841dd723994c" - [[package]] name = "fluent-uri" version = "0.1.4" @@ -471,9 +470,9 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.14.5" +version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" +checksum = "1e087f84d4f86bf4b218b927129862374b72199ae7d8657835f1e89000eea4fb" [[package]] name = "heck" @@ -481,11 +480,20 @@ version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" +[[package]] +name = "hex-conservative" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5313b072ce3c597065a808dbf612c4c8e8590bdbf8b579508bf7a762c5eae6cd" +dependencies = [ + "arrayvec", +] + [[package]] name = "iana-time-zone" -version = "0.1.60" +version = "0.1.61" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7ffbb5a1b541ea2561f8c41c087286cc091e21e556a4f09a8f6cbf17b69b141" +checksum = "235e081f3925a06703c2d0117ea8b91f042756fd6e7a6e5d901e8ca1a996b220" dependencies = [ "android_system_properties", "core-foundation-sys", @@ -506,12 +514,13 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.5.0" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68b900aa2f7301e21c36462b170ee99994de34dff39a4a6a528e80e7376d07e5" +checksum = "707907fe3c25f5424cce2cb7e1cbcafee6bdbe735ca90ef77c29e84591e5b9da" dependencies = [ "equivalent", "hashbrown", + "serde", ] [[package]] @@ -522,18 +531,18 @@ checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" [[package]] name = "js-sys" -version = "0.3.70" +version = "0.3.72" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1868808506b929d7b0cfa8f75951347aa71bb21144b7791bae35d9bccfcfe37a" +checksum = "6a88f1bda2bd75b0452a14784937d796722fdebfe50df998aeb3f0b7603019a9" dependencies = [ "wasm-bindgen", ] [[package]] name = "libc" -version = "0.2.158" +version = "0.2.160" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8adc4bb1803a324070e64a98ae98f38934d91957a99cfb3a43dcbc01bc56439" +checksum = "f0b21006cd1874ae9e650973c565615676dc4a274c965bb0a73796dac838ce4f" [[package]] name = "log" @@ -547,12 +556,6 @@ version = "2.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" -[[package]] -name = "mime" -version = "0.3.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" - [[package]] name = "minicov" version = "0.3.5" @@ -571,9 +574,9 @@ checksum = "f2b8f3a258db515d5e91a904ce4ae3f73e091149b90cadbdb93d210bee07f63b" [[package]] name = "nonasync" -version = "0.1.0" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94a84b7c873630913f738950f17412b9d5b24cad6866b98b802253f8cbbefabb" +checksum = "4b1005555d351f593bf72ffc3a89a0d42e243df004d2c4ded17699f10b562b98" dependencies = [ "amplify", ] @@ -589,9 +592,9 @@ dependencies = [ [[package]] name = "once_cell" -version = "1.19.0" +version = "1.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" +checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" [[package]] name = "paste" @@ -616,9 +619,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.86" +version = "1.0.88" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77" +checksum = "7c3a7fc5db1e57d5a779a352c8cdb57b29aa4c40cc69c3a68a7fedc815fbf2f9" dependencies = [ "unicode-ident", ] @@ -664,18 +667,17 @@ dependencies = [ [[package]] name = "rgb-core" -version = "0.11.0-beta.8" -source = "git+https://github.com/RGB-WG/rgb-core?branch=develop#0450760dbae554de0d7623691aed7630f1b60a60" +version = "0.11.0-beta.9" +source = "git+https://github.com/RGB-WG/rgb-core?branch=feat/fungible-nonconf#9c6f3fee4ac573380c0ed8658d644fc5a7cfc533" dependencies = [ "aluvm", "amplify", "baid64", + "base64", "bp-core", "chrono", "commit_verify", "getrandom", - "mime", - "secp256k1-zkp", "serde", "single_use_seals", "strict_encoding", @@ -705,14 +707,13 @@ dependencies = [ [[package]] name = "rgb-invoice" -version = "0.11.0-beta.8" -source = "git+https://github.com/RGB-WG/rgb-std?branch=develop#796312c89122607ff77dd41c5cffeb34db472d34" +version = "0.11.0-beta.9" +source = "git+https://github.com/RGB-WG/rgb-std?branch=feat/fungible-nonconf#0bf8c97606d081b65a6d74f21f854c997246bf8d" dependencies = [ "amplify", "baid64", "bp-core", "bp-invoice", - "fast32", "fluent-uri", "indexmap", "percent-encoding", @@ -720,13 +721,12 @@ dependencies = [ "rgb-core", "serde", "strict_encoding", - "strict_types", ] [[package]] name = "rgb-std" -version = "0.11.0-beta.8" -source = "git+https://github.com/RGB-WG/rgb-std?branch=develop#796312c89122607ff77dd41c5cffeb34db472d34" +version = "0.11.0-beta.9" +source = "git+https://github.com/RGB-WG/rgb-std?branch=feat/fungible-nonconf#0bf8c97606d081b65a6d74f21f854c997246bf8d" dependencies = [ "aluvm", "amplify", @@ -780,10 +780,11 @@ checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294" [[package]] name = "secp256k1" -version = "0.29.0" +version = "0.30.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e0cc0f1cf93f4969faf3ea1c7d8a9faed25918d96affa959720823dfe86d4f3" +checksum = "b50c5943d326858130af85e049f2661ba3c78b26589b8ab98e65e80ae44a1252" dependencies = [ + "bitcoin_hashes", "rand", "secp256k1-sys", "serde", @@ -791,54 +792,31 @@ dependencies = [ [[package]] name = "secp256k1-sys" -version = "0.10.0" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1433bd67156263443f14d603720b082dd3121779323fce20cba2aa07b874bc1b" +checksum = "d4387882333d3aa8cb20530a17c69a3752e97837832f34f6dccc760e715001d9" dependencies = [ "cc", ] -[[package]] -name = "secp256k1-zkp" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52a44aed3002b5ae975f8624c5df3a949cfbf00479e18778b6058fcd213b76e3" -dependencies = [ - "bitcoin-private", - "rand", - "secp256k1", - "secp256k1-zkp-sys", - "serde", -] - -[[package]] -name = "secp256k1-zkp-sys" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c6eea7919e0cab992510edfbf40bd9342c0a3c2bb910f2c51355c2cb2d69839" -dependencies = [ - "cc", - "secp256k1-sys", -] - [[package]] name = "serde" -version = "1.0.209" +version = "1.0.210" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99fce0ffe7310761ca6bf9faf5115afbc19688edd00171d81b1bb1b116c63e09" +checksum = "c8e3592472072e6e22e0a54d5904d9febf8508f65fb8552499a1abc7d1078c3a" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.209" +version = "1.0.210" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5831b979fd7b5439637af1752d535ff49f4860c0f341d1baeb6faf0f4242170" +checksum = "243902eda00fad750862fc144cea25caca5e20d615af0a81bee94ca738f1df1f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] @@ -855,9 +833,9 @@ dependencies = [ [[package]] name = "serde_spanned" -version = "0.6.7" +version = "0.6.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb5b1b31579f3811bf615c144393417496f152e12ac8b7663bf664f4a815306d" +checksum = "87607cb1398ed59d48732e575a4c28a7a8ebf2454b964fe3f224f2afc07909e1" dependencies = [ "serde", ] @@ -904,9 +882,8 @@ checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" [[package]] name = "single_use_seals" -version = "0.11.0-beta.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1a4c51f21507cf63984c367507f281215073e85b08711ed7da4fc63dbd709e0" +version = "0.11.0-beta.9" +source = "git+https://github.com/LNP-BP/client_side_validation?branch=develop#4015f1fb9e99fdc536c69b957fa5727da9cfa6a9" dependencies = [ "amplify_derive", ] @@ -939,9 +916,8 @@ dependencies = [ [[package]] name = "strict_types" -version = "2.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f16e8855a575633815f01482ac927ebaca3d2485aec8e17226c6826de29154e" +version = "2.7.1" +source = "git+https://github.com/strict-types/strict-types?branch=develop#729a4f86d25dfcea15ed15bbeb1e027473401c58" dependencies = [ "amplify", "ascii-armor", @@ -981,9 +957,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.77" +version = "2.0.79" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f35bcdf61fd8e7be6caf75f429fdca8beb3ed76584befb503b1569faee373ed" +checksum = "89132cd0bf050864e1d38dc3bbc07a0eb8e7530af26344d3d2bbbef83499f590" dependencies = [ "proc-macro2", "quote", @@ -992,22 +968,22 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.63" +version = "1.0.64" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0342370b38b6a11b6cc11d6a805569958d54cfa061a29969c3b5ce2ea405724" +checksum = "d50af8abc119fb8bb6dbabcfa89656f46f84aa0ac7688088608076ad2b459a84" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.63" +version = "1.0.64" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4558b58466b9ad7ca0f102865eccc95938dca1a74a856f2b57b6629050da261" +checksum = "08904e7672f5eb876eaaf87e0ce17857500934f4981c4a0ab2b4aa98baac7fc3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] @@ -1033,9 +1009,9 @@ dependencies = [ [[package]] name = "toml_edit" -version = "0.22.20" +version = "0.22.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "583c44c02ad26b0c3f3066fe629275e50627026c51ac2e595cca4c230ce1ce1d" +checksum = "4ae48d6208a266e853d946088ed816055e556cc6028c5e8e2b84d9fa5dd7c7f5" dependencies = [ "indexmap", "serde", @@ -1052,9 +1028,9 @@ checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" [[package]] name = "unicode-ident" -version = "1.0.12" +version = "1.0.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" +checksum = "e91b56cd4cadaeb79bbf1a5645f6b4f8dc5bde8834ad5894a8db35fda9efa1fe" [[package]] name = "unsafe-libyaml" @@ -1096,9 +1072,9 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.93" +version = "0.2.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a82edfc16a6c469f5f44dc7b571814045d60404b55a0ee849f9bcfa2e63dd9b5" +checksum = "128d1e363af62632b8eb57219c8fd7877144af57558fb2ef0368d0087bddeb2e" dependencies = [ "cfg-if", "once_cell", @@ -1107,24 +1083,24 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.93" +version = "0.2.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9de396da306523044d3302746f1208fa71d7532227f15e347e2d93e4145dd77b" +checksum = "cb6dd4d3ca0ddffd1dd1c9c04f94b868c37ff5fac97c30b97cff2d74fce3a358" dependencies = [ "bumpalo", "log", "once_cell", "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-futures" -version = "0.4.43" +version = "0.4.45" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61e9300f63a621e96ed275155c108eb6f843b6a26d053f122ab69724559dc8ed" +checksum = "cc7ec4f8827a71586374db3e87abdb5a2bb3a15afed140221307c3ec06b1f63b" dependencies = [ "cfg-if", "js-sys", @@ -1134,9 +1110,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.93" +version = "0.2.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "585c4c91a46b072c92e908d99cb1dcdf95c5218eeb6f3bf1efa991ee7a68cccf" +checksum = "e79384be7f8f5a9dd5d7167216f022090cf1f9ec128e6e6a482a2cb5c5422c56" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -1144,28 +1120,28 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.93" +version = "0.2.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "afc340c74d9005395cf9dd098506f7f44e38f2b4a21c6aaacf9a105ea5e1e836" +checksum = "26c6ab57572f7a24a4985830b120de1594465e5d500f24afe89e16b4e833ef68" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.93" +version = "0.2.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c62a0a307cb4a311d3a07867860911ca130c3494e8c2719593806c08bc5d0484" +checksum = "65fc09f10666a9f147042251e0dda9c18f166ff7de300607007e96bdebc1068d" [[package]] name = "wasm-bindgen-test" -version = "0.3.43" +version = "0.3.45" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68497a05fb21143a08a7d24fc81763384a3072ee43c44e86aad1744d6adef9d9" +checksum = "d381749acb0943d357dcbd8f0b100640679883fcdeeef04def49daf8d33a5426" dependencies = [ "console_error_panic_hook", "js-sys", @@ -1178,20 +1154,20 @@ dependencies = [ [[package]] name = "wasm-bindgen-test-macro" -version = "0.3.43" +version = "0.3.45" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b8220be1fa9e4c889b30fd207d4906657e7e90b12e0e6b0c8b8d8709f5de021" +checksum = "c97b2ef2c8d627381e51c071c2ab328eac606d3f69dd82bcbca20a9e389d95f0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] name = "web-sys" -version = "0.3.70" +version = "0.3.72" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26fdeaafd9bd129f65e7c031593c24d62186301e0c72c8978fa1678be7d532c0" +checksum = "f6488b90108c040df0fe62fa815cbdee25124641df01814dd7282749234c6112" dependencies = [ "js-sys", "wasm-bindgen", @@ -1290,9 +1266,9 @@ checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" [[package]] name = "winnow" -version = "0.6.18" +version = "0.6.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68a9bda4691f099d435ad181000724da8e5899daa10713c2d432552b9ccd3a6f" +checksum = "36c1fec1a2bb5866f07c25f68c26e565c4c200aebb96d7e55710c19d3e8ac49b" dependencies = [ "memchr", ] @@ -1315,5 +1291,5 @@ checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", ] diff --git a/Cargo.toml b/Cargo.toml index faa846b..dae1bc9 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -22,14 +22,15 @@ name = "ifaces" [dependencies] amplify = "4.7.0" strict_encoding = "2.7.0" -strict_types = "2.7.0" -aluvm = "0.11.0-beta.8" -bp-core = "0.11.0-beta.8" -rgb-std = { version = "0.11.0-beta.8" } +strict_types = "2.7.1" +aluvm = "0.11.0-beta.9" +bp-core = "0.11.0-beta.9" +rgb-std = { version = "0.11.0-beta.9" } chrono = "0.4.38" serde_crate = { package = "serde", version = "1.0", optional = true } serde_json = "1.0" sha2 = "0.10.8" +rand = "0.8.5" [features] default = [] @@ -49,10 +50,15 @@ wasm-bindgen-test = "0.3" features = ["all"] [patch.crates-io] +commit_verify = { git = "https://github.com/LNP-BP/client_side_validation", branch = "develop" } +single_use_seals = { git = "https://github.com/LNP-BP/client_side_validation", branch = "develop" } +strict_types = { git = "https://github.com/strict-types/strict-types", branch = "develop" } +aluvm = { git = "https://github.com/AluVM/rust-aluvm", branch = "develop" } bp-consensus = { git = "https://github.com/BP-WG/bp-core", branch = "develop" } bp-dbc = { git = "https://github.com/BP-WG/bp-core", branch = "develop" } bp-seals = { git = "https://github.com/BP-WG/bp-core", branch = "develop" } bp-core = { git = "https://github.com/BP-WG/bp-core", branch = "develop" } -rgb-core = { git = "https://github.com/RGB-WG/rgb-core", branch = "develop" } -rgb-invoice = { git = "https://github.com/RGB-WG/rgb-std", branch = "develop" } -rgb-std = { git = "https://github.com/RGB-WG/rgb-std", branch = "develop" } +bp-invoice = { git = "https://github.com/BP-WG/bp-std", branch = "develop" } +rgb-core = { git = "https://github.com/RGB-WG/rgb-core", branch = "feat/fungible-nonconf" } +rgb-invoice = { git = "https://github.com/RGB-WG/rgb-std", branch = "feat/fungible-nonconf" } +rgb-std = { git = "https://github.com/RGB-WG/rgb-std", branch = "feat/fungible-nonconf" } diff --git a/interfaces/RGBStd.con b/interfaces/IfaceStd.con similarity index 81% rename from interfaces/RGBStd.con rename to interfaces/IfaceStd.con index c80170d..ec5f61f 100644 --- a/interfaces/RGBStd.con +++ b/interfaces/IfaceStd.con @@ -11,12 +11,12 @@ interface NamedAsset @version(1) -@id(rgb:ifc:VPnE3vly-SyuCUze-soMpdCb-jvSuziU-M!dOCU!-QBt6KVA#pierre-night-plate) +@id(rgb:ifc:Pk1UAgh!-AqsJDMT-wXTOGpZ-HUhm5GG-lcouewH-y0O02Jw#sting-strong-clinic) @developer("ssi:LZS1ux-gjD9nXPF-OcetUUkW-6r3uSCS6-aQhs9W5f-8JE7w") @timestamp(1711405444) interface RenameableAsset - public updateRight: Rights + public updateRight: 2D!!4C8N-5bRs!A$-hHvf98G-HHjZddM-a3p7qK8-QJkznmw#toga-natural-solo -- type name unknown genesis: override assigns: updateRight @@ -29,13 +29,13 @@ interface RenameableAsset @version(1) -@id(rgb:ifc:13N6PRwT-T68!FGY-lBwX2cm-qesgJ11-j0nQkM1-WSCJFj4#ariel-gizmo-evita) +@id(rgb:ifc:hZaUz4ZH-mPU9R9Y-I7qG!53-I8!NOUC-0LXnEIe-1MucQ5k#koala-pamela-elvis) @developer("ssi:LZS1ux-gjD9nXPF-OcetUUkW-6r3uSCS6-aQhs9W5f-8JE7w") @timestamp(1711405444) interface FungibleAsset global issuedSupply: RGBContract.Amount - owned assetOwner(*): Zk64 + owned assetOwner(*): RGBContract.Amount error issuedMismatch "supply specified as a global parameter doesn't match the issued supply allocated to the asset owners" @@ -55,12 +55,12 @@ interface FungibleAsset @version(1) -@id(rgb:ifc:w3Lk9Mt3-gKt$n5y-TYpVGg0-IDpK0p9-sHQ!hb6-m2Qr3a0#unicorn-reward-ladder) +@id(rgb:ifc:wnxf4Z$M-2y2Vzfr-NRdRQ6C-ffRuO5C-NBOp8YC-4TgxicY#data-avalon-select) @developer("ssi:LZS1ux-gjD9nXPF-OcetUUkW-6r3uSCS6-aQhs9W5f-8JE7w") @timestamp(1711405444) interface FixedAsset - owned assetOwner(+): Zk64 + owned assetOwner(+): RGBContract.Amount genesis: override errors: issuedMismatch @@ -68,7 +68,7 @@ interface FixedAsset @version(1) -@id(rgb:ifc:vOVfWwQ7-2TDwbAN-36Yrvum-8nAF$lT-vNzw!Zt-7ZmBGR0#ammonia-antonio-norway) +@id(rgb:ifc:8Oi9U9aP-Mq0Kp8p-bdbMkX1-8I0iQoD-JJysp41-1gdT2vE#quick-next-alfred) @developer("ssi:LZS1ux-gjD9nXPF-OcetUUkW-6r3uSCS6-aQhs9W5f-8JE7w") @timestamp(1711405444) interface BurnableAsset @@ -77,7 +77,7 @@ interface BurnableAsset global burnConsignmentUrl(?): RGBContract.Details global burnedSupply(*): RGBContract.Amount - public burnRight(+): Rights + public burnRight(+): 2D!!4C8N-5bRs!A$-hHvf98G-HHjZddM-a3p7qK8-QJkznmw#toga-natural-solo -- type name unknown error invalidBurnProof "the provided proof of reserves is invalid" @@ -94,16 +94,14 @@ interface BurnableAsset @version(1) -@id(rgb:ifc:0RhF!uRt-geU8$Hc-hvvG6j4-e1wxCwQ-CWBtpfB-gZIIY6s#brazil-olympic-marvin) +@id(rgb:ifc:S$$GZfKR-5MW7JvR-baQ51QK-tZfh1R7-lqOT$UG-v8Tw0zM#trick-jump-cigar) @developer("ssi:LZS1ux-gjD9nXPF-OcetUUkW-6r3uSCS6-aQhs9W5f-8JE7w") @timestamp(1711405444) interface InflatableAsset - meta allowedInflation: RGBContract.Amount - global issuedSupply(+): RGBContract.Amount global maxSupply: RGBContract.Amount - public inflationAllowance(*): Zk64 + public inflationAllowance(*): RGBContract.Amount error inflationExceedsAllowance "you try to issue more assets than allowed by the contract terms" @@ -117,7 +115,6 @@ interface InflatableAsset transition issue: required, abstract errors: inflationExceedsAllowance, issuedMismatch - meta: allowedInflation globals: issuedSupply assigns: assetOwner(*), inflationAllowance(*) default: assetOwner @@ -125,13 +122,13 @@ interface InflatableAsset @version(1) -@id(rgb:ifc:azoYYtyN-hzAFPrJ-8zqI$HJ-14PRdSK-YrUQL2v-ccJC6Bk#tractor-scorpio-mineral) +@id(rgb:ifc:rgZRKBo2-yq3st3z-4vzl8qC-6QEJa4d-jlQohA4-goyHmSI#singer-stone-shannon) @developer("ssi:LZS1ux-gjD9nXPF-OcetUUkW-6r3uSCS6-aQhs9W5f-8JE7w") @timestamp(1711405444) interface ReplaceableAsset global replacedSupply(*): RGBContract.Amount - public replaceRight(+): Rights + public replaceRight(+): 2D!!4C8N-5bRs!A$-hHvf98G-HHjZddM-a3p7qK8-QJkznmw#toga-natural-solo -- type name unknown genesis: override assigns: replaceRight(+) @@ -146,14 +143,14 @@ interface ReplaceableAsset @version(1) -@id(rgb:ifc:cqaDYTzY-SR6opg8-yAwXW23-QH5ge!v-KJK8kzy-xqGZ4gI#cake-museum-karl) +@id(rgb:ifc:Ytoy2M11-IZleJ$q-94pFy0e-YQTLaB!-2bYpYkQ-f06fKT0#silver-sweet-reward) @developer("ssi:LZS1ux-gjD9nXPF-OcetUUkW-6r3uSCS6-aQhs9W5f-8JE7w") @timestamp(1711405444) interface NonFungibleToken global attachmentTypes(*): RGB21.AttachmentType global tokens(*): RGB21.TokenData - owned assetOwner(*): RGBContract.Allocation + owned assetOwner(*): RGBContract.NftAllocation error fractionOverflow "the amount of token fractions in outputs exceeds 1" @@ -199,14 +196,14 @@ interface EngravableNft @version(1) -@id(rgb:ifc:gpfNDb9S-qdSEAmR-MH2bn!3-ZQtY$Az-GxASNVG-dVIhFzM#bernard-nikita-detail) +@id(rgb:ifc:m2WMDHDo-0WEduIs-dZCh0QW-i9sEB60-4bpv48W-4UuzzvQ#british-yogurt-shelter) @developer("ssi:LZS1ux-gjD9nXPF-OcetUUkW-6r3uSCS6-aQhs9W5f-8JE7w") @timestamp(1711405444) interface UniqueNft global attachmentTypes: RGB21.AttachmentType global tokens: RGB21.TokenData - owned assetOwner(+): RGBContract.Allocation + owned assetOwner(+): RGBContract.NftAllocation genesis: override globals: attachmentTypes, tokens @@ -214,14 +211,14 @@ interface UniqueNft @version(1) -@id(rgb:ifc:L8SvJhId-0E78cOR-LOTR$VO-KhEnHfL-7afNS2K-WCHl4gI#suzuki-solid-dragon) +@id(rgb:ifc:VO$26JWw-mNq0z4I-85eQWUl-4VBXc4!-985m9s5-nZPw!xo#edition-alaska-popcorn) @developer("ssi:LZS1ux-gjD9nXPF-OcetUUkW-6r3uSCS6-aQhs9W5f-8JE7w") @timestamp(1711405444) interface LimitedNft global attachmentTypes(+): RGB21.AttachmentType global tokens(+): RGB21.TokenData - owned assetOwner(+): RGBContract.Allocation + owned assetOwner(+): RGBContract.NftAllocation genesis: override globals: attachmentTypes(+), tokens(+) @@ -229,7 +226,7 @@ interface LimitedNft @version(1) -@id(rgb:ifc:to80AGDM-Dmi7SvS-KYgBysc-qVYsjqf-N0sm1ED-ng3KevA#survive-humor-order) +@id(rgb:ifc:I$dFDePL-fN$HsRx-mLrJ6jt-zQt!LXg-ZER6Zof-Cl4qCHU#clean-rent-monkey) @developer("ssi:LZS1ux-gjD9nXPF-OcetUUkW-6r3uSCS6-aQhs9W5f-8JE7w") @timestamp(1711405444) interface IssuableNft diff --git a/interfaces/RGBStd.rgb b/interfaces/IfaceStd.rgb similarity index 73% rename from interfaces/RGBStd.rgb rename to interfaces/IfaceStd.rgb index 275bec6..b25f81b 100644 Binary files a/interfaces/RGBStd.rgb and b/interfaces/IfaceStd.rgb differ diff --git a/interfaces/IfaceStd.rgba b/interfaces/IfaceStd.rgba new file mode 100644 index 0000000..06c1092 --- /dev/null +++ b/interfaces/IfaceStd.rgba @@ -0,0 +1,235 @@ +-----BEGIN RGB KIT----- +Id: rgb:kit:Vd$$fG2Z-yuwmLns-8s$qv5X-PWyO6n6-tUtnwFa-ylaouUs +Version: 2 +Interface: EngravableNft; + id=EiusZVYz-zpXSkSo-3c0Tqoc-t!N4Jnr-6$TxTgX-Ur1CFWM#tropic-joel-data; + dev=ssi:LZS1ux-gjD9nXPF-OcetUUkW-6r3uSCS6-aQhs9W5f-8JE7w +Interface: IssuableNft; + id=I$dFDePL-fN$HsRx-mLrJ6jt-zQt!LXg-ZER6Zof-Cl4qCHU#clean-rent-monkey; + dev=ssi:LZS1ux-gjD9nXPF-OcetUUkW-6r3uSCS6-aQhs9W5f-8JE7w +Interface: RenameableAsset; + id=Pk1UAgh!-AqsJDMT-wXTOGpZ-HUhm5GG-lcouewH-y0O02Jw#sting-strong-clinic; + dev=ssi:LZS1ux-gjD9nXPF-OcetUUkW-6r3uSCS6-aQhs9W5f-8JE7w +Interface: InflatableAsset; + id=S$$GZfKR-5MW7JvR-baQ51QK-tZfh1R7-lqOT$UG-v8Tw0zM#trick-jump-cigar; + dev=ssi:LZS1ux-gjD9nXPF-OcetUUkW-6r3uSCS6-aQhs9W5f-8JE7w +Interface: LimitedNft; + id=VO$26JWw-mNq0z4I-85eQWUl-4VBXc4!-985m9s5-nZPw!xo#edition-alaska-popcorn; + dev=ssi:LZS1ux-gjD9nXPF-OcetUUkW-6r3uSCS6-aQhs9W5f-8JE7w +Interface: NamedAsset; + id=Vk9c4$Ny-Fv0J6tg-pDF05CE-312oCWh-fENNuia-GYbEu18#adios-alert-never; + dev=ssi:LZS1ux-gjD9nXPF-OcetUUkW-6r3uSCS6-aQhs9W5f-8JE7w +Interface: NonFungibleToken; + id=Ytoy2M11-IZleJ$q-94pFy0e-YQTLaB!-2bYpYkQ-f06fKT0#silver-sweet-reward; + dev=ssi:LZS1ux-gjD9nXPF-OcetUUkW-6r3uSCS6-aQhs9W5f-8JE7w +Interface: NamedContract; + id=gvx80qo7-lpHXzWN-fADtFHA-MI6$$fu-VXHTNji-nXo1oWQ#format-oliver-latin; + dev=ssi:LZS1ux-gjD9nXPF-OcetUUkW-6r3uSCS6-aQhs9W5f-8JE7w +Interface: FungibleAsset; + id=hZaUz4ZH-mPU9R9Y-I7qG!53-I8!NOUC-0LXnEIe-1MucQ5k#koala-pamela-elvis; + dev=ssi:LZS1ux-gjD9nXPF-OcetUUkW-6r3uSCS6-aQhs9W5f-8JE7w +Interface: UniqueNft; + id=m2WMDHDo-0WEduIs-dZCh0QW-i9sEB60-4bpv48W-4UuzzvQ#british-yogurt-shelter; + dev=ssi:LZS1ux-gjD9nXPF-OcetUUkW-6r3uSCS6-aQhs9W5f-8JE7w +Interface: ReplaceableAsset; + id=rgZRKBo2-yq3st3z-4vzl8qC-6QEJa4d-jlQohA4-goyHmSI#singer-stone-shannon; + dev=ssi:LZS1ux-gjD9nXPF-OcetUUkW-6r3uSCS6-aQhs9W5f-8JE7w +Interface: FixedAsset; + id=wnxf4Z$M-2y2Vzfr-NRdRQ6C-ffRuO5C-NBOp8YC-4TgxicY#data-avalon-select; + dev=ssi:LZS1ux-gjD9nXPF-OcetUUkW-6r3uSCS6-aQhs9W5f-8JE7w +Interface: BurnableAsset; + id=8Oi9U9aP-Mq0Kp8p-bdbMkX1-8I0iQoD-JJysp41-1gdT2vE#quick-next-alfred; + dev=ssi:LZS1ux-gjD9nXPF-OcetUUkW-6r3uSCS6-aQhs9W5f-8JE7w +Type-System: sts:krWRmcjd-z9$PeZn-05!3KT1-RBCv2HX-54seNWB-0cEbIJc#twin-china-detail +Check-SHA256: 738a895626356c8238e81dcc67fe2e3f81b10f774562dd9f9ce3668c5cbde542 + +0u2ETMQ&$uVRm6+Y-LVnbO40;0cHRI000013T19*a$$C9ZfA1=_du0pVvMQ>MD%PY4ZGsBP8$~I5&FIU +-G!0wy!D93009610RR9100038Wo~D3VRmKz0003BWo~D3VRmV5XLA7n0RRCCVRLh3bWe9~WpV)k|Nj9B +VRLh3bWe9~WpV)k|Nj655N2{=V{~b6Zclb)a%OCAcM@)IZbfcqa$$C1Vr*qpZ);_44sLI5MR9duY*t}x +b!BrBZf|Zza$#e1X>V>}Y*cS+Wo`_0ZfkCDcWzW~Yh`W$3So0|Wpqz>Ze?-+009ziZ*E0yXL4b7VPb4$ +RBvl#ZZ=_bbY*RDbRcwZAZ2c6a$$C5Aa8CUVIXvGYh`XAcW7y2XdrNMZ)j;^X>=fEZf9~~c4=;BGyrpR +X*x_=Q!#aTEoW*(Ic```MlDZcWpq_lYga8cax-;PLsK>_VNqyvIaf7iEjUU=H+KOGNpo{`VPb4$PG)of +g!utx000000003JX>Mk0VRUJ4Zb58pZ+BsCV`Tvp46_|m^u3-)2^*VLeS!lfFCxNhr?F^;Qi5AQin2NY +0RaI30RR925@~K`Y+-b1Z*DZe?-+0RR6IX>Mk0VRUJ4Zb58p +Z+BsCV`TsU|Nj645N2{=V{~b6Zclb)a%OCAcNJ-Fc42I3WI=RvVPj}*Wo~p-d2nSFX>)URWkq;nWo2Y@ +L2PVqcVTX0Wejz0Yi@6MZd7k;Wo`iqVRLh3bWe9~WpV%j0TpR;b9H4!cw=Q{WOG4mY;SjAZewLXd2e+f +baHthbZ;POb8~fNAZ>4QWgua5b7gdMAarP9ZXjW7Y;SjEWFTUBAarPDAY*TCbaG*1bRcwPa&2=o0CRI` +I!szqF?Dz?XKF+_Zdg!8El*=*bX8SrS1mSjGj&r#Q#LJOQD}2HS2boWI7&q~cL5JlWo}_@Wnp4$WkGXu +Wpn_9`2l7C00000009eiaAaY0Wm0KpXmkPCKfd5E4dt|K_z&S8_xTceV>Mk0VRUJ4Zb58pZ+BsCV`Tw|j96u3I`KP|x6K-jit^gQ+!PC!a#7jT+VjUz +9FBwl0RRC20RRCBZDDv*b#QQOc>w?c009zdZf0y@bZKvHL2PVqcVTX0WdQ*H{{R9JX>Mk0VRUJ4ZcS-( +ZDDj{Xbx#}b9H58O=)v&VRU0?0R?Gub9H3^0003DX>)URWn@!zaBysS0RRC20TO9$W^7?}X>V>pY;13L +VQyn(0RaF10t#Vsb7gc-cWz~J009605@~K`Y+-b1Z*DV>tcw=Q{ +WOG4mY;SjAZewK*X>)URWn@ihb8TUCV`u>iVRLh3bWe9~WpV%j0vTy;W^7?}X>V>tcw=Q{WOG4mY;SjA +ZewLXd2e+fbaHthbZ;POb8~fNAZ>4QWgua5b7gdMAarP9ZXjW7Y;SjEWFTUBAarPDAY*TCbaG*1bRcwP +a&2=FX>Mk0VRUJ4ZcS-(ZDDj{Xk2n-aBp&SWn>_8b!{MTW*}*Eb9H58AYpTJWpr~OVQyp~X>Mk0VRUJ4 +ZXjW7Y;SjAZewL2WN&42ZYOjgZDDj{XdrWNWn*b(X=P*}ZDDw6ZFOxRb9HcVYP%2dR;e +Wrf2mfn0W-6EYpxT%Hqe4Z6#YuvhEM?N$K+0SaMrb7gc-cWz~J0b!Ol%4ULr1>rorb(ioCoZe?-- +VU{+^W`cnQ%??R|3qTSHpra(ku*HuAQ$q+KGO7#i00001009634`Fn4VPj}*Wo~p-d2nTO0096026S(0 +Wo~l-0RR613So0|Wpqz>Ze?-+0RR600}y6%VPkY@Z*EU^WpZY0Z+8`GZgyd8X=FikbYWv?ZDnqBRC#b^ +40Ud6Zf|#PRBvl#ZUG2%a$#Ze?--0RR613So0|Wpqz>Ze?--0RR601Q2F& +VPkY@Z*EU^WpZY0Z+8xEZ*E0#bzy8)VQh6}a}sWEZboupV{~b6ZeeUxZ);_440Ud6Zf|#PRBvl#ZUG8m +b8}^MPj_x*asUAcbaG*Cb7p071rTO(VPkY@Z*EU^WpZY0Z+9|uXk{Q_ZEtmMbRchLAarkQWo{s5a$#e1 +X>V?GAZczOZ*_EVb#!weWq4y{Wn^<8F%@ZUc42I3WI=RvVPj}*Wo~p-d2nSoVRUq1V`yz%ZMZ*(AGY;13LWn>^`Z*m}XXk{RDZ);_44sLI5MR9duY*t}xb!Br`bZBKDb9HSX +Z)PBKaAj_EAarkQWo{s5a$#e1X>V?GAY^Z4b8aVeAZ2lNVQe6DZyV?GAZczOZ*_EVb#!wQZf|Zza$#e1X>V>}Y*cS+Wo|fObaZ8HaC9JaZyb#7~JZ+C7~Z);_49${>3Z)0I}X>V>IZ)PBMZfkCDcWxkb +Z);_4AW1|t0CRI`I!szqF?Dz?XKF+_Zdg!8El*=*bX8SrS1mSjGj&r#Q#LJOQD}2HS2boWI7&q~cL5Df +VQpn(LvL<$a$#e10EGDgW&i*H000F8VRCcwGO=000MM +WprU_Y;yrWD{{BQuNq?vw$uLzi?1~hlkP@ao_$9uVE}^UN!R2600eGfZDj#~Ud6mq639W2L|vh3p}>j> +;{fO~I?t|ZBSH!(tpGg%010q%Wn*b`X>V=;T?51yjj4`)KRWY6000312V`Y*VQFl000031 +1a4t%WdQ&I010q%Wn*b`X>V=;00966bY*gFa{&MW0000000000GyrpRX*x_=Q!#aTEoW*(Ic```MlDZc +Wpq_lYga8cax-;PLsK>_VNqyvIaf7iEjUU=H+KOIMs;pyX<}?;L349ubO40;0cHRI000013~6(7b!B8z +b#QQOc>#!wSY=~6@jI2b%^Ho0^4h`N6bqMfQQ6em^T$yfj)VaK0SaMrb7gc-cWz~J0f>xPWn((=JC(Q1 +8jXtb+QHlu3zu?H+0@$e$59-Pga7~l0RRC20Ssw#b9H58Q+04~Y)C1bYo}%2y}8`ZgXa3asU7T009bNb8}^MPj_x*asdGU{{aeNb8}^MPj_x*asdGU{{R6G +Zf|ZyadlyAL2Yk!Zgg`23So0|Wpqz>Ze?-+0SI(*VQzC~WpV-zX>)URWn@ihb8TUCV`yY^b#QQOc_4Fe +Wn*b(X=P*}VRIm1AZKiEVqt6`aA9&`ZDn+2av)@HWpi#PbRcbEbYo~BbZBKDX>)URWn>_8b#QQOc_3kI +Y;R*>bY)~9bZ;PZXk{Q_b8}^MAa8eWWpZ;5Zf|ZyadlyAL2Yk!Zgg`+bZBKDb9HSXZ)PBKaAj_EAYpTJ +Wpr~OWN&42ZYOjgWpQ<3Y#?-RAarPDAaiwXAa7Rb7?wET2nD~cr9mY +L^*C)P)03JV`X$zRclu*HgYp{Q$tfWEn!h;b2(QvW-T~MMK^Z=2~}=sadl-*W^@3A`2l7C000000uNzy +bYWv?ZDnqBRC#b^a{+Ot!RJVdyu3xNGNAv<8C^~)ovQBKu+`*3lDFOYMcDxW26S(0Wo~l;{~`yek&tDD +!z_VZcAXP49oSr+6K@T=%Z{*D>&)#|0RRCCVRLh3bWe9~WpV*wmNv>}f`J9i4oQLwKoSX{qa?+!#g7D2 +LkJ);stfJ_009920RRFIVRUq1V`yz_VNqyvIaf7iEjUU=H+KOLQe|*# +VPj=sVr*qWb8}^M0EGDgW&i*H0003Fa%FIAVPj=vQ+04~YZ)O4#Vs&zELvL<#X=iS2Wo~p;a%=zq +0RRqiWpHd^V`XGhb#QQOc>w?c009hgWpHd^V`WllXJ~W*0RR623So0|Wpqz>Ze?--0RR6Ca%FIAVPj=d +X=iA30003100IzcZgyd8X=Flma&Ay^Z*OJ}X>)URWn@ihb8TUCV`u>iVRLh3bWe9~WpV%j05kw|b7?wE +T2nD~cr9mYL^*C)P)03JV`X$zRclu*HgYp{Q$tfWEn!h;b2(QvW-T~MMK^Z=3Px#oWn@8fb7gb@g!utx +000000003BVRLh3bWe9~WpV+Cj96u3I`KP|x6K-jit^gQ+!PC!a#7jT+VjUz9FBwl009920RR923So0| +Wpqz>Ze?--0RR600S;+%b9H58O=)v&VRU0?00000GyrpRX*x_=Q!#aTEoW*(Ic```MlDZcWpq_lYga8c +ax-;PLsK>_VNqyvIaf7iEjUU=H+KOILUnR(VPb4$L349ubO40;0cHRI0003AVs&zEP;zf?W-*S+pmK)` +*-|j6QCe!M6qqZlop +?nYaleMc%`0D|O6*W>^I3}SV1Ze?Usb#QQOc>#!wSY=~6@jI2b%^Ho0^4h`N6bqMfQQ6em^T$yfj)VXK +0SRJta&A&-XJ~W**gwADFAe3iZ1@l19{2t5VaJV^T`{fc?xMUvnKPbj00993009610SRJta&A&-XJ~W* +0RR60009JIb#iY1009YNb#iV{a&K>D0uo|%a&AL!ZgXj8Zf#|5bX9U}000313}SV1Ze?Usb#QQOc>w?c +009YNb#iV}X=iA30RaF10SRJta&A&-XJ~W)0RR600T5|!c42I3WI}avZcuV>Z)N}h009tbZgyd8X=Flm +a&Ay^Z*OKPbZBKDaB^>UX=G(&AaHVTZ)PBGW*~B9b7gXNWpf~Db0BGMc42I3WHbPCb7?wET2nD~cr9mY +L^*C)P)03JV`X$zRclu*HgYp{Q$tfWEn!h;b2(QvW-T~MMK^Z<002S&01EbB)+K@7h0D=SBjVedlDqGV +d368bwG2#j+mD9lQ3zjNCgsHiJR3zsQCr5KWj&xO2a)?R5p8j#`q>uYQ&j)}00000000L700000000iE +t{Qo#1aqv%riM}dFTwu+9@otcHU8F!O3w2 +qJC#)U<71gbYb$kB!Cv4eL6_}05B~d-+;N}5sv|)Tc&j_eb0gK2sjSX8ao+<`1M~J|HmdBRUd1sOY#QI +#7OY62ZUYgq2{$1_f|(Z*OMux+H)Wo_#t< +{Qxj6AK!qv;}MSmqFbhQEq%{{?+7>)46_|m^u3-)2^*VLeS!lfFCxNhr?F^;Qi5AQin2Nd0j1CTGIbLN +eor6CU~-azM4%p_jBMKVnA!_hHLM3-*BHx`ZxWNw7!I9y+{RnQn@2DI{;m7yr3U)7OiEGa`mzoq#(6;V_f>*k#ka7f`=3qD6)+-@LI6M< +uyu|U!T^j90F36+)E=H0H{s0>nH0sEektM3d!V}o0nEa3l8<>f1KA&4t&LI4m}^5aI1iE}_s79eO?HmE +kRjtfL&d6G@+l`%qd385?K@+fP1(-9sgE>i7rMzqbp-*X&-*fU69;}zAIV^Hl7d8_9-)kE+Vz;)3s*I) +2VU1ITdJ&3iT??W6$?l#{@A?G8j--)v|TbGZq;_HaqHa&9IL;>*e1Zg(dl;zh@Se)i)R+C0ZKmX5Vlzr +Fd~pbAOI`hxKKSy8ufv-2{CEg*?@H%8S4F=BCVmr`=C0JLA?Y500eGtZe`d%zThtn<+N=058)p7{qSMO +jh9_9t?BNfyg->Vo@@aGb8l^B^h!oTk{Mq*mt#Id5<{IqiqB>((XyRTgKMj7L7^;VFWB;W7bg;sK59Oe +@c3K=fV3eR7p&1RS^QDdq`TfM1OfmAZf|a7*gwADFAe3iZ1@l19{2t5VaJV^T`{fc?xMUvnKPbj0R(ez +ZDp`<(~tJj3|i&b2NlXOR2^DUyWY#wQk^*F-L`Td370XB%Aj(G3)xaIsZm;LsuY+jte!uyUZPTtus~8L +r=bP`3SxC~ZcuV>Z)S5xvr`~b_&>p|I=+ZSHXzGneTL3na3%zBY;|)h1Y}`zXe|R|Z*(pMdS!BN +FavLHWibPEcW*KUbZByAWite3Z*_7s1ZHV=Wi0dH>saBu-}aRG920dsQ! +baVlAbpdvE0e5!+cz6MMc>#KQKPz&##IG7-47St%2#c>Z5R>jkTb_MKDq#SEtcHU8F!O3w2qJC#)UKHujTH+>EdJQM&>E4z*R)+SA#T-n +t8weyMYn(@h5^MUvO8NyVMYp&P~kr{`@Vw(r~naH;kFK+d0H97bAybczVb@xPq-Dzr4oJgUK7OifU&lwYQy^3LKf$d!zKBIO +Aj@QZhR$B(b98cVaA;*G2x4+!V{2t}OehFqa$#d@Wpq+02w`({ +WpZhAYbpeAY;|)h1!He*ZDA}0ZE0?Gb1eg8Z*(pNb8KOAXfFhMWpZyY18;6+F#~jWZ!!gRXmVv`GX!RD +b#gQWW@&b1H3M^Lcs2!dWp-t5Hw9&BXJ~Xd1a4_=WjO_7Z)|UFItg=SZD~VqY;SHm1Z-tay|%gb!BsOX>V>n0%3GO0$)Kv0$)Nx0$)Qz0$)T#0$)W%0$)Z(0$)c*0$)f-0$)i<0$)l> +0$)o@0$)r_0$)u{0$)x}0$)#00$)&20$)*40$);60$)>80$)^A0$){C0$)~E0$*2G0$*5I0$*8K0$*BM +3UhHna$#d@Wpqqi31VSmYg24tb7))&b8$j)VPk7$bW&XfV_|Y-bY2E*Z)9O}XkQ3oVPk7_X=7_(0byYQ +VqyVfV*zAj0cB+YW@Z6rX8~wv0cmLgYH9&%YXNL*0c~voZf*f@Zvk*{0da8wa&iH4a{+X80d;i&c6I@G +cL8{K0eN`=dU^?CLULhaYh`pydjxQ4aAkZ6V?uIaV{2t}Qhfz4R=eonD*nA*;6t215lmk3S~(t;6Y +7Z=sJCn}C_bsn*7Z3O|M)IR&V(Htw%E&VW2%ISUNIBhq^+CHpT0s&1fiR-mi4VL$$c_gyK-vkb1V>yr3 +U)7OiEGa`mzoq#(6;V_O`>9xR8a*>q2D50xZ(4$R31H0PIsUw_;fcDKIn~;D0000000000|Nj6000000 +TX!suv0v9m0LPL+_79KRH|I99{YEOV7tT#ZPWpkW1p!`O$dXTU&2q#dT$Zaxd1hGe8*-eZ2I646q$?$f +9S>WJ$5c2n1xg(vzLX+s=TnOlIwpu5x<(TMczEDkZ1)BN1axJ1bQsH&ZxWNw7!I9y+{RnQn@2DI{;m7< +jj@=_gDCb(0R?SkWNBgGhp04`Gl!Y4#EOy;XgWfDE7LwMr|Y<=xPaMd`c4>2IVr*pq +1Y~7nX#oXeWo~q70tIbpY;0)*31nqsX-#QtY-t1vV`Xl1X-#QtY-t4rZE0h2Zw3iuWn*bgX=8G42MS|l +Zggo)X=8G42n23nZf^+)WMyM%PGN3u3JGInZggo*VQy~=1aN6%Zwv@zWn*bjX=85<31ek$bZJm&V{Z-x +W@T-3Zx0D%Wn*bZWo>kC5DH^uZggozWo>kC5d>j$bZ-(~UdWP9bIo$ZB3zcMM|oyg?;CQQqXyz&yre57 +i5(9G0)iue^mXvL0b>G|!V30Z)+K@7h0D=SBjVedlDqGVd368bwG2#j ++mD9lQD0sr<;4X&8%0D>TgISeJ)kNFk^3Xf*%skbRRcZ*dS!BNFavLHWibPEcW*KUbZByAWite3 +Z*_7s1ZHV=WiUrS2@UrbB_UrkK{UrtT}Ur$d0Ur8UsO~AUsY8CUshHEUsqQG +UszZIUs+iKUs_rLVPOGcVgX}g0c2zWWn}?oW&vks0cdCeX=wp!Y5{9&0c>mmZEXQ=ZUJv^0dQ~uad821 +ashL50d#Z$b#(!Db^&*H0eE-;d3gbPdSR9}%4ULr1*k#ka7f`9xR8a*>q2D50xZ(4$R31H0PIsUw_;fcDKIn~;D0RR91 +00000{{R3000000WdT-0T)tV&9_|60=K=Fqg4a~00eGtZe`d%zThtn<+N=0 +58)p7{qSMOjh9_9t?BNfyg->Vo@@aGb8l^BePvFU?UojNJUmGgS3*%Iw!rWRqRntr7jya>ElsKMYW)~OLxhE=)Z*?BAY;AV`@I5NQHT; +&p7LREnfuzip)Flw(%El5GL~%R*K7_!!LEI$d#tw{C^XqS1c9Fcks}C%(J^vq=Vj&!RS(spiTq~1Q&u+ +K^%e}Avcd>00DhvPM7VL7JNKBNfTE>Q75**@Cc&Ka8ws_`Wr1xsw4#g4$>Ms8HM=uUmE|%CLL8DYpYB0 +2F=7s{mYlP#7GIvfL_JCQxeEQkVIXfYN5c23F83hGCI$$Y9m4lDXjoK1p&l5eV)0q0(o=Ek6qT`tOWJT +(?USNzPt(#xCj&gl+=PFfb@0n?X0$)o@0$)r_0$)u{0$)x}0$)#00$)&20$)*40$);60$)>80$)^A +0$){C0$)~E0$*2G0$*5I0$*8K0$*BM0byYQVqyVfV*zAj0cB+YW@Z6rX8~wv0cmLgYH9&%YXNL*0c~vo +Zf*f@Zvk*{0da8wa&iH4a{+X80d;i&c6I@GcL8{K0eN`=dU}YASY=~6@jI2b%^Ho0^4h`N6bqMfQQ6em +^T$yfj)VmPT%k!=UF9_Hk+b8VFt_j2&9|DqsTD5}A2(UF#~}_Mip)Flw(%El5GL~%R*K7_!!LEI$d#tw +{C^XqS1c9F1pM5!a(mkyX=Kz2_&$;GdBbR00eGtZe`d%zThtn<+N=058)p7 +{qSMOjh9_9t?BNfyg->Vo@@aGb8l^B`KdvfR)sH9>^>zJk@b#)dI9k0m>sKp>`gcXJ!_L9qSQY7y3rgf +(k=ZkQOfCkG@u4Q3HlB(d+LiLJm-R=h;`?dxB&nF00000 +02BZK000000HcCJ^UK%K(4i9Ajp1M~R@C@!4#dQE#lUD;OiKi1Rs{hnTdJ&3iT??W6$?l#{@A?G8j--) +v|TbGZq;_HaqHcs&-*fU69;}zAIV^Hl7d8_9-)kE+Vz;)3s*I)2VU0z1h8<^kM`0GTIJXW70NMG9a>Vm +-pkWcojB&*wsIf|mjwYFuyu|U!T^j90F36+)E=H0H{s0>nH0sEektM3d!W0q4c`8MAg$P-$_ObTP^+;# +QB8KK9=zKTm*o$AsQE~(J)#3QPiZn-Yf@WXkl`5Wpppt@_H915|BP>K9=zKTm*o$AsQE~(J)#3 +QPiZn-YmR-1eezR=2|E&(B`3obNI((XWj +*%F+LcX5LIzmLo5#W`0ornJpr`vBkPrPe7nQ#r+2>fnc?xeBUA2t3iEoy@J9k$WaEUx}!s`ym)GDo%67 +tO|Gy=Bof+a{vGU0000006zc#000000K__dp1HFEd2`8+UDn~O1og|)LO{U2yb2Gv2owO6)CB@az9SbZ +=!8X@=Yuq$20sb<4l#S`iz7Vef}@Ca=a#tjtrsCg%+lRr?B`GL`xImylWKs$pvgYJmvV80iF~}u|BtS- +iU6QaHX&1wj$zkYg`{Q63JyraSw4QMY+uI(0Y58px5Td+V+^*_{|Jk(H4u~TMq8eJM=D_eg5*ipS{pf*v6^k7Gls +f5rCoWKZRyu3j3ckV4Jthm=C&OmaWm;t2@#H=ITLm*{QiV2NfFIf5Z%-zmLo5#W`0ornJpr`vBkP +rPe7nQ#r+2>fnc?xeBUA*ZjWY9`LALUza=D8w-q{e*4SCS0#5iEUeSLv>}QC1_TClX=7_;a$9#Sj2Bz={du0O&G0&#r1CLJBFZ06hm} +WprU_Y;#4ofF*_j#U`>lTS#F>3Xo9YKQ;Tlg9WGn5m)2^IEV>wa%E#_b7^mGT?51yjj4`)KRWY6<)W@$8mW*%&FhDhLgP$wKlOrtu`}L^+TgISeJ)kNFk^3Xf*%skbRR9100000003QGV +000000N{tHG?p`mnXkl(k`ZV+LVYXKJ}#&0xTv^*>Pochfdm2o1a5C`W!OKy;4cm3v~2hf;U4$>@L|V| +mt8Tf>F%PuK$$b1YykvwZ*67V9xqZ>e{x^fFs+1!e+{I`x|;BTGZEk9?>;u +9IL;>*e1Zg(dl;zh@Se)i)R+C0ZKmX5VlzrFd~pb0000000000|Nj6000000^h!oTk{Mq*mt#Id5<{Iq +iqB>((XyRTgKMj7L7^;V1p!-kERL~X*GB-yl0o(lkJ>lqHnaUkDzF#MO+`-nfvWYb7a>H<(%oY0=TGqa +6l5KfYJkC@$v(fAa&d%-e7p!qz9SbZ=!8X@=Yuq$20sb<4l#S`iz7Vef}@Ca=a#qt000000000d00000 +0002@9%YWFOg}YFoW9l|-yK9CRWr2rRnLhh&gT{LWK{$N0ssVVZ*FDSKfd5E4dt|K_z&S8_xmmZEXQ=ZUJv^0dQ~uad821ashL5 +0d#Z$b#(!Db^&*H0eE-;d3gbPdikkAnO21_Q|vw^7?JgkgL(n*=$IX=eC$m)1U+k$A_W0}Ud6mq639W2 +L|vh3p}>j>;{fO~I?t|ZBSH!(tpGjysaSFvJu_4WvuML_T7r2AV9eq<{=Bc@iMp6M)!KLg{~`yek&tDD +!z_VZcAXP49oSr+6K@T=%Z{*D>&)#|1_%XdZe(S6WdT-0oEfg=7gNu)i}m2V`Y*VQFl0MYn(@h5^MUvO8NyVMYp&P~kr{`@Vw(r~naH;^JG;71#M+yX<^`ps5F){hncU$ijom%IzoLb(>^Yz>$s@6fa*%L +>wyblbaY{3Xl-R~baTv)=eb|?NQ$9$(>OX7sslQ%bEkMULcZCvo*Z;Mne7O2Wpib6c4c#Jbj+U}49ir` +|1I+*$<$TBtm<+yI?cCS&H}f+m!nkx000 + +-----END RGB KIT----- diff --git a/interfaces/RGB20.con b/interfaces/RGB20.con index b0c765f..355449b 100644 --- a/interfaces/RGB20.con +++ b/interfaces/RGB20.con @@ -1,5 +1,5 @@ @version(1) -@id(rgb:ifc:naFrAfgG-Kfu$A!c-3L!bC$4-s1LWJQV-4Iv!62u-4B3ab8Y#mailbox-dialog-iron) +@id(rgb:ifc:rdybH$jR-oSvSmO6-5Kd39Jr-tY1Gw8u-33Li1mr-kttA3js#script-calypso-balsa) @developer("ssi:LZS1ux-gjD9nXPF-OcetUUkW-6r3uSCS6-aQhs9W5f-8JE7w") @timestamp(1711405444) interface RGB20Base: NamedAsset, FungibleAsset @@ -7,7 +7,7 @@ interface RGB20Base: NamedAsset, FungibleAsset global spec: RGBContract.AssetSpec global terms: RGBContract.ContractTerms - owned assetOwner(*): Zk64 + owned assetOwner(*): RGBContract.Amount error issuedMismatch "supply specified as a global parameter doesn't match the issued supply allocated to the asset owners" @@ -27,7 +27,7 @@ interface RGB20Base: NamedAsset, FungibleAsset @version(1) -@id(rgb:ifc:1$D4u$R8-gvvRAMs-SAZpZiR-IPGrUMf-6xizoHW-8UtBnJU#arena-ladder-left) +@id(rgb:ifc:36$QIrdA-q26kocm-mFC1v!U-li0uQ$P-2rPjDsj-sPtt$7I#radical-human-decade) @developer("ssi:LZS1ux-gjD9nXPF-OcetUUkW-6r3uSCS6-aQhs9W5f-8JE7w") @timestamp(1711405444) interface RGB20Renamable: NamedAsset, FungibleAsset, RGB20Base, RenameableAsset @@ -35,8 +35,8 @@ interface RGB20Renamable: NamedAsset, FungibleAsset, RGB20Base, RenameableAsset global spec: RGBContract.AssetSpec global terms: RGBContract.ContractTerms - owned assetOwner(*): Zk64 - public updateRight: Rights + owned assetOwner(*): RGBContract.Amount + public updateRight: 2D!!4C8N-5bRs!A$-hHvf98G-HHjZddM-a3p7qK8-QJkznmw#toga-natural-solo -- type name unknown error issuedMismatch "supply specified as a global parameter doesn't match the issued supply allocated to the asset owners" @@ -62,7 +62,7 @@ interface RGB20Renamable: NamedAsset, FungibleAsset, RGB20Base, RenameableAsset @version(1) -@id(rgb:ifc:$iUnO9aO-1xhqUd6-1Jm5S5!-wM3ngby-5GVEylQ-ZTAMYDk#tornado-pioneer-bucket) +@id(rgb:ifc:Oq2rlfVG-m!!reli-q10Jxut-FBhzKXQ-mxtfYzg-Td1qVfQ#club-factor-montana) @developer("ssi:LZS1ux-gjD9nXPF-OcetUUkW-6r3uSCS6-aQhs9W5f-8JE7w") @timestamp(1711405444) interface RGB20Fixed: NamedAsset, FungibleAsset, RGB20Base, FixedAsset @@ -70,7 +70,7 @@ interface RGB20Fixed: NamedAsset, FungibleAsset, RGB20Base, FixedAsset global spec: RGBContract.AssetSpec global terms: RGBContract.ContractTerms - owned assetOwner(+): Zk64 + owned assetOwner(+): RGBContract.Amount error issuedMismatch "supply specified as a global parameter doesn't match the issued supply allocated to the asset owners" @@ -90,7 +90,7 @@ interface RGB20Fixed: NamedAsset, FungibleAsset, RGB20Base, FixedAsset @version(1) -@id(rgb:ifc:meHrtVTZ-6xAdd0w-rjDttLh-cs2n7zn-sZBzfwz-FcU!i24#jungle-wizard-dollar) +@id(rgb:ifc:8Ve9nkin-k!rNXag-4Jjb66h-vwHEyts-AUvDs5b-XjY9n7g#flute-darwin-arena) @developer("ssi:LZS1ux-gjD9nXPF-OcetUUkW-6r3uSCS6-aQhs9W5f-8JE7w") @timestamp(1711405444) interface RGB20RenamableFixed: NamedAsset, FungibleAsset, RGB20Base, RenameableAsset, RGB20Renamable, FixedAsset @@ -98,8 +98,8 @@ interface RGB20RenamableFixed: NamedAsset, FungibleAsset, RGB20Base, RenameableA global spec: RGBContract.AssetSpec global terms: RGBContract.ContractTerms - owned assetOwner(+): Zk64 - public updateRight: Rights + owned assetOwner(+): RGBContract.Amount + public updateRight: 2D!!4C8N-5bRs!A$-hHvf98G-HHjZddM-a3p7qK8-QJkznmw#toga-natural-solo -- type name unknown error issuedMismatch "supply specified as a global parameter doesn't match the issued supply allocated to the asset owners" @@ -125,19 +125,17 @@ interface RGB20RenamableFixed: NamedAsset, FungibleAsset, RGB20Base, RenameableA @version(1) -@id(rgb:ifc:YLpmbnY2-yZn$JdG-ghjwoCP-zj215y0-$XuwA90-o$CP$pg#camel-slogan-comrade) +@id(rgb:ifc:4uhMBcJl-6nwJ79l-sVNo1E2-BB19rdl-rdQGt1X-3Iqq3YA#lopez-chant-journal) @developer("ssi:LZS1ux-gjD9nXPF-OcetUUkW-6r3uSCS6-aQhs9W5f-8JE7w") @timestamp(1711405444) interface RGB20Inflatable: NamedAsset, FungibleAsset, RGB20Base, InflatableAsset - meta allowedInflation: RGBContract.Amount - global issuedSupply(+): RGBContract.Amount global maxSupply: RGBContract.Amount global spec: RGBContract.AssetSpec global terms: RGBContract.ContractTerms - owned assetOwner(*): Zk64 - public inflationAllowance(*): Zk64 + owned assetOwner(*): RGBContract.Amount + public inflationAllowance(*): RGBContract.Amount error inflationExceedsAllowance "you try to issue more assets than allowed by the contract terms" @@ -155,7 +153,6 @@ interface RGB20Inflatable: NamedAsset, FungibleAsset, RGB20Base, InflatableAsset transition issue: required, abstract errors: inflationExceedsAllowance, issuedMismatch - meta: allowedInflation globals: issuedSupply assigns: assetOwner(*), inflationAllowance(*) default: assetOwner @@ -169,7 +166,7 @@ interface RGB20Inflatable: NamedAsset, FungibleAsset, RGB20Base, InflatableAsset @version(1) -@id(rgb:ifc:yxQRcNJ4-yMnJ0$c-gLjwpdS-8DuJjFn-pWQ4i5C-To2R$U4#basil-gopher-music) +@id(rgb:ifc:k$iPxrD7-8Og7n1Z-2uezBV8-ZH!dXm3-tRxgViG-6x5BVnc#button-express-igloo) @developer("ssi:LZS1ux-gjD9nXPF-OcetUUkW-6r3uSCS6-aQhs9W5f-8JE7w") @timestamp(1711405444) interface RGB20Burnable: NamedAsset, FungibleAsset, RGB20Base, BurnableAsset @@ -181,8 +178,8 @@ interface RGB20Burnable: NamedAsset, FungibleAsset, RGB20Base, BurnableAsset global spec: RGBContract.AssetSpec global terms: RGBContract.ContractTerms - owned assetOwner(*): Zk64 - public burnRight(+): Rights + owned assetOwner(*): RGBContract.Amount + public burnRight(+): 2D!!4C8N-5bRs!A$-hHvf98G-HHjZddM-a3p7qK8-QJkznmw#toga-natural-solo -- type name unknown error invalidBurnProof "the provided proof of reserves is invalid" @@ -211,11 +208,10 @@ interface RGB20Burnable: NamedAsset, FungibleAsset, RGB20Base, BurnableAsset @version(1) -@id(rgb:ifc:BWy2H0Nd-ykgandr-mR5fydi-U$7tFU2-R!z1F9B-MZW0tKo#bishop-poem-dublin) +@id(rgb:ifc:1Jrlq3oA-UMSu82N-dFRFq6T-pqnX0aF-xH17MPN-Y2r1Uqs#jargon-pedro-modern) @developer("ssi:LZS1ux-gjD9nXPF-OcetUUkW-6r3uSCS6-aQhs9W5f-8JE7w") @timestamp(1711405444) interface RGB20InflatableBurnable: NamedAsset, FungibleAsset, RGB20Base, InflatableAsset, RGB20Inflatable, BurnableAsset - meta allowedInflation: RGBContract.Amount meta burnProof: RGBContract.BurnMeta global burnConsignmentUrl(?): RGBContract.Details @@ -225,9 +221,9 @@ interface RGB20InflatableBurnable: NamedAsset, FungibleAsset, RGB20Base, Inflata global spec: RGBContract.AssetSpec global terms: RGBContract.ContractTerms - owned assetOwner(*): Zk64 - public burnRight(+): Rights - public inflationAllowance(*): Zk64 + owned assetOwner(*): RGBContract.Amount + public burnRight(+): 2D!!4C8N-5bRs!A$-hHvf98G-HHjZddM-a3p7qK8-QJkznmw#toga-natural-solo -- type name unknown + public inflationAllowance(*): RGBContract.Amount error inflationExceedsAllowance "you try to issue more assets than allowed by the contract terms" @@ -254,7 +250,6 @@ interface RGB20InflatableBurnable: NamedAsset, FungibleAsset, RGB20Base, Inflata transition issue: required, abstract errors: inflationExceedsAllowance, issuedMismatch - meta: allowedInflation globals: issuedSupply assigns: assetOwner(*), inflationAllowance(*) default: assetOwner @@ -268,11 +263,10 @@ interface RGB20InflatableBurnable: NamedAsset, FungibleAsset, RGB20Base, Inflata @version(1) -@id(rgb:ifc:w0Z1Za2j-klpfWyT-4coOB!6-90qakW5-AfjmIc9-ejZbKZU#cycle-buzzer-british) +@id(rgb:ifc:tsFbtLc7-ijbJ0C3-YdI2b6w-aeW!ofX-!DecY5g-bEs0eW4#agatha-poker-tango) @developer("ssi:LZS1ux-gjD9nXPF-OcetUUkW-6r3uSCS6-aQhs9W5f-8JE7w") @timestamp(1711405444) interface RGB20Replaceable: NamedAsset, FungibleAsset, RGB20Base, InflatableAsset, RGB20Inflatable, BurnableAsset, RGB20InflatableBurnable, ReplaceableAsset - meta allowedInflation: RGBContract.Amount meta burnProof: RGBContract.BurnMeta global burnConsignmentUrl(?): RGBContract.Details @@ -283,10 +277,10 @@ interface RGB20Replaceable: NamedAsset, FungibleAsset, RGB20Base, InflatableAsse global spec: RGBContract.AssetSpec global terms: RGBContract.ContractTerms - owned assetOwner(*): Zk64 - public burnRight(+): Rights - public inflationAllowance(*): Zk64 - public replaceRight(+): Rights + owned assetOwner(*): RGBContract.Amount + public burnRight(+): 2D!!4C8N-5bRs!A$-hHvf98G-HHjZddM-a3p7qK8-QJkznmw#toga-natural-solo -- type name unknown + public inflationAllowance(*): RGBContract.Amount + public replaceRight(+): 2D!!4C8N-5bRs!A$-hHvf98G-HHjZddM-a3p7qK8-QJkznmw#toga-natural-solo -- type name unknown error inflationExceedsAllowance "you try to issue more assets than allowed by the contract terms" @@ -313,7 +307,6 @@ interface RGB20Replaceable: NamedAsset, FungibleAsset, RGB20Base, InflatableAsse transition issue: required, abstract errors: inflationExceedsAllowance, issuedMismatch - meta: allowedInflation globals: issuedSupply assigns: assetOwner(*), inflationAllowance(*) default: assetOwner @@ -335,20 +328,18 @@ interface RGB20Replaceable: NamedAsset, FungibleAsset, RGB20Base, InflatableAsse @version(1) -@id(rgb:ifc:Gzd3DwVy-TtF3Z6V-h981qjU-WV9QmbS-$SB5Tyg-6y5PLPc#battery-consul-mercury) +@id(rgb:ifc:UZa96Pql-tG1kWRV-WB5yyVj-QCu5I4W-Kk!PG$U-ZMnmHvk#bruno-animal-totem) @developer("ssi:LZS1ux-gjD9nXPF-OcetUUkW-6r3uSCS6-aQhs9W5f-8JE7w") @timestamp(1711405444) interface RGB20RenamableInflatable: NamedAsset, FungibleAsset, RGB20Base, RenameableAsset, RGB20Renamable, InflatableAsset - meta allowedInflation: RGBContract.Amount - global issuedSupply(+): RGBContract.Amount global maxSupply: RGBContract.Amount global spec: RGBContract.AssetSpec global terms: RGBContract.ContractTerms - owned assetOwner(*): Zk64 - public inflationAllowance(*): Zk64 - public updateRight: Rights + owned assetOwner(*): RGBContract.Amount + public inflationAllowance(*): RGBContract.Amount + public updateRight: 2D!!4C8N-5bRs!A$-hHvf98G-HHjZddM-a3p7qK8-QJkznmw#toga-natural-solo -- type name unknown error inflationExceedsAllowance "you try to issue more assets than allowed by the contract terms" @@ -366,7 +357,6 @@ interface RGB20RenamableInflatable: NamedAsset, FungibleAsset, RGB20Base, Rename transition issue: required, abstract errors: inflationExceedsAllowance, issuedMismatch - meta: allowedInflation globals: issuedSupply assigns: assetOwner(*), inflationAllowance(*) default: assetOwner @@ -386,7 +376,7 @@ interface RGB20RenamableInflatable: NamedAsset, FungibleAsset, RGB20Base, Rename @version(1) -@id(rgb:ifc:FFfPPWDH-4$BWBn7-3QnE8WV-nHj98E8-IoAIZvt-4kiX7YA#theory-memo-puzzle) +@id(rgb:ifc:4dWw9IYp-yzQdFgh-jwV!liK-j0K3hht-5N2IhWM-q1WK2KU#game-actor-diet) @developer("ssi:LZS1ux-gjD9nXPF-OcetUUkW-6r3uSCS6-aQhs9W5f-8JE7w") @timestamp(1711405444) interface RGB20RenamableBurnable: NamedAsset, FungibleAsset, RGB20Base, RenameableAsset, RGB20Renamable, BurnableAsset @@ -398,9 +388,9 @@ interface RGB20RenamableBurnable: NamedAsset, FungibleAsset, RGB20Base, Renameab global spec: RGBContract.AssetSpec global terms: RGBContract.ContractTerms - owned assetOwner(*): Zk64 - public burnRight(+): Rights - public updateRight: Rights + owned assetOwner(*): RGBContract.Amount + public burnRight(+): 2D!!4C8N-5bRs!A$-hHvf98G-HHjZddM-a3p7qK8-QJkznmw#toga-natural-solo -- type name unknown + public updateRight: 2D!!4C8N-5bRs!A$-hHvf98G-HHjZddM-a3p7qK8-QJkznmw#toga-natural-solo -- type name unknown error invalidBurnProof "the provided proof of reserves is invalid" @@ -435,11 +425,10 @@ interface RGB20RenamableBurnable: NamedAsset, FungibleAsset, RGB20Base, Renameab @version(1) -@id(rgb:ifc:MkSuvvz2-StGzuV8-Hewq0fo-hMigWm$-UMxXtdP-RCnZyec#asia-domino-respect) +@id(rgb:ifc:vc3ezu54-R44wAJK-KUnxzX2-oy3D4N3-KqdU8mh-Qp5evQA#garlic-piano-side) @developer("ssi:LZS1ux-gjD9nXPF-OcetUUkW-6r3uSCS6-aQhs9W5f-8JE7w") @timestamp(1711405444) interface RGB20RenamableInflatableBurnable: NamedAsset, FungibleAsset, RGB20Base, RenameableAsset, RGB20Renamable, InflatableAsset, RGB20RenamableInflatable, BurnableAsset - meta allowedInflation: RGBContract.Amount meta burnProof: RGBContract.BurnMeta global burnConsignmentUrl(?): RGBContract.Details @@ -449,10 +438,10 @@ interface RGB20RenamableInflatableBurnable: NamedAsset, FungibleAsset, RGB20Base global spec: RGBContract.AssetSpec global terms: RGBContract.ContractTerms - owned assetOwner(*): Zk64 - public burnRight(+): Rights - public inflationAllowance(*): Zk64 - public updateRight: Rights + owned assetOwner(*): RGBContract.Amount + public burnRight(+): 2D!!4C8N-5bRs!A$-hHvf98G-HHjZddM-a3p7qK8-QJkznmw#toga-natural-solo -- type name unknown + public inflationAllowance(*): RGBContract.Amount + public updateRight: 2D!!4C8N-5bRs!A$-hHvf98G-HHjZddM-a3p7qK8-QJkznmw#toga-natural-solo -- type name unknown error inflationExceedsAllowance "you try to issue more assets than allowed by the contract terms" @@ -479,7 +468,6 @@ interface RGB20RenamableInflatableBurnable: NamedAsset, FungibleAsset, RGB20Base transition issue: required, abstract errors: inflationExceedsAllowance, issuedMismatch - meta: allowedInflation globals: issuedSupply assigns: assetOwner(*), inflationAllowance(*) default: assetOwner @@ -499,11 +487,10 @@ interface RGB20RenamableInflatableBurnable: NamedAsset, FungibleAsset, RGB20Base @version(1) -@id(rgb:ifc:r6$dLeVy-H0HQpUy-F2XbX2E-P2JqbHp-wsISD4f-xUEaOKQ#postage-plaza-almond) +@id(rgb:ifc:dhbZ77Ii-EjWn0vr-4dI0NMP-HDlpnNH-YhaurpI-QDGmCGY#pelican-scarlet-slang) @developer("ssi:LZS1ux-gjD9nXPF-OcetUUkW-6r3uSCS6-aQhs9W5f-8JE7w") @timestamp(1711405444) interface RGB20RenamableReplaceable: NamedAsset, FungibleAsset, RGB20Base, RenameableAsset, RGB20Renamable, InflatableAsset, RGB20RenamableInflatable, BurnableAsset, RGB20RenamableInflatableBurnable, ReplaceableAsset - meta allowedInflation: RGBContract.Amount meta burnProof: RGBContract.BurnMeta global burnConsignmentUrl(?): RGBContract.Details @@ -514,11 +501,11 @@ interface RGB20RenamableReplaceable: NamedAsset, FungibleAsset, RGB20Base, Renam global spec: RGBContract.AssetSpec global terms: RGBContract.ContractTerms - owned assetOwner(*): Zk64 - public burnRight(+): Rights - public inflationAllowance(*): Zk64 - public replaceRight(+): Rights - public updateRight: Rights + owned assetOwner(*): RGBContract.Amount + public burnRight(+): 2D!!4C8N-5bRs!A$-hHvf98G-HHjZddM-a3p7qK8-QJkznmw#toga-natural-solo -- type name unknown + public inflationAllowance(*): RGBContract.Amount + public replaceRight(+): 2D!!4C8N-5bRs!A$-hHvf98G-HHjZddM-a3p7qK8-QJkznmw#toga-natural-solo -- type name unknown + public updateRight: 2D!!4C8N-5bRs!A$-hHvf98G-HHjZddM-a3p7qK8-QJkznmw#toga-natural-solo -- type name unknown error inflationExceedsAllowance "you try to issue more assets than allowed by the contract terms" @@ -545,7 +532,6 @@ interface RGB20RenamableReplaceable: NamedAsset, FungibleAsset, RGB20Base, Renam transition issue: required, abstract errors: inflationExceedsAllowance, issuedMismatch - meta: allowedInflation globals: issuedSupply assigns: assetOwner(*), inflationAllowance(*) default: assetOwner diff --git a/interfaces/RGB20.rgb b/interfaces/RGB20.rgb index 39438fd..c54f596 100644 Binary files a/interfaces/RGB20.rgb and b/interfaces/RGB20.rgb differ diff --git a/interfaces/RGB20.rgba b/interfaces/RGB20.rgba index 7d37499..d6fd7e0 100644 --- a/interfaces/RGB20.rgba +++ b/interfaces/RGB20.rgba @@ -1,365 +1,374 @@ -----BEGIN RGB KIT----- -Id: rgb:kit:rkBGk37g-KX3CPhg-4kytJa3-FI7gQJG-rPElGuq-Ya3vC$Y +Id: rgb:kit:Ay5jP01X-gm8mq9A-3xypXFd-WDbC5cp-!iEDQXN-adLDjKQ Version: 2 -Interface: RGB20InflatableBurnable; - id=BWy2H0Nd-ykgandr-mR5fydi-U$7tFU2-R!z1F9B-MZW0tKo#bishop-poem-dublin; - dev=ssi:LZS1ux-gjD9nXPF-OcetUUkW-6r3uSCS6-aQhs9W5f-8JE7w; - suppl=hwNKARI0FMsV5mr8LTkJaAMSlxQo2x5LP6WdvGTZoBs -Interface: RGB20RenamableBurnable; - id=FFfPPWDH-4$BWBn7-3QnE8WV-nHj98E8-IoAIZvt-4kiX7YA#theory-memo-puzzle; +Interface: RGB20Fixed; + id=Oq2rlfVG-m!!reli-q10Jxut-FBhzKXQ-mxtfYzg-Td1qVfQ#club-factor-montana; dev=ssi:LZS1ux-gjD9nXPF-OcetUUkW-6r3uSCS6-aQhs9W5f-8JE7w; - suppl=fWWlgwPDFRW69ZTzqiVPWJGEOr!HhZBzUhhpAhD3y2s + suppl=SaovV$lLNd8Q1fKe4ntfCqFT$TS$vzRO6x8opqeT6I8 Interface: RGB20RenamableInflatable; - id=Gzd3DwVy-TtF3Z6V-h981qjU-WV9QmbS-$SB5Tyg-6y5PLPc#battery-consul-mercury; + id=UZa96Pql-tG1kWRV-WB5yyVj-QCu5I4W-Kk!PG$U-ZMnmHvk#bruno-animal-totem; dev=ssi:LZS1ux-gjD9nXPF-OcetUUkW-6r3uSCS6-aQhs9W5f-8JE7w; - suppl=Tn6z5oWY0iFNb$V9OvG9RhtaxAegEjtn46WUpotzNt0 -Interface: RGB20RenamableInflatableBurnable; - id=MkSuvvz2-StGzuV8-Hewq0fo-hMigWm$-UMxXtdP-RCnZyec#asia-domino-respect; + suppl=xqn2J2xJ$EfccI7rlpO4EuFgSP1D2XpmmW2f1!5Z9vk +Interface: RGB20RenamableReplaceable; + id=dhbZ77Ii-EjWn0vr-4dI0NMP-HDlpnNH-YhaurpI-QDGmCGY#pelican-scarlet-slang; dev=ssi:LZS1ux-gjD9nXPF-OcetUUkW-6r3uSCS6-aQhs9W5f-8JE7w; - suppl=7P62AIaAy882ZBa7sKbh4Xiii$cwS0Cj6u9ZFaoLqS8 -Interface: RGB20Inflatable; - id=YLpmbnY2-yZn$JdG-ghjwoCP-zj215y0-$XuwA90-o$CP$pg#camel-slogan-comrade; + suppl=6DN6Egm3YOTQJGZ9r7wRRQG97P5FsfptG4jvGsJTtnc +Interface: RGB20Burnable; + id=k$iPxrD7-8Og7n1Z-2uezBV8-ZH!dXm3-tRxgViG-6x5BVnc#button-express-igloo; dev=ssi:LZS1ux-gjD9nXPF-OcetUUkW-6r3uSCS6-aQhs9W5f-8JE7w; - suppl=dYkHYQYc7n0FNZOvbXbyk26TngaKM7bzxJRNVJU8VYk -Interface: RGB20RenamableFixed; - id=meHrtVTZ-6xAdd0w-rjDttLh-cs2n7zn-sZBzfwz-FcU!i24#jungle-wizard-dollar; + suppl=lfN6Nz9Vzo7YZFNJKliKS9xvyCCD5yNbvevnkCsVI0k +Interface: RGB20Replaceable; + id=tsFbtLc7-ijbJ0C3-YdI2b6w-aeW!ofX-!DecY5g-bEs0eW4#agatha-poker-tango; dev=ssi:LZS1ux-gjD9nXPF-OcetUUkW-6r3uSCS6-aQhs9W5f-8JE7w; - suppl=7vFkR1M82PYyCUlbdI!VRADuErRZrPov2Fc5x6ujJJc -Interface: RGB20RenamableReplaceable; - id=r6$dLeVy-H0HQpUy-F2XbX2E-P2JqbHp-wsISD4f-xUEaOKQ#postage-plaza-almond; + suppl=$IrVIiQZR1h6sy6685YVb8weQ7Ewf34ldmfXeu8TjbI +Interface: RGB20RenamableInflatableBurnable; + id=vc3ezu54-R44wAJK-KUnxzX2-oy3D4N3-KqdU8mh-Qp5evQA#garlic-piano-side; dev=ssi:LZS1ux-gjD9nXPF-OcetUUkW-6r3uSCS6-aQhs9W5f-8JE7w; - suppl=JXHKgJeiGx9ORN9AaJ$35Gl1lUeskUq7zYlUIfR7Ooo -Interface: RGB20Replaceable; - id=w0Z1Za2j-klpfWyT-4coOB!6-90qakW5-AfjmIc9-ejZbKZU#cycle-buzzer-british; + suppl=kpNxfINsW$q7miUIvQGi099NRnhzjfljf$sm4n4MeM4 +Interface: RGB20InflatableBurnable; + id=1Jrlq3oA-UMSu82N-dFRFq6T-pqnX0aF-xH17MPN-Y2r1Uqs#jargon-pedro-modern; dev=ssi:LZS1ux-gjD9nXPF-OcetUUkW-6r3uSCS6-aQhs9W5f-8JE7w; - suppl=kxo1RuJIv$jx$wBL9v9qXdltbDUMFiik2PUWJFh7Tq4 -Interface: RGB20Burnable; - id=yxQRcNJ4-yMnJ0$c-gLjwpdS-8DuJjFn-pWQ4i5C-To2R$U4#basil-gopher-music; + suppl=7!aNeqq1FIoIsHZlClTi4lbncEVWZUgnwos6lB331Ag +Interface: RGB20RenamableBurnable; + id=4dWw9IYp-yzQdFgh-jwV!liK-j0K3hht-5N2IhWM-q1WK2KU#game-actor-diet; dev=ssi:LZS1ux-gjD9nXPF-OcetUUkW-6r3uSCS6-aQhs9W5f-8JE7w; - suppl=ActJyKiLYgrF4aOzHoqxEsOl5r$V3p0VbfqN$hCnGnM -Interface: RGB20Fixed; - id=$iUnO9aO-1xhqUd6-1Jm5S5!-wM3ngby-5GVEylQ-ZTAMYDk#tornado-pioneer-bucket; + suppl=7KiZ0IbKBQj2yPLHIGkYCHR9YRBJmQDRMr8K$mhJp4w +Interface: RGB20Inflatable; + id=4uhMBcJl-6nwJ79l-sVNo1E2-BB19rdl-rdQGt1X-3Iqq3YA#lopez-chant-journal; dev=ssi:LZS1ux-gjD9nXPF-OcetUUkW-6r3uSCS6-aQhs9W5f-8JE7w; - suppl=vs0oZVfUdW73Bxno8ebclKF6k1hCoxTJxPYrumSZQxQ + suppl=XNoQ7WLWIka0Xi7fUKqf5D$fzAsFogs8D7Wo2zIYP2c +Interface: RGB20RenamableFixed; + id=8Ve9nkin-k!rNXag-4Jjb66h-vwHEyts-AUvDs5b-XjY9n7g#flute-darwin-arena; + dev=ssi:LZS1ux-gjD9nXPF-OcetUUkW-6r3uSCS6-aQhs9W5f-8JE7w; + suppl=LaBJn4kEboOkFwo$zkAL0z8cyUQe5rsRYAqcxKcfnok Type-System: sts:3Vut1$G8-lmJY9!z-CvaNdjp-n0adNAj-IVQQ1jB-SdhQxp4#parker-axiom-meaning -Check-SHA256: 7bb82626cf537cdf39f60d103a509a6e856f00a8e4aebd059d845fed467de585 +Check-SHA256: 149e4bea47e74badd81867ae56a2e85db7fb84d5ba4569d1bf20dacc9a77480c -0tx{aQb$5EFiCD^Y+-a^Vr*qXb#iWDVr*pwR!>~x^Kusb3F_D>3|%=0P4(JM3 -91~BkJ``pp2L<+WYM!zJb=Ey6LPIrKAc+<}ouO+1_y#HazXRttFXqDki#07`P*;L4`>n3v9olck(HKSg -5A{VZzlj>DF^xPWn((=JC(Q18jXtb+QHlu3zu?H+0@$e$59-Pga82yX>)URWn@!zaBysS0f>xPWn((=JC(Q1 -8jXtb+QHlu3zu?H+0@$e$59-PgaH8wZDDv*b#QQOc>#!wSY=~6@jI2b%^Ho0^4h`N6bqMfQQ6em^T$yf -j)VaK1aoj@V*%IvzT+P7s9j%|JK7ryjGlh`%f(kEcQ`Dp)4jAIiU9!t1$1R{ZF2!zi^o(rG6hNMk0VRUJ4Zb58p -Z+BsCV`TyX0096100azab8~fNWK(r;aBO)20096AZDDv*b#QQOc>w?c00eVzWn%#V0RRPbWpZtE0RRC2 -0}5etb7gc-cWz~J0096031W3}Zc=GyXmkMp|NjzcZf0y@bZKvHL2PVqcVTX0WdQ*H{{R9JX>Mk0VRUJ4 -ZcS-(ZDDj{Xbx#}b9H58O=)v&VRU0?0|a7qa&G?s0SRJta&Ay^Z*OJ-5@L07ZbNTwb7^O8ZDnqBRdQ?q -0096DVs&zEWn@!zaBysS0RRC20SRJta&A&-XJ~W*0RR6131W3}Zc=GyXmkJo|Nj615NU39VQgt+LUnR( -P;zf?W&j0gb8~fN0003HVQg$~cV%QrZf0y@bZKvH0Ssw#b9H58Q+04~YMk0VRUJ4Zb58p -Z+BsCV`TvV|NjCCVRLh3bWe9~WpV%j|NjzcZf0y@bZKvHL2PVqcVTX0WdH#G{{R9RX>Mk0VRUJ4Zbf)w -Wo2Y@L2PVqcVTX0We#a`b9H58O=)v&VRU0?0SaMrb7gc-cWz~J2y}8`ZgXa3asU7T009bNb8}^MPj_x* -asdGU{{aeNb8}^MPj_x*asdGU{{R6GZf|ZyadlyAL2Yk!Zgg`23So0|Wpqz>Ze?-+0SI(*VQzC~WpV`> -X>Mk0VRUJ4Zbf)wWo2Y@L2PVqcVTX0Wj}dubs%(dc_4IeAZc@Rb!8xJZ*pZIVRLh3baNndXkl(3VQg$~ -cV%QCVtF8RXk{Q{Z*FvQVPkY4bY*gFa}jB7W^7?}X>V>#X>)C1bYo~-a%FIDa&%>6AaiwXAa7)UR -Wn>^>b8}^Mb0A@EWFTp7W^7?}X>V>IVQg$~cVTX0Wguj4Wpi#PbRcbEbYo~Bb8uy2X=Z6_5a&K>DAa7N95 -Y-wZ;X>)URWn@ihb8TUCV`yY^b#QQOc_4FeWn*b(X=P*}VRIm1AZKiEVqt6`aA9&`ZDn+2av)@HWpi#P -bRcbEbYo~BbZBKDX>)URWn>_8b#QQOc_3kIY;R*>bY)~9bZ;PZXk{Q_b8}^MAa8eWWpZ;5Zf|ZyadlyA -L2Yk!Zgg`+bZBKDb9HSXZ)PBKaAj_EAYpTJWpr~OWN&42ZYOjgWpQ<3Y#?-RAarPDAaiwXAa7Rb7?wET2nD~cr9mYL^*C)P)03JV`X$zRclu*HgYp{Q$tfWEn!h;b2(QvW-T~M -MK^Z=7E(t-GB8qQZeeX~x^Kusb3F_D>3|%=0P4(JM3 -91~BkJ``pp2L<+WYM!zJb=Ey6LPIrKAc+<}ouO+1_y#HazXRttFXqDki#07`P*;L4`>n3v9olckRQbf- -`EpAuf>SrFpvqkdxbI5r;!w|>I3+$n8+s{F*YNne^n8N*(E!U50h(Ef5)T@+41cU*&VknPOF^8Kyyah8 -1UuO<@N5Hj>5A{VZzlj>@2NhYQ(KFsV^mYN`~N -E3BSBv0kE5j<7&dC#RtW5@L07ZbNTwb7^O8ZDnqBRdQ?rKPz&##IG7-47St%2#c>Z5R>jkTb_MKDq#SE -TceV>TceV>}QC0RRPbWpZtE0b7g5R5&sPN*yA;lp<^AQ;QQiCWsumMiT;fc;H-Y_W=L{3So0|Wpqz> -Ze?-;0003AVs&zEQfX&sbO8YY0Sk3-WMOn=QfX&sbO8YY000000}N?%b9H58Q+04~Y1bY)U$XJ~W*009610S;+% -b9H58O=)v&VRU0?0|a7qa&G?s0SRJta&Ay^Z*OJ-5@L07ZbNTwb7^O8ZDnqBRdQ?q0096DVs&zEWn@!z -aBysS0RRC20SRJta&A&-XJ~W*0RR6131W3}Zc=GyXmkJo|Nj615NU39VQgt+LUnR(P;zf?W&j3qWo}_@ -W&Z#G0R(e!Wn%#V0RRCDb#P>1bY)U$XJ~W*009623w3a0VRU6uX=iA3000310003Cb#P>1bY)U$XJ~W? -baG*Cb7p07000000SaMrb7gc-cWz~J0RaF10SaMrb7gc-cWz~J0RaF1009qfZ*E0#bzy8lZEtmMbaMd; -VRLh3bWe9~WpV%k2y}8`ZgXa3asv=)Zgyd8X=Flma&Ay^Z*OKPbZBKDaB^>UX=G(&AaHVTZ)PBGW*~B9 -b7gXNWpf~Db0BGMc42I3WDaR_b9H58O=)v&VRU0?WOH?JaBO)Xb8uy2X=Z6~x^Kusb3F_D>3|%=0P4(J< -mWA;RHt3oehQzyH*K>M391~BkJ``pp2L<+WYM!zJb=Ey6LPIrKAc+<}ouO+1_y#HazXRttFXqDki#07` -P*;L4`>n3v9olckRQbf-`EpAuf>SrFpvqkdxbI5r;!w|>I3+$n8+s{F*YNne^n8N*(E!U50h(Ef5)T@+ -41cU*&VknPOF^8K(HKSg)URWn@!zaBysS0f>xPWn((=JC(Q1 -8jXtb+QHlu3zu?H+0@$e$59-PgaH8wZDDv*b#QQOc>#!wSY=~6@jI2b%^Ho0^4h`N6bqMfQQ6em^T$yf -j)VaK1aoj@V*%IvzT+P7s9j%|JK7ryjGlh`%f(kEcQ`Dp)4jAIiU9!t1$1R{ZF2!zi^o(rG6hNV>pY;13LVQyn(0s#O43w3a0 -VRU6uX=iA30RaI3000043~6(7b!B8zb#QQOc>w?c010hjcvE$7aBO)200965b8uy20RRC21$1R{ZF2zt -0RRIEVRLh3bWe9~WpV%j|NjzcZf0y@bZKvHL2PVqcVTX0WdQ*H{|j|+WMOn=QfX&sbO8VX0006JX>Mk0 -VRUJ4ZcS-(ZDDj{Xbx#}b9H58O=)v&VRU0?0|jYwb9H3^009tTY;13LWn@WiW^7?}X>V=;3~6(7b!B8z -b#QQOc>w?c009zdZf0y@bZKvHL2PVqcVTX0WdQ*H{{jkOb8}^MPj_x*asUAT{}O3#W^7?}X>V>pY;13L -VQyn(0096000J3lZf0y@bZKvHMR;RnWn^)C1bYo}%3So0|Wpqz>Ze?-? -a%FB|ZDs!e009JZaAjiw009623w3a0VRU6uX=iA30RRC20Sk3-WMOn=QfX&sbN~PW000013w3a0VRU6u -X=iA32y}8`ZgXa3asU7T009bNb8}^MPj_x*asdGU{{aeNb8}^MPj_x*asdGU{{R6GZf|ZyadlyAL2Yk! -Zgg`23So0|Wpqz>Ze?-+0SI(*VQzC~WpV@=X>Mk0VRUJ4Zbf)wWo2Y@L2PVqcVTX0Wj}dubs%(dc_4Ie -AZc@Rb!8xJZ*pZIVRLh3baNndXkl(3VQg$~cV%QCVtF8RXk{Q{Z*FvQVPkY4bY*gFa}jB7W^7?}X>V># -X>)C1bYo~-a%FIDa&%>6AaiwXAa7)URWn>^>b8}^Mb0A@EWFTp7W^7?}X>V>IVQg$~cVTX0Wguj4 -Wpi#PbRcbEbYo~Bb8uy2X=Z6)C1bYo~_b9HcVYK5Ib#!obbaONSb8~4rOj=Vhb$BgjYD771 -SWreSPh(|tRaI+OEjDs9byGuAHZ5UMXmdGNHD)b1N<}w!0U%OGLNYK?Wo}_@VPb4$Np5CrVRT_)Y-K`q -a&BQ_Y-I>mPh8{kau)pw>ewj^T{#F%_1b`zh4BqG=$aXZ#JgYDb9y}-6Hl)`6lNs{1@>}kp0WaU);%Xe -Lp50-i55Pcp=$y71}Xc$1Lrp{=EDDrH7#OLSAsA5t*+o5+Hb~G`NZD&a!V_MQ#Y)j%3TS#?@H|AP|uw> -B|bnKdMQxX@c6s*e1iMY0Lu~qnpuew4;r-$f2?B8f!6U$L7bJ*7)AQzZGq)H{C6R~@w$(PwZjmwKqY~; -m%)LO2xF@oH+K&Oa!%2AXQg5H&1#KBmGudmOZ0)|JfQ0?Pb~Mm@2NhYQ(KFsV^mYN`~NE3BSBv0kE5j<7&dC#RtX5@L07ZbNTwb7^O8ZDnqBRdQ?r -KPz&##IG7-47St%2#c>Z5R>jkTb_MKDq#SETceV>TceV>xPWn((=JC(Q18jXtb+QHlu3zu?H+0@$e$59-PgaH5qb8uy20oVM#;~wy+U0;_w -+8Yauo__nw#aAVFI4rEwy|f{U0RaF7bY*gFa{*h6$5c2n1xg(vzLX+s=TnOlIwpu5x<(TMczEDkZ1({G -1PWnub7gc-cWz~J0ssI331W3}Zc=GyXmkMq0Ra+eZf0y@bZKvHL2PVqcVTX0WdZ>J0Sk3-WMOn=QfX&s -bO8YY000001Pp0&b9H58Q+04~YZe?-+0RR69Vs&zEQfX&sbO8YW{}O3#W^7?}X>V>pY;13LVQyn(0RaF13w3a0VRU6uX=iA30RRC2 -00I$dZf0y@bZKvHO=)v&VRU0?4rz09b!B8tX>)C1bYo})1Y&h^ZvOxQ31W3}ZcuV>Z)O4#Vs&zELvL<# -X=iS2Wo~p;a%=zq0RRkQb#iWHWK(r;aBO)20096231W3}Zc=GyXmkMp|Nj9AVs&zEQfX&sbN~SV{{R6H -X>N95Y-wadb#iV{a&K>D00n7tb9H3^009tTY;13LWn@WiW^7?}X>V=;3~6(7b!B8zb#QQOc>w?c009zd -Zf0y@bZKvHL2PVqcVTX0WdQ*H{{jkOb8}^MPj_x*asUAT{}O3#W^7?}X>V>pY;13LVQyn(0096000J3l -Zf0y@bZKvHMR;RnWn^)C1bYo}%3So0|Wpqz>Ze?-?a%FB|ZDs!e009JZ -aAjiw009623w3a0VRU6uX=iA30RRC20Sk3-WMOn=QfX&sbN~PW000013w3a0VRU6uX=iA32y}8`ZgXa3 -asU7T009bNb8}^MPj_x*asdGU{{aeNb8}^MPj_x*asdGU{{R6GZf|ZyadlyAL2Yk!Zgg`23So0|Wpqz> -Ze?-+0SI(*VQzC~WpV`>X>Mk0VRUJ4Zbf)wWo2Y@L2PVqcVTX0Wj}dubs%(dc_4IeAZc@Rb!8xJZ*pZI -VRLh3baNndXkl(3VQg$~cV%QCVtF8RXk{Q{Z*FvQVPkY4bY*gFa}jB7W^7?}X>V>#X>)C1bYo~-a%FID -a&%>6AaiwXAa7)URWn>^>b8}^Mb0A@EWFTp7W^7?}X>V>IVQg$~cVTX0Wguj4Wpi#PbRcbEbYo~B -b8uy2X=Z6_5a&K>DAa7N95Y-wZ;X>)URWn@ihb8TUCV`yY^b#QQOc_4FeWn*b(X=P*}VRIm1AZKiEVqt6` -aA9&`ZDn+2av)@HWpi#PbRcbEbYo~BbZBKDX>)URWn>_8b#QQOc_3kIY;R*>bY)~9bZ;PZXk{Q_b8}^M -Aa8eWWpZ;5Zf|ZyadlyAL2Yk!Zgg`+bZBKDb9HSXZ)PBKaAj_EAYpTJWpr~OWN&42ZYOjgWpQ<3Y#?-R -AarPDAaiwXAa7Rb7?wET2nD~cr9mYL^*C)P)03JV`X$zRclu*HgYp{ -Q$tfWEn!h;b2(QvW-T~MMK^Z=4^l@$GB8PQW^7?}VPb4$1XfR6o -;2qj;#?cr>`s8haV?b -j96u3I`KP|x6K-jit^gQ+!PC!a#7jT+VjUz9FBwp3~6(7b!B8zb#QQOc>#!wSY=~6@jI2b%^Ho0^4h`N -6bqMfQQ6em^T$yfj)VaL32k9`Q+04~YJ0RR911Pp0&b9H58 -Q+04~YZe?-+0RR6IX>Mk0 -VRUJ4Zb58pZ+BsCV`TvV|Nj625ovB_Y+-b1Z*EO#b8TUCV`vU(b8~fNWKC&vZDDj{XaWUkb8~fN0003H -VQg$~cV%QrZf0y@bZKvH0Ssw#b9H58Q+04~YMk0VRUJ4Zb58pZ+BsCV`TvV|NjCCVRLh3 -bWe9~WpV%j|NjzcZf0y@bZKvHL2PVqcVTX0WdH#G{{R9RX>Mk0VRUJ4Zbf)wWo2Y@L2PVqcVTX0We#a` -b9H58O=)v&VRU0?0SaMrb7gc-cWz~J2y}8`ZgXa3asU7T009bNb8}^MPj_x*asdGU{{aeNb8}^MPj_x* -asdGU{{R6GZf|ZyadlyAL2Yk!Zgg`23So0|Wpqz>Ze?-+0SI(*VQzC~WpV@=X>Mk0VRUJ4Zbf)wWo2Y@ -L2PVqcVTX0Wj}dubs%(dc_4IeAZc@Rb!8xJZ*pZIVRLh3baNndXkl(3VQg$~cV%QCVtF8RXk{Q{Z*FvQ -VPkY4bY*gFa}jB7W^7?}X>V>#X>)C1bYo~-a%FIDa&%>6AaiwXAa7)URWn>^>b8}^Mb0A@EWFTp7 -W^7?}X>V>IVQg$~cVTX0Wguj4Wpi#PbRcbEbYo~Bb8uy2X=Z6)C1bYo~_b9HcVYK5Ib#!ob -baONSb8~4rOj=Vhb$BgjYD771SWreSPh(|tRaI+OEjDs9byGuAHZ5UMXmdGNHD)b1N<}w!0TWV3LNYK? -Wo}_@VPb4$Mrn9uWCm7GT;ua{7X1n8*eMKMIS5Vl+JKgY@eMZUni+<~yI`{W+ev&_Ht^T -vI2G1Jtsm#HCZ5u7CxP!YXSHMDf_{w_T?x4F -O6=lL&z(3WK0q6KDNxt&_`CFcg8R_`%Mt;aS&0%48nq06tYXfA*6~Y0oR!0JoReaeMuS2F -q^&9T!O;2^`kQ1c-K~WA0cHRI000033~6(7b!B8zb#QQOc>#!wSY=~6@jI2b%^Ho0^4h`N6bqMfQQ6em -^T$yfj)VaK1aoj@V*%IvzT+P7s9j%|JK7ryjGlh`%f(kEcQ`Dp)4jAIiU9!t1$1R{ZF2!zi^o(rG6hN< -BEFO&Yv)so6FMe{9J)pm0(f}fTx|CN00IhOb8}^MPj_x*asmJW0Sk3-WMOn=QfX&sbO8YY000000}N?% -b9H58Q+04~Y)URWn@ihb8TUCV`u^fa%FB|ZDs!e009JZaAjiw009623w3a0VRU6uX=iA30RRC20Sk3-WMOn= -QfX&sbN~PW000013w3a0VRU6uX=iA32y}8`ZgXa3asU7T009bNb8}^MPj_x*asdGU{{aeNb8}^MPj_x* -asdGU{{R6GZf|ZyadlyAL2Yk!Zgg`23So0|Wpqz>Ze?-+0SI(*VQzC~WpV-zX>)URWn@ihb8TUCV`yY^ -b#QQOc_4FeWn*b(X=P*}VRIm1AZKiEVqt6`aA9&`ZDn+2av)@HWpi#PbRcbEbYo~BbZBKDX>)URWn>_8 -b#QQOc_3kIY;R*>bY)~9bZ;PZXk{Q_b8}^MAa8eWWpZ;5Zf|ZyadlyAL2Yk!Zgg`+bZBKDb9HSXZ)PBK -aAj_EAYpTJWpr~OWN&42ZYOjgWpQ<3Y#?-RAarPDAaiwXAa7Rb7?wE -T2nD~cr9mYL^*C)P)03JV`X$zRclu*HgYp{Q$tfWEn!h;b2(QvW-T~MMK^Z=8B#|=GB8qQZeeXewj^T{#F%_1b`zh4BqG=$aXZ#JgYDb9y}-6Hl)`6lNs{1@>}kp0WaU -);%XeLp50-i55Pcp=$y71}Xc$1Lrp{=EDDrH7#OLSAsA5t*+o5+Hb~G`NZD&a!V_MQ#Y)j%3TS#?@H|A -P|uw>B|bnKdMQxX@c6s*e1iMY0Lu~qnpuew4;r-$f2?B8f!6U$L7bJ*7)AQzZGq)H{C6R~@w$(PwZjmw -KqY~;m%)LO2xF@oH+K&Oa!%2AXQg5H&1#KBmGudmOZ0)|JfQ0?Pb~MmrUy{~b?Lg*QU`2l7C000025MgX=Z+B&6Np5CrVRUJ4ZitLnWn((=JC(Q18jXtb+QHlu3zu?H+0@$e -$59-Pgb8AGa&Ay^Z*OKXj>@2NhYQ(KFsV^mYN`~NE3BSBv0kE5j<7&dC#RtY5@L07ZbNTwb7^O8ZDnqB +0tx{NQb$5EFh*&3Wn=_aPh8{kau)pw>ewj^T{#F%_1b`zh4BqG=$aXZ#JgXGmXyziN0{|JN7e}Lp}yyG +JowX;3qseNLLSu1oI{zd+?yZx(V;8SnC`hL-TfxJSk!DhyM4=xS*w!UK;ApTd|%<8%-b!M&HBwn)KKUr +-$vuP2+&Ta#sc9uF^R^6`2l7C000000}N?%b9H58Q+04~Y)URWn@!zaBysS0RRC21aoj@V*vmG00neqa&2<~009623So0|Wpqz>Ze?-- +0RR600S;+%b9H58O=)v&VRU0?0SI(*VQzC~WpV%j0003BVRLh3bWe9~WpV)k|Nj9BVRLh3bWe9~WpV)k +|Nj614{mR6MR9duY(Z^rb#8QX0SaMrb7gc-cWz~J009Vea$#)C1bYo~_b9HcV +YK5Ib#!obbaONSb8~4rOj=Vh +b$BgjYD771SWreSPh(|tRaI+OEjDs9byGuAHZ5UMXmdGNHD)b1N<}w!0T@z8LNYK?Wo}_@VPb4$Np5Cr +VRT_)Y-I*kPh8{kau)pw>ewj^T{#F%_1b`zh4BqG=$aXZ#JgXGmXyziN0{|JN7e}Lp}yyGJowX;3qseN +LLSu1oI{zd+?yZx(V;8SnC`hL-TfxJSk!DhyM4=xS*w!UK;An(O;iF1egdlr48-tVGlr#+)P`<7z3wAh^Auh1g5K&x(~p~tg@CiGir4s}4QS$-W+?plsd +^#;Gh@Y6Gd`2l7C000001Pp0&b9H58Q+04~YTceV>}QC0RRPbWpZtE0b7g5R5&sPN*yA;lp<^AQ;QQiCWsumMiT;fc;H-Y_W=L{ +3So0|Wpqz>Ze?--h>TceV>TceV>@L|V|mt8Tf>F%PuK$$b1YybfP000001Pp0&b9H58Q+04~YZe?-+0RR6IX>Mk0VRUJ4Zb58pZ+BsCV`TvV|NjehaAaY0Wm0Kp +XmkMp0RR935ovB_Y+-b1Z*EO#b8TUCV`vU(b8~fNWKC&vZDDj{Xafalb8~fN000013~6(7b!B8zb#QQO +c>w?c009zdZf0y@bZKvHL2PVqcVTX0WdQ*H{{jkOb8}^MPj_x*asUAT{}O3#W^7?}X>V>pY;13LVQyn( +0096000J3lZf0y@bZKvHMR;RnWn^)C1bYo}%3So0|Wpqz>Ze?-?a%FB| +ZDs!e009JZaAjiw009623w3a0VRU6uX=iA30RRC20Sk3-WMOn=QfX&sbN~PW000013w3a0VRU6uX=iA3 +2y}8`ZgXa3asU7T009bNb8}^MPj_x*asdGU{{aeNb8}^MPj_x*asdGU{{R6GZf|ZyadlyAL2Yk!Zgg`2 +3So0|Wpqz>Ze?-+0SI(*VQzC~WpV@=X>Mk0VRUJ4Zbf)wWo2Y@L2PVqcVTX0Wj}dubs%(dc_4IeAZc@R +b!8xJZ*pZIVRLh3baNndXkl(3VQg$~cV%QCVtF8RXk{Q{Z*FvQVPkY4bY*gFa}jB7W^7?}X>V>#X>)C1 +bYo~-a%FIDa&%>6AaiwXAa7)URWn>^>b8}^Mb0A@EWFTp7W^7?}X>V>IVQg$~cVTX0Wguj4Wpi#P +bRcbEbYo~Bb8uy2X=Z6)C1bYo~_b9HcVYK5Ib#!obbaONSb8~4rOj=Vhb$BgjYD771SWreS +Ph(|tRaI+OEjDs9byGuAHZ5UMXmdGNHD)b1N<}w!0U1(9LNYK?Wo}_@VPb4$Qe|*#VPj=sVr*p!R!>~x +^Kusb3F_D>3|%=0P4(J=Xj +w?M0Iq@l^C6fJN0Nn+CEKR;^Ej5{N+`)&WSOaI1Y@{#1lyC(EoX%2Njt66>>QSMrfPxS`B#PHKIQI@^v +`lYmOWLXtf2b{82Gy=PlI9RDZJa5!w$>tvU@aVl$){io+3a83jb+aU2UkK79C=8NvvYs{82UFVdz0Kav +?s!LzFaVN@Qhak?YBJnD4cw}oQ^}!1o?g8Gt_D#k8aB$U?6-XQzd3xUE|3tGxOO>Eq7XQOjE9*bg!utx +000000SRJta&Ay^Z*OKXj>@2NhYQ(KFsV^mYN`~NE3BSBv0kE5j<7&dC#RtY5@L07ZbNTwb7^O8ZDnqB RdQ?rKPz&##IG7-47St%2#c>Z5R>jkTb_MKDq#SETceV>TceV>xPWn((=JC(Q18jXtb+QHlu3zu?H+0@$e$59-PgaH5!a%FIAVPj=vQ+04~ Yw?c010hjcvE$7aBO)200965b8uy20RRC21$1R{ZF2zt -0RROGVRLh3bWe9~WpV%j|NjYMb#iV}X=iA30RaF15@~K`Y+-b1Z*D)C1bYo}*1Y&h^ -ZvOxQ31W3}ZcuV>Z)O4#Vs&zELvL<#X=iS2Wo~p;a%=zq0RRkQb#iWHWK(r;aBO)20096231W3}Zc=Gy -XmkMp|Nj9AVs&zEQfX&sbN~SV{{R6HX>N95Y-wadb#iV{a&K>D00n7tb9H3^009tTY;13LWn@WiW^7?} -X>V=;3~6(7b!B8zb#QQOc>w?c009zdZf0y@bZKvHL2PVqcVTX0WdQ*H{{jkOb8}^MPj_x*asUAT{}O3# -W^7?}X>V>pY;13LVQyn(0096000J3lZf0y@bZKvHMR;RnWn^)C1bYo}% -3So0|Wpqz>Ze?-?a%FB|ZDs!e009JZaAjiw009623w3a0VRU6uX=iA30RRC20Sk3-WMOn=QfX&sbN~PW -000013w3a0VRU6uX=iA32XbX_Y+++%{{R6AVs&zEP;zf?W&#pob#iV)Z*FsGXKrm}Zgf?0YybcO01k3x -aBN{?Wn@!zaBysS0RRC20St0waBN{?Wm0KpXmkMp|NjCCVRLh3bWe9~WpV)k|NjhfWpHd^V`WllXJ~W) -009610uX6#c42I3WI}avZcuV>Z)Of@b8~fNWKC&vZDDj{XaNdgb8}^MPj_x*atL&CVQzC~WpV%j0003B -VRLh3bWe9~WpV)k|Nj9BVRLh3bWe9~WpV)k|Nj614{mR6MR9duY(Z^rb#8QX0SaMrb7gc-cWz~J009Ve -a$#iZ*?Gaa(N(hZy;%Nb9H4PZEtdAAYpTJWpr~O -bZB92AYp85Z+B&6AYyqSbZBKDV{dMBa$#e1AarGNZF3Q6Zf0y@bZKvHO=)v&VRU0?TykY_Z*p{HWFT{O -Z6I%EAZc@Rb!B8AVRLh3baNnKZe$>7Zf0y@bZKvHAYp85Z+BsCV`U&@Z)J0CCv+ffVRU0?AaihKV`*k- -Wn>_2VR&h6b!{MXb#QQOc@SxCc42I3WI}avZcuV>Z)PcUXk{R9a&LBNWMyO^aB^>NW*~27AaZ4MWpZ|9 -b0BGRAZc!PVQgt+4rz09b!B8tX>)C1bYo~_b9HcVYK5Ib#!obbaONSb8~4rOj=Vhb$BgjYD771SWreSPh(|tRaI+OEjDs9byGuAHZ5UM -XmdGNHD)b1N<}w!0T5D0LNYK?WpHd^V`X7tY-I>mPh8{kau)pw>ewj^T{#F%_1b`zh4BqG=$aXZ#JgYD -b9y}-6Hl)`6lNs{1@>}kp0WaU);%XeLp50-i55Pcp=$y71}Xc$1Lrp{=EDDrH7#OLSAsA5t*+o5+Hc0u -7)AQzZGq)H{C6R~@w$(PwZjmwKqY~;m%)LO2xF^Yx@K;6Hp!X)CDEXUJSYhKrUy{~b?Lg*QU`2l7C000025MgX=Z+B&6Np5CrVRUJ4ZitLnWn((= -JC(Q18jXtb+QHlu3zu?H+0@$e$59-Pgb8AGa&Ay^Z*OKXj>@2NhYQ(KFsV^mYN`~NE3BSBv0kE5j<7&d -C#RtY5@L07ZbNTwb7^O8ZDnqBRdQ?rKPz&##IG7-47St%2#c>Z5R>jkTb_MKDq#SETceV>TceV>xPWn((=JC(Q18jXtb+QHlu3zu?H+0@$e -$59-PgaH5!a%FIAVPj=vQ+04~Yw?c010hjcvE$7aBO)200965b8uy20RRC21$1R{ -ZF2zt0RRLFVRLh3bWe9~WpV%j|NjYMb#iV}X=iA30RaF15@~K`Y+-b1Z*D)C1bYo})1Y&h^ZvOxQ31W3}ZcuV> -Z)O4#Vs&zELvL<#X=iS2Wo~p;a%=zq0RRkQb#iWHWK(r;aBO)20096231W3}Zc=GyXmkMp|Nj9AVs&zE -QfX&sbN~SV{{R6HX>N95Y-wadb#iV{a&K>D00n7tb9H3^009tTY;13LWn@WiW^7?}X>V=;3~6(7b!B8z -b#QQOc>w?c009zdZf0y@bZKvHL2PVqcVTX0WdQ*H{{jkOb8}^MPj_x*asUAT{}O3#W^7?}X>V>pY;13L -VQyn(0096000J3lZf0y@bZKvHMR;RnWn^)C1bYo}%3So0|Wpqz>Ze?-@ -a%FIAVPj?g009YNb#iV{a&K>D0uo|%a&AL!ZgXj8Zf#|5bX9U}000314svC1Y+++%WK(r;aBO)200962 -402^~Y+++%QfX&sbO8YW{{jkOb8}^MPj_x*asdGU{|s_vaBN{?Wm0KpXmkJo0RR935NU39VQgt+LUnR( -P;zf?W)5j{b9H58O=)v&VRU0?0SaMrb7gc-cWz~J2y}8`ZgXa3asU7T009bNb8}^MPj_x*asdGU{{aeN -b8}^MPj_x*asdGU{{R6GZf|ZyadlyAL2Yk!Zgg`23So0|Wpqz>Ze?-+0SI(*VQzC~WpV`>X>Mk0VRUJ4 -Zbf)wWo2Y@L2PVqcVTX0Wj}dubs%(dc_4IeAZc@Rb!8xJZ*pZIVRLh3baNndXkl(3VQg$~cV%QCVtF8R -Xk{Q{Z*FvQVPkY4bY*gFa}jB7W^7?}X>V>#X>)C1bYo~-a%FIDa&%>6AaiwXAa7)URWn>^>b8}^M -b0A@EWFTp7W^7?}X>V>IVQg$~cVTX0Wguj4Wpi#PbRcbEbYo~Bb8uy2X=Z6_5a&K>DAa7N95Y-wZ;X>)UR -Wn@ihb8TUCV`yY^b#QQOc_4FeWn*b(X=P*}VRIm1AZKiEVqt6`aA9&`ZDn+2av)@HWpi#PbRcbEbYo~B -bZBKDX>)URWn>_8b#QQOc_3kIY;R*>bY)~9bZ;PZXk{Q_b8}^MAa8eWWpZ;5Zf|ZyadlyAL2Yk!Zgg`+ -bZBKDb9HSXZ)PBKaAj_EAYpTJWpr~OWN&42ZYOjgWpQ<3Y#?-RAarPDAaiwXAa7Rb7?wET2nD~cr9mYL^*C)P)03JV`X$zRclu*HgYp{Q$tfWEn!h;b2(QvW-T~MMK^Z=4N^x! -GB84Qa&BQ_Y-I#iPh8{kau)pw>ewj^T{#F%_1b`zh4BqG=$aXZ#JgYDb9y}-6Hl)`6lNs{1@>}kp0WaU -);%XeLp50-i55Pcp=$y71}Xc$1Lrp{=EDDrH7#OLSAsA5t*+o5+Hc0ZZ)P!$%Aj(G3)xaIsZm;LsuY+jte!uyUZPTtus~8Lr=bNB -Vs&zELvL<#X=iS2Wo~p;a%=%VD{{BQuNq?vw$uLzi?1~hlkP@ao_$9uVE}^UN!R2601RSva&Bd0Q+04~ -Yw?c00eVzWn%#V0RRPbWpZtE0RRC20t#Vsb7gc-cWz~J0096031W3} -Zc=GyXmkMp|Nj614rz09b!B8tX>)C1bYo}&1Y&h^ZvOxQ31W3}ZcuV>Z)O4#Vs&zELvL<#X=iS2Wo~p; -a%=zq0RRkQb#iWHWK(r;aBO)20096231W3}Zc=GyXmkMp|Nj9AVs&zEQfX&sbN~SV{{R6HX>N95Y-wad -b#iV{a&K>D00?w)VQzC~WpV%j0003BVRLh3bWe9~WpV)k|Nj9BVRLh3bWe9~WpV)k|Nj614{mR6MR9du -Y(Z^rb#8QX0SaMrb7gc-cWz~J009Vea$#_5 -a&K>DAa7N95Y-wZ;X>)URWn@ihb8TUCV`yY^b#QQOc_4FeWn*b(X=P*}VRIm1 -AZKiEVqt6`aA9&`ZDn+2av)@HWpi#PbRcbEbYo~BbZBKDX>)URWn>_8b#QQOc_3kIY;R*>bY)~9bZ;PZ -Xk{Q_b8}^MAa8eWWpZ;5Zf|ZyadlyAL2Yk!Zgg`+bZBKDb9HSXZ)PBKaAj_EAYpTJWpr~OWN&42ZYOjg -WpQ<3Y#?-RAarPDAaiwXAa7Rb7?wET2nD~cr9mYL^*C)P)03JV`X$z -Rclu*HgYp{Q$tfWEn!h;b2(QvW-T~MMK^Z=3Q|WxGB8GIcx7Y+R!>~x^Kusb3F_D>3|%=0P4(JM391~BkJ``pp2L<+WYM!zJb=Ey6LPIrKAc+<}ouO+1_y#HazXRttFXqDki#07`P*;L4 -`>n3v9olck!*b;G%XfgQf1jL_VwFaNLIb3&DfYq8`WE_|WGmgRg!utx0000000RtZb8~fNWK(r;aBO)2 -h>TceV>}QC0RRPbWpZtE0b7g5R5&sPN*yA;lp<^AQ;QQiCWsumMiT;fc;H-Y_W=L_3So0|Wpqz>Ze?-; -009920009FX>)URWn@!zaBysS0RRC21aoj@V*vmG00neqa&2<~009623So0|Wpqz>Ze?--0RR600S;+% -b9H58O=)v&VRU0?0SI(*VQzC~WpV%j0003BVRLh3bWe9~WpV)k|Nj9BVRLh3bWe9~WpV)k|Nj614{mR6 -MR9duY(Z^rb#8QX0SaMrb7gc-cWz~J009Vea$#)C1bYo~_b9HcVYVo@@XC0Ra+eZf0y@bZKvHL2PVqcVTX0WdVqcSY=~6@jI2b%^Ho0^4h`N6bqMf +QQ6em^T$yfj)VXK009hgWpHd^V`WllXJ~W**gwADFAe3iZ1@l19{2t5VaJV^T`{fc?xMUvnKPbj00993 +3w3a0VRU6uX=iA30oXsj;4cm3v~2hf;U4$>@L|V|mt8Tf>F%PuK$$b1YybfP000001Pp0&b9H58Q+04~ +YZe?-+0RR69Vs&zEQfX&s +bO8YW{}O3#W^7?}X>V>pY;13LVQyn(0RaF1402^~Y+++%QfX&sbO8YW{|j|+WMOn=QfX&sbO8VX0006J +X>Mk0VRUJ4ZcS-(ZDDj{Xbx#}b9H58O=)v&VRU0?1q5Psa&G?s0SRJta&Ay^Z*OJ-5@L07ZbNTwb7^O8 +ZDnqBRdQ?q0096DVs&zEWn@!zaBysS0RRC20SRJta&A&-XJ~W*0RR6131W3}Zc=GyXmkJo|Nj615NU39 +VQgt+LUnR(P;zf?W&j0gb8~fN000013~6(7b!B8zb#QQOc>w?c009zdZf0y@bZKvHL2PVqcVTX0WdQ*H +{{jkOb8}^MPj_x*asUAT{}O3#W^7?}X>V>pY;13LVQyn(0096000J3lZf0y@bZKvHMR;RnWn^)C1bYo}%3So0|Wpqz>Ze?-?a%FB|ZDs!e009JZaAjiw009623w3a0VRU6uX=iA3 +0RRC20Sk3-WMOn=QfX&sbN~PW000013w3a0VRU6uX=iA32XbX_Y+++%{{R6AVs&zEP;zf?W&#pob#iV) +Z*FsGXKrm}Zgf?0YybcO01k3xaBN{?Wn@!zaBysS0RRC20St0waBN{?Wm0KpXmkMp|NjCCVRLh3bWe9~ +WpV)k|NjhfWpHd^V`WllXJ~W)009610uX6#c42I3WI}avZcuV>Z)Of@b8~fNWKC&vZDDj{XaNdgb8}^M +Pj_x*atL&CVQzC~WpV%j0003BVRLh3bWe9~WpV)k|Nj9BVRLh3bWe9~WpV)k|Nj614{mR6MR9duY(Z^r +b#8QX0SaMrb7gc-cWz~J009Vea$#iZ*?Gaa(N(h +Zy;%Nb9H4PZEtdAAYpTJWpr~ObZB92AYp85Z+B&6AYyqSbZBKDV{dMBa$#e1AarGNZF3Q6Zf0y@bZKvH +O=)v&VRU0?TykY_Z*p{HWFT{OZ6I%EAZc@Rb!B8AVRLh3baNnKZe$>7Zf0y@bZKvHAYp85Z+BsCV`U&@ +Z)J0CCv+ffVRU0?AaihKV`*k-Wn>_2VR&h6b!{MXb#QQOc@SxCc42I3WI}avZcuV>Z)PcUXk{R9a&LBN +WMyO^aB^>NW*~27AaZ4MWpZ|9b0BGRAZc!PVQgt+4rz09b!B8tX>)C1bYo~_b9HcVYK5Ib#!obbaONSb8~4rOj=Vhb$BgjYD771SWreS +Ph(|tRaI+OEjDs9byGuAHZ5UMXmdGNHD)b1N<}w!0S!_|LNYKyb#iWDVr*puR!>~x^Kusb3F_D>3|%=0 +P4(J@2NhYQ(KFsV^mYN`~NE3BSBv0kE5j<7&dC#RtW5@L07ZbNTwb7^O8ZDnqBRdQ?rKPz&##IG7- +47St%2#c>Z5R>jkTb_MKDq#SETceV>TceV>}QC0RRPbWpZtE0b7g5R5&sPN*yA;lp<^AQ;QQiCWsum +MiT;fc;H-Y_W=L`3So0|Wpqz>Ze?--h>TceV>)URWn@!zaBysS0RRC2 +1aoj@V*vmG00neqa&2<~009633So0|Wpqz>Ze?-+0RR69Vs&zEQfX&sbO8YW{{R6FX>)URWn@ihb8TUC +V`u^dVs&zE{{R6AVs&zEP;zf?W&#pob#iV)Z*FsGXKrm}Zgf?0YybcO01RSva&Bd0Q+04~YZe?-+0SI(* +VQzC~WpV=$X>N95Y-wadb#iV{a&K>DDRgLMAaHVTc4=f~WFT;IZ*OKGZ)PBJWpib6c4c!QX>%ZHZgyd8 +X=Dy*b8~fNWKC&vZDDj{Xk>GBaBysSAaihKV`*k-Wn>^>b0A?LXKZg`VQe69VRB(@Wprh7AY^Z4b8aVe +AZ=lEV`w0BXk{R2b8~fNWFT{OaBysSAYp85Z)0I}Wn>_9Zy?Xk{RCb!{MTW*~ELWo~pJVRLh3baNnNZ)J0CCv+fXadlyAAarjabZBKDb9HSXZ)PB2b8}^M +b0BGMAa8YaaCLNZGyrpRX*x_=Q!#aTEoW*(Ic```MlDZcWpq_lYga8cax-;PLsK>_VNqyvIaf7iEjUU= +H+KOLQb$5EFj8f3Y+++%VPb4$2v$#A1;Sl1(t?aja +_`f-Ps4kEYmbi8~P@)hxf{cfmB82$?W&i*H009YNb#iV{a&K>DF^xPWn((=JC(Q18jXtb+QHlu3zu?H+0@$e$59-Pga82yX>)URWn@!zaBysS0f>xP +Wn((=JC(Q18jXtb+QHlu3zu?H+0@$e$59-PgaH8wZDDv*b#QQOc>#!wSY=~6@jI2b%^Ho0^4h`N6bqMf +QQ6em^T$yfj)VaK4svC1Y+++%WK(r;aBO)2h>TceV>}QC0RRPbWpZtE0b7g5R5&sPN*yA;lp<^AQ;QQi +CWsumMiT;fc;H-Y_W=L|3So0|Wpqz>Ze?--h>TceV>Mk0VRUJ4Zb58pZ+BsC +V`Tw|j96u3I`KP|x6K-jit^gQ+!PC!a#7jT+VjUz9FBwl0RRCEa%FIAVPj=dX=iA30oXsj;4cm3v~2hf +;U4$>@L|V|mt8Tf>F%PuK$$b1YybfP0RR911Pp0&b9H58Q+04~YZe?-+0RR69Vs&zEQfX&sbO8YW{}O3#W^7?}X>V>pY;13LVQyn( +0RaF1402^~Y+++%QfX&sbO8YW{{R9JX>Mk0VRUJ4ZcS-(ZDDj{Xbx#}b9H58O=)v&VRU0?1O#Gra&G?s +0SRJta&Ay^Z*OJ-5@L07ZbNTwb7^O8ZDnqBRdQ?q0096DVs&zEWn@!zaBysS0RRC20SRJta&A&-XJ~W* +0RR6131W3}Zc=GyXmkJo|Nj615NU39VQgt+LUnR(P;zf?W&j0gb8~fN000013~6(7b!B8zb#QQOc>w?c +009zdZf0y@bZKvHL2PVqcVTX0WdQ*H{{jkOb8}^MPj_x*asUAT{}O3#W^7?}X>V>pY;13LVQyn(00960 +00J3lZf0y@bZKvHMR;RnWn^)C1bYo}%3So0|Wpqz>Ze?-@a%FIAVPj?g +009YNb#iV{a&K>D0uo|%a&AL!ZgXj8Zf#|5bX9U}000314svC1Y+++%WK(r;aBO)200962402^~Y+++% +QfX&sbO8YW{{jkOb8}^MPj_x*asdGU{|s_vaBN{?Wm0KpXmkJo0RR935NU39VQgt+LUnR(P;zf?W)5j{ +b9H58O=)v&VRU0?0SaMrb7gc-cWz~J2y}8`ZgXa3asU7T009bNb8}^MPj_x*asdGU{{aeNb8}^MPj_x* +asdGU{{R6GZf|ZyadlyAL2Yk!Zgg`23So0|Wpqz>Ze?-+0SI(*VQzC~WpV`>X>Mk0VRUJ4Zbf)wWo2Y@ +L2PVqcVTX0Wj}dubs%(dc_4IeAZc@Rb!8xJZ*pZIVRLh3baNndXkl(3VQg$~cV%QCVtF8RXk{Q{Z*FvQ +VPkY4bY*gFa}jB7W^7?}X>V>#X>)C1bYo~-a%FIDa&%>6AaiwXAa7)URWn>^>b8}^Mb0A@EWFTp7 +W^7?}X>V>IVQg$~cVTX0Wguj4Wpi#PbRcbEbYo~Bb8uy2X=Z6_5a&K>DAa7N95Y-wZ;X>)URWn@ihb8TUC +V`yY^b#QQOc_4FeWn*b(X=P*}VRIm1AZKiEVqt6`aA9&`ZDn+2av)@HWpi#PbRcbEbYo~BbZBKDX>)UR +Wn>_8b#QQOc_3kIY;R*>bY)~9bZ;PZXk{Q_b8}^MAa8eWWpZ;5Zf|ZyadlyAL2Yk!Zgg`+bZBKDb9HSX +Z)PBKaAj_EAYpTJWpr~OWN&42ZYOjgWpQ<3Y#?-RAarPDAaiwXAa7R +b7?wET2nD~cr9mYL^*C)P)03JV`X$zRclu*HgYp{Q$tfWEn!h;b2(QvW-T~MMK^Z=AW}y{GB8qQZeeX< +Vr*qeZf0y@bYWs_WkPjwZee0rO +#PD4+hNY3zhHge0S17sc2g^gW*qq<5&?2`$t8S#B$)*%7Z}~}L(&RrsYR`;2Be45z|FTQ}#%1!6Zk2EWAc(=$<)z3BR-v~6Tr6;=nFvQ{(#yOKCqsXjb!)MUx#9{KR-y;IhYGOY@y +%3F1_Bwt?$(j+Jhl5(=1HP#1H+VO<>0cHRI0003AVs&zEP;zf?W-*S+pmK)`*-|j6QCe!M6qqZlop?nYaleMc%`0D|O6*W>^I +3}SV1Ze?Usb#QQOc>#!wSY=~6@jI2b%^Ho0^4h`N6bqMfQQ6em^T$yfj)VXK3~6(7b!B8zb#QQOc>#!w +SY=~6@jI2b%^Ho0^4h`N6bqMfQQ6em^T$yfj)VaL32k9`Q+04~YVo@@XC0Ra+e +Zf0y@bZKvHL2PVqcVTX0WdVqcSY=~6@jI2b%^Ho0^4h`N6bqMfQQ6em^T$yfj)VXK009eiaAaY0Wm0Kp +XmkPCKfd5E4dt|K_z&S8_x)URWn@!zaBysS0RRC232k9` +Q+04~YMk0 +VRUJ4Zb58pZ+BsCV`TvV|NjehaAaY0Wm0KpXmkMp0RR935ovB_Y+-b1Z*EO#b8TUCV`vU(b8~fNWKC&v +ZDDj{Xaodeb#iY1009YNb#iV{a&K>D0uo|%a&AL!ZgXj8Zf#|5bX9U}000313}SV1Ze?Usb#QQOc>w?c +009YNb#iV}X=iA30RaF10SRJta&A&-XJ~W)0RR600T5|!c42I3WI}avZcuV>Z)N}mX>)URWdHyG0Ssw# +b9H58Q+04~YMk0VRUJ4Zb58pZ+BsCV`TvV|NjCCVRLh3bWe9~WpV%j|NjzcZf0y@bZKvH +L2PVqcVTX0WdH#G{{R9RX>Mk0VRUJ4Zbf)wWo2Y@L2PVqcVTX0We#a`b9H58O=)v&VRU0?0SaMrb7gc- +cWz~J26AO?VQppq00035b8uy20RRC20Sk3-WMOn=QfX&sbO8VX009eiaAaY0Wm0KpXmkJo0RR910Sk3- +WMOn=QfX&sbO>~EVQzC~WpV%j0003BVRLh3bWe9~WpV)k|Nj9BVRLh3bWe9~WpV)k|Nj614{mR6MR9du +Y(Z^rb#8QX0SaMrb7gc-cWz~J009Vea$#iZ*?Ga +a(N(hZy;%Nb9H4PZEtdAAYpTJWpr~ObZB92AYp85Z+B&6AYyqSbZBKDV{dMBa$#e1AarGNZF3Q6Zf0y@ +bZKvHO=)v&VRU0?TykY_Z*p{HWFT{OZ6I%EAZc@Rb!B8AVRLh3baNnKZe$>7Zf0y@bZKvHAYp85Z+BsC +V`U&@Z)J0CCv+ffVRU0?AaihKV`*k-Wn>_2VR&h6b!{MXb#QQOc@SxCc42I3WI}avZcuV>Z)PcUXk{R9 +a&LBNWMyO^aB^>NW*~27AaZ4MWpZ|9b0BGRAZc!PVQgt+4rz09b!B8tX>)C1bYo~_b9HcVYK5Ib#!obbaONSb8~4rOj=Vhb$BgjYD771 -SWreSPh(|tRaI+OEjDs9byGuAHZ5UMXmdGNHD)b1N<}w!000UC1#Gq-LtV;98lBqaN0;(;B|q-bRM{W1 -)L%g{m9(^~pY!cz00000GyrpRX*x_=Q!#aTEoW*(Ic```MlDZcWpq_lYga8cax-;PLsK>_VNqyvIaf7i -EjUU=H+KO50RRFBMrC1ib#i5M6#xPVVs&zEVPb4$3TbX;Y+-a^Vr*pyQ*>c&WMOh-1^@+8M?x|%0u)!z -Jz&S<@Ky$X_d;c&WMOh-1^@+8M?x|%0vk7X4+U~g(RXL1VfW2yjYXC937bpwf#p1)>n=|$_n`CbW&i*H05kw|b7?wE -T2nD~cr9mYL^*C)P)03JV`X$zRclu*HgYp{Q$tfWEn!h;b2(QvW-T~MMK^Z=009632u5XLbairNa~1#s -3TbX;Y+-a^Vr*pza%FB|ZDC?;We8JrVQyq$a%2Vo1yV;sGB5%%M6SO4_Da#SxnBo+3bcNROo|1j{X;Qc -*H1(#*~#ai^X+B;0000q0CRI`I!szqF?Dz?XKF+_Zdg!8El*=*bX8SrS1mSjGj&r#Q#LJOQD}2HS2boW -I7&q~cL4wa00Ia`Wnpx6a%FQL00RhOb#iWDVr*p!X>Mk0VRT_)Y-I^@Wo}_@VPb4$2vc-nZe(F{WCj2Q -Qb$5EFalt@W^Q&i$(jEp(V&JrC$Ozb>ku7xOe>5#Z7vrq+J5t%#zD>eGZn=?i*BFu?PdS~001-qb8~4r -Oj=Vhb$BgjYD771SWreSPh(|tRaI+OEjDs9byGuAHZ5UMXmdGNHD)b1N<}w!0RRC20tiNBVRUtJWpfJv -0SR(tZeeXc&WMOh-1^@+8M?x|%0jbYX5}VRB>! -00mM_VNqyvIaf7iEjUU=H+KO50RRFBMrC1ib#i5MApipiVs&zEVPb4$ -3TbX;Y+-a^Vr*p#a%FIAVPj=sVr*pyQ*>c&WMOh-1^@+8M?x|%0?QN;aMF0l$;s3AATB&9buRvPK}ZMPM`DbW&i*H05kw|b7?wET2nD~cr9mYL^*C)P)03JV`X$zRclu*HgYp{Q$tfWEn!h;b2(Qv -W-T~MMK^Z=009632u5XLbairNa|!?f2x4_|Zee0!00mMUMA(m1w0!?L{VGDpk+OvDhHAKF%fNXr25$w;Zs!r0000000007 -000000000E(i%G%h4}Sf8vn;89aSG|t4s0*&BRFk%a^yrND0jb0t9t*cyH)xK+Rkw`Mu(V|7oQWGN(Z+ -AyvH&RuaL#D^138|7M^`NNc{jXEg#>2x#JO!0is)`buE3*f$s=77|WDz5|hsu4xM=1 -##_akM=$^Wt^4(jv6#$*DE3PM1p!tKmiMH2B(lTb1P)|lIgi#~)sbZ^DMLcPrTIA(QB)kOzr)xjz`xPy -cM6D}`pk=G7OeqFKI{;-SrsrMkU{`J9I$nc6v6J{1p&;$a*~gE -I0M-qU9F8#%$RFKGB^*CB=^U`QB8J^yO1H{K10Q-T=FR=Q=>S+XYD&KHujTH+>EdJQM&>E4z*R)+SA#T-nt8wey2OO)v -!`LRkztQP;3W%Qi%!_9htpQ3t>=3qD6)+-@LLdMy*z$T8ClZi8YCe|m_*?{lv>_T7tkE!8{87}TyWT7W -0ssVVZ*FDSKfd5E4dt|K_z&S8_xVm --pkWcojB&*wsIf|mobjYpmK)`*-|j6QCe!M6qqZlo$g+grvznd|(VVK)`s##^Jh_COk!RL4 -N<*rD#rE}NPvxSnUK**8Le1-kltSZ7azFKgf3Y*(iUtA%ba`-Pu?^n-fFP~dpvnj-AyBKaJW)+{-ce}5 -$#DguerIN224rbxWpi{YTdJ&3iT??W6$?l#{@A?G8j--)v|TbGZq;_HaqHbhw}2&v0mUY=J6lL$MhcKn -;XgI|zJmp*01;Q@0XT>R0ssVVZ*FDSKfd5E4dt|K_z&S8_x-d45AI6^+T%?S?D -8ao+<`1M~J|HmdBRUd1sOY#QI#7ON6MEdyk4bS?#RY+-X~F9dpJa&IsLZ*FBV19W$9G6i&Ka%E*R1ZHn_ax?^HX?A5b19NG3HU)EKc4cli -1!ZYxXmmIPZfS01IR#^HY;SHl33Fv_X+v*pZ*DsTY-MwEJOyQObzy8h2WN6+VRU73J_vDjWpi|CZ*D&V -VRS$OUqL|vUqV6xUqeFzUqnO#UqwX%Uq(g(Uq?p*Ur0y-Ur9*UrS2@UrbB_UrkK{UrtT}Ur$d0 -Ur8UsO~AUsY8CUshHEUsqQGUszZIUs+iKUs_rUb8$j)VPk7$bWB?bVqs%zQ*2># -Xj}?&aYAxoV{2t}Qe6dOVRB`3UIuJ$WMOk?UkGAhV{3G2V{2dmVPOGcVgX}g0c2zWWn}?oW&vks0cdCe -X=wp!Y5{9&0c>mmZEXQ=ZUJv^0dQ~uad821ashL50d#Z$b#(!Db^&*H0eE-;d3gbPdI@7fa$#d@Wpqq? -1aN6^Wqb)^LULhaYh`p&eFb!BY-DAARt=W-qYp6avD7| -R0gwX!*5!Gc?n?5;yM1jui=Thm^szjcmMzZ000000RR600000009$t~jeJj&GE~o3bsJMXYO0?^NT%k!=UF9_Hk+b8VFt_j2&9|DqsTD5}A2(UF#~}_M00>4q10|{hh -V`)ukY;0)+3S(t%bZJd#Y;0)-1#M|#a&HC+WMyM%O=)9tZwCrvWo~q7O=)9tZwLf#VQy~;2xMhrX-;8o -Zwd)xWo~q7PGN3u3j}a!V{Z%yWMyM%P-$at4GCjqZggo-X=85=1!iS!bZ-v{WMyM%MrCbuZx9M&Wo~q7 -MrCbuZxIAxbaZbLUS7zOPjk(3#3Edlt4DceSnnHhoTCQfV7#O&C5asm1puYQ&j^#1bSt1Z!iOIZe=k8ba!tu1$1a~Wo0u2W^Z+JGz4a8c4ajKb7^=s1#@L~Wo|bG -Woc(MgX0$)Kv0$)Nx0$)Qz0$)T#0$)W%0$)Z(0$)c*0$)f-0$)i<0$)l>0$)o@0$)r_0$)u{ -0$)x}0$)#00$)&20$)*40$);60$)>80$)^A0$){C0$)~E0$*2G0$*5I0$*8K0$*BM0byYQVqyVfV*zAj -0cB+YW@Z6rX8~wv0cmLgYH9&%YXNL*0c~voZf*f@Zvk*{0da8wa&iH4a{+X80d;i&c6I@GcL8{K0eN`= -dU|83BNXVdN64~--?N&Y5Ye2f)%xm$jy$=9osnnOG)f5jsaSFvJu_4WvuML_T7r2AV9eq<{=Bc@iMp6M -)!KLg0000000030000000001hUd6mq639W2L|vh3p}>j>;{fO~I?t|ZBSH!(tpGg*0mM3ep1HFEd2`8+ -UDn~O1og|)LO{U2yb2Gv2owO6)Pf^`^mXvL0b>G|!UHq{UqL|vUqV6x -UqeFzUqnO#UqwX%Uq(g(Uq?p*Ur0y-Ur9*UrS2@UrbB_UrkK{UrtT}Ur$d0Ur8UsO~AUsY8CUshHEUsqQGUszZIUs+iKUs_rLVPOGcVgX}g0c2zWWn}?oW&vks0cdCeX=wp!Y5{9& -0c>mmZEXQ=ZUJv^0dQ~uad821ashL50d#Z$b#(!Db^&*H0eE-;d3gbPdWeizWn((=JC(Q18jXtb+QHlu -3zu?H+0@$e$59-PgarXyp-EU>tcHU8F!O3w2qJC#)UJ{2Xl2|ba`-PFWB;W7bg;sK59Oe@c3K=fV3eR7p&1RS^QDd -q`TfM2V-bqa&u*LFWB;W7bg;sK59Oe@c3K=fV3eR7p&1RS^QDdq`TfMzmLo5#W`0ornJpr`vBkPrPe7n -Q#r+2>fnc?xeBUA2t3iEoy@J9k$WaEUx}!s`ym)GDo%67tO|Gy=Bof+a{vGU0000006zc#000000K__d -p1HFEd2`8+UDn~O1og|)LO{U2yb2Gv2owO6)CB@az9SbZ=!8X@=Yuq$20sb<4l#S`iz7Vef}@Ca=a#tj -trsCg%+lRr?B`GL`xImylWKs$pvgYJmvV80iF~}u|BtS-iU6QaHX&1wj$zkYg`{Q63JyraSw4QMY+uI( -0Y58px5Td+V+^*_{|Jk(H4u~TMq8eJM=D_eg5*ipf1KA&4t&LI4m}^5aI1iE}_s79eO?HmE -kOczy7YGF1t^|4b)vt7`JJJH?>OpeZskt`?6&l-r#0;UokIU)BIae{Jw9R4r0N>}O)+shqImKG);D@8R -3aUoe{J!HJ@Tgs1mpj@U3yhwA`^&{wC3iS1tkb=;A&LP81O{|zV{2t{TX!suv0v9m0LPL+_79KRH|I99 -{YEOV7tT#ZPWpkW1a4t%Wq@AAyi*d$L6AgUp=zPPiV5QY=rTIbu4*Gf3Ms7sJqKiEbYW?1b49m+C58dT -CbBzQNMS|_kWk@2HT%AU1*iZKSL6XWhzW3VWn*b`X>V>_1H>1Nsg8a>I`c#0nSFF19TD^=GS9xEuuG0V -@n0g?Kfd5E4dt|K_z&S8_xxYy=<4kft^@4w~Gv12ehp04`Gl!Y4#EOy;XgWfDE7LwMr|Y<= -xPaY62ZUYgq2{$1_lBIba-iGqk=;7 -%h%D+p%U7S;b1RT)c9`>#Kd;Rz-U=aO9W+B1a@zAbRpwDL&d6G@+l`%qd385?K@+fP1(-9sgE>i7rMzq -b@I9-fEJ#8I!OHhFfAY7fVtxlj{%}vrgbfS&w=jH<(%oY0=TGqa6l5KfYJkC@$v(fAa&d%-e7p!qz9SbZ=!8X@=Yuq$ -20sb<4l#S`iz7Vef}@Ca=a#qt000000000d000000002_7YGF1t^|4b)vt7`JJJH?>OpeZskt`?6&l-r -#0;SW8UbNp0b*hSV`BkiWC3Mm0cK_aXJ-LuXaQ+y0cvUiYij{)YyoX;0d8&qZ*Ku`Z~<{~0djHyb8`W7 -bOCjB0d{r)cXt7Jcma8N0eX7-saSFvJu_4WvuML_T7r2AV9eq<{=Bc@iMp6M)!KLg0000 +SWreSPh(|tRaI+OEjDs9byGuAHZ5UMXmdGNHD)b1N<}w!0T)t7LNYK(Zf0y@bYWs_WkPjwZee0GH +T;ua{7X1n8*eMKMIS5Vl+JKgY@eMZUni+<~yI+Ntl+T7onDsqJ)(GyQzUOj0_|udNLf4!^9@NX6Lz%7I +n;-bmp)1mu?zt)5{U*Cu)NDMveankktCHJ5-aAYG#%1!6Zk2EWAc(=+1e +Oa;Pa>U;_B*=$tWH4|V#*V^5dw@@10SKNxK-GK1uy;IhYGOY@y%3F1_Bwt?$(j+Jhl5(=1HP#1H+VO<> +0cHRI0003AVs&zEP;zf?W-*S+pmK)`*-|j6QCe!M6qqZlop?nYaleMc%`0D|O6*W>^I3}SV1Ze?Usb#QQOc>#!wSY=~6@jI2b +%^Ho0^4h`N6bqMfQQ6em^T$yfj)VXK3~6(7b!B8zb#QQOc>#!wSY=~6@jI2b%^Ho0^4h`N6bqMfQQ6em +^T$yfj)VaL32k9`Q+04~YVo@@XC0Ra+eZf0y@bZKvHL2PVqcVTX0WdVqcSY=~6 +@jI2b%^Ho0^4h`N6bqMfQQ6em^T$yfj)VXK0096100azab8~fNWK(r;aBO)20096AZDDv*b#QQOc>w?c +00eVzWn%#V0RRPbWpZtE0RRC20}5etb7gc-cWz~J0096031W3}Zc=GyXmkMp|NjzcZf0y@bZKvHL2PVq +cVTX0WdQ*H{{R9JX>Mk0VRUJ4ZcS-(ZDDj{Xbx#}b9H58O=)v&VRU0?0|a7qa&G?s0SRJta&Ay^Z*OJ- +5@L07ZbNTwb7^O8ZDnqBRdQ?q0096DVs&zEWn@!zaBysS0RRC20SRJta&A&-XJ~W*0RR6131W3}Zc=Gy +XmkJo|Nj615NU39VQgt+LUnR(P;zf?W&j0gb8~fN000013~6(7b!B8zb#QQOc>w?c009zdZf0y@bZKvH +L2PVqcVTX0WdQ*H{{jkOb8}^MPj_x*asUAT{}O3#W^7?}X>V>pY;13LVQyn(0096000J3lZf0y@bZKvH +MR;RnWn^)C1bYo}%3So0|Wpqz>Ze?-^baG*Cb7p07000000SaMrb7gc- +cWz~J0RaF10SaMrb7gc-cWz~J0RaF1009qfZ*E0#bzy8lZEtmMbaMd;VRLh3bWe9~WpV%k2y}8`ZgXa3 +as?S_Zf0y@bZKvHMR;RnWn^)URWgu;Da%CW4b8}^Mb0BnRVQwH{ +Y;13LWn>^?c_4IXWgug3Zgg^CV{{;NWpZtE5ovB_Y+-b1Z*EO#b8TUCV`yA*WpHnDbY)~9b9HSXZ)PBA +b8~fNWFTR4b7gdMAYpD~AZc!9Y+-b1Z*CxAY;13LVQyn(AY^Z4b8aVeAZ=lEV`w0AaAjj@W@%+)AZ=lI +X>E0FAaiwaaBO)HX>N95Y-wadb#iV{a&K>DDRgLMAaHVTc4=f~WFT;IZ*OKGZ)PBJWpib6c4c!QX>%ZH +Zgyd8X=Dy*b8~fNWKC&vZDDj{Xk>GBaBysSAaihKV`*k-Wn>^>b0A?LXKZg`VQe69VRB(@Wprh7AY^Z4 +b8aVeAZ=lEV`w0BXk{R2b8~fNWFT{OaBysSAYp85Z)0I}Wn>_9Zy?Xk{RCb!{MTW*~ELWo~pJVRLh3baNnNZ)J0CCv+fXadlyAAarjabZBKDb9HSXZ)PB2 +b8}^Mb0BGMAa8YaaCLNZGyrpRX*x_=Q!#aTEoW*(Ic```MlDZcWpq_lYga8cax-;PLsK>_VNqyvIaf7i +EjUU=H+KORQb$5EFj8f1VQpbzY-K`qa&BQ_Y-I*kPh8{kau)pw>ewj^T{#F%_1b`zh4BqG=$aXZ#JgXG +mXyziN0{|JN7e}Lp}yyGJowX;3qseNLLSu1oI{zd+?yZx(V;8SnC`hL-TfxJSk!DhyM4=xS*w!UK;An( +O;iF1egdlr48-tVGlr#+)P`<7z3wAh^Auh1g5K&x(~p~Z)P!$%Aj(G3)xaIsZm;L +suY+jte!uyUZPTtus~8Lr=bNBVs&zELvL<#X=iS2Wo~p;a%=%VD{{BQuNq?vw$uLzi?1~hlkP@ao_$9u +VE}^UN!R2601RSva&Bd0Q+04~YVo@@XC0RanjaAaY0Wm0KpXmkPCKfd5E4dt|K_z&S8_x)URWn@!zaBysS0RRC21aoj@V*vmG00neqa&2<~009643So0|Wpqz>Ze?-+ +0RR69Vs&zEQfX&sbO8YW{|j|+WMOn=QfX&sbO8VX0003FX>)URWn@ihb8TUCV`u{eVs&zE{{R6AVs&zE +P;zf?W&#pob#iV)Z*FsGXKrm}Zgf?0YybcO01RSva&Bd0Q+04~Y~EVQzC~WpV%j0003BVRLh3bWe9~WpV)k +|Nj9BVRLh3bWe9~WpV)k|Nj614{mR6MR9duY(Z^rb#8QX0SaMrb7gc-cWz~J009Vea$#_5a&K>DAa7N95Y-wZ;X>)URWn@ih +b8TUCV`yY^b#QQOc_4FeWn*b(X=P*}VRIm1AZKiEVqt6`aA9&`ZDn+2av)@HWpi#PbRcbEbYo~BbZBKD +X>)URWn>_8b#QQOc_3kIY;R*>bY)~9bZ;PZXk{Q_b8}^MAa8eWWpZ;5Zf|ZyadlyAL2Yk!Zgg`+bZBKD +b9HSXZ)PBKaAj_EAYpTJWpr~OWN&42ZYOjgWpQ<3Y#?-RAarPDAaiwXAa7Rb7?wET2nD~cr9mYL^*C)P)03JV`X$zRclu*HgYp{Q$tfWEn!h;b2(QvW-T~MMK^Z=4^l@$GB8PQ +W^7?}VPb4$1XfR6)URWn@!zaBysS0f>xPWn((=JC(Q18jXtb+QHlu3zu?H+0@$e$59-P +gaH8wZDDv*b#QQOc>#!wSY=~6@jI2b%^Ho0^4h`N6bqMfQQ6em^T$yfj)VaK1aoj@V*%IvzT+P7s9j%| +JK7ryjGlh`%f(kEcQ`Dp)4jAIiU9!t1$1R{ZF2!zi^o(rG6hNw?c00eVzWn%#V0RRPbWpZtE0RRC20t#Vsb7gc-cWz~J009605@~K`Y+-b1Z*DV>#X>)C1bYo}^X>)URWn@ihb8TUCV`u^eX>)URWdHyG0Ssw#b9H58Q+04~ +YMk0VRUJ4Zb58pZ+BsCV`TvV|NjCCVRLh3bWe9~WpV%j|NjzcZf0y@bZKvHL2PVqcVTX0 +WdH#G{{R9RX>Mk0VRUJ4Zbf)wWo2Y@L2PVqcVTX0We#a`b9H58O=)v&VRU0?0SaMrb7gc-cWz~J2y}8` +ZgXa3asU7T009bNb8}^MPj_x*asdGU{{aeNb8}^MPj_x*asdGU{{R6GZf|ZyadlyAL2Yk!Zgg`23So0| +Wpqz>Ze?-+0SI(*VQzC~WpV@=X>Mk0VRUJ4Zbf)wWo2Y@L2PVqcVTX0Wj}dubs%(dc_4IeAZc@Rb!8xJ +Z*pZIVRLh3baNndXkl(3VQg$~cV%QCVtF8RXk{Q{Z*FvQVPkY4bY*gFa}jB7W^7?}X>V>#X>)C1bYo~- +a%FIDa&%>6AaiwXAa7)URWn>^>b8}^Mb0A@EWFTp7W^7?}X>V>IVQg$~cVTX0Wguj4Wpi#PbRcbE +bYo~Bb8uy2X=Z6)C1bYo~_b9HcVYK5Ib#!obbaONSb8~4rOj=Vhb$BgjYD771SWreSPh(|t +RaI+OEjDs9byGuAHZ5UMXmdGNHD)b1N<}w!0TWV3LNYK?Wo}_@VPb4$Mrn9uWCm7GT;ua{7X1n8*eMKM +IS5Vl+JKgY@eMZUni+<~yI+Ntl+T7onDsqJ)(GyQzUOj0_|udNLf4!^9@NX6Lz%7In;-bmp)1mu?zt)5 +{U*Cu)NDMveankktCHJ5-a9@`R00To0;>rO#PD4+hNY3zhHge0S17sc2g^gW*qq<5&?2`$t8S#B$)*%7 +Z}~}L(&RrsYR`;2Be45z|FXh-U*Vt3+bxyN`preuQ0OP$M&r2%&`zhu0^v9@iN=Ka0cHRI000033~6(7 +b!B8zb#QQOc>#!wSY=~6@jI2b%^Ho0^4h`N6bqMfQQ6em^T$yfj)VaK1aoj@V*%IvzT+P7s9j%|JK7ry +jGlh`%f(kEcQ`Dp)4jAIiU9!t1$1R{ZF2!zi^o(rG6hN)URWn@!zaBysS0RRC21aoj@V*vmG00neq +a&2<~009633So0|Wpqz>Ze?--0RR6Bb#P>1bY)U$XJ~W*009610S;+%b9H58O=)v&VRU0?0tRwrZeeX@ +{{R311aoj@V*vmG009eiaAaY0Wm0KpXmkMp0RRCDb#P>1bY)U$XJ~W)00961009eiaAaY0Wm0KpXmkj4 +a$#Ze?--0RR613So0|Wpqz>Ze?--0RR600S|6(Zbfl*VQfKdZ*^{Ta{&rr +b8}^MPj_x*asUAcbaG*Cb7p070uE_&b9H58O=)v&VRU0?WOH?JaBO)Xb8uy2X=Z6jbYX5}VRB>!00mM_ +VNqyvIaf7iEjUU=H+KO50RRFBMrC1ib#i5MD*yxtVs&zEVPb4$3TbX;Y+-a^Vr*pza%FB|ZDC?;Weaj; +aBN{?Wnp4$We8JrVQyq$a%2Vo1yV;sGB5&@_>ac0`|#*HpH_Cc?7>&YNBPy}-qdk{ScdB!K~{I&Y!PPw +0000q0CRI`I!szqF?Dz?XKF+_Zdg!8El*=*bX8SrS1mSjGj&r#Q#LJOQD}2HS2boWI7&q~cL4wa00Ia` +Wnpx6a%FQ0009VMb#iWDVr*pyQ*>c&WMOh-1^@+8M?x|%0=B_hw6{BoHp$Q}*mRAX>js`%>K|X=-f@m# +Y)dqGZryAVX8-^I05kw|b7?wET2nD~cr9mYL^*C)P)03JV`X$zRclu*HgYp{Q$tfWEn!h;b2(QvW-T~M +MK^Z=009632u5XLbairNb0Gi&2x4_|Zee085oZ7Z001-qb8~4rOj=Vhb$BgjYD771 +SWreSPh(|tRaI+OEjDs9byGuAHZ5UMXmdGNHD)b1N<}w!0RRC20tiNBVRUtJWpf_@0|;Vua&BQ_Y-I{* +Zf0y@bYWs_WeIX+ZeeXc&WMOh-1^@+8M?x|%0@Rx2t9k%X#IEyWT@?{(={jnieHs@L_3XpV +V`}wMtKDo7X8-^I05kw|b7?wET2nD~cr9mYL^*C)P)03JV`X$zRclu*HgYp{Q$tfWEn!h;b2(QvW-T~M +MK^Z=009632u5XLbairNa}@vr2x4_|Zee0U;_B*=$tWH4|V#*V^5dw@@10SKNxK-GJR}5oZ7Z001-qb8~4rOj=Vh +b$BgjYD771SWreSPh(|tRaI+OEjDs9byGuAHZ5UMXmdGNHD)b1N<}w!0RRC20tiNBVRUtJWpfMw0Saku +W^7?}VPb4$2vc-nZe(F{WCj2QQb$5EFaq&cy`D&?lj_Y~s5mAz`sy3-989gS1uqWHTV6IjpSay@5oZ7Z +001-qb8~4rOj=Vhb$BgjYD771SWreSPh(|tRaI+OEjDs9byGuAHZ5UMXmdGNHD)b1N<}w!0RRC20tiNB +VRUtJWpfJv0SR(tZeeXc&WMOh-1^@+8M?x|%D*ylr_FvW|f!>A7(M}`c+nSQQ?~8eK|KYU^ +Omy3ihUZZTUtT8V#RWVYMMP0s#-L?ApehHE`!Nx1aisd$7U5G>00000000002LJ#7000004$>Ms8HM=u +UmE|%CLL8DYpYB02F=7s{mYlP#7GIv1_A_iba-#*YCz3gCHcMLg#T%!5i+MiDNX7aiufEJ#8I!OHhFfAY7fVtxlj{%}vrgbfS&w=jyr3U)7OiEGa`mzoq#(6;V_itG~n8CcwYZ>30f1DQOuZYLozrI +k|g)X!BI_ij=PW{<32;hs$B9ZCsU(1!DsC|W1LOd&b_IRG-(&Q$wPGo0j1CTGIbLNeor6CU~-azM4%p_ +jBMKVnA!_hHLM3-*D718tWb&n35^vCNG$%?ywDnvz}K{0G9hl&cB^sg-3J`2zr)xjz`xPycM6D}`pk=G +7OeqFKI{;-SrsrMkU}5;FWB;W7bg;sK59Oe@c3K=fV3eR7p&1RS^QDdq`TfM1OfmAZf|a7*gwADFAe3i +Z1@l19{2t5VaJV^T`{fc?xMUvnKPbj0R(ezZDp`<(~tJj3|i&b2NlXOR2^DUyWY#wQk^*F-L`Td370XB +%Aj(G3)xaIsZm;LsuY+jte!uyUZPTtus~8Lr=bP`3SxC~ZcuV>Z)S5xvr`~b_&>p|I=+ZSHXzGneTL3n +a3%zBY;|)h1Y}`zXe|R|Z*(pMdS!BNFavLHWibPEcW*KUbZByAWite3Z*_7s1ZHV=Wi0dH>saBu-}aRG920dsQ!baVlAbpdvE0e5!+cz6MMc>#KQKPz&##IG7-47St%2#c>Z +5R>jkTb_MKDq#SEtcHU8F!O3w2qJC#)UKHujTH+>EdJQM&>E4z*R)+SA#T-nt8weyMYn(@h5^MUvO8NyVMYp&P~kr{`@Vw(r~naH;kFK+d0H97bAybczVb@xP +q-Dzr4oJgUK7OifU&lwYQy^3LKf$d!zKBIOAj@QZhR$B(b98cV +aA;*G2x4+!V{2t}OehFqa$#d@Wpq+02w`({WpZhAYbpeAY;|)h1!He*ZDA}0ZE0?Gb1eg8Z*(pNb8KOA +XfFhMWpZyY18;6+F#~jWZ!!gRXmVv`GX!RDb#gQWW@&b1H3M^Lcs2!dWp-t5Hw9&BXJ~Xd1a4_=WjO_7 +Z)|UFItg=SZD~VqY;SHm1Z-tay|%gb!BsOX>V>n0%3GO0$)Kv0$)Nx0$)Qz +0$)T#0$)W%0$)Z(0$)c*0$)f-0$)i<0$)l>0$)o@0$)r_0$)u{0$)x}0$)#00$)&20$)*40$);60$)>8 +0$)^A0$){C0$)~E0$*2G0$*5I0$*8K0$*BM3UhHna$#d@Wpqqi31VSmYg24tb7))&b8$j)VPk7$bW&Xf +V_|Y-bY2E*Z)9O}XkQ3oVPk7_X=7_(0byYQVqyVfV*zAj0cB+YW@Z6rX8~wv0cmLgYH9&%YXNL*0c~vo +Zf*f@Zvk*{0da8wa&iH4a{+X80d;i&c6I@GcL8{K0eN`=dU^?CLULhaYh`pydjxQ4aAkZ6V?uIaV{2t} +Qhfz4R=epU^Z_oR6wvcum54rF6FkJew+k!36?Lqfl$`8gF)R0#X2SaKRYGgJn%Xv1$>f_VvG%;Guz +yszPjx|liD+IRo}000000096000000003KeERL~X*GB-yl0o(lkJ>lqHnaUkDzF#MO+`-nfvN=oUS7zO +Pjk(3#3Edlt4DceSnnHhoTCQfV7#O&C5asmTZ_k3I5GuF9U{JzB5UVUixWB~h#a~`69Ra6;9P9?1_A_h +Wq5QL%am^tlg}6qop{{FTg974FaQ3n`}K{nn9PGH_DcZ;ZDnL>Vc>_TG?p`mnXkl(k`ZV+LVYXKJ}#&0 +xTv^*>Pochfn1?USY72b?vbnl1H>1Nsg8a>I`c#0nSFF19TD^= +GS9xEuuG0V@n0eX6ANi>WNCJ3b7^91WdH4q11PWtiZggo) +X>4q11qE$sV{&f>31nqsX-#Qka&HF;V`Xl1X-#Qka&HI(Zeeb32?%6mV`)xdZf^<+V`Xl1X-;8oZwmx) +X=85;2xMhrX;5inZw(1!Wo~q7P-$at4h3dqZFFxB31nqsX+~vjbZ-y}V`Xl1X+~vjbZ-#^VRUqF5?)@& +l23EZa>OEBma9j3W?1hVa-5?E;$Xa_DA7(M}`c+nSQQ?~8eK|KYU^Omy3ihUZaVUMA(m1w0!?L{VGDpk+OvDhHAKF%fNXr25$w;Zs!u +J_LGYa&IsLZ*FBV19W$9G6i&Ka%E*R1ZHn_ax?^HX?A5b19NG3HU)EKc4cli1!ZYxXmmIPZfS01IRaln +K>}YwLIPhyLjqq!L;_z$MFL+&Mgm_)M*?3+NCIC;NdjL=N&;U?O9Ed^Oafm`O#)v|P6A&~PXb?1Py%03 +Q3795QUYI7QvzR9R03aBRRUjDRsvsFR{~#HSOQ;JSpr{LS^;5U0b*hSV`BkiWC3Mm0cK_aXJ-LuXaQ+y +0cvUiYij{)YyoX;0d8&qZ*Ku`Z~<{~0djHyb8`W7bOCjB0d{r)cXt7Jcma8N0eX64sv{KWu}8?Vgx|B8 +o)FQTs@3}HgpNG9gq@LR)-*~8`>9xR8a*>q2D50xZ(4$R31H0PIsUw_;fcDKIn~;D0RR9100000{{R30 +00000fL_JCQxeEQkVIXfYN5c23F83hGCI$$Y9m4lDXjoK1p&l5eV)0q0(o=Ek6qT`tOWJT(?USNzPt(# +xCj&gl+=PFfb@0n?X0$)o@0$)r_0$)u{0$)x}0$)#00$)&20$)*40$);60$)>80$)^A0$){C0$)~E +0$*2G0$*5I0$*8K0$*BM0byYQVqyVfV*zAj0cB+YW@Z6rX8~wv0cmLgYH9&%YXNL*0c~voZf*f@Zvk*{ +0da8wa&iH4a{+X80d;i&c6I@GcL8{K0eN`=dU}YASY=~6@jI2b%^Ho0^4h`N6bqMfQQ6em^T$yfj)VmP +T%k!=UF9_Hk+b8VFt_j2&9|DqsTD5}A2(UF#~}_Mqk=;7%h%D+p%U7S;b1RT)c9`>#Kd;Rz-U=aO9W+B +1pz8ss;p3n{|Sv13rH;f*u2mhk-*oqT{0nV)po0K>)oZ#`!aPC2Yyc<$zXDlf<&Mmp^R+W^_bcVS2e5$ +Ue^EwuyE6l_RBTu$F{ZT5Vfz5z=cU#uHd8spTI%43qqz#IMhHC7 +qMgjGn~{4aFkgwNr28QlFe*-S#jFZ=4d$x=UUL8d00000002J#00000006`~eV)0q0(o=Ek6qT`tOWJT +(?USNzPt(#xCj&gl+*Wd>h=Ype%b?272^{p2nM9k9NV(jNn@cR^G +9g}K+!Jx@Lzn5}xgo%8-%Kwk9vx)$qPBtM^kB(v2T7{%#%L)!i!&yFls%&4!1pz-Ra<{~<8ep?nYaleMc%`0D|O6*W}E?a*~gEI0M-qU9F8#%$RFKGB^*CB=^U`QB8J^yO0F}`4m; +t2@#H=ITLm*{QiV2NfFIf5Z%-zmLo5#W`0ornJpr`vBkPrPe7nQ#r+2>fnc?xeBUA*ZjWY9`LALUza=D +8w-q{e*4SCS0#5iEUeSLv>}QC1_TClX=7_;a$9#Sj2Bz={du0O&G0&#r1CLJBFZ06hm}WprU_Y;#4ofF*_j#U`>lTS#F>3Xo9YKQ;Tl +g9WGn5m)2^IEV>wa%E#_b7^mGT?51yjj4`)KRWY6 +<)W@$8mW*%&FhDhLgP$wKlOrtu`}L^;D@L*mNSQ$uf&Ry5okI>eJj&GE~o3bsJMXYO0?^N1OfmAZf|a7 +*gwADFAe3iZ1@l19{2t5VaJV^T`{fc?xMUvnKPbj0R(ezZDrgZFH%;2a$nalt%Qbu4W!Asn(%=$5#QwR +K0HccB}nLMK+Rkw`Mu(V|7oQWGN(Z+AyvH&RuaL#S+XYD&30ftrsCg%+lRr?B`GL`xImylWKs$pvgYJmvV80iF~{WNWLQ%D(Hkon&*Qwpawq)`VKLB>Wd>h=Ype% +b?2720000000000CjbBd00000`4m;t2@#H=ITLm*{QiV2NfFIf5Z%-0~!HgVF6-d0b^qU +WMlzlWdUYp0cU3cXlMaxX#r|#0c&dkY-|B-Z2@j>0dH>saBu-}aRG920dsQ!baVlAbpdvE0e5!+cz6MM +c>#KQ`>9xR8a*>q2D50xZ(4$R31H0PIsUw_;fcDKIn~;D0RR91 -----END RGB KIT----- diff --git a/interfaces/RGB21.rgb b/interfaces/RGB21.rgb index 8187f38..18fc80d 100644 Binary files a/interfaces/RGB21.rgb and b/interfaces/RGB21.rgb differ diff --git a/interfaces/RGB21.rgba b/interfaces/RGB21.rgba index b5f61ef..683480e 100644 --- a/interfaces/RGB21.rgba +++ b/interfaces/RGB21.rgba @@ -1,168 +1,168 @@ -----BEGIN RGB KIT----- -Id: rgb:kit:NYvLHd4g-aog4Oz$-ZjWJJtz-iKdOImJ-9U9tH10-hWBvQgo +Id: rgb:kit:Ea8JtbR4-MDzc7!s-WDS3fic-oa!Q2Al-KkvKWmp-bgZLgOM Version: 2 Interface: RGB21Issuable; - id=MTbC0xIy-t4kjnRO-6lrefMT-QDDxtSN-SNOHen$-WEeyyfc#cubic-motif-corona; + id=IvE5ZEhj-LPzmuKU-stFXrOY-GMDgfoP-i5HSMey-nFzEWf0#gordon-trilogy-tunnel; dev=ssi:LZS1ux-gjD9nXPF-OcetUUkW-6r3uSCS6-aQhs9W5f-8JE7w; - suppl=ZHXpK8I4SysWFz3LQLfshLbo4RLUWBnSiCt2uU4$q84 + suppl=75o1xO5CI6SD1xvQhcwiM4kmvxx4$yHKJUxNE2RYfkE Interface: RGB21Unique; - id=zaiUh27F-2cYWfcd-FfL5lBc-uUenO66-IYZE0D9-GeVIvGU#forest-heroic-energy; + id=kymCOGIa-NmKvwpn-1d6tvAZ-e4vilfE-vnlugPf-s0w2P$c#speed-color-cipher; dev=ssi:LZS1ux-gjD9nXPF-OcetUUkW-6r3uSCS6-aQhs9W5f-8JE7w; - suppl=LDm0JMzpP1yeC!0J0mCjIA4r0WLxzr8aMnXR98haDLI -Type-System: sts:khmpaMuX-TkN$aWG-9khkPeS-s7byD4Q-VtuwEzF-2bqkUZc#alien-phone-bagel -Check-SHA256: 96812bdd94b205ee024b5c0b50c3feaa3d42d582662d97f37c4088337b764c44 + suppl=DCFO4W0YUqauKoC55Qjc70SJ4IShoetOpO331Od5BBY +Type-System: sts:Feh51tFl-B4nPGA5-L3LnrjB-tllZXcn-X9r!jet-tZmi4So#happy-gamma-canary +Check-SHA256: 6f11813b8e031fe5732afea3242220d17ab43d73895977244b53b8fc0945c8d2 -0s;XIQb$5EF-dcCbzx#`We8SJT;ua{7X1n8*eMKMIS5Vl+JKgY@eMZUni+<~yI*pqgJC?_Ngk-C4>AJ< -*4uOk<_EsKqDt~i^2VW=;sVUJc^^_AA?HnP4dl)m7&~2db~aWFA>JNQ2jD2sV9r$e#NPRGODlp?H>{w_ -T?x4FO6=lL&z(3WK0q6KDNukJ<-%Jbw&5!la)e)nc+&Z?)cp=VitWp2D%VVh;r9|NtYua+&Xv-UDmQaP ->Y>YiH-cxcuhYdi7gD`K6=VP9K@fMd>+=UiO(Z;vr3(5J4H{;2>CphwDBtv_o_My8Gyq`C4rsed^on8t -aU +0s;XIQb$5EF-dcCbzx#`We8SJT;ua{7X1n8*eMKMIS5Vl+JKgY@eMZUni+<~yI*43GT6;^A(>t$`n}?j +a?$1xOtyjhX4s{P5PwdeDLou~b{vUkrO#PD4+ +hNY3zhHge0S17sc2g^gW*qr#~Lp{^cb%nMblbS)2`^tX8RVs-Y>YiH-cxcuhYdi7gD`K6=P_O$sI8}X?U1m{iY#EIwDl*bNx(uG5Wmit9a`|Xj3EiMGfQ2eBZ~h9A+-E +dXC)Cx8m1U s_xvd)#O5wx83$yW+G?8y4pg`n~?$g^};P^@zs+0R(e! Wn%%?{J!HJ@Tgs1mpj@U3yhwA`^&{wC3iS1tkb=;A&LP300neqa&2<~TZ_k3I5GuF9U{JzB5UVUixWB~ h#a~`69Ra6;9P9?0RRScZ);_4a{>P%2dR;eWrf2mfn0W-6EYpxT%Hqe4Z6#YuvhEM?N$H*0}5etb7gc- -cWz~J1sHJc%j{$al(PgiY{guVo`3y4;ZoR4bMl2=SA)CVSpWb55@~K`Y+-b1Z*D$C0RaIEb#P>1bY)U$XJ~W*0RaF2000CJVRUq1V`yzV>p -Y;13LVQyn(0RaF13w3a0VRU6uX=iA30RRC200R(aa$#e1X>V>%c4cyAY;SiJX>N95Y-wacbaY{3Xl-R~ -bX0k8Wejz0Yi@6MZd7k;Wo`rqWo~D3VRmKz0003BWo~D3VRmV5XLA7n0RRCCVRLh3bWe9~WpV)k|Nj9B -VRLh3bWe9~WpV)k|Nj655N2{=V{~b6Zclb)a%OCAcM@)IZbfcqa$$C1Vr*qpZ);_44sLI5MR9duY*t}x -b!BrBZf|Zza$#e1X>V>}Y*cS+Wo`_0ZfkCDcWzW~Yh`W$3So0|Wpqz>Ze?->X>)URWdHyG0uNzybYWv? -ZDnqBRC#b^a{vJU{|0n#Yh`Y8009600TO9$W^7?}X>V>pY;13LVQyn(0RaF10t#Vsb7gc-cWz~J00960 -5@~K`Y+-b1Z*DZe?-?a%FB|ZDs!e009JZaAjiw -009623w3a0VRU6uX=iA30RRC20Sk3-WMOn=QfX&sbN~PW000013w3a0VRU6uX=iA32y}8`ZgXa3a{mAT -009bNb8}^MPj_x*asdGU{{aeNb8}^MPj_x*asdGU{{RFKW^!R;bZKvHPj+Q;W^8YF4sLI5MR9duY*t}x -b!BrBZf|Zza$#e1X>V>}Y*cS+Wo`_0ZfkCDcWzW~Yh`W$3So0|Wpqz>Ze?-+0SI(*VQzC~WpW1)W^!R; -bZKvHPj+Q;W^8YFGIVHVAYpB9b#8PZZ)PBLZ);_4AZBu5V{~b6ZgU`MZXj=UbZ~Wab0B4SV`XJzb09Gl -X>N95Y-wacbaY{3Xl-R~bX0k8WjJAUbYWv?ZDnqBAZTH8AYmYMd2nSQcW7y2Xdr2GAZ~ATAYp85Z+B&6 -AZBlJAarPDAarkQWo{K|b8~fNMR;RnWn^)URWgu;Da%CW4b8}^M -b0BnRVQwH{Y;13LWn>^?c_4IXWgug3Zgg^CV{{;NWpZtE5^is9MQ&$uVRm6+Y-Ln$Yh`XWVRUq5ZE$oT -bZ;PKZf9~~c4Z)MZXjVGbZ={AZXkDPX=7+0aB^>GX<}(~AZ2c6a$$C9Zf6c|Z*E0#bzy8)VQh6}b60d| -Wgv5PZ6I%EAaihKZge1YZ);_4AZBu5V{~b6ZgU`HZ)J0CCv+fXadlyAAarjabZBKDb9HSXZ)PBLZ);_4 -AZBu5V{~b6ZgU`MZXj=UbZ~Waa}sWEZboupV{~b6ZeeUxZ);_4IAL^jWo>YDAarjabaG*Cb7p07AYmY8 -a$#e1X>V>IZ)PBFZ*DDSa$#e1X>V>}Vr*p~bZ={AZVYv9Yi@6MZd7k;Wo{l}Y;131VRUJ4ZXj=FAa!nQ -Zf|#PAarkQWo{rzL^J?%b7?wET2nD~cr9mYL^*C)P)03JV`X$zRclu*HgYp{Q$tfWEn!h;b2(QvW-T~M -MK^Z=3sOfyGBH(dX>oOB1XfR6}QC0RRPbWpZtE0b7g5 -R5&sPN*yA;lp<^AQ;QQiCWsumMiT;fc;H-Y_W=L~bZ={AZgTgQ=Omp&uURQ&=-B|zu0RR911P@_! -bYWv?ZDnqBRC#b^a{&MW00eVzWn%#V0RRPbWpZtE0RRC226S(0Wo~l;009623So0|Wpqz>Ze?--0RR60 -0}y6%VPkY@Z*EU^WpZY0Z+8`GZgyd8X=FikbYWv?ZDnqBRC#b^40Ud6Zf|#PRBvl#ZUG2%a$#Ze?--0RR613So0|Wpqz>Ze?--0RR601Q2F&VPkY@Z*EU^WpZY0Z+8xEZ*E0#bzy8) -VQh6}a}sWEZboupV{~b6ZeeUxZ);_440Ud6Zf|#PRBvl#ZUG8mb8}^MPj_x*asUAcbaG*Cb7p071rTO( -VPkY@Z*EU^WpZY0Z+9|uXk{Q_ZEtmMbRchLAarkQWo{s5a$#e1X>V?GAZczOZ*_EVb#!weWq4y{Wn^<8 -F%@ZUc42I3WI=RvVPj}*Wo~p-d2nSoVRUq1V`yz%ZMZ*(AGY;13L -Wn>^`Z*m}XXk{RDZ);_44sLI5MR9duY*t}xb!Br`bZBKDb9HSXZ)PBKaAj_EAarkQWo{s5a$#e1X>V?G -AY^Z4b8aVeAZ2lNVQe6DZyV?GAZczOZ*_EVb#!wQZf|Zza$#e1 -X>V>}Y*cS+Wo|fObaZ8HaC9JaZyb#7~JZ+C7~Z);_49${>3Z)0I}X>V>IZ)PBMZfkCDcWxkbZ);_4AW1|t0CRI`I!szqF?Dz?XKF+_ -Zdg!8El*=*bX8SrS1mSjGj&r#Q#LJOQD}2HS2boWI7&q~cK`qa0x>qi(-Jbbi6fm8x|X+}F*E}Y8&WkR -P95q0SVywS_n`CbW&i*H05kw|b7?wET2nD~cr9mYL^*C)P)03JV`X$zRclu*HgYp{Q$tfWEn!h;b2(Qv -W-T~MMK^Z=009632u5XLbairNb1VP^3S)0V={Wo~D3VRm6+Y-I{&a$#e1X>V>}YzcB@ZeeX< -Vr*pyQ*>c&WMOh-1^@+8M?x|&0?nwDhi=8$#uk0YMSQ+x1!00mMUMA(m1w0!?L{VGDpk+OvDhHAKF%fNXr25$w;Zs!r0000000007000000000Es;(M& -rv!7X$EJo+{V&1)03O%U?m&Rq5}b^8af15>0t9q!(i%G%h4}Sf8vn;89aSG|t4s0*&BRFk -%a^yrND0jb0t9t*cyH)xK+Rkw`Mu(V|7oQWGN(Z+AyvH&RuaL#D^138|7M^`NNc{jX -Eg#>2x#JO!0is)`buE3*f$s=76b!Q+Q}n%_NC_L8Regd3CNCnwY^SkkhEjrCKZ>$C1p%ec`!aPC2Yyc< -$zXDlf<&Mmp^R+W^_bcVS2e5$Ue_3K?aSgQ=Omp&uURQ&=-B|?!WdT-0 -*e1Zg(dl;zh@Se)i)R+C0ZKmX5VlzrFd~pb06-kDb&eFm0E`a+jONnR9-bLD;mr@36vdi;DdEn0pt}VD -%))Y#k9jx)*&ki4jZw^)YeO%$n#j0HLDJN5-IKgM_J7b(p+0MPGk2Gl)y2(Rz -1p%ec`!aPC2Yyc<$zXDlf<&Mmp^R+W^_bcVS2e5$Ue_vHs;p3n{|Sv13rH;f*u2mhk-*oqT{0nV)po0K ->)i(&tG~n8CcwYZ>30fiwM}t)avF -pgNI3y#xXP1a5C`W!OKy;4cm3v~2hf;U4$>@L|V|mt8Tf>F%PuK$$b1YykvwZ*67tN=8DG8DBb=V?IL? -L!Cj2&t@&rvYk+aYpZNQp)6%D*z$T8ClZi8YCe|m_*?{lv>_T7tkE!8{87}TyWT7W0ssVVZ*FDSKfd5E -4dt|K_z&S8_xVm-pkWcojB&*wsIf| -mpsv;oy@J9k$WaEUx}!s`ym)GDo%67tO|Gy=Bof+a|0~|Wq4z3Ap~e)b7&(5WN&P2VR9q`VQp|G1aNG1 -b1MX7VRL9L17vS>E(CgIa&IsLZ*FBV19W$9G6i&Ka%E*R1ZHn_ax?^HX?A5b19NG3HU)EKc4cli1!ZYx -XmmIPZfS01IR#^3a%FU025fI+VRL9-0byYQVqyVfV*zAj0cB+YW@Z6rX8~wv0cmLgYH9&%YXNL*0c~vo -Zf*f@Zvk*{0da8wa&iH4a{+X80d;i&c6I@GcL8{K0eN`=dU`)Aa<{~<8ep?nYaleMc%` -0D|O6*W?8OW2z$*=&?u0vV`BWnw}8RoT}CO>V%FwxrCjOXVx@IL#ltp_Vr{><)W@$8mW*%&FhDhLgP$w -KlOrtu`}L^1_A_hd2nU14c`8MAg$P-$_ObTP^+;#QB8K)l1SfF*_j#U`>lTS#F>3Xo9YKQ;Tlg9WGn5m)2^IEVxS00eGtZe`d% -zThtn<+N=058)p7{qSMOjh9_9t?BNfyg->Vo@@aGb8l^B%Kwk9vx)$qPBtM^kB(v2T7{%#%L)!i!&yFl -s%&4!NWLQ%D(Hkon&*Qwpawq)`VKLB>Wd>h=Ype%b?272178JmaA9L*AOvN2V{9P?admHWWpg3~Xkl|` -BL-w|Y;0k2BnNP1a${v~bR`L4ZE$6Bb75{|CJJG2Z*z2VZ*XX3CkSG4VPk7$bWA7+Vsc?)Yh`p&DF|V6 -bY*gBb89LDaBOvRD+Ob3ZEayJ1#M|=b#pBPWN&mX1#@g+b7(IFdS!BNFavLHWibPEcW*KUbZByAWite3 -Z*_7s1ZHV=WiCgZ)|UFI|OWHb8|ceWpQ<3 -Y&{2Oa%Ew3WpX|Uadl;LbZKvHKLTNNKmuPuK>}YwLIPhyLjqq!L;_z$MFL+&Mgm_)M*?3+NCIC;NdjL= -N&;U?O9Ed^Oafm`O#)v|P6A&~PXb?1Py%03Q3795QUYI7QvzR9R03aBRRUjDRsvsFR{~#HSOQ;JSpr{L -S_*SetH31dQXVPk7$bW(iMY -W)~OLxhE=)Z*?BAY;6SrqSQY7y3rgf(k=ZkQOfCkYp6avD7|R0gwX!*5!Gc?n?5;yM1jui=Thm^szjcmMzZ000000RR6000000 -09$t~jeJj&GE~o3bsJMXYO0?^NT%k!=UF9_Hk+b8VFt_j2 -&9|DqsTD5}A2(UF#~}_M00>4q10|{hhV`)ukY;0)+3S(t%bZJd#Y;0)-1#M|#a&HC+WMyM%O=)9tZwCrv -Wo~q7O=)9tZwLf#VQy~;2xMhrX-;8oZwd)xWo~q7PGN3u3j}a!V{Z%yWMyM%P-$at4GCjqZggo-X=85= -1!iS!bZ-v{WMyM%MrCbuZx9M&Wo~q7MrCbuZxIAxbaZbLUS7zOPjk(3#3Edlt4DceSnnHhoTCQfV7#O& -C5asm1puYQ&j^#1bSt1Z!iOIZe=k8ba!tu1$1a~Wo0u2 -W^Z+JGz4a8c4ajKb7^=s1#@L~Wo|bGWoc(MgX0$)Kv0$)Nx0$)Qz0$)T#0$)W%0$)Z(0$)c* -0$)f-0$)i<0$)l>0$)o@0$)r_0$)u{0$)x}0$)#00$)&20$)*40$);60$)>80$)^A0$){C0$)~E0$*2G -0$*5I0$*8K0$*BM0byYQVqyVfV*zAj0cB+YW@Z6rX8~wv0cmLgYH9&%YXNL*0c~voZf*f@Zvk*{0da8w -a&iH4a{+X80d;i&c6I@GcL8{K0eN`=dU|83BNXVdN64~--?N&Y5Ye2f)%xm$jy$=9osnnOG)f5jsaSFv -Ju_4WvuML_T7r2AV9eq<{=Bc@iMp6M)!KLg0000000030000000001G0aiogNR0FM6f^;O*CpsE^1w^{ -LCiZR_61McH**~Y0j1CTGIbLNeor6CU~-azM4%p_jBMKVnA!_hHLM3-*KTyopB)U#RL=h`^CZdCRl%(4 -axyy2w_MHwx4oC6RRjV61a5C`W!OKy;4cm3v~2hf;U4$>@L|V|mt8Tf>F%PuK$$b1YykvwZ*66LWlopv -mKJ1a4t%WlphinA*;6t215lmk3S~(t;6Y7Z=sJCn}C_ -bsn*7ZFlg{eay4FQlx|4kiqCuj-XBi38I(?qGvjTZ@$&X#u;j9Gp%hN(Yz`nc+54Z>v0F=~%BY^aE@a?p<+);Uv-gA(xqT91| -EKCMyQK|uB0+zx9Gy-2iK>}YwLIPhyLjqq!L;_z$MFL+&Mgm_)M*?3+NCIC;NdjL=N&;U?O9Ed^Oafm` -O#)v|P6A&~PXb?1Py%03Q3795QUYI7QvzR9R03aBRRUjDRsvsFR{~#HSOQ;JSpr{LS^;5U0b*hSV`Bki -WC3Mm0cK_aXJ-LuXaQ+y0cvUiYij{)YyoX;0d8&qZ*Ku`Z~<{~0djHyb8`W7bOCjB0d{r)cXt7Jcma8N -0eX6&+I(x%_S~U4aACO4ElT!P8NxvCJG<KHujTH+>EdJQM&>E4z*R)+SA#T-n -t8weyrO*2^brT1EPanx(a*~2XpdO)&Y})mh+6z}TtOs7#00gjb(~tJj3|i&b2NlXOR2^DUyWY#wQk^*F --L`Td36}){9I$nc6v6J{u?^n-fFP~dpvnj-AyBKaJW)+{-ce}5 -$#DguerIN21_K0id2nSMuyu|U!T^j90F36+)E=H0H{s0>nH0sEektM3d!V}qb9G{Ld2nSf*z$T8ClZi8 -YCe|m_*?{lv>_T7tkE!8{87}TyWT7ZV`yP=b7gcd*z$T8ClZi8YCe|m_*?{lv>_T7tkE!8{87}TyWT9k -e*~A-{pMOIF3{$ogLC-FQ5ynWwEO**XV}S~GTT}O0S>CJ8hNJ#bF9avhEe@5!T$gr*V67lfY}n9jCXN@ -`@fIN>BTu$F{ZT5Vfz5z=cU#uHd8spTI%43qqz#IMhHC7qMgjGn~{4aFkgwNr28QlFe*-S#jFZ=4d$x= -UUL8d00000002J#00000006`~eV)0q0(o=Ek6qT`tOWJT(?USNzPt(#xCj&gl+*Wd>h=Ype%b?272^{p2nM9k9NV(jNn@cR^G9g}K+!Jx@Lzn5}xgo%8-%Kwk9vx)$qPBtM^ -kB(v2T7{%#%L)!i!&yFls%&4!1pz-Ra<{~<8ep?nYaleMc%`0D|O6*W}EP=eb|?NQ$9$ -(>OX7sslQ%bEkMULcZCvo*Z;Mne7U9@X&qCv%6BHgWizA=u(cLP6P}D7lKnk9D*JpH;-dOs(;1y^<+=w -qOM*VsgOd=>xYy=<4kft^@4w~Gv0~-000000000K000000002Y!g7+2c{l^vA6>1DQOuZYLozrIk|g)X -!BI_ij=PWr0{IsR1l_I#dHB_@bgMhk0_N&La@nc5HwP6O+keCip}&vI>BTu$F{ZT5Vfz5z=cU#uHd8sp -TI%43qqz#IM%Vnl;~wy+U0;_w+8Yauo__nw#aAVFI4rEwy|f{U0R{vHbZKL2WpZ10ERL~X*GB-yl0o(l -kJ>lqHnaUkDzF#MO+`-nfvN;j>;{fO~I?t|ZBSH!(tpGg-WMy<=X>4;v -w}2&v0mUY=J6lL$MhcKn;XgI|zJmp*01;Q@0XT>WaB^j1X>)0BZe0V!7mcZoem^?%L*to!bRZoO^d~aU -zM`;8jz95VBG^B^;4cm3v~2hf;U4$>@L|V|mt8Tf>F%PuK$$b1Yybe<9xqZ>e{x^fFs+1!e+{I`x|;BT -GZEk9?>;P#rE}NPvxSnUK**8Le1-kltSZ7azFKgf3Y*(ir|N+G?p`mnXkl(k`ZV+LVYXK -J}#&0xTv^*>Pochfdm2o1a5C`W!OKy;4cm3v~2hf;U4$>@L|V|mt8Tf>F%PuK$$b1YykvwZ*67V9xqZ> -e{x^fFs+1!e+{I`x|;BTGZEk9?>;u9IL;>*e1Zg(dl;zh@Se)i)R+C0ZKmX -5VlzrFd~pb0000000000|Nj6000000^h!oTk{Mq*mt#Id5<{IqiqB>((XyRTgKMj7L7^;V1p!-kERL~X -*GB-yl0o(lkJ>lqHnaUkDzF#MO+`-nfvWYb7a>H<(%oY0=TGqa6l5KfYJkC@$v(fAa&d%-e7p!qz9SbZ -=!8X@=Yuq$20sb<4l#S`iz7Vef}@Ca=a#qt000000000d000000002@9%YWFOg}YFoW9l|-yK9CRWr2r -RnLhh&gT{LWK{$N0ssVVZ*FDSKfd5E4dt|K_z&S8_xmmZEXQ=ZUJv^0dQ~uad821ashL50d#Z$b#(!Db^&*H0eE-;d3gbPdikkA -nO21_Q|vw^7?JgkgL(n*=$IX=eC$m)1U+k$A_W0}Ud6mq639W2L|vh3p}>j>;{fO~I?t|ZBSH!(tpGjy -saSFvJu_4WvuML_T7r2AV9eq<{=Bc@iMp6M)!KLg{~`yek&tDD!z_VZcAXP49oSr+6K@T=%Z{*D>&)#| -1_%XdZe(S6WdT-0oEfg=7gNu)i}m2V`Y*VQFl0MYn(@ -h5^MUvO8NyVMYp&P~kr{`@Vw(r~naH; -^JG;71#M+yX<^`ps5F){hncU$ijom%IzoLb(>^Yz>$s@6fa*%L>wyblbaY{3Xl-R~baTv)=eb|?NQ$9$ -(>OX7sslQ%bEkMULcZCvo*Z;Mne7O2Wpib6c4c#Jbj+U}49ir`|1I+*$<$TBtm<+yI?cCS&H}f+m!nkx -000 +cWz~J0b!Ol%4ULr1V>pY;13LVQyn(0Tc|g +9aHqZo=6EBn^k>+112vb!fdCpXogaPTR)1jIsgFy0Sk3-WMOn=QfX&sbOG2uzThtn<+N=058)p7{qSMO +jh9_9t?BNfyg->Vo@@XC0RR9100a+VbaY{3Xl-R~bX0k8Wpe-k|NjJYaAjiw00966bY*gFa{&MW00wk# +Yh`Y8009600}5etb7gc-cWz~J009605@~K`Y+-b1Z*D1bY)U$XJ~W*00961 +0}y6%VPkY@Z*EU^WpZY0Z+8`GZgyd8X=FikbYWv?ZDnqBRC#b^40Ud6Zf|#PRBvl#ZUhHqZf9~~c4hwn +009bRZf9~~c4=;Ba{&MW009bNb8}^MPj_x*asdGU{{aeNb8}^MPj_x*asdGU{{RILW^!R;bZKvHPj+Q; +W^8YF5^is9MQ&$uVRm6+Y-Ln$Yh`W@Zf|ZyadlyAR$**)Wpfg4Z*E3%VPkY@Z*F01RBvl#ZVYv9Yi@6M +Zd7k;Wo`iqVRLh3bWe9~WpV{+b8~fN000024`Fn4VPj}*Wo~p-d2nTO0096026S(0Wo~l-0RR615@~K` +Y+-b1Z*DZe?-+0RR6IX>Mk0VRUJ4Zb58pZ+BsCV`TsU|Nj645N2{= +V{~b6Zclb)a%OCAcNJ-Fc42I3WI=RvVPj}*Wo~p-d2nSFX>)URWkq;nWo2Y@L2PVqcVTX0Wejz0Yi@6M +Zd7k;Wo`iqVRLh3bWe9~WpV~`Wo}_@W&Z#G0R(e!Wn%#V0RRCDb#P>1bY)U$XJ~W*009623w3a0VRU6u +X=iA3000310003Cb#P>1bY)U$XJ~W?baG*Cb7p07{{R300SaMrb7gc-cWz~J0RaF10SaMrb7gc-cWz~J +0RaF100aV>%c4cyAY;SiCZf|ZyadlyAR$**)Wpfg4Z*E3%VPkY@Z*F01RBvl#ZVYv9Yi@6M +Zd7k;Wo`iqVRLh3bWe9~WpV%k2y}8`ZgXa3at9D*a$#e1X>V>%c4cyAY;SimbZBKDVQp`9Zge1TW*~HL +Yh`XAW^!R;bZKvHb0BGMAa8YaaCLNZAZ2)CWo2Y@ATbqbZgyd8X=FikbYWv?ZDnqBRC#b^IAL^jVPj}* +Wo~pJXkl|8VIXvQaAhEOXlY|;AZc?TZf|rTVQg$~cV%QCW^ZyJbZBKDbZ={AZWU>Bb9H4!cw=Q{WOG4m +Y;SjAZewLXd2e+fbaHthbZ;POb8~fNAZ>4QWgua5b7gdMAarP9ZXjW7Y;SjEWFTUBAarPDAY*TCbaG*1 +bRcwPa&2=GZf|ZyZf9~~c41;{WmIo#Wo|ZMbaZ8HaC9JaZy;rEXL4b7Wgu^EAYmYMZ);_4Aa`hKV`w07 +a&Ks9Vrg_BWo~D3VRmV5XAW*}Zbfl*VQf}mY;|RGS9EA)AaiwXAa7bZKvHAa7_VNqyvIaf7iEjUU=H+KOGQb$5EF;#A9adl+`R!>~x^Kusb3F_D> +3|%=0P4(JXv +jR(~i7`}+dRIMW)E%}WETGtn8n`Mj)aOlxt9k`1fWGHk&XuYsNdeesKzmFE-OS8`Og!utx0000000a+V +baY{3Xl-R~bX0k8Wpe>>rorb(ioCoP%2dR;eWrf2mfn0W-6EYpxT%Hqe4Z6#YuvhEM?N$K*0SaMrb7gc-cWz~J0b!Ol%4ULr +1Ze?--0RR600}y6%VPkY@Z*EU^WpZY0Z+8`GZgyd8X=Fik +bYWv?ZDnqBRC#b^40Ud6Zf|#PRBvl#ZUG2%a$#Ze?--0RR613So0|Wpqz> +Ze?--0RR601Q2F&VPkY@Z*EU^WpZY0Z+8xEZ*E0#bzy8)VQh6}a}sWEZboupV{~b6ZeeUxZ);_440Ud6 +Zf|#PRBvl#ZUG8mb8}^MPj_x*asUAcbaG*Cb7p071rTO(VPkY@Z*EU^WpZY0Z+9|uXk{Q_ZEtmMbRchL +AarkQWo{s5a$#e1X>V?GAZczOZ*_EVb#!weWq4y{Wn^<8F%@ZUc42I3WI=RvVPj}*Wo~p-d2nSoVRUq1 +V`yz%ZMZ*(AGY;13LWn>^`Z*m}XXk{RDZ);_44sLI5MR9duY*t}x +b!Br`bZBKDb9HSXZ)PBKaAj_EAarkQWo{s5a$#e1X>V?GAY^Z4b8aVeAZ2lNVQe6DZyV?GAZczOZ*_EVb#!wQZf|Zza$#e1X>V>}Y*cS+Wo|fObaZ8HaC9JaZyb#7~JZ+C7~Z);_49${>3Z)0I}X>V>I +Z)PBMZfkCDcWxkbZ);_4AW1|t0CRI`I!szqF?Dz?XKF+_Zdg!8El*=*bX8SrS1mSjGj&r#Q#LJOQD}2H +S2boWI7&q~cK`qa0wVD_WJqHy{N}i&EVNbYIf0B02k1U7M@YxAoLt0N{oZU5X8-^I05kw|b7?wET2nD~ +cr9mYL^*C)P)03JV`X$zRclu*HgYp{Q$tfWEn!h;b2(QvW-T~MMK^Z=009632u5XLbairNb1VP^3S)0< +Y-M9~X>V={Wo~D3VRm6+Y-I{&a$#e1X>V>}YzcB@ZeeXc&WMOh-1^@+8M?x|&0+T6%IAR($ +Vz0uP^>?dp0hhSGDPI!#<+=mkvrINW_ugy~X8-^I05kw|b7?wET2nD~cr9mYL^*C)P)03JV`X$zRclu* +HgYp{Q$tfWEn!h;b2(QvW-T~MMK^Z=009632u5XLbairNa}xjp3TAR)V{~b6ZeeT&b#7^Kb!7-sbYX5} +VRB>!00mMUMA(m1w0!?L{VGDpk+Ov +DhHAKF%fNXr25$w;Zs!r0000000007000000000Es;(M&rv!7X$EJo+{V&1)03O%U?m&Rq5}b^8af15> +0t9q!(i%G%h4}Sf8vn;89aSG|t4s0*&BRFk%a^yrND0jb0t9t*cyH)xK+Rkw`Mu(V|7oQW +GN(Z+AyvH&RuaL#D^138|7M^`NNc{jXEg#>2x#JO!0is)`buE3*f$s=76b!Q+Q}n%_ +NC_L8Regd3CNCnwY^SkkhEjrCKZ>$C1p%ec`!aPC2Yyc<$zXDlf<&Mmp^R+W^_bcVS2e5$Ue_4Qly4G~ +&lnD!c-+QY#hXVj|NgD}^^LKZ%!4TQO92G|Rt=W-q4NmyOwH13hJJ{ +1p&;$a*~gEI0M-qU9F8#%$RFKGB^*CB=^U`QB8J^yO1H{K10Q-T=FR=Q=>S+XYD&KHujTH+>EdJQM&>E4z*R)+SA#T-n +t8wey2OO)v!`LRkztQP;3W%Qi%!_9htpQ3t>=3qD6)+-@LLdMu-?&gcOB(fowFxn4+u4A192x5Uog%HF +!~38*kwLu#0ssVVZ*FDSKfd5E4dt|K_z&S8_x@L|V|mt8Tf>F%PuK$$b1YykvwZ*66;aMO?W(hOSV*asELF;pE|QoG*E(^8!{=H0e( +APJW|(W0Hqt(%d1CNN)#sHFQL7%(bMbH%I*cn#*O0A6zgEd*tFV{9P=Xkl|`BL-w|Y;0k2Bm-e>a3%zB +Y;|)h1Y}`zXe|R|Z*(pMdS!BNFavLHWibPEcW*KUbZByAWite3Z*_7s1ZHV=Wi0dH>saBu-}aRG920dsQ!baVlAbpdvE0e5!+cz6MMc>#KQKPz&##IG7-47St%2#c>Z5R>jkTb_MK +Dq#SEtcHU8F!O3w2qJC#)UKHu +jTH+>EdJQM&>E4z*R)+SA#T-nt8weyMYn(@h5^MUvO8NyVMYp&P~kr{`@Vw(r~naH;kFK+d0H97bAybczVb@xPq-Dzr4oJgU +K7OifU&lzkBNr;@ghiU?gEXK9KMDE{F?;HZBRuDVqlk6qmbe371#@s=V`U%&Wq4z3AqH`EZ**mIA_Qn* +b7&(5WN&P2VR9q~aAk61Wo~pO31Mw;WpZ<2Ze%73VQ_DAbaHQSXk{k|Vsc?)Yh`pyCN6MEdyk4bS?#RY+-X~F9dpJa&IsLZ*FBV19W$9G6i&Ka%E*R +1ZHn_ax?^HX?A5b19NG3HU)EKc4cli1!ZYxXmmIPZfS01IR#^HY;SHl33Fv_X+v*pZ*DsTY-MwEJOyQO +bzy8h2WN6+VRU73J_vDjWpi|CZ*D&VVRS$OUqL|vUqV6xUqeFzUqnO#UqwX%Uq(g(Uq?p*Ur0y-Ur9*< +UrI^>UrS2@UrbB_UrkK{UrtT}Ur$d0Ur8UsO~AUsY8CUshHEUsqQGUszZIUs+iK +Us_rUb8$j)VPk7$bWB?bVqs%zQ*2>#Xj}?&aYAxoV{2t}Qe6dOVRB`3UIuJ$WMOk?UkGAhV{3G2V{2dm +VPOGcVgX}g0c2zWWn}?oW&vks0cdCeX=wp!Y5{9&0c>mmZEXQ=ZUJv^0dQ~uad821ashL50d#Z$b#(!D +b^&*H0eE-;d3gbPdI@7fa$#d@Wpqq?1aN6^Wqb)^LULhaYh`p&eFb!BY-DAAPO)*A+RkpPGhOnR2u=~w +f)QpH7uC5ZDvob;93!rlZ8yf+KCD*)0ZlH6>$O%5miMH2B(lTb1P)|l +Igi#~)sbZ^DMLcPrTIA(QB(-~saSFvJu_4WvuML_T7r2AV9eq<{=Bc@iMp6M)!KLf0000000030{{R30 +00016cPx&vU)M(f$C5$z50Bb6=QgwbMk=ru&P_#5`hlti0bX9nl23EZa>OEBma9j3W?1hVa-5?E;$Xa_ +D^Yz>$s@6fa*%L>w#RMNmyOwH13hJ(~} +Y-IohWMyM%0R>}aZggn^1#M|;Y-s}tWMyM%O=)awX#@&mWo~q7O=)awX$1vsX=8G41_@+kV`)ukV{&f? +3S(t%bZJd#V{&f@1a4t&ZwUxwWn*bhVQy~<31ek$bZJguZf^?&aA{+23`!Wo>kC4+&&tV`)ZZZFFxC3S(t%bZJIqZFFxD1YvY^ZxUW!$dXTU&2q#dT$Zaxd1hGe8*-eZ2I646 +q$?$f9S;Qpf+K+Rb@1)9wcJs8k=}EVt)knrbu3H13mOG^S@OiTh_O-%w{PEG<}Pfr40P*4J2QBeY4Qc?n6Q&R$8R8#_ARaF9CR#pOE +S62dGSXcsISy=*KT3P{NVF6-d0b^qUWMlzlWdUYp0cU3cXlMaxX#r|#0c&dkY-|B-Z2@j>0dH>saBu-} +aRG920dsQ!baVlAbpdvE0e5!+cz6MMc>#KQVU{+^W`cnQ%??R|3qTSHpra(ku*HuAQ$q+KGO7#i1p;LO +Rzu`SjPv&tGy!?nCFm&fz)So=%sVIc1y9;Ha~&D$=A9F8Na0y;!RP5vuL@+rc3&yv5+tiFEA;1JTz6xt +BNXVdN64~--?N&Y5Ye2f)%xm$jy$=9osnnOG)f5jsaSFvJu_4WvuML_T7r2AV9eq<{=Bc@iMp6M)!KLg +0000000030000000001G0aiogNR0FM6f^;O*CpsE^1w^{LCiZR_61McH**~Y0j1CTGIbLNeor6CU~-az +M4%p_jBMKVnA!_hHLM3-*KTyopB)U#RL=h`^CZdCRl%(4axyy2w_MHwx4oC6RRjV61a5C`W!OKy;4cm3 +v~2hf;U4$>@L|V|mt8Tf>F%PuK$$b1YykvwZ*66LWlopvmKJ1a4t%WlphinA*;6t215lmk3S~(t;6Y7Z=sJCn}C_bsn*7ZFlg{eay4FQlx|4kiqCuj-XBi38I(?qGvjTZ@$&X#u;j9Gp +%hN(Yz`nc+54Z>v0F=~%BY^aE@a?p<+);Uv-gA(xqT91|EKCMyQK|uB0+zx9Gy-2iK>}YwLIPhyLjqq! +L;_z$MFL+&Mgm_)M*?3+NCIC;NdjL=N&;U?O9Ed^Oafm`O#)v|P6A&~PXb?1Py%03Q3795QUYI7QvzR9 +R03aBRRUjDRsvsFR{~#HSOQ;JSpr{LS^;5U0b*hSV`BkiWC3Mm0cK_aXJ-LuXaQ+y0cvUiYij{)YyoX; +0d8&qZ*Ku`Z~<{~0djHyb8`W7bOCjB0d{r)cXt7Jcma8N0eX6&+I(x%_S~U4aACO4ElT!P8NxvCJG<KHujTH+>EdJQM&>E4z*R)+SA#T-nt8weyrO*2^brT1EPanx(a*~2XpdO)&Y})mh ++6z}TtOs7#00gjb(~tJj3|i&b2NlXOR2^DUyWY#wQk^*F-L`Td36}){9I$nc6v6J{u?^n-fFP~dpvnj-AyBKaJW)+{-ce}5$#DguerIN21_K0id2nSMuyu|U!T^j90F36+ +)E=H0H{s0>nH0sEektM3d!V}qb9G{Ld2nSf*z$T8ClZi8YCe|m_*?{lv>_T7tkE!8{87}TyWT7ZV`yP= +b7gcd*z$T8ClZi8YCe|m_*?{lv>_T7tkE!8{87}TyWT9ke*~A-{pMOIF3{$ogLC-FQ5ynWwEO**XV}S~ +GTT}O0S>CJ8hNJ#bF9avhEe@5!T$gr*V67lfY}n9jCXN@`@fIN>BTu$F{ZT5Vfz5z=cU#uHd8spTI%43 +qqz#IMhHC7qMgjGn~{4aFkgwNr28QlFe*-S#jFZ=4d$x=UUL8d00000002J#00000006`~eV)0q0(o=E +k6qT`tOWJT(?USNzPt(#xCj&gl+*Wd>h=Ype%b?272^{p2nM9k9N +V(jNn@cR^G9g}K+!Jx@Lzn5}xgo%8-%Kwk9vx)$qPBtM^kB(v2T7{%#%L)!i!&yFls%&4!1pz-Ra<{~< +8ep?nYaleMc%`0D|O6*W}EP=eb|?NQ$9$(>OX7sslQ%bEkMULcZCvo*Z;Mne7U9@X&qC +v%6BHgWizA=u(cLP6P}D7lKnk9D*JpH;-dOs(;1y^<+=wqOM*VsgOd=>xYy=<4kft^@4w~Gv0~-00000 +0000K000000002Y!g7+2c{l^vA6>1DQOuZYLozrIk|g)X!BI_ij=PWr0{IsR1l_I#dHB_@bgMhk0_N&L +a@nc5HwP6O+keCip}&vI>BTu$F{ZT5Vfz5z=cU#uHd8spTI%43qqz#IM%Vnl;~wy+U0;_w+8Yauo__nw +#aAVFI4rEwy|f{U0R{vHbZKL2WpZ10ERL~X*GB-yl0o(lkJ>lqHnaUkDzF#MO+`-nfvN;j>;{fO~I?t|ZBSH!(tpGg-WMy<=X>4;vw}2&v0mUY=J6lL$MhcKn;XgI|zJmp*01;Q@ +0XT>WaB^j1X>)0BZe0V!7mcZoem^?%L*to!bRZoO^d~aUzM`;8jz95VBG^B^;4cm3v~2hf;U4$>@L|V| +mt8Tf>F%PuK$$b1Yybe<9xqZ>e{x^fFs+1!e+{I`x|;BTGZEk9?>;P#rE}NPvxSnUK**8 +Le1-kltSZ7azFKgf3Y*(ir|N+G?p`mnXkl(k`ZV+LVYXKJ}#&0xTv^*>Pochfdm2o1a5C`W!OKy;4cm3 +v~2hf;U4$>@L|V|mt8Tf>F%PuK$$b1YykvwZ*67V9xqZ>e{x^fFs+1!e+{I`x|;BTGZEk9?>;u9IL;>*e1Zg(dl;zh@Se)i)R+C0ZKmX5VlzrFd~pb0000000000|Nj6000000^h!oT +k{Mq*mt#Id5<{IqiqB>((XyRTgKMj7L7^;V1p!-kERL~X*GB-yl0o(lkJ>lqHnaUkDzF#MO+`-nfvWYb +7a>H<(%oY0=TGqa6l5KfYJkC@$v(fAa&d%-e7p!qz9SbZ=!8X@=Yuq$20sb<4l#S`iz7Vef}@Ca=a#qt +000000000d000000002@9%YWFOg}YFoW9l|-yK9CRWr2rRnLhh&gT{LWK{$N0ssVVZ*FDSKfd5E4dt|K +_z&S8_xmmZEXQ=ZUJv^ +0dQ~uad821ashL50d#Z$b#(!Db^&*H0eE-;d3gbPdikkAnO21_Q|vw^7?JgkgL(n*=$IX=eC$m)1U+k$ +A_W0}Ud6mq639W2L|vh3p}>j>;{fO~I?t|ZBSH!(tpGjysaSFvJu_4WvuML_T7r2AV9eq<{=Bc@iMp6M +)!KLg{~`yek&tDD!z_VZcAXP49oSr+6K@T=%Z{*D>&)#|1_%XdZe(S6WdT-0oEfg=7gNu)i}m2V`Y*VQFl0MYn(@h5^MUvO8NyVMYp&P~kr{`@Vw(r~naH;^JG;71#M+yX<^`ps5F){hncU$ijom%IzoLb +(>^Yz>$s@6fa*%L>wyblbaY{3Xl-R~baTv)=eb|?NQ$9$(>OX7sslQ%bEkMULcZCvo*Z;Mne7O2Wpib6 +c4c#Jbj+U}49ir`|1I+*$<$TBtm<+yI?cCS&H}f+m!nkx000 -----END RGB KIT----- diff --git a/interfaces/RGB21@0.11.0.sta b/interfaces/RGB21@0.11.0.sta index b6baad8..cff30cf 100644 --- a/interfaces/RGB21@0.11.0.sta +++ b/interfaces/RGB21@0.11.0.sta @@ -1,44 +1,44 @@ -----BEGIN STRICT TYPE LIB----- -Id: stl:URVJ768i-moZ15p1-NpCOpOv-E$nZffn-Wq2vgZh-MgmPyPM#omega-cactus-hazard +Id: stl:$nNyOoei-!voolWH-$1WgNyl-qr9N7b5-4NWJHzx-8W4wyA4#panel-sharp-fire Name: RGB21 Dependencies: Std#ralph-blue-lucky, - Bitcoin#signal-color-cipher, - RGBContract#rover-annual-disney -Check-SHA256: 06a76474d78aea0bd7fbe562a3a922530fb3701089850ec530006d6fb3b224fd + RGBContract#atlas-iron-figure, + Bitcoin#signal-color-cipher +Check-SHA256: d874a32bed9a5d60de1d543ffd6bc40e7d109940149d6bbafb152feccd7075bd -1yV;sGBE?nEFN!zncXl9K5w2;FV{y1jDTJCC^p$-mHEbO0#qjhQ*>nYY!hN5_Bp3Y36tDMM#=e#tGI($ -UA5U3KNx<*C>ja}LTPkkZ)tA&zH(mP8ozbdze5D|o}Qu*MP~=1k^EBVAb9Wwj`+h1Qb$5VZ*FvQVPkXy +1yV;sGBE?nEFN!zncXl9K5w2;FV{y1jDTJCC^p$-mHEbO0#qjhQ*>nPX{cJSJdCo*`M?#tiu^i$iy$)< +e#(pBxs^w;|C1&QQb$5VZ*FvQVPkalY!hN5_Bp3Y36tDMM#=e#tGI($UA5U3KNx<*C>ja}LTPkkZ)t7= 2SRCdV{d700{|i8K10Q-T=FR=Q=>S+XYD&02PWpib6c4c!IaP7J{3{7QZX<<@jXHH>l -WjxWMoy@J9k$WaEUx}!s`ym)GDo%67tO|Gy=Bof+a|lgoZDm7fVRAn!a<{~<8ep?nYal -eMc%`0D|O6*W?F8WprU_Y;!}Zf5rCoWKZRyu3j3ckV4Jthm=C&OmaWbPV{2t{WdT-0j>;{fO~I?t|ZBSH!(tpGg)PGN0ju?^n-fFP~dpvnj- -AyBKaJW)+{-ce}5$#DguerIN22~A~WX<<}(aAgBibYuhoNWLQ%D(Hkon&*Qwpawq)`VKLB>Wd>h=Ype% -b?2724ncEcX=zY$X>N33Vr*q!UMA(m1w0!?L{VGDpk+OvDhHAKF%fNXr25$w;Zs!zL2PhnVNP{zf+K+R -b@1)9wcJs8k=}EVt)knrbu3HFb009JUVQpmrPO)*A+RkpPGhOnR2u=~wf)QpH7uC5ZDvob;9Y-wd=RBr((XWj*%F+LcX5LI3Q2TjZF56!b#8P80RR952~=-uWo|@abYTVv -1!-<%Wq1PmzH(mP8ozbdze5D|o}Qu*MP~=1k^EBVAb9Wwj`+i60aiogNR0FM6f^;O*CpsE^1w^{LCiZR -_61McH**~ZbZKL2WpV%n0ssVVZ*FA(00035b8l^B00jX8`o3~r-WtDk*S|vq^`4%h5JhJPqLKVk=pcCT -29Ef{TX!suv0v9m0LPL+_79KRH|I99{YEOV7tT#ZPWpkW1a4t%WdH;M00eGtZe;)f009JZZ*64&1pxy3 -zH(mP8ozbdze5D|o}Qu*MP~=1k^EBVAb9Wwj`+iXUd6mq639W2L|vh3p}>j>;{fO~I?t|ZBSH!(tpGg- -WMy<=X>4-<1OfmAZf|a7000011aog~WdH>M0{XskUfvqNb=SW`1ofVtq7X%A2cnVuQs^Lf@CJ_f!#^u> -x5Td+V+^*_{|Jk(H4u~TMq8eJM=D_eg5*ipVE_aI00eGtZe;)f009JZZ*64&1pxy3zH(mP8ozbd -ze5D|o}Qu*MP~=1k^EBVAb9Wwj`+hvs(;1y^<+=wqOM*VsgOd=>xYy=<4kft^@4w~Gv0~|VRUq1V`yz< -Zgg`13IG5B0{XskUfvqNb=SW`1ofVtq7X%A2cnVuQs^Lf@CJ_f!$Ycn#rE}NPvxSnUK**8Le1-kltSZ7 -azFKgf3Y*(iU0rr0000002BZK0000000?qrb7gXNWpe-o0ssVVZ*FA(00035b8l^B00jX8`o3~r-WtDk -*S|vq^`4%h5JhJPqLKVk=pcCT29Ef{4$>Ms8HM=uUmE|%CLL8DYpYB02F=7s{mYlP#7GIv +LPKwEbaG*1bPE6u(i%G%h4}Sf8vn;89aSG|t4s0*&BRFk%a^yrND0jkP;zf?W>02PWpib6c4c!J>*k#k +a7f`DagXkl_c +D{{BQuNq?vw$uLzi?1~hlkP@ao_$9uVE}^UN!R2DL}hegX>4;ts(;1y^<+=wqOM*VsgOd=>xYy=<4kft +^@4w~Gv0~{L3DIsV`yzlqHnaUkDzF#MO+`-nfvN^nX=7_;a$%M>%4ULr +1V?20aiogNR0FM6f^;O*CpsE^1w^{LCiZR +_61McH**~dRBvl#Zb@!rWq5#I#k^Az$U%@qU7>2Bz={du0O&G0&#r1CLJBFZ06hdwVQpox4c`8MAg$P- +$_ObTP^+;#QB8KuYQ&k8-Y;b5{PIYa9 +BY^aE@a?p<+);Uv-gA(xqT91|EKCMyQK|uB0+zxBL2PhnVfhyb1l_I#dHB_@bgMhk0_N&La@nc5HwP6O ++keCip$b84aA;vuZDDL|1^^C0baY{3Xl-R~bWUMyWd#8M2m;D19&dx0-7pM3Z=O*v*GCA9fL-<|HrZsA +`NnJlR3}KjBNr;@ghiU?gEXK9KMDE{F?;HZBRuDVqlk6qmbd``00000000yK00000000g_baY{3Xl-R~ +bX0k8Wd;HQX=DHZ0R(PgZDj#Yv2mE%&TgwSUGkR*P7%_A5oQ+`)ww4sj&F4yv21M(MQvhbWMpMzO=VtcHU8F +!O3w2qJC#)U<71gbYTDp002M$0000000030{{R300000DMQ&$uVRmV5XGCFiVFm&TVQ_G4X=P+oZvyOT +s9LW)jIzo3z!kiT{5pP%ATt$y%8TH+l}EAvlO|;WRzu`SjPv&tGy!?nCFm&fz)So=%sVIc1y9;Ha~%g` +Z*FvDZgc?-s;(M&rv!7X$EJo+{V&1)03O%U?m&Rq5}b^8af15_Npxjxb3<=+Zgd3!000CDRBvl#ZbV^p +VFm~VX>Md?cmnKcs9LW)jIzo3z!kiT{5pP%ATt$y%8TH+l}EAvlO|;WRzu`SjPv&tGy!?nCFm&fz)So= +%sVIc1y9;Ha~%eBX=7_;asUJZ00eGtZe;)f009JZZ*64&1pxx=X{cJSJdCo*`M?#tiu^i$iy$)2Bz={du0O&G0&#r1CLJBFZ +06hm}WprU_Y;ynv0ssVVZ*FA(00035b8l^B00jX8>}jZ4uRM&h$@#z)yo&rfev2S86@JQ#;JKAYvHz1M +KPz&##IG7-47St%2#c>Z5R>jkTb_MKDq#SE}jZ4uRM&h$@#z)yo&rfev2S86@JQ#;JKAYvHz1ML#ltp_Vr{><)W@$8mW*%&FhDh +LgP$wKlOrtu`}L^00000000006aWAK000002y$g}WpZ|9a{vSa00eGtZe;)f009JZZ*64&1pxx=X{cJS +JdCo*`M?#tiu^i$iy$);K=mRmV)&;+=Xmp=8%{dOaKyPp>`{W+ev&_Ht^T -vI2G1Jtsm#HCZ5u7Cwae0cHRI0000617UJ>0e1iJJu1QEX=%Xy>vn1>teUKtq)w3djjO=VIO}{ZUjP6H -WMy<=X>4-=KPz&##IG7-47St%2#c>Z5R>jkTb_MKDq#SETceV>000312V`Y*VQFl000031 -3~6(7b!B8zb#QQOc>w?c00eGfZDj!f0RRbba%E#_b7^mG0RRC21$1R{ZF2zt0RRCCVRLh3bWe9~WpV%j -|Nj614rz09b!B8tX>)C1bYo}%2y}8`ZgXa3asU7T009bNb8}^MPj_x*asdGU{{aeNb8}^MPj_x*asdGU -{{R6GZf|ZyadlyAL2Yk!Zgg`23So0|Wpqz>Ze?-+0SI(*VQzC~WpV-zX>)URWn@ihb8TUCV`yY^b#QQO -c_4FeWn*b(X=P*}VRIm1AZKiEVqt6`aA9&`ZDn+2av)@HWpi#PbRcbEbYo~BbZBKDX>)URWn>_8b#QQO -c_3kIY;R*>bY)~9bZ;PZXk{Q_b8}^MAa8eWWpZ;5Zf|ZyadlyAL2Yk!Zgg`+bZBKDb9HSXZ)PBKaAj_E -AYpTJWpr~OWN&42ZYOjgWpQ<3Y#?-RAarPDAaiwXAa7Rb7?wET2nD~ -cr9mYL^*C)P)03JV`X$zRclu*HgYp{Q$tfWEn!h;b2(QvW-T~MMK^Z=4N^x!GBrYVa&BQ_Y-I$3{Cv`? -JC>2x&0}8xJ4GA=2}kp0WaU);%XeLp50-i55Nu(xNbX -n?;n^t+ch=ZSc3QE+NQrJj4aisiv`r9x_I}Z)P!$%Aj(G3)xaIsZm;LsuY+jte!uyUZPTtus~8Lr=bV~VRCcwGO=000tVb#iV)Z*FsGXKrm}Zgf?0Yym$ja<{~<8ep?nYal -eMc%`0D|O6*W>^I3}SV1Ze?Usb#QQOc>#!wSY=~6@jI2b%^Ho0^4h`N6bqMfQQ6em^T$yfj)VXK2V`Y* -VQFl00Y58px5Td+V+^*_{|Jk(H4u~TMq8eJM=D_eg5*ip)URWn@!zaBysS0f>xPWn((=JC(Q1 -8jXtb+QHlu3zu?H+0@$e$59-PgaH5qZeeX@0f1h`yi*d$L6AgUp=zPPiV5QY=rTIbu4*Gf3Ms7sJplj- -aB^j1X>)0BZUJ2b#21aJj($Hn^F!mAeRLol5%ecA&%UCtOO8MBUm^hj1$1R{ZF2!zi^o(rG6hN4-<0096DX>)URWn@!zaBysS0RRC21a4t%WdQ&I010q%Wn*b`X>V=;00966bY*gFa{&MW00IhO -b8}^MPj_x*asUAT{|RDsa&A&-XJ~W*0RR600S;+%b9H58O=)v&VRU0?0t8}pa&G?s0SRJta&Ay^Z*OJ- -5@L07ZbNTwb7^O8ZDnqBRdQ?q0096DVs&zEWn@!zaBysS0RRC20SRJta&A&-XJ~W*0RR6131W3}Zc=Gy -XmkJo|Nj615NU39VQgt+LUnR(P;zf?W&j9ua$#Ze?--0RR613So0|Wpqz> -Ze?--0RR600S|6(Zbfl*VQfKdZ*^{Ta{&rrb8}^MPj_x*asUAcbaG*Cb7p070}yF$c42I3WI}avZcuV> -Z)PcUXk{R9a&LBNWMyO^aB^>NW*~27AaZ4MWpZ|9b0BGRAZc!PVQgt+4rz09b!B8tX>)C1bYo~_b9HcV -YK5Ib#!obbaONSb8~4rOj=Vh -b$BgjYD771SWreSPh(|tRaI+OEjDs9byGuAHZ5UMXmdGNHD)b1N<}w!000641=6B0dz(d+*sZj++->l; -t}Y?Say-NZ(5a@eh#oRVp!4l!00000GyrpRX*x_=Q!#aTEoW*(Ic```MlDZcWpq_lYga8cax-;PLsK>_ -VNqyvIaf7iEjUU=H+KO50RRFBMrC1ib#i5M3;+QNW^!R;bZKvHVQdIfbYX5}VRB>!00mM_VNqyvIaf7iEjUU=H+KO50RRFBMrC1ib#i5M6#xPVVs&zEVPb4$3TAR)V{~b6ZeeT) -Q*>c&WMOh-1^@+8M?x|+C;$Ks(i%G%h4}Sf8vn;89aSG|t4s0*&BRFk%a^yrND0jb0t9t*cyH)xK+Rkw -`Mu(V|7oQWGN(Z+AyvH&RuaL#D^138|7M^`NNc{jXEg#>2x#JO!0is)`buE3*f$s=7 -7|WDz5|hsu4xM=1##_akM=$^Wt^4(jv6#$*DE3PM1p!tKmiMH2B(lTb1P)|lIgi#~)sbZ^DMLcPrTIA( -QB)kOzr)xjz`xPycM6D}`pk=G7OeqFKI{;-SrsrMkU{`J9I$nc6v6J{1p&;$a*~gEI0M-qU9F8#%$RFKGB^*CB=^U`QB8J^yO1H{K10Q-T=FR=Q=>S+XYD&KHujTH+>EdJQM&>E4z*R)+S -A#T-nt8wey2OO)v!`LRkztQP;3W%Qi%!_9htpQ3t>=3qD6)+-@LLdMy*z$T8ClZi8YCe|m_*?{lv>_T7 -tkE!8{87}TyWT7W0ssVVZ*FDSKfd5E4dt|K_z&S8_xVm-pkWcojB&*wsIf|mobjYpmK)`*-|j6QCe!M6qqZlo$g+grvznd|(VVK) -`s##^Jh_COk!RL4N<*rD#rE}NPvxSnUK**8Le1-kltSZ7azFKgf3Y*(iUtA%ba`-Pu?^n-fFP~dpvnj- -AyBKaJW)+{-ce}5$#DguerIN224rbxWpi{YTdJ&3iT??W6$?l#{@A?G8j--)v|TbGZq;_HaqHbjvr`~b -_&>p|I=+ZSHXzGneTL3nMs8HM=uUmE|%CLL8DYpYB02F=7s{mYlP#7GIv00000 -00000|Nj6000000NWLQ%D(Hkon&*Qwpawq)`VKLB>Wd>h=Ype%b?272178JmaA9L*AOvN2V{9P?admHW -Wpg3~Xkl|`BL-w|Y;0k2BnNP1a${v~bR`L4ZE$6Bb75{|CJJG2Z*z2VZ*XX3CkSG4VPk7$bWA7+Vsc?) -Yh`p&DF|V6bY*gBb89LDaBOvRD+Ob3ZEayJ1#M|=b#pBPWN&mX1#@g+b7(IFdS!BNFavLHWibPEcW*KU -bZByAWite3Z*_7s1ZHV=WiCgZ)|UFI|OWH -b8|ceWpQ<3Y&{2Oa%Ew3WpX|Uadl;LbZKvHKLTNNKmuPuK>}YwLIPhyLjqq!L;_z$MFL+&Mgm_)M*?3+ -NCIC;NdjL=N&;U?O9Ed^Oafm`O#)v|P6A&~PXb?1Py%03Q3795QUYI7QvzR9R03aBRRUjDRsvsFR{~#H -SOQ;JSpr{LS_*SetH31dQXVPk7$bW(ieJj&GE~o3bsJMXYO0?^NT%k!=UF9_Hk+b8V -Ft_j2&9|DqsTD5}A2(UF#~}_M00>4q10|{hhV`)ukY;0)+3S(t%bZJd#Y;0)-1#M|#a&HC+WMyM%O=)9t -ZwCrvWo~q7O=)9tZwLf#VQy~;2xMhrX-;8oZwd)xWo~q7PGN3u3j}a!V{Z%yWMyM%P-$at4GCjqZggo- -X=85=1!iS!bZ-v{WMyM%MrCbuZx9M&Wo~q7MrCbuZxIAxbaZbLUtT8V#RWVYMMP0s#-L?ApehHE`!Nx1 -aisd$7U5G>13mOG^S@OiTh_O-%w{PEG<} -Pfr40P*4J2QBeY4Qc?n6Q&R$8R8#_ARaF9CR#pOES62dGSXcsISy=*KT3P{NVF6-d0b^qUWMlzlWdUYp -0cU3cXlMaxX#r|#0c&dkY-|B-Z2@j>0dH>saBu-}aRG920dsQ!baVlAbpdvE0e5!+cz6MMc>#KQW2z$* -=&?u0vV`BWnw}8RoT}CO>V%FwxrCjOXVx@I2>Yp6avD7|R0gwX!*5!Gc?n?5;yM1jui=Thm^szjcmV(a -000000RI30000000CxZIJu1QEX=%Xy>vn1>teUKtq)w3djjO=VIO}{ZUj+e*%scV6@fU9pCi53oip!$I -FLkNNm8RePe-orvEEUUuUd6mq639W2L|vh3p}>j>;{fO~I?t|ZBSH!(tpGg*0mM3ep1HFEd2`8+UDn~O -1og|)LO{U2yb2Gv2owO6)Pf^`^mXvL0b>G|!UHq{UqL|vUqV6xUqeFz -UqnO#UqwX%Uq(g(Uq?p*Ur0y-Ur9*UrS2@UrbB_UrkK{UrtT}Ur$d0Ur8 -UsO~AUsY8CUshHEUsqQGUszZIUs+iKUs_rLVPOGcVgX}g0c2zWWn}?oW&vks0cdCeX=wp!Y5{9&0c>mm -ZEXQ=ZUJv^0dQ~uad821ashL50d#Z$b#(!Db^&*H0eE-;d3gbPdWeizWn((=JC(Q18jXtb+QHlu3zu?H -+0@$e$59-PgarXyp-EU>L0b>G|!rXoSC?n5wJSpIAp{09w=bpP+ -&ZWGMAfo&23(WIz3ZsHT^UK%K(4i9Ajp1M~R@C@!4#dQE#lUD;OiKi1Rs{hnTdJ&3iT??W6$?l#{@A?G -8j--)v|TbGZq;_HaqHcs&-*fU69;}zAIV^Hl7d8_9-)kE+Vz;)3s*I)2VU0z1h8<^kM`0GTIJXW70NMG -9a>Vm-pkWcojB&*wsIf|mjwYFuyu|U!T^j90F36+)E=H0H{s0>nH0sEektM3d!W0q4c`8MAg$P-$_ObT -P^+;#QB8KK9=zKTm*o$AsQE~(J)#3QPiZn-Yf@WXkl`5Wpppt@_H915|BP>K9=zKTm*o$AsQE~ -(J)#3QPiZn-Ymb5%jv~AS23ov&0+fh-{+;)DK=9%#aim%hoiX)szwMr(W0Hqt(%d1CNN)#sHFQL7%(bM -bH%I*cn#*O0A6zd000000000#000000002QI(?qGvjTZ@$&X#u;j9Gp%hN(Yz`nc+54Z>v0F=}P0!Y3i -7b@t4MVjY>G@u4Q3HlB(d+LiLJm-R=h;`?dxb>|UAwf1KA&4t&LI4m}^5aI1iE}_s79eO?HmEkOczy7YGF1t^|4b)vt7`JJJH?>OpeZskt`?6&l-r#0;Uo -kIU)BIae{Jw9R4r0N>}O)+shqImKG);D@8R3aUofKfd5E4dt|K_z&S8_xxYy=<4kft^@4w~ -Gv12aef}sT&vZN~;BKL%dw1uayIIbqypJHF`|S(N^Kl9YUtT8V#RWVYMMP0s#-L?ApehHE`!Nx1aisd$ -7U5G>00000000009{>OV00000;D@L*mNSQ$uf&Ry5okI>eJj&GE~o3bsJMXYO0?^N1OfmAZf|a7*gwAD -FAe3iZ1@l19{2t5VaJV^T`{fc?xMUvnKPbj0R(ezZDrgZFH%;2a$nalt%Qbu4W!Asn(%=$5#QwRK0Hcc -B}nLMK+Rkw`Mu(V|7oQWGN(Z+AyvH&RuaL#S+XYD&30f -trsCg%+lRr?B`GL`xImylWKs$pvgYJmvV80iF~{WNWLQ%D(Hkon&*Qwpawq)`VKLB>Wd>h=Ype%b?272 -0000000000CjbBd00000`4m;t2@#H=ITLm*{QiV2NfFIf5Z%-0~!HgVF6-d0b^qUWMlzl -WdUYp0cU3cXlMaxX#r|#0c&dkY-|B-Z2@j>0dH>saBu-}aRG920dsQ!baVlAbpdvE0e5!+cz6MMc>#KQ -`>9xR8a*>q2D50xZ(4$R31H0PIsUw_;fcDKIn~;D0RR91 +0s;XIQb$5EH9~cAZee0;K=mRmV)&;+=Xmp=5=Yl+T7onDsqJ)(GyQ +zUOj0_|udNLf4!^9@NX6Lz%=VDF*9hAZ`6NPnybkfD&V!=J!4Km4>wz$a+407AElMy;IhYGOY@y%3F1_ +Bwt?$(j+Jhl5(=1HP#1H+VO<>0cHRI0003AVs&zEP;zf?W-*S+pmK)`*-|j6QCe!M6qqZloxPWn((=JC(Q18jXtb ++QHlu3zu?H+0@$e$59-Pga82tWMy<=X>4-=KPz&##IG7-47St%2#c>Z5R>jkTb_MKDq#SETceV>xPWn((= +JC(Q18jXtb+QHlu3zu?H+0@$e$59-Pga7~l0SRJta&A&-XJ~W**gwADFAe3iZ1@l19{2t5VaJV^T`{fc +?xMUvnKPbj009930000617UJ>000312V`Y*VQFl0000313~6(7b!B8zb#QQOc>w?c00eGfZDj!f0RRbb +a%E#_b7^mG0RRC21$1R{ZF2zt0RRFDVRLh3bWe9~WpV%j|NjYMb#iV}X=iA30RaF1009nZb8~fNWKC&v +ZDDj{XaWRcb#iY1009YNb#iV{a&K>D0uo|%a&AL!ZgXj8Zf#|5bX9U}000313}SV1Ze?Usb#QQOc>w?c +009YNb#iV}X=iA30RaF10SRJta&A&-XJ~W)0RR600T5|!c42I3WI}avZcuV>Z)N}pbaG*Cb7p0700000 +0SaMrb7gc-cWz~J0RaF10SaMrb7gc-cWz~J0RaF1009qfZ*E0#bzy8lZEtmMbaMd;VRLh3bWe9~WpV%k +2y}8`ZgXa3asv=)Zgyd8X=Flma&Ay^Z*OKPbZBKDaB^>UX=G(&AaHVTZ)PBGW*~B9b7gXNWpf~Db0BGM +c42I3WDaR_b9H58O=)v&VRU0?WOH?JaBO)Xb8uy2X=Z6wGO= +000MMWprU_Y;yrWD{{BQuNq?vw$uLzi?1~hlkP@ao_$9uVE}^UN!R2601Rn!b9H58Q+04~Yj>;{fO~I?t|ZBSH!( +tpGg%010q%Wn*b`X>V=;T?51yjj4`)KRWY6Ze?--h>TceV>000312V`Y*VQFl0000313~6(7b!B8zb#QQOc>w?c00eGfZDj!f0RRbb +a%E#_b7^mG0RRC21$1R{ZF2zt0RRCCVRLh3bWe9~WpV%j|Nj614rz09b!B8tX>)C1bYo}%2y}8`ZgXa3 +asU7T009bNb8}^MPj_x*asdGU{{aeNb8}^MPj_x*asdGU{{R6GZf|ZyadlyAL2Yk!Zgg`23So0|Wpqz> +Ze?-+0SI(*VQzC~WpV-zX>)URWn@ihb8TUCV`yY^b#QQOc_4FeWn*b(X=P*}VRIm1AZKiEVqt6`aA9&` +ZDn+2av)@HWpi#PbRcbEbYo~BbZBKDX>)URWn>_8b#QQOc_3kIY;R*>bY)~9bZ;PZXk{Q_b8}^MAa8eW +WpZ;5Zf|ZyadlyAL2Yk!Zgg`+bZBKDb9HSXZ)PBKaAj_EAYpTJWpr~OWN&42ZYOjgWpQ<3Y#?-RAarPD +AaiwXAa7Rb7?wET2nD~cr9mYL^*C)P)03JV`X$zRclu*HgYp{Q$tfW +En!h;b2(QvW-T~MMK^Z<00IIv(>@2W#<}JK6Gb>&K`xOSLx^XyK{@kcwys3dQVQ4JY!PPw0000q0CRI` +I!szqF?Dz?XKF+_Zdg!8El*=*bX8SrS1mSjGj&r#Q#LJOQD}2HS2boWI7&q~cL4wa00Ia`Wnpx6a%FQB +00IbNb#iWDVr*p!W^!R;bZKvHVQdIfbYX5}VRB>!00mMt!Hq{WedU%6WhiW1Z&rJ@=J{ +wHC;FK7JM^-fR(P00000GyrpRX*x_=Q!#aTEoW*(Ic```MlDZcWpq_lYga8cax-;PLsK>_VNqyvIaf7i +EjUU=H+KO50RRFBMrC1ib#i5M3;+QNW^!R;bZKvHVQdIfbYX5}VRB>!00mMY62ZUYgq2{$1_f|( +Z*OMux+H)Wo_#t<{Qxj6AK!qv;}MSmqFbhQEq%{{?+7>;%am^tlg}6qop{{FTg974FaQ3n`}K{nn9PGH +_DcZ;0agu`_oR6wvcum54rF6FkJew+k!36?Lqfl$`8gF)R2-|n!`LRkztQP;3W%Qi%!_9htpQ3t>=3qD +6)+-@LI6MnH0sEektM3d!V}o0nEa3l8<>f1KA&4t&LI4m}^5aI1iE} +_s79eO?HmEkRjtfL&d6G@+l`%qd385?K@+fP1(-9sgE>i7rMzqbp-*X&-*fU69;}zAIV^Hl7d8_9-)kE ++Vz;)3s*I)2VU1ITdJ&3iT??W6$?l#{@A?G8j--)v|TbGZq;_HaqHa&9IL;>*e1Zg(dl;zh@Se)i)R+C +0ZKmX5VlzrFd~pbAOJ7e@_H915|BP>K9=zKTm*o$AsQE~(J)#3QPiZn-Yf(H00eGtZe`d%zThtn<+N=0 +58)p7{qSMOjh9_9t?BNfyg->Vo@@aGb8l^BuyE6l_RDb4RmNAXE51!L2&Jh($Ia%Vd3q&R*o> +-d45AI6^+T%{E(CgIa&IsLZ*FBV19W$9G6i&Ka%E*R1ZHn_ax?^HX?A5b19NG3HU)EK +c4cli1!ZYxXmmIPZfS01IR#^3a%FU025fI+VRL9-0byYQVqyVfV*zAj0cB+YW@Z6rX8~wv0cmLgYH9&% +YXNL*0c~voZf*f@Zvk*{0da8wa&iH4a{+X80d;i&c6I@GcL8{K0eN`=dU`)Aa<{~<8ep +?nYaleMc%`0D|O6*W?8OW2z$*=&?u0vV`BWnw}8RoT}CO>V%FwxrCjOXVx@IL#ltp_Vr{><)W@$8mW*% +&FhDhLgP$wKlOrtu`}L^1_A_hd2nU14c`8MAg$P-$_ObTP^+;#QB8K)l7QQy^3LKf$d!zKBIOAj@QZhR$B(b98cVaA;*G2x4+!V{2t}OehFqa$#d@Wpq+02w`({WpZhAYbpeAY;|)h1!He*ZDA}0 +ZE0?Gb1eg8Z*(pNb8KOAXfFhMWpZyY18;6+F#~jWZ!!gRXmVv`GX!RDb#gQWW@&b1H3M^Lcs2!dWp-t5 +Hw9&BXJ~Xd1a4_=WjO_7Z)|UFItg=SZD~VqY;SHm1Z-tay|%gb!BsOX>V>n +0%3GO0$)Kv0$)Nx0$)Qz0$)T#0$)W%0$)Z(0$)c*0$)f-0$)i<0$)l>0$)o@0$)r_0$)u{0$)x}0$)#0 +0$)&20$)*40$);60$)>80$)^A0$){C0$)~E0$*2G0$*5I0$*8K0$*BM3UhHna$#d@Wpqqi31VSmYg24t +b7))&b8$j)VPk7$bW&XfV_|Y-bY2E*Z)9O}XkQ3oVPk7_X=7_(0byYQVqyVfV*zAj0cB+YW@Z6rX8~wv +0cmLgYH9&%YXNL*0c~voZf*f@Zvk*{0da8wa&iH4a{+X80d;i&c6I@GcL8{K0eN`=dU^?CLULhaYh`py +djxQ4aAkZ6V?uIaV{2t}Qhfz4R=epU^Z_oR6wvcum54rF6FkJew+k!36?Lqfl$`8gF)R0#X2SaKRY +GgJn%Xv1$>f_VvG%;GuzyszPjx|liD+IRo}000000096000000003Ky$5c2n1xg(vzLX+s=TnOlIwpu5 +x<(TMczEDkZ1)BN1axJ1bQsH&ZxWNw7!I9y+{RnQn@2DI{;m7Md`c4>2IVr*pq1Y~7nX#oXeWo~q70tIbpY;0)*31nqs +X-#QtY-t1vV`Xl1X-#QtY-t4rZE0h2Zw3iuWn*bgX=8G42MS|lZggo)X=8G42n23nZf^+)WMyM%PGN3u +3JGInZggo*VQy~=1aN6%Zwv@zWn*bjX=85<31ek$bZJm&V{Z-xW@T-3Zx0D%Wn*bZWo>kC5DH^uZggoz +Wo>kC5d>j$bZ-)0UMA(m1w0!?L{VGDpk+OvDhHAKF%fNXr25$w;Zs!uJ_LGYa&IsLZ*FBV19W$9G6i&K +a%E*R1ZHn_ax?^HX?A5b19NG3HU)EKc4cli1!ZYxXmmIPZfS01IRalnK>}YwLIPhyLjqq!L;_z$MFL+& +Mgm_)M*?3+NCIC;NdjL=N&;U?O9Ed^Oafm`O#)v|P6A&~PXb?1Py%03Q3795QUYI7QvzR9R03aBRRUjD +RsvsFR{~#HSOQ;JSpr{LS^;5U0b*hSV`BkiWC3Mm0cK_aXJ-LuXaQ+y0cvUiYij{)YyoX;0d8&qZ*Ku` +Z~<{~0djHyb8`W7bOCjB0d{r)cXt7Jcma8N0eX64sv{KWu}8?Vgx|B8o)FQTs@3}HgpNG9gq@LR)-*~8 +`>9xR8a*>q2D50xZ(4$R31H0PIsUw_;fcDKIn~;D0RR9100000{{R3000000cK`4_D#7GwX~6yKc4{fC +nyi?lPLTMGtH94V>wGO=1p$i8JMp&h7jF2B +z={du0O&G0&#r1CLJBFZ06hf(#5#SRxw8U!bIFfg*5RxK^~=*jK)}Ad3J +OG^S@OiTh_O-%w{PEG<}Pfr40P*4J2QBeY4Qc?n6Q&R$8R8#_ARaF9CR#pOES62dGSXcsISy=*KT3P{N +VF6-d0b^qUWMlzlWdUYp0cU3cXlMaxX#r|#0c&dkY-|B-Z2@j>0dH>saBu-}aRG920dsQ!baVlAbpdvE +0e5!+cz6MMc>#KQh>TceV>4NmyOwH13hJ#Kd;Rz-U=aO9W+B1pz8ss;p3n{|Sv13rH;f*u2mhk-*oqT{0nV)po0K>)oZ#`!aPC2Yyc<$zXDl +f<&Mmp^R+W^_bcVS2e5$Ue^EwuyE6l_RBTu$F{ZT5Vfz5z=cU#u +Hd8spTI%43qqz#IMhHC7qMgjGn~{4aFkgwNr28QlFe*-S#jFZ=4d$x=UUL8d00000002J#00000006`~ +eV)0q0(o=Ek6qT`tOWJT(?USNzPt(#xCj&gl+*Wd>h=Ype%b?272 +^{p2nM9k9NV(jNn@cR^G9g}K+!Jx@Lzn5}xgo%8-%))Y#k9jx)*&ki4jZw^)YeOVo@@XB+#WAdR)2C|*D$SwhJOvD$-0{Gfin@`Y62ZUY +gq2{$1_lBIba-iGqk=;7%h%D+p%U7S;b1RT)c9`>#Kd;Rz-U=aO9W+B1a@zAbRpwDL&d6G@+l`%qd385 +?K@+fP1(-9sgE>i7rMzqb@I9-fEJ#8I!OHhFfAY7fVtxlj{%}vrgbfS&w=jH<(%oY0=TGqa6l5KfYJkC@$v(fAa&d%- +e7p!qz9SbZ=!8X@=Yuq$20sb<4l#S`iz7Vef}@Ca=a#qt000000000d000000002_7YGF1t^|4b)vt7` +JJJH?>OpeZskt`?6&l-r#0;SW8UbNp0b*hSV`BkiWC3Mm0cK_aXJ-LuXaQ+y0cvUiYij{)YyoX;0d8&q +Z*Ku`Z~<{~0djHyb8`W7bOCjB0d{r)cXt7Jcma8N0eX7-saSFvJu_4WvuML_T7r2AV9eq<{=Bc@iMp6M +)!KLg0000 -----END RGB KIT----- diff --git a/interfaces/RGBContract@0.11.0.sta b/interfaces/RGBContract@0.11.0.sta new file mode 100644 index 0000000..9c16669 --- /dev/null +++ b/interfaces/RGBContract@0.11.0.sta @@ -0,0 +1,53 @@ +-----BEGIN STRICT TYPE LIB----- +Id: stl:7GmoWq88-jLLJ!cA-VvIr8On-6LIDMVf-sqL4LmV-R7H$kyY#atlas-iron-figure +Name: RGBContract +Dependencies: + Std#ralph-blue-lucky, + Bitcoin#signal-color-cipher +Check-SHA256: 25f87c77ba721b8392a2bd33ce56b2dacbef4c9c0af13dbe361cb9a3830c985f + +3sOfyLvL<$a$#e10?I5NZ-bfLFbqC#o>4E?M+l67UG^w8*<_XZ#%uyqCj(P-Wc6$lVk7oBr%DNv+($;q +`HHK!gIHa)*%m(-e#9sm3I{@IbYpL6ZUP5FX>?<6X>J1mA>%$n#j0HLDJN5-IKgM_J7b(p+0MPGk2Gl) +y2(Rz1Xgc#bfbbo^UK%K(4i9Ajp1M~R@C@!4#dQE#lUD;OiKi1Rs>XdX=LbXK+Rkw`Mu(V|7oQWGN(Z+ +AyvH&RuaL#N1_Q*>km07$+g7b@t4MVjY>G@u4Q3HlB(d+LiLJm-R=h;`?dxDG*c +V`*tna%paKVPb4$UtT8V#RWVYMMP0s#-L?ApehHE`!Nx1aisd$7U5G>2tjOcXkkuuZGt0!^mXvL0b>G|!UaKWaA;xq7YGF1t^|4b)vt7`JJJH?>OpeZskt`?6&l-r#0;SdL2Phn +VN-2kY-|(&20?9ab#8P80RR992SIXlX=7|<1pxpB0s_h`9&dx0-7pM3Z=O*v*GCA9fL-<|HrZsA`NnJl +R40NXfb@0n?X4E?M+l67UG^w8*<_XZ +#%uyqCtqGB<;4X&8%0D>TgISeJ)kNFk^3Xf*%skbRR9100000003QGV0000000}{Jb7gc>aAji# +1O{|zV{2t{0b6%0jj> +;{fO~I?t|ZBSH!(tpGg-WMy<=X>4-<1OfmAZf|a7000011aog~WdH>M0Y58px5Td+V+^*_{|Jk(H4u~T +Mq8eJM=D_eg5*ipV=;T?51yjj4`)KRWY6Z)S4<2>}k$8ao+<`1M~J|HmdBRUd1sOY#QI#7O)0BZUJ2b +#21aJj($Hn^F!mAeRLol5%ecA&%UCtOO8MBUm^`dZ*FvQVPkYuWpZtE1_A_hWq5P}7|WDz5|hsu4xM=1 +##_akM=$^Wt^4(jv6#$*DE3PM1#M+yX<+~a0ssVVZ*FA(00035b8l^B00jX7L#ltp_Vr{><)W@$8mW*% +&FhDhLgP$wKlOrtu`}L^2SjCbVQFl01pxpE00992000000093000000000R|b8~fNO=Wap1_20iWpib6 +c4cz_2>}k$8ao+<`1M~J|HmdBRUd1sOY#QI#7O4E?M+l67UG^w8*<_XZ#%uyqC;1l$1l_I#dHB_@bgMhk0_N&La@nc5 +HwP6O+keCip#TU0Jkg?^%&nV|dnPbniKwLeAs8?!PIJYq3V03Xs{mee0000000000KL7v#000002~A~W +X<<}(aAgJq1ax_DWdR(pb&eFm0E`a+jONnR9-bLD;mr@36vdi;DdEn0pt}cibz*dRaAg1l0ssVVZ*FA( +00035b8l^B00jX79I$nc6v6J{2V-bqa&u*L00aU61a5C`WdHyG +0R(ezZDjxj0RbGab&eFm0E`a+jONnR9-bLD;mr@36vdi;DdEn0pt}f7X>DagXkl^#Ed*tFV{9P=Xkl|` +BL-w|Y;0k2Bm-e>a3%zBY;|)h1Y}`zXe|R|Z*(pMdS!BNFavLHWibPEcW*KUbZByAWite3Z*_7s1ZHV= +Wi0dH>saBu-}aRG920dsQ!baVlAbpdvE0e5!+cz6MMc>#KQ1WsXXWd#8M +1p)%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?;HZBRuDV +qlk6qmbd@_00000001Wd00000000e6W^_SpY;R*>bZKvH1p)zO0aiogNR0FM6f^;O*CpsE^1w^{LCiZR +_61McH**~U8SCbq6L3i3S#QDT=}@l)0BZUYkwX>Md`c4>2IVr*pq1Y~7nX#oXeWo~q70tIbpY;0)*31nqsX-#QtY-t1vV`Xl1X-#QtY-t4r +ZE0h2Zw3iuWn*bgX=8G42MS|lZggo)X=8G42n23nZf^+)WMyM%PGN3u3JGInZggo*VQy~=1aN6%Zwv@z +Wn*bjX=85<31ek$bZJm&V{Z-xW@T-3Zx0D%Wn*bZWo>kC5DH^uZggozWo>kC5d>j$bZ-(5P;zf?W>02P +Wpib6c4c!00t9t*cy9vrY!hN5_Bp3Y36tDMM#=e#tGI($UA5U3KNx<*C>jdrYCz3gCHcMLg#T%!5i+Mi +DNW&j8P06+i$000000096000000000qEX=7n>WNBe;LvL<$a$#e11pxpE +00961000000096000000000J5X=7_;as>eZ1p)%fEFN!zncXl9K5w2;FV{y1jDTJCC^p$-mHEbO0#ql0 +BY^aE@a?p<+);Uv-gA(xqT91|EKCMyQK|uB0+zx62m;D19&dx0-7pM3Z=O*v*GCA9fL-<|HrZsA`NnJl +R3~3vCgsHiJR3zsQCr5KWj&xO2a)?R5p8j#`q>uYQ&j)}00000000L700000000V9Z);_4Np56icm)9f +00a + +-----END STRICT TYPE LIB----- + diff --git a/interfaces/RGBContract@0.11.0.stl b/interfaces/RGBContract@0.11.0.stl new file mode 100644 index 0000000..809bcf1 Binary files /dev/null and b/interfaces/RGBContract@0.11.0.stl differ diff --git a/interfaces/RGBContract@0.11.0.sty b/interfaces/RGBContract@0.11.0.sty new file mode 100644 index 0000000..0125a51 --- /dev/null +++ b/interfaces/RGBContract@0.11.0.sty @@ -0,0 +1,111 @@ +{- + Id: stl:7GmoWq88-jLLJ!cA-VvIr8On-6LIDMVf-sqL4LmV-R7H$kyY#atlas-iron-figure + Name: RGBContract + Version: 0.11.0 + Description: Types for writing RGB contracts and interfaces + Author: Dr Maxim Orlovsky + Copyright (C) 2023-2024 LNP/BP Standards Association. All rights reserved. + License: Apache-2.0 +-} + +@context +typelib RGBContract + +import Std#ralph-blue-lucky + use AsciiPrintable#ultra-sunset-format + use AlphaNum#window-tractor-alamo + use Alpha#citizen-bicycle-stretch + use AlphaSmall#magnum-martin-soviet + +import Bitcoin#signal-color-cipher + use Vout#brush-gloria-heroic + use Txid#shallow-light-reverse + use Outpoint#logo-alamo-madam + + +@mnemonic(monica-tornado-page) +data Amount : U64 + +@mnemonic(infant-father-exhibit) +data Article : Std.Alpha, [Std.AlphaNum ^ ..0x1f] + +@mnemonic(alaska-archive-mailbox) +data AssetSpec : ticker Ticker + , name Name + , details Details? + , precision Precision + +@mnemonic(mono-bagel-falcon) +data Attachment : type MediaType, digest [Byte ^ 32] + +@mnemonic(ivory-speed-finish) +data BurnMeta : burnProofs {ProofOfReserves} + +@mnemonic(hawaii-winter-orca) +data ContractSpec : article Article? + , name Name + , details Details? + , precision Precision + +@mnemonic(voodoo-toga-meaning) +data ContractTerms : text RicardianContract, media Attachment? + +@mnemonic(trivial-halt-nobody) +data Details : [Unicode ^ 1..0xff] + +@mnemonic(alias-analog-icon) +data IssueMeta : reserves {ProofOfReserves} + +@mnemonic(taboo-pogo-exile) +data MediaRegName : Std.AlphaSmall, [MimeChar ^ ..0x3f] + +@mnemonic(brother-burma-book) +data MediaType : type MediaRegName + , subtype MediaRegName? + , charset MediaRegName? + +@mnemonic(amber-alarm-satire) +data MimeChar : excl#33 | hash#35 | dollar | amp#38 + | plus#43 | dash#45 | dot | zero#48 + | one | two | three | four + | five | six | seven | eight + | nine | caret#94 | lodash | a#97 + | b | c | d | e + | f | g | h | i + | j | k | l | m + | n | o | p | q + | r | s | t | u + | v | w | x | y + | z + + +@mnemonic(lexicon-monitor-madonna) +data Name : Std.AsciiPrintable, [Std.AsciiPrintable ^ ..0x27] + +@mnemonic(kansas-rocket-kiwi) +data NftAllocation : TokenIndex, OwnedFraction + +@mnemonic(mission-person-armor) +data OwnedFraction : U64 + +@mnemonic(vendor-anita-british) +data Precision : indivisible | deci | centi | milli + | deciMilli | centiMilli | micro | deciMicro + | centiMicro | nano | deciNano | centiNano + | pico | deciPico | centiPico | femto + | deciFemto | centiFemto | atto + + +@mnemonic(harmony-dolby-golf) +data ProofOfReserves : utxo Bitcoin.Outpoint, proof [Byte] + +@mnemonic(bernard-right-pablo) +data RicardianContract : [Unicode] + +@mnemonic(newton-corona-aloha) +data Ticker : Std.Alpha, [Std.AlphaNum ^ ..0x7] + +@mnemonic(giraffe-correct-modest) +data TokenIndex : U32 + + diff --git a/interfaces/RGBStd.rgba b/interfaces/RGBStd.rgba deleted file mode 100644 index 4e0223e..0000000 --- a/interfaces/RGBStd.rgba +++ /dev/null @@ -1,233 +0,0 @@ ------BEGIN RGB KIT----- -Id: rgb:kit:fMw$islR-26Wg98x-WMmoVi7-wxP011K-Ta!xLY8-WIKkQEE -Version: 2 -Interface: EngravableNft; - id=EiusZVYz-zpXSkSo-3c0Tqoc-t!N4Jnr-6$TxTgX-Ur1CFWM#tropic-joel-data; - dev=ssi:LZS1ux-gjD9nXPF-OcetUUkW-6r3uSCS6-aQhs9W5f-8JE7w -Interface: LimitedNft; - id=L8SvJhId-0E78cOR-LOTR$VO-KhEnHfL-7afNS2K-WCHl4gI#suzuki-solid-dragon; - dev=ssi:LZS1ux-gjD9nXPF-OcetUUkW-6r3uSCS6-aQhs9W5f-8JE7w -Interface: RenameableAsset; - id=VPnE3vly-SyuCUze-soMpdCb-jvSuziU-M!dOCU!-QBt6KVA#pierre-night-plate; - dev=ssi:LZS1ux-gjD9nXPF-OcetUUkW-6r3uSCS6-aQhs9W5f-8JE7w -Interface: NamedAsset; - id=Vk9c4$Ny-Fv0J6tg-pDF05CE-312oCWh-fENNuia-GYbEu18#adios-alert-never; - dev=ssi:LZS1ux-gjD9nXPF-OcetUUkW-6r3uSCS6-aQhs9W5f-8JE7w -Interface: ReplaceableAsset; - id=azoYYtyN-hzAFPrJ-8zqI$HJ-14PRdSK-YrUQL2v-ccJC6Bk#tractor-scorpio-mineral; - dev=ssi:LZS1ux-gjD9nXPF-OcetUUkW-6r3uSCS6-aQhs9W5f-8JE7w -Interface: NonFungibleToken; - id=cqaDYTzY-SR6opg8-yAwXW23-QH5ge!v-KJK8kzy-xqGZ4gI#cake-museum-karl; - dev=ssi:LZS1ux-gjD9nXPF-OcetUUkW-6r3uSCS6-aQhs9W5f-8JE7w -Interface: UniqueNft; - id=gpfNDb9S-qdSEAmR-MH2bn!3-ZQtY$Az-GxASNVG-dVIhFzM#bernard-nikita-detail; - dev=ssi:LZS1ux-gjD9nXPF-OcetUUkW-6r3uSCS6-aQhs9W5f-8JE7w -Interface: NamedContract; - id=gvx80qo7-lpHXzWN-fADtFHA-MI6$$fu-VXHTNji-nXo1oWQ#format-oliver-latin; - dev=ssi:LZS1ux-gjD9nXPF-OcetUUkW-6r3uSCS6-aQhs9W5f-8JE7w -Interface: IssuableNft; - id=to80AGDM-Dmi7SvS-KYgBysc-qVYsjqf-N0sm1ED-ng3KevA#survive-humor-order; - dev=ssi:LZS1ux-gjD9nXPF-OcetUUkW-6r3uSCS6-aQhs9W5f-8JE7w -Interface: BurnableAsset; - id=vOVfWwQ7-2TDwbAN-36Yrvum-8nAF$lT-vNzw!Zt-7ZmBGR0#ammonia-antonio-norway; - dev=ssi:LZS1ux-gjD9nXPF-OcetUUkW-6r3uSCS6-aQhs9W5f-8JE7w -Interface: FixedAsset; - id=w3Lk9Mt3-gKt$n5y-TYpVGg0-IDpK0p9-sHQ!hb6-m2Qr3a0#unicorn-reward-ladder; - dev=ssi:LZS1ux-gjD9nXPF-OcetUUkW-6r3uSCS6-aQhs9W5f-8JE7w -Interface: InflatableAsset; - id=0RhF!uRt-geU8$Hc-hvvG6j4-e1wxCwQ-CWBtpfB-gZIIY6s#brazil-olympic-marvin; - dev=ssi:LZS1ux-gjD9nXPF-OcetUUkW-6r3uSCS6-aQhs9W5f-8JE7w -Interface: FungibleAsset; - id=13N6PRwT-T68!FGY-lBwX2cm-qesgJ11-j0nQkM1-WSCJFj4#ariel-gizmo-evita; - dev=ssi:LZS1ux-gjD9nXPF-OcetUUkW-6r3uSCS6-aQhs9W5f-8JE7w -Type-System: sts:8TSHKI10-zPyBfmy-fD7133v-7ZIfki5-8dW1xXI-mTKi0jc#baron-factor-ibiza -Check-SHA256: d7013e77fd523388202518b388004d165e4d62ba6f7b874a6b1a4e8cc7660d90 - -0u2ETMQ&$uVRm6+Y-LVnbO40;0cHRI000013T19*a$$C9ZfA1=_du0pVvMQ>MD%PY4ZGsBP8$~I5&FIU --G!0wy!D93009610RR9100038Wo~D3VRmKz0003BWo~D3VRmV5XLA7n0RRCCVRLh3bWe9~WpV)k|Nj9B -VRLh3bWe9~WpV)k|Nj655N2{=V{~b6Zclb)a%OCAcM@)IZbfcqa$$C1Vr*qpZ);_44sLI5MR9duY*t}x -b!BrBZf|Zza$#e1X>V>}Y*cS+Wo`_0ZfkCDcWzW~Yh`W$3So0|Wpqz>Ze?-+009ziZ*E0yXL4b7VPb4$ -RBvl#ZZ=_bbY*RDbRcwZAZ2c6a$$C5Aa8CUVIXvGYh`XAcW7y2XdrNMZ)j;^X>=fEZf9~~c4=;BGyrpR -X*x_=Q!#aTEoW*(Ic```MlDZcWpq_lYga8cax-;PLsK>_VNqyvIaf7iEjUU=H+KOFOlfUtbY)~tW^@3A -`2l7C000000uNzybYWv?ZDnqBRC#b^a{+Ot!RJVdyu3xNGNAv<8C^~)ovQBKu+`*3lDFOYMcDxX26S(0 -Wo~l;{~`yek&tDD!z_VZcAXP49oSr+6K@T=%Z{*D>&)#|0RaIDVRLh3bWe9~WpV`=aP71bY)U$ -XJ~W*00961009PaWo}_@W&Z#G0R(e!Wn%#V0RRCDb#P>1bY)U$XJ~W*009623w3a0VRU6uX=iA300031 -0003Cb#P>1bY)U$XJ~W)001-qb8~4rOj=Vhb$BgjYD771SWreSPh(|tRaI+OEjDs9byGuAHZ5UMXmdGN -HD)b1N<}w!0SZoGZDnLZb8}^M0EGDgW&i*H00066b8uy20oVM#;~wy+U0;_w+8Yauo__nw#aAVFI4rEw -y|f{U0RaF7bY*gFa{*h6$5c2n1xg(vzLX+s=TnOlIwpu5x<(TMczEDkZ1({G000000t9n#Wn%#V0RRPb -WpZtE0RRC2000000000q0CRI`I!szqF?Dz?XKF+_Zdg!8El*=*bX8SrS1mSjGj&r#Q#LJOQD}2HS2boW -I7&q~cL5MmWpHd^V`X7tY-K@nb7gb@g!utx00000009niWpHd^V`XGhb#QQOc>#!wSY=~6@jI2b%^Ho0 -^4h`N6bqMfQQ6em^T$yfj)VXK0St0waBN{?Wm0KpXmkMq0RaF30003Da%FIAVPj=dX=iA30RaF100038 -a%FIAVPj?g009YNb#iV{a&K>D0uo|%a&AL!ZgXj8Zf#|5bX9U}000314svC1Y+++%WK(r;aBO)200962 -402^~Y+++%QfX&sbO8YW{{jkOb8}^MPj_x*asdGU{|s_vaBN{?Wm0KpXmkJo0RR935NU39VQgt+LUnR( -P;zf?W)5j{b9H58O=)v&VRU0?0SaMrb7gc-cWz~J0000q0CRI`I!szqF?Dz?XKF+_Zdg!8El*=*bX8Sr -S1mSjGj&r#Q#LJOQD}2HS2boWI7&q~cL5MiZ*E3)Zf9v?Y-Ln$Yh`W#g!utx0000000IwTbaY{3Xl-R~ -bX0k8Wpe>>rorb(ioCoZe?->7;x>&>|_U&vjjD4#axh{fBik-QrJv$@`YYkgS*{X -000310RRFIVRUq1V`yzb#7~JZ+C7~Z);_40SaMrb7gc-cWz~J009Vea$#K5Ib#!obbaNnOcw=Q{WOE=f6=`mEVQgt+ -L3DIsV`yzK5Ib#!obbaN7JZ*E3%VPkY@Z*F01RBvl# -Za86dbY*RDbRcwZAartJZgXa3av)(KW^!R;bZKvHAa7oOBPG)ofg!utx0000000IwTbaY{3Xl-R~bX0k8 -Wpe>>rorb(ioCoZe?->7;x>&>|_U&vjjD4#axh{fBik-QrJv$@`YYkgS*{X00992 -0RRFIVRUq1V`yz_VNqyvIaf7iEjUU=H+KOIPGN0jWJ7OmbaG*1bO40; -0cHRI0000517UJ>0e1iJJu1QEX=%Xy>vn1>teUKtq)w3djjO=VIO}{ZUjP6HWMy<=X>4-=KPz&##IG7- -47St%2#c>Z5R>jkTb_MKDq#SE$C0RaI30RR925@~K`Y+-b1Z*DZe?-+0RR6IX>Mk0VRUJ4Zb58pZ+BsCV`TsU|Nj645N2{=V{~b6Zclb)a%OCAcNJ-Fc42I3 -WI=RvVPj}*Wo~p-d2nSFX>)URWkq;nWo2Y@L2PVqcVTX0Wejz0Yi@6MZd7k;Wo`iqVRLh3bWe9~WpV%j -0TpR;b9H4!cw=Q{WOG4mY;SjAZewLXd2e+fbaHthbZ;POb8~fNAZ>4QWgua5b7gdMAarP9ZXjW7Y;SjE -WFTUBAarPDAY*TCbaG*1bRcwPa&2=o0CRI`I!szqF?Dz?XKF+_Zdg!8El*=*bX8SrS1mSjGj&r#Q#LJO -QD}2HS2boWI7&q~cL5DTb#iWDVr*qWb8}^M0EGDgW&i*H009YNb#iV{a&K>DF^xPWn((=JC(Q18jXtb+QHlu3zu?H+0@$e$59-Pga82n31W3}Zc=Gy -XmkMq0RaF30003AVs&zEQfX&sbO8YW{{R311Y&h^ZvOxQ31W3}ZcuV>Z)O4#Vs&zELvL<#X=iS2Wo~p; -a%=zq0RRkQb#iWHWK(r;aBO)20096231W3}Zc=GyXmkMp|Nj9AVs&zEQfX&sbN~SV{{R6HX>N95Y-wad -b#iV{a&K>D000015NU39VQgt+LUnR(P;zf?W+`-NWgu{JZ+2;9Wn>_5a&K>DAa7N95Y-waP0CRI`I!szqF?Dz?XKF+_Zdg!8El*=*bX8SrS1mSjGj&r#Q#LJOQD}2HS2boWI7&q~cL54U -X?SI1L349ubO40;0cHRI000000SaMrb7gc-cWz~J0ssL4009610SaMrb7gc-cWz~J0RaF1009nZb8~fN -WKC&vZDDj{XaE2J05kw|b7?wET2nD~cr9mYL^*C)P)03JV`X$zRclu*HgYp{Q$tfWEn!h;b2(QvW-T~M -MK^Z=4@qujY+-a^Vr*qWb8}^M0EGDgW&i*H009tTY;13LWn@WiW^7?}X>V?bj96u3I`KP|x6K-jit^gQ -+!PC!a#7jT+VjUz9FBwn3~6(7b!B8zb#QQOc>#!wSY=~6@jI2b%^Ho0^4h`N6bqMfQQ6em^T$yfj)VaL -32k9`Q+04~YJ0RRC20SRqkcvE$7aBO)2009625@~K`Y+-b1Z*DV>#X>)C1 -bYo}^X>)URWn@ihb8TUCV`u>dX>)URWdHyH5MgX=Z+B&6Np5CrVRUJ4ZUGEwb8~fNWK(r;aBO)200962 -5@~K`Y+-b1Z*DZe?-+0RR6IX>Mk0VRUJ4Zb58pZ+BsCV`TsU|Nj62 -8EI~2Y+-b1Z*E0+V`XJzb3truZ+BsCV`UC$b8~fNWKC&vZDDj{XaNdgb8}^MPj_x*asU7V8EI~2Y+-b1 -Z*E0+V`XJzb3truZ+BsCV`V>iZ*?Gaa(N(hZy;%Nb9H4PZEtdAAYpTJWpr~ObZB92AYp85Z+B&6AYyqS -bZBKDV{dMBa$#e1AarGNZF3Q6Zf0y@bZKvHO=)v&VRU0?TykY_Z*p{HWFT{OZ6I%EAZc@Rb!B8AVRLh3 -baNnKZe$>7Zf0y@bZKvHAYp85Z+BsCV`U&@Z)J0CCv+ffVRU0?AaihKV`*k-Wn>_2VR&h6b!{MXb#QQO -c{BiXb7?wET2nD~cr9mYL^*C)P)03JV`X$zRclu*HgYp{Q$tfWEn!h;b2(QvW-T~MMK^Z=4MuftXK7+= -WkGXuWpn_9`2l7C000000Ssw#b9H58Q+04~Y)C1bYo}%2y}8`ZgXa3asU7T009bNb8}^MPj_x*asdGU{{aeNb8}^MPj_x*asdGU{{R6GZf|ZyadlyA -L2Yk!Zgg`23So0|Wpqz>Ze?-+0SI(*VQzC~WpV-zX>)URWn@ihb8TUCV`yY^b#QQOc_4FeWn*b(X=P*} -VRIm1AZKiEVqt6`aA9&`ZDn+2av)@HWpi#PbRcbEbYo~BbZBKDX>)URWn>_8b#QQOc_3kIY;R*>bY)~9 -bZ;PZXk{Q_b8}^MAa8eWWpZ;5Zf|ZyadlyAL2Yk!Zgg`+bZBKDb9HSXZ)PBKaAj_EAYpTJWpr~OWN&42 -ZYOjgWpQ<3Y#?-RAarPDAaiwXAa7Rb7?wET2nD~cr9mYL^*C)P)03J -V`X$zRclu*HgYp{Q$tfWEn!h;b2(QvW-T~MMK^Z<002S&01EbB)+K@7h0D=SBjVedlDqGVd368bwG2#j -+mD9lQ3zjNCgsHiJR3zsQCr5KWj&xO2a)?R5p8j#`q>uYQ&j)}00000000L700000000iEt{Qo#1aqv% -riM}dFTwu+9@otcHU8F!O3w2qJC#)U<71g -bYb$kB!Cv4eL6_}05B~d-+;N}5sv|)Tc&j_eb0gK2sjSX8ao+<`1M~J|HmdBRUd1sOY#QI#7OY62ZUYgq2{$1_f|(Z*OMux+H)Wo_#t<{Qxj6AK!qv -;}MSmqFbhQEq%{{?+7>)46_|m^u3-)2^*VLeS!lfFCxNhr?F^;Qi5AQin2Nd0j1CTGIbLNeor6CU~-az -M4%p_jBMKVnA!_hHLM3-*BEf^%j{$al(PgiY{guVo`3y4;ZoR4bMl2=SA)CVSp@=R0aiogNR0FM6f^;O -*CpsE^1w^{LCiZR_61McH**~s>*k#ka7f`30f1DQOuZYLozrIk|g)X!BI_ij=PW{<32;hs$B9ZCsU(1!DsC|W1LOd&b_IRG-(&Q$wPGo0j1CT -GIbLNeor6CU~-azM4%p_jBMKVnA!_hHLM3-*D718tWb&n35^vCNG$%?ywDnvz}K{0G9hl&cB^sg-3J`2 -zr)xjz`xPycM6D}`pk=G7OeqFKI{;-SrsrMkU}5;E8nK9=zKTm*o$AsQE~(J)#3QPiZn-Yf(H00eGtZe`d%zThtn<+N=0 -58)p7{qSMOjh9_9t?BNfyg->Vo@@aGb8l^BuyE6l_RDb4RmNAXE51!L2&Jh($Ia%Vd3q&R*o> --d45AI6^+T%{E(CgIa&IsLZ*FBV19W$9G6i&Ka%E*R1ZHn_ax?^HX?A5b19NG3HU)EK -c4cli1!ZYxXmmIPZfS01IR#^3a%FU025fI+VRL9-0byYQVqyVfV*zAj0cB+YW@Z6rX8~wv0cmLgYH9&% -YXNL*0c~voZf*f@Zvk*{0da8wa&iH4a{+X80d;i&c6I@GcL8{K0eN`=dU`)Aa<{~<8ep -?nYaleMc%`0D|O6*W?8OW2z$*=&?u0vV`BWnw}8RoT}CO>V%FwxrCjOXVx@IL#ltp_Vr{><)W@$8mW*% -&FhDhLgP$wKlOrtu`}L^1_A_hd2nU14c`8MAg$P-$_ObTP^+;#QB8K)l1SfF*_j#U`>lTS#F>3Xo9YKQ;Tlg9WGn5m)2^IEVxS -00eGtZe`d%zThtn<+N=058)p7{qSMOjh9_9t?BNfyg->Vo@@aGb8l^B%Kwk9vx)$qPBtM^kB(v2T7{%# -%L)!i!&yFls%&4!N3&BPQ}{o@tvbGlMK&PIWPOItUgYE6R<+4ELO!|82@cX4I~j%e^V!Z000000RR600000007$+g7b@t4MVjY>G@u4Q3HlB(d+LiLJm-R=h;`?dxC37W -b8ul}WgrA)cw=lK261(7bY*iQ1ZZJ%Xd?z>Z)|K~awG?EWpZO>ZgeFHVQp|_a&uvBWF`t>aBp*Ta&K^G -WhV$?a$#d@Wpqp^2x4+!V{2t}QYi>wb97~LX>)5T1aNG1b1Ma7Z*6U1ECp?8Zgq1l17vS>E(LRJVRL9N -1bSt1Z!iOIZe=k8ba!tu1$1a~Wo0u2W^Z+JGz4a8c4ajKb7^=s1#@L~Wo|bGWoc(MgX1!He) -Z*DpXb7gI5LvL(vZaV~QWpi^p1!Zw{VQf7IXL4m>bY*fr2yt~~b98BMZa)HHbU*@MK|umvLP7#xLqh^z -L_`8#MMVN%Mn(c(M@Ir*NJs)-Nl5}OG^S@OiTh_O-%w{PEG<}Pfr40P*4J2QBeY4Qc?n6Q&R$8 -R8#_ARaF9CR#pOES62dGSXcsISy=*KT3QNoaYAxoV{2t}Oj`+JVPk7kY+-X~Tnck>LULhaYh`p&T?J!d -a%FU025fI+VRL9-2x4JlYjkO2YhVFkVF6-d0b^qUWMlzlWdUYp0cU3cXlMaxX#r|#0c&dkY-|B-Z2@j> -0dH>saBu-}aRG920dsQ!baVlAbpdvE0e5!+cz6MMc>#KQ31dQXVPk7$bWD2$aA|O5df_VvG%;Guz -yszPjx|liD+IRo}000000096000000003KeERL~X*GB-yl0o(lkJ>lqHnaUkDzF#MO+`-nfvN=oUS7zO -Pjk(3#3Edlt4DceSnnHhoTCQfV7#O&C5asmTZ_k3I5GuF9U{JzB5UVUixWB~h#a~`69Ra6;9P9?1_A_h -Wq5QL%am^tlg}6qop{{FTg974FaQ3n`}K{nn9PGH_DcZ;ZDnL>Vc>_TG?p`mnXkl(k`ZV+LVYXKJ}#&0 -xTv^*>Pochfn1?USY72b?vbnl1H>1Nsg8a>I`c#0nSFF19TD^= -GS9xEuuG0V@n0eX6ANi>WNCJ3b7^91WdH4q11PWtiZggo) -X>4q11qE$sV{&f>31nqsX-#Qka&HF;V`Xl1X-#Qka&HI(Zeeb32?%6mV`)xdZf^<+V`Xl1X-;8oZwmx) -X=85;2xMhrX;5inZw(1!Wo~q7P-$at4h3dqZFFxB31nqsX+~vjbZ-y}V`Xl1X+~vjbZ-#^VRUqF5?)@& -l23EZa>OEBma9j3W?1hVa-5?E;$Xa_DA7(M}`c+nSQQ?~8eK|KYU^Omy3ihUZaVUMA(m1w0!?L{VGDpk+OvDhHAKF%fNXr25$w;Zs!u -J_LGYa&IsLZ*FBV19W$9G6i&Ka%E*R1ZHn_ax?^HX?A5b19NG3HU)EKc4cli1!ZYxXmmIPZfS01IRaln -K>}YwLIPhyLjqq!L;_z$MFL+&Mgm_)M*?3+NCIC;NdjL=N&;U?O9Ed^Oafm`O#)v|P6A&~PXb?1Py%03 -Q3795QUYI7QvzR9R03aBRRUjDRsvsFR{~#HSOQ;JSpr{LS^;5U0b*hSV`BkiWC3Mm0cK_aXJ-LuXaQ+y -0cvUiYij{)YyoX;0d8&qZ*Ku`Z~<{~0djHyb8`W7bOCjB0d{r)cXt7Jcma8N0eX64sv{KWu}8?Vgx|B8 -o)FQTs@3}HgpNG9gq@LR)-*~8`>9xR8a*>q2D50xZ(4$R31H0PIsUw_;fcDKIn~;D0RR9100000{{R30 -00000WdT-0T)tV&9_|60=K=Fqg4a~00eGtZe`d%zThtn<+N=058)p7{qSMO -jh9_9t?BNfyg->Vo@@aGb8l^BePvFU?UojNJUmGgS3*%Iw!rWRqRntr7jya>ElsKMYW)~OLxhE=)Z*?BAY;AV`@I5NQHT;&p7LREnfuz -ip)Flw(%El5GL~%R*K7_!!LEI$d#tw{C^XqS1c9Fcks}C%(J^vq=Vj&!RS(spiTq~1Q&u+K^%e}Avcd> -00DhvPM7VL7JNKBNfTE>Q75**@Cc&Ka8ws_`Wr1xsw4#g4$>Ms8HM=uUmE|%CLL8DYpYB02F=7s{mYlP -#7GIvfL_JCQxeEQkVIXfYN5c23F83hGCI$$Y9m4lDXjoK1p&l5eV)0q0(o=Ek6qT`tOWJT(?USNzPt(# -xCj&gl+=PFfb@0n?X0$)o@0$)r_0$)u{0$)x}0$)#00$)&20$)*40$);60$)>80$)^A0$){C0$)~E -0$*2G0$*5I0$*8K0$*BM0byYQVqyVfV*zAj0cB+YW@Z6rX8~wv0cmLgYH9&%YXNL*0c~voZf*f@Zvk*{ -0da8wa&iH4a{+X80d;i&c6I@GcL8{K0eN`=dU}YASY=~6@jI2b%^Ho0^4h`N6bqMfQQ6em^T$yfj)VmP -T%k!=UF9_Hk+b8VFt_j2&9|DqsTD5}A2(UF#~}_Mip)Flw(%El5GL~%R*K7_!!LEI$d#tw{C^XqS1c9F -1pM5!a(mkyX=Kz2_&$;GdBbR00eGtZe`d%zThtn<+N=058)p7{qSMOjh9_9 -t?BNfyg->Vo@@aGb8l^B`KdvfR)sH9>^>zJk@b#)dI9k0m>sKp>`gcXJ!_L9qSQY7y3rgf(k=ZkQOfCk -G@u4Q3HlB(d+LiLJm-R=h;`?dxB&nF0000002BZK00000 -0HcCJ^UK%K(4i9Ajp1M~R@C@!4#dQE#lUD;OiKi1Rs{hnTdJ&3iT??W6$?l#{@A?G8j--)v|TbGZq;_H -aqHcs&-*fU69;}zAIV^Hl7d8_9-)kE+Vz;)3s*I)2VU0z1h8<^kM`0GTIJXW70NMG9a>Vm-pkWcojB&* -wsIf|mjwYFuyu|U!T^j90F36+)E=H0H{s0>nH0sEektM3d!W0q4c`8MAg$P-$_ObTP^+;#QB8K -K9=zKTm*o$AsQE~(J)#3QPiZn-Yf@WXkl`5Wpppt@_H915|BP>K9=zKTm*o$AsQE~(J)#3QPiZn-YmR- -1eezR=2|E&(B`3obNI((XWj*%F+LcX5LI -zmLo5#W`0ornJpr`vBkPrPe7nQ#r+2>fnc?xeBUA2t3iEoy@J9k$WaEUx}!s`ym)GDo%67tO|Gy=Bof+ -a{vGU0000006zc#000000K__dp1HFEd2`8+UDn~O1og|)LO{U2yb2Gv2owO6)CB@az9SbZ=!8X@=Yuq$ -20sb<4l#S`iz7Vef}@Ca=a#tjtrsCg%+lRr?B`GL`xImylWKs$pvgYJmvV80iF~}u|BtS-iU6QaHX&1w -j$zkYg`{Q63JyraSw4QMY+uI(0Y58px5Td+V+^*_{|Jk(H4u~TMq8eJM=D_eg5*ipS{pf*v6^k7Glsf5rCoWKZRy -u3j3ckV4Jthm=C&OmaWm;t2@#H=ITLm*{QiV2NfFIf5Z%-zmLo5#W`0ornJpr`vBkPrPe7nQ#r+2 ->fnc?xeBUA*ZjWY9`LALUza=D8w-q{e*4SCS0#5iEUeSLv>}QC1_TClX=7_;a$9#Sj2Bz={du0O&G0&#r1CLJBFZ06hm}WprU_Y;#4o -fF*_j#U`>lTS#F>3Xo9YKQ;Tlg9WGn5m)2^IEV>wa%E#_b7^mGT?51yjj4`)KRWY6<)W@$8mW*%&FhDhLgP$wKlOrtu`}L^+TgISeJ)kNFk^3Xf*%skbRR9100000003QGV000000N{tH -G?p`mnXkl(k`ZV+LVYXKJ}#&0xTv^*>Pochfdm2o1a5C`W!OKy;4cm3v~2hf;U4$>@L|V|mt8Tf>F%Pu -K$$b1YykvwZ*67V9xqZ>e{x^fFs+1!e+{I`x|;BTGZEk9?>;u9IL;>*e1Zg -(dl;zh@Se)i)R+C0ZKmX5VlzrFd~pb0000000000|Nj6000000^h!oTk{Mq*mt#Id5<{IqiqB>((XyRT -gKMj7L7^;V1p!-kERL~X*GB-yl0o(lkJ>lqHnaUkDzF#MO+`-nfvWYb7a>H<(%oY0=TGqa6l5KfYJkC@ -$v(fAa&d%-e7p!qz9SbZ=!8X@=Yuq$20sb<4l#S`iz7Vef}@Ca=a#qt000000000d000000002@9%YWF -Og}YFoW9l|-yK9CRWr2rRnLhh&gT{LWK{$N0ssVVZ*FDSKfd5E4dt|K_z&S8_xmmZEXQ=ZUJv^0dQ~uad821ashL50d#Z$b#(!D -b^&*H0eE-;d3gbPdikkAnO21_Q|vw^7?JgkgL(n*=$IX=eC$m)1U+k$A_W0}Ud6mq639W2L|vh3p}>j> -;{fO~I?t|ZBSH!(tpGjysaSFvJu_4WvuML_T7r2AV9eq<{=Bc@iMp6M)!KLg{~`yek&tDD!z_VZcAXP4 -9oSr+6K@T=%Z{*D>&)#|1_%XdZe(S6WdT-0oEfg=7gN -u)i}m2V`Y*VQFl0MYn(@h5^MUvO8NyVMYp&P~kr{`@Vw(r~naH;^JG;71#M+yX<^`ps5F){hncU$ijom%IzoLb(>^Yz>$s@6fa*%L>wyblbaY{3 -Xl-R~baTv)=eb|?NQ$9$(>OX7sslQ%bEkMULcZCvo*Z;Mne7O2Wpib6c4c#Jbj+U}49ir`|1I+*$<$TB -tm<+yI?cCS&H}f+m!nkx000 - ------END RGB KIT----- diff --git a/src/lib.rs b/src/lib.rs index 8107073..4b9b249 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -24,12 +24,13 @@ #[macro_use] extern crate amplify; #[macro_use] -extern crate strict_types; +extern crate strict_encoding; #[cfg(feature = "serde")] #[macro_use] extern crate serde_crate as serde; mod traits; +pub mod stl; pub mod rgb20; pub mod rgb21; @@ -38,6 +39,7 @@ pub mod rgb25; pub use rgb20::{Rgb20, Rgb20Info, Rgb20Wrapper}; pub use rgb21::{Rgb21, Rgb21Wrapper}; pub use rgb25::{Rgb25, Rgb25Info, Rgb25Wrapper}; +pub use stl::{LIB_ID_RGB_CONTRACT, LIB_NAME_RGB_CONTRACT}; pub use traits::{IssuerWrapper, SchemaIssuer}; pub const LNPBP_IDENTITY: &str = "ssi:LZS1ux-gjD9nXPF-OcetUUkW-6r3uSCS6-aQhs9W5f-8JE7w"; diff --git a/src/main.rs b/src/main.rs index d7c9cbf..3bb14aa 100644 --- a/src/main.rs +++ b/src/main.rs @@ -25,13 +25,14 @@ use std::path::PathBuf; use std::str::FromStr; use std::{fs, io}; +use ifaces::stl::rgb_contract_stl; use ifaces::{rgb20, rgb21, rgb25, Rgb20, Rgb21, LNPBP_IDENTITY}; use rgbstd::containers::{ FileContent, Kit, Supplement, SUPPL_ANNOT_IFACE_CLASS, SUPPL_ANNOT_IFACE_FEATURES, }; use rgbstd::info::IfaceClassName; use rgbstd::interface::IfaceClass; -use rgbstd::stl::{bp_tx_stl, rgb_contract_stl}; +use rgbstd::stl::bp_tx_stl; use strict_types::stl::std_stl; use strict_types::{StlFormat, SystemBuilder}; @@ -71,8 +72,8 @@ fn main() -> io::Result<()> { kit.ifaces.push(iface.clone()).unwrap(); kit.types.extend(types).unwrap(); } - kit.save_file("interfaces/RGBStd.rgb")?; - kit.save_armored("interfaces/RGBStd.rgba")?; + kit.save_file("interfaces/IfaceStd.rgb")?; + kit.save_armored("interfaces/IfaceStd.rgba")?; let mut kit = Kit::default(); for features in rgb20::Rgb20::ENUMERATE { @@ -148,6 +149,28 @@ fn main() -> io::Result<()> { ) .expect("unable to write to the file"); + let contract_stl = rgb_contract_stl(); + contract_stl + .serialize(StlFormat::Binary, Some(&dir), "0.11.0", None) + .expect("unable to write to the file"); + contract_stl + .serialize(StlFormat::Armored, Some(&dir), "0.11.0", None) + .expect("unable to write to the file"); + contract_stl + .serialize( + StlFormat::Source, + Some(&dir), + "0.11.0", + Some( + " + Description: Types for writing RGB contracts and interfaces + Author: Dr Maxim Orlovsky + Copyright (C) 2023-2024 LNP/BP Standards Association. All rights reserved. + License: Apache-2.0", + ), + ) + .expect("unable to write to the file"); + let mut filename = dir.clone(); let mut map = HashMap::new(); @@ -158,7 +181,7 @@ fn main() -> io::Result<()> { .map(|iface| (iface.iface_id(), iface.name.clone())), ); - filename.push("RGBStd.con"); + filename.push("IfaceStd.con"); let mut file = fs::File::create(&filename).unwrap(); for iface in ifaces { writeln!(file, "{}", iface.display(&map, &ifsys)).unwrap(); diff --git a/src/rgb20/iface.rs b/src/rgb20/iface.rs index 7038cb4..01b14db 100644 --- a/src/rgb20/iface.rs +++ b/src/rgb20/iface.rs @@ -20,13 +20,12 @@ // limitations under the License. use rgbstd::interface::{ - AssignIface, GenesisIface, GlobalIface, Iface, Modifier, OwnedIface, Req, TransitionIface, - VerNo, + AssignIface, GenesisIface, GlobalIface, Iface, Modifier, TransitionIface, VerNo, }; use rgbstd::schema::Occurrences; -use rgbstd::stl::StandardTypes; use rgbstd::Identity; +use crate::stl::StandardTypes; use crate::LNPBP_IDENTITY; pub fn rgb20_base() -> Iface { named_asset().expect_extended(fungible(), tn!("RGB20Base")) } @@ -77,7 +76,7 @@ pub fn renameable() -> Iface { metadata: none!(), global_state: none!(), assignments: tiny_bmap! { - fname!("updateRight") => AssignIface::public(OwnedIface::Rights, Req::Required), + fname!("updateRight") => AssignIface::required().rights().public(), }, valencies: none!(), genesis: GenesisIface { @@ -128,7 +127,7 @@ pub fn fungible() -> Iface { fname!("issuedSupply") => GlobalIface::required(types.get("RGBContract.Amount")), }, assignments: tiny_bmap! { - fname!("assetOwner") => AssignIface::private(OwnedIface::Amount, Req::NoneOrMore), + fname!("assetOwner") => AssignIface::none_or_many().typed(types.get("RGBContract.Amount")), }, valencies: none!(), genesis: GenesisIface { @@ -232,6 +231,7 @@ pub fn reservable() -> Iface { */ pub fn fixed() -> Iface { + let types = StandardTypes::new(); Iface { version: VerNo::V1, name: tn!("FixedAsset"), @@ -241,7 +241,7 @@ pub fn fixed() -> Iface { metadata: none!(), global_state: none!(), assignments: tiny_bmap! { - fname!("assetOwner") => AssignIface::private(OwnedIface::Amount, Req::OneOrMore), + fname!("assetOwner") => AssignIface::one_or_many().typed(types.get("RGBContract.Amount")), }, valencies: none!(), genesis: GenesisIface { @@ -271,15 +271,13 @@ pub fn inflatable() -> Iface { developer: Identity::from(LNPBP_IDENTITY), timestamp: 1711405444, name: tn!("InflatableAsset"), - metadata: tiny_bmap! { - fname!("allowedInflation") => types.get("RGBContract.Amount"), - }, + metadata: none!(), global_state: tiny_bmap! { fname!("issuedSupply") => GlobalIface::one_or_many(types.get("RGBContract.Amount")), fname!("maxSupply") => GlobalIface::required(types.get("RGBContract.Amount")), }, assignments: tiny_bmap! { - fname!("inflationAllowance") => AssignIface::public(OwnedIface::Amount, Req::NoneOrMore), + fname!("inflationAllowance") => AssignIface::none_or_many().typed(types.get("RGBContract.Amount")).public(), }, valencies: none!(), genesis: GenesisIface { @@ -301,7 +299,7 @@ pub fn inflatable() -> Iface { fname!("issue") => TransitionIface { modifier: Modifier::Abstract, optional: false, - metadata: tiny_bset![fname!("allowedInflation")], + metadata: none!(), globals: tiny_bmap! { fname!("issuedSupply") => Occurrences::Once, }, @@ -347,7 +345,7 @@ pub fn burnable() -> Iface { fname!("burnedSupply") => GlobalIface::none_or_many(types.get("RGBContract.Amount")), }, assignments: tiny_bmap! { - fname!("burnRight") => AssignIface::public(OwnedIface::Rights, Req::OneOrMore), + fname!("burnRight") => AssignIface::one_or_many().rights().public(), }, valencies: none!(), genesis: GenesisIface { @@ -404,7 +402,7 @@ pub fn replaceable() -> Iface { fname!("replacedSupply") => GlobalIface::none_or_many(types.get("RGBContract.Amount")), }, assignments: tiny_bmap! { - fname!("replaceRight") => AssignIface::public(OwnedIface::Rights, Req::OneOrMore), + fname!("replaceRight") => AssignIface::one_or_many().rights().public(), }, valencies: none!(), genesis: GenesisIface { diff --git a/src/rgb20/info.rs b/src/rgb20/info.rs index 3cfef49..f68cd83 100644 --- a/src/rgb20/info.rs +++ b/src/rgb20/info.rs @@ -23,10 +23,10 @@ use std::fmt::{self, Display, Formatter, Write}; use chrono::{DateTime, Utc}; use rgbstd::info::ContractInfo; -use rgbstd::stl::Attachment; -use rgbstd::{Amount, Precision, XOutpoint, XWitnessId}; +use rgbstd::{XOutpoint, XWitnessId}; use crate::rgb20::Rgb20; +use crate::stl::{Amount, Attachment, Precision}; #[derive(Clone, PartialEq, Eq, Hash, Debug)] #[cfg_attr( diff --git a/src/rgb20/issuer.rs b/src/rgb20/issuer.rs index e916321..2a0503d 100644 --- a/src/rgb20/issuer.rs +++ b/src/rgb20/issuer.rs @@ -22,14 +22,14 @@ use std::str::FromStr; use bp::dbc::Method; +use rand::random; use rgbstd::containers::ValidContract; use rgbstd::interface::{BuilderError, ContractBuilder, IfaceClass, TxOutpoint}; -use rgbstd::invoice::{Amount, Precision}; -use rgbstd::stl::{AssetSpec, Attachment, ContractTerms, RicardianContract}; -use rgbstd::{AltLayer1, AssetTag, BlindingFactor, GenesisSeal, Identity}; +use rgbstd::{AltLayer1, GenesisSeal, Identity}; use strict_encoding::InvalidRString; use super::Rgb20; +use crate::stl::{Amount, AssetSpec, Attachment, ContractTerms, Precision, RicardianContract}; use crate::{IssuerWrapper, SchemaIssuer}; #[derive(Clone, Eq, PartialEq, Hash, Debug, Display, Error)] @@ -69,7 +69,7 @@ impl PrimaryIssue { details: Option<&str>, precision: Precision, ) -> Result { - Self::testnet_int(issuer, by, ticker, name, details, precision, false) + Self::testnet_int(issuer, by, ticker, name, details, precision) } pub fn testnet>( @@ -79,23 +79,7 @@ impl PrimaryIssue { details: Option<&str>, precision: Precision, ) -> Result { - Self::testnet_int(C::issuer(), by, ticker, name, details, precision, false) - } - - pub fn testnet_det>( - by: &str, - ticker: &str, - name: &str, - details: Option<&str>, - precision: Precision, - asset_tag: AssetTag, - ) -> Result { - let mut me = Self::testnet_int(C::issuer(), by, ticker, name, details, precision, true)?; - me.builder = me - .builder - .add_asset_tag("assetOwner", asset_tag) - .expect("invalid RGB20 schema (assetOwner mismatch)"); - Ok(me) + Self::testnet_int(C::issuer(), by, ticker, name, details, precision) } fn testnet_int( @@ -105,7 +89,6 @@ impl PrimaryIssue { name: &str, details: Option<&str>, precision: Precision, - deterministic: bool, ) -> Result { let spec = AssetSpec::with(ticker, name, precision, details)?; let terms = ContractTerms { @@ -114,27 +97,16 @@ impl PrimaryIssue { }; let (schema, main_iface_impl, types, scripts, features) = issuer.into_split(); - let mut builder = match deterministic { - false => ContractBuilder::with( - Identity::from_str(by).expect("invalid issuer identity string"), - features.iface(), - schema, - main_iface_impl, - types, - scripts, - ), - true => ContractBuilder::deterministic( - Identity::from_str(by).expect("invalid issuer identity string"), - features.iface(), - schema, - main_iface_impl, - types, - scripts, - ), - }; - builder = builder - .add_global_state("spec", spec) - .expect("invalid RGB20 schema (token specification mismatch)"); + let builder = ContractBuilder::with( + Identity::from_str(by).expect("invalid issuer identity string"), + features.iface(), + schema, + main_iface_impl, + types, + scripts, + ) + .serialize_global_state("spec", &spec) + .expect("invalid RGB20 schema (token specification mismatch)"); Ok(Self { builder, @@ -163,27 +135,19 @@ impl PrimaryIssue { } pub fn add_inflation_metadata(mut self, amount: Amount) -> Result { - self.builder = self.builder.add_metadata("allowedInflation", amount)?; + self.builder = self + .builder + .serialize_metadata("allowedInflation", &amount)?; Ok(self) } pub fn allocate( - mut self, + self, method: Method, beneficiary: O, amount: impl Into, ) -> Result { - let amount = amount.into(); - let beneficiary = beneficiary.map_to_xchain(|outpoint| { - GenesisSeal::new_random(method, outpoint.txid, outpoint.vout) - }); - self.issued - .checked_add_assign(amount) - .ok_or(IssuerError::AmountOverflow)?; - self.builder = - self.builder - .add_fungible_state("assetOwner", beneficiary, amount.value())?; - Ok(self) + self.allocate_det(method, beneficiary, random(), amount) } pub fn allocate_all( @@ -204,7 +168,6 @@ impl PrimaryIssue { beneficiary: O, seal_blinding: u64, amount: impl Into, - amount_blinding: BlindingFactor, ) -> Result { let amount = amount.into(); let beneficiary = beneficiary.map_to_xchain(|outpoint| { @@ -213,52 +176,37 @@ impl PrimaryIssue { self.issued .checked_add_assign(amount) .ok_or(IssuerError::AmountOverflow)?; - self.builder = self.builder.add_fungible_state_det( - "assetOwner", - beneficiary, - amount, - amount_blinding, - )?; + self.builder = + self.builder + .serialize_owned_state("assetOwner", beneficiary, &amount, None)?; Ok(self) } pub fn allow_inflation( - mut self, + self, method: Method, controller: O, supply: impl Into, ) -> Result { - let supply = supply.into(); - let controller = controller.map_to_xchain(|outpoint| { - GenesisSeal::new_random(method, outpoint.txid, outpoint.vout) - }); - self = self.update_max_supply(supply)?; - self.builder = - self.builder - .add_fungible_state("inflationAllowance", controller, supply.value())?; - Ok(self) + self.allow_inflation_det(method, controller, random(), supply) } /// Add asset allocation in a deterministic way. pub fn allow_inflation_det( mut self, method: Method, - beneficiary: O, + controller: O, seal_blinding: u64, supply: impl Into, - supply_blinding: BlindingFactor, ) -> Result { let supply = supply.into(); - let beneficiary = beneficiary.map_to_xchain(|outpoint| { + let beneficiary = controller.map_to_xchain(|outpoint| { GenesisSeal::with_blinding(method, outpoint.txid, outpoint.vout, seal_blinding) }); self = self.update_max_supply(supply)?; - self.builder = self.builder.add_fungible_state_det( - "inflationAllowance", - beneficiary, - supply, - supply_blinding, - )?; + self.builder = + self.builder + .serialize_owned_state("inflationAllowance", beneficiary, &supply, None)?; Ok(self) } @@ -267,17 +215,7 @@ impl PrimaryIssue { Some(max) => max .checked_add_assign(supply) .ok_or(IssuerError::AmountOverflow)?, - None => { - let tag = self - .builder - .asset_tag("assetOwner") - .expect("asset tag must be already set"); - self.builder = self - .builder - .add_asset_tag("inflationAllowance", tag) - .expect("invalid RGB20 inflation allowance tag (inflation allowance mismatch)"); - self.inflation = Some(supply) - } + None => self.inflation = Some(supply), } Ok(self) } @@ -290,7 +228,7 @@ impl PrimaryIssue { let controller = controller.map_to_xchain(|outpoint| { GenesisSeal::new_random(method, outpoint.txid, outpoint.vout) }); - self.builder = self.builder.add_rights("burnRight", controller)?; + self.builder = self.builder.add_rights("burnRight", controller, None)?; Ok(self) } @@ -303,7 +241,7 @@ impl PrimaryIssue { let controller = controller.map_to_xchain(|outpoint| { GenesisSeal::with_blinding(method, outpoint.txid, outpoint.vout, seal_blinding) }); - self.builder = self.builder.add_rights("burnRight", controller)?; + self.builder = self.builder.add_rights("burnRight", controller, None)?; Ok(self) } @@ -315,7 +253,7 @@ impl PrimaryIssue { let controller = controller.map_to_xchain(|outpoint| { GenesisSeal::new_random(method, outpoint.txid, outpoint.vout) }); - self.builder = self.builder.add_rights("replaceRight", controller)?; + self.builder = self.builder.add_rights("replaceRight", controller, None)?; Ok(self) } @@ -328,17 +266,10 @@ impl PrimaryIssue { let controller = controller.map_to_xchain(|outpoint| { GenesisSeal::with_blinding(method, outpoint.txid, outpoint.vout, seal_blinding) }); - self.builder = self.builder.add_rights("replaceRight", controller)?; + self.builder = self.builder.add_rights("replaceRight", controller, None)?; Ok(self) } - // TODO: implement when bulletproofs are supported - /* - pub fn conceal_allocations(mut self) -> Self { - - } - */ - #[allow(clippy::result_large_err)] pub fn issue_contract(self) -> Result { Ok(self.pre_issue_contract()?.issue_contract()?) @@ -356,13 +287,13 @@ impl PrimaryIssue { .issued .checked_add(inflation) .ok_or(IssuerError::AmountOverflow)?; - self.builder = self.builder.add_global_state("maxSupply", max)?; + self.builder = self.builder.serialize_global_state("maxSupply", &max)?; } Ok(self .builder - .add_global_state("issuedSupply", self.issued)? - .add_global_state("terms", self.terms)?) + .serialize_global_state("issuedSupply", &self.issued)? + .serialize_global_state("terms", &self.terms)?) } - - // TODO: Add secondary issuance and other methods } + +// TODO: Add secondary issuer and other actors diff --git a/src/rgb20/mod.rs b/src/rgb20/mod.rs index 067a5a4..704ac1d 100644 --- a/src/rgb20/mod.rs +++ b/src/rgb20/mod.rs @@ -28,7 +28,6 @@ use amplify::confinement::Confined; use rgbstd::info::FeatureList; use rgbstd::interface::{Iface, IfaceClass, IfaceId}; use rgbstd::persistence::ContractStateRead; -use rgbstd::stl::rgb_contract_stl; use strict_types::TypeLib; use self::iface::{burnable, fixed, inflatable, replaceable, rgb20_base, rgb20_renamable}; @@ -41,6 +40,7 @@ use crate::rgb20::wrapper::{ RGB20_RENAMABLE_INFLATABLE_BURNABLE_IFACE_ID, RGB20_RENAMABLE_INFLATABLE_IFACE_ID, RGB20_REPLACABLE_IFACE_ID, }; +use crate::stl::rgb_contract_stl; pub const LIB_NAME_RGB20: &str = "RGB20"; diff --git a/src/rgb20/wrapper.rs b/src/rgb20/wrapper.rs index 09084f5..4ec0aaf 100644 --- a/src/rgb20/wrapper.rs +++ b/src/rgb20/wrapper.rs @@ -20,57 +20,55 @@ // limitations under the License. use rgbstd::interface::{ - AssignmentsFilter, ContractIface, ContractOp, FungibleAllocation, IfaceClass, IfaceId, - IfaceWrapper, RightsAllocation, + AssignmentsFilter, ContractIface, ContractOp, IfaceClass, IfaceId, IfaceWrapper, Output, }; -use rgbstd::invoice::{Amount, Precision}; use rgbstd::persistence::ContractStateRead; -use rgbstd::stl::{AssetSpec, ContractTerms, Details}; -use rgbstd::{AssetTag, ContractId, SchemaId, WitnessInfo, XWitnessId}; +use rgbstd::{ContractId, SchemaId, WitnessInfo, XWitnessId}; use strict_encoding::InvalidRString; use super::{Inflation, PrimaryIssue, Rgb20, Rgb20Info}; +use crate::stl::{Amount, AssetSpec, ContractTerms, Details, Precision}; use crate::IssuerWrapper; pub const RGB20_FIXED_IFACE_ID: IfaceId = IfaceId::from_array([ - 0xfe, 0x25, 0x27, 0x3b, 0xd6, 0x8e, 0xd7, 0x18, 0x6a, 0x51, 0xde, 0xb5, 0x26, 0x6e, 0x52, 0xe7, - 0xec, 0x0c, 0xde, 0x78, 0x1b, 0xcb, 0x91, 0x95, 0x13, 0x29, 0x50, 0x65, 0x30, 0x0c, 0x60, 0x39, + 0x3a, 0xad, 0xab, 0x95, 0xf5, 0x46, 0x9b, 0xef, 0xab, 0x7a, 0x58, 0xaa, 0xd7, 0x42, 0x71, 0xba, + 0xd1, 0x41, 0x87, 0x32, 0x97, 0x42, 0x6c, 0x6d, 0x7d, 0x8c, 0xe0, 0x4d, 0xdd, 0x6a, 0x55, 0xf4, ]); pub const RGB20_RENAMABLE_IFACE_ID: IfaceId = IfaceId::from_array([ - 0x99, 0xe1, 0xeb, 0xb5, 0x54, 0xd9, 0xeb, 0x10, 0x1d, 0x77, 0x4c, 0x2b, 0x8c, 0x3b, 0x6d, 0x2e, - 0x17, 0x2c, 0xda, 0x7e, 0xf3, 0x9e, 0xc6, 0x41, 0xcd, 0xfc, 0x33, 0x15, 0xc5, 0x3e, 0x8b, 0x6e, + 0xf1, 0x57, 0xbd, 0x9e, 0x48, 0xa7, 0x93, 0xea, 0xcd, 0x5d, 0xa8, 0x38, 0x26, 0x36, 0xfa, 0xea, + 0x1b, 0xf0, 0x1c, 0x4c, 0xad, 0xb0, 0x05, 0x2f, 0x0e, 0xce, 0x5b, 0x5e, 0x36, 0x3d, 0x9f, 0xb8, ]); pub const RGB20_INFLATABLE_IFACE_ID: IfaceId = IfaceId::from_array([ - 0x60, 0xba, 0x66, 0x6e, 0x76, 0x36, 0xc9, 0x99, 0xff, 0x25, 0xd1, 0xa0, 0x86, 0x3c, 0x28, 0x08, - 0xfc, 0xe3, 0xdb, 0x5e, 0x72, 0xd3, 0xf5, 0xee, 0xc0, 0x0f, 0x74, 0xa3, 0xf0, 0x8f, 0xfe, 0x98, + 0xe2, 0xe8, 0x4c, 0x05, 0xc2, 0x65, 0xea, 0x7c, 0x09, 0xef, 0xd9, 0x6c, 0x54, 0xda, 0x35, 0x13, + 0x60, 0x41, 0xd7, 0xda, 0xdd, 0x96, 0xb7, 0x50, 0x1a, 0xdd, 0x57, 0xdc, 0x8a, 0xaa, 0xdd, 0x80, ]); pub const RGB20_INFLATABLE_BURNABLE_IFACE_ID: IfaceId = IfaceId::from_array([ - 0x05, 0x6c, 0xb6, 0x1f, 0x43, 0x5d, 0xca, 0x48, 0x1a, 0x9d, 0xda, 0xe6, 0x47, 0x97, 0xf2, 0x76, - 0x25, 0x3f, 0xee, 0xd1, 0x54, 0xd9, 0x1f, 0xb3, 0xd4, 0x5f, 0x41, 0x31, 0x95, 0xb4, 0xb4, 0xaa, + 0xd4, 0x9a, 0xe5, 0xab, 0x7a, 0x00, 0x50, 0xc4, 0xae, 0xf3, 0x63, 0x5d, 0x15, 0x11, 0x6a, 0xe9, + 0x3a, 0x6a, 0x9d, 0x7d, 0x1a, 0x17, 0x11, 0xf5, 0xec, 0xc3, 0xcd, 0x63, 0x6a, 0xf5, 0x52, 0xab, ]); pub const RGB20_BURNABLE_IFACE_ID: IfaceId = IfaceId::from_array([ - 0xcb, 0x14, 0x11, 0x70, 0xd2, 0x78, 0xc8, 0xc9, 0xc9, 0xd3, 0xf7, 0x20, 0x2e, 0x3c, 0x29, 0x75, - 0x2f, 0x03, 0xb8, 0x98, 0xc5, 0x9e, 0x95, 0x90, 0xe2, 0x2e, 0x42, 0x4e, 0x8d, 0x91, 0xfd, 0x4e, + 0x93, 0xf8, 0x8f, 0xc6, 0xb0, 0xfb, 0xf0, 0xe8, 0x3b, 0x9f, 0x56, 0x76, 0xb9, 0xec, 0xc1, 0x57, + 0xc6, 0x47, 0xf9, 0xd5, 0xe6, 0xde, 0xd4, 0x71, 0x81, 0x58, 0x86, 0xeb, 0x1e, 0x41, 0x56, 0x77, ]); pub const RGB20_RENAMABLE_INFLATABLE_IFACE_ID: IfaceId = IfaceId::from_array([ - 0x1b, 0x37, 0x77, 0x0f, 0x05, 0x72, 0x4e, 0xd1, 0x77, 0x67, 0xa5, 0x61, 0xf7, 0xcd, 0x6a, 0x8d, - 0x45, 0x95, 0xf5, 0x09, 0x9b, 0x4b, 0xf4, 0x81, 0xe5, 0x3c, 0xa0, 0xeb, 0x2e, 0x4f, 0x2c, 0xf7, + 0x51, 0x96, 0xbd, 0xe8, 0xfa, 0xa5, 0xb4, 0x6d, 0x64, 0x59, 0x15, 0x56, 0x07, 0x9c, 0xb2, 0x56, + 0x34, 0x02, 0xbb, 0x92, 0x38, 0x58, 0xa9, 0x3e, 0x3c, 0x6f, 0xd4, 0x64, 0xc9, 0xe6, 0x1e, 0xf9, ]); pub const RGB20_REPLACABLE_IFACE_ID: IfaceId = IfaceId::from_array([ - 0xc3, 0x46, 0x75, 0x65, 0xad, 0xa3, 0x92, 0x5a, 0x5f, 0x5b, 0x24, 0xf8, 0x72, 0x83, 0x81, 0xfb, - 0xaf, 0x74, 0xa9, 0xa9, 0x16, 0xe4, 0x07, 0xe3, 0x98, 0x87, 0x3d, 0x7a, 0x36, 0x5b, 0x29, 0x95, + 0xb6, 0xc1, 0x5b, 0xb4, 0xb7, 0x3b, 0x8a, 0x36, 0xc9, 0xd0, 0x2d, 0xd8, 0x74, 0x8d, 0x9b, 0xeb, + 0x06, 0x9e, 0x5b, 0xea, 0x1f, 0x5f, 0xe0, 0xde, 0x71, 0x8e, 0x60, 0x6c, 0x4b, 0x34, 0x79, 0x6e, ]); pub const RGB20_RENAMABLE_BURNABLE_IFACE_ID: IfaceId = IfaceId::from_array([ - 0x14, 0x57, 0xcf, 0x3d, 0x60, 0xc7, 0xe3, 0xf0, 0x56, 0x06, 0x7e, 0xf7, 0x42, 0x71, 0x3c, 0x59, - 0x59, 0xc7, 0x8f, 0xdf, 0x04, 0xf0, 0x8a, 0x00, 0x21, 0x9b, 0xed, 0xe2, 0x48, 0x97, 0xed, 0x80, + 0xe1, 0xd5, 0xb0, 0xf4, 0x86, 0x29, 0xcb, 0x34, 0x1d, 0x16, 0x08, 0x63, 0xc1, 0x5f, 0xa5, 0x88, + 0xa8, 0xf4, 0x2b, 0x78, 0x61, 0xb7, 0x93, 0x76, 0x22, 0x15, 0x8c, 0xab, 0x55, 0x8a, 0xd8, 0xa5, ]); pub const RGB20_RENAMABLE_INFLATABLE_BURNABLE_IFACE_ID: IfaceId = IfaceId::from_array([ - 0x32, 0x44, 0xae, 0xbe, 0xfc, 0xf6, 0x4a, 0xd1, 0xb3, 0xb9, 0x5f, 0x07, 0x7b, 0x0a, 0xb4, 0x7e, - 0x88, 0x4c, 0x8a, 0x05, 0xa6, 0xfd, 0x43, 0x31, 0x5e, 0xd7, 0x4f, 0x44, 0x29, 0xd9, 0xc9, 0xe7, + 0xbd, 0xcd, 0xde, 0xce, 0xee, 0x78, 0x47, 0x8e, 0x30, 0x00, 0x92, 0x8a, 0x52, 0x7c, 0x73, 0x5f, + 0x6a, 0x32, 0xdc, 0x3e, 0x0d, 0xdc, 0xaa, 0x9d, 0x53, 0xc9, 0xa1, 0x42, 0x9e, 0x5e, 0xbd, 0x00, ]); pub const RGB20_FULL_IFACE_ID: IfaceId = IfaceId::from_array([ - 0xaf, 0xaf, 0xdd, 0x2d, 0xe5, 0x72, 0x1f, 0x41, 0xd0, 0xa5, 0x4c, 0x85, 0xd9, 0x76, 0xd7, 0xd8, - 0x43, 0xf6, 0x26, 0xa6, 0xc7, 0xa7, 0x0b, 0x08, 0x48, 0x3e, 0x1f, 0xc5, 0x41, 0x1a, 0x38, 0xa4, + 0x76, 0x16, 0xd9, 0xef, 0xb2, 0x22, 0x12, 0x35, 0xa7, 0xd2, 0xfa, 0xf8, 0x74, 0x8d, 0x0d, 0x30, + 0xf1, 0xc3, 0x96, 0x99, 0xcd, 0x1d, 0x88, 0x5a, 0xba, 0xba, 0x48, 0x40, 0x31, 0xa6, 0x08, 0x66, ]); #[derive(Clone, Eq, PartialEq, Debug, From)] @@ -127,17 +125,6 @@ impl Rgb20Wrapper { PrimaryIssue::testnet::(issuer, ticker, name, details, precision) } - pub fn testnet_det>( - issuer: &str, - ticker: &str, - name: &str, - details: Option<&str>, - precision: Precision, - asset_tag: AssetTag, - ) -> Result { - PrimaryIssue::testnet_det::(issuer, ticker, name, details, precision, asset_tag) - } - pub fn features(&self) -> Rgb20 { let renaming = self .0 @@ -183,81 +170,76 @@ impl Rgb20Wrapper { } pub fn spec(&self) -> AssetSpec { - let strict_val = &self - .0 - .global("spec") + self.0 + .global_typed::("spec") .expect("RGB20 interface requires global state `spec`") .next() - .expect("RGB20 interface requires global state `spec` to have at least one item"); - AssetSpec::from_strict_val_unchecked(strict_val) + .expect("RGB20 interface requires global state `spec` to have at least one item") } pub fn balance(&self, filter: impl AssignmentsFilter) -> Amount { self.allocations(filter) - .map(|alloc| alloc.state) + .map(|output| output.state) .sum::() } pub fn allocations<'c>( &'c self, filter: impl AssignmentsFilter + 'c, - ) -> impl Iterator + 'c { + ) -> impl Iterator> + 'c { self.0 - .fungible("assetOwner", filter) + .outputs_typed("assetOwner", filter) .expect("RGB20 interface requires `assetOwner` state") } pub fn inflation_allowance_allocations<'c>( &'c self, filter: impl AssignmentsFilter + 'c, - ) -> impl Iterator + 'c { + ) -> impl Iterator> + 'c { self.0 - .fungible("inflationAllowance", filter) + .outputs_typed("inflationAllowance", filter) .expect("RGB20 interface requires `inflationAllowance` state") } pub fn update_right<'c>( &'c self, filter: impl AssignmentsFilter + 'c, - ) -> impl Iterator + 'c { + ) -> impl Iterator> + 'c { self.0 - .rights("updateRight", filter) + .outputs_typed("updateRight", filter) .expect("RGB20 interface requires `updateRight` state") } pub fn burn_epoch<'c>( &'c self, filter: impl AssignmentsFilter + 'c, - ) -> impl Iterator + 'c { + ) -> impl Iterator> + 'c { self.0 - .rights("burnEpoch", filter) + .outputs_typed("burnEpoch", filter) .expect("RGB20 interface requires `burnEpoch` state") } pub fn burn_right<'c>( &'c self, filter: impl AssignmentsFilter + 'c, - ) -> impl Iterator + 'c { + ) -> impl Iterator> + 'c { self.0 - .rights("burnRight", filter) + .outputs_typed("burnRight", filter) .expect("RGB20 interface requires `updateRight` state") } pub fn contract_terms(&self) -> ContractTerms { - let strict_val = &self - .0 - .global("terms") + self.0 + .global_typed::("terms") .expect("RGB20 interface requires global `terms`") .next() - .expect("RGB20 interface requires global state `terms` to have at least one item"); - ContractTerms::from_strict_val_unchecked(strict_val) + .expect("RGB20 interface requires global state `terms` to have at least one item") } pub fn total_issued_supply(&self) -> Amount { self.0 - .global("issuedSupply") + .global_typed::("issuedSupply") .expect("RGB20 interface requires global `issuedSupply`") - .map(|amount| Amount::from_strict_val_unchecked(&amount)) .sum() } @@ -265,31 +247,28 @@ impl Rgb20Wrapper { // default to the non-inflatable asset `issued supply` pub fn max_supply(&self) -> Amount { self.0 - .global("maxSupply") + .global_typed::("maxSupply") .unwrap_or_else(|_| { self.0 - .global("issuedSupply") + .global_typed("issuedSupply") .expect("RGB20 interface requires global `issuedSupply`") }) - .map(|amount| Amount::from_strict_val_unchecked(&amount)) .sum() } pub fn total_burned_supply(&self) -> Amount { self.0 - .global("burnedSupply") + .global_typed::("burnedSupply") .into_iter() .flatten() - .map(|amount| Amount::from_strict_val_unchecked(&amount)) .sum() } pub fn total_replaced_supply(&self) -> Amount { self.0 - .global("replacedSupply") + .global_typed::("replacedSupply") .into_iter() .flatten() - .map(|amount| Amount::from_strict_val_unchecked(&amount)) .sum() } diff --git a/src/rgb21/iface.rs b/src/rgb21/iface.rs index 7327e31..3c3dfef 100644 --- a/src/rgb21/iface.rs +++ b/src/rgb21/iface.rs @@ -20,13 +20,12 @@ // limitations under the License. use rgbstd::interface::{ - AssignIface, GenesisIface, GlobalIface, Iface, IfaceClass, Modifier, OwnedIface, Req, - TransitionIface, VerNo, + AssignIface, GenesisIface, GlobalIface, Iface, IfaceClass, Modifier, TransitionIface, VerNo, }; -use rgbstd::stl::StandardTypes; use rgbstd::{Identity, Occurrences}; use super::Rgb21; +use crate::stl::StandardTypes; use crate::LNPBP_IDENTITY; pub fn nft() -> Iface { @@ -43,7 +42,7 @@ pub fn nft() -> Iface { fname!("attachmentTypes") => GlobalIface::none_or_many(types.get("RGB21.AttachmentType")), }, assignments: tiny_bmap! { - fname!("assetOwner") => AssignIface::private(OwnedIface::Data(types.get("RGBContract.Allocation")), Req::NoneOrMore), + fname!("assetOwner") => AssignIface::none_or_many().typed(types.get("RGBContract.NftAllocation")), }, valencies: none!(), genesis: GenesisIface { @@ -120,7 +119,7 @@ pub fn unique() -> Iface { fname!("attachmentTypes") => GlobalIface::required(types.get("RGB21.AttachmentType")), }, assignments: tiny_bmap! { - fname!("assetOwner") => AssignIface::private(OwnedIface::Data(types.get("RGBContract.Allocation")), Req::OneOrMore), + fname!("assetOwner") => AssignIface::one_or_many().typed(types.get("RGBContract.NftAllocation")), }, valencies: none!(), genesis: GenesisIface { @@ -157,7 +156,7 @@ pub fn limited() -> Iface { fname!("attachmentTypes") => GlobalIface::one_or_many(types.get("RGB21.AttachmentType")), }, assignments: tiny_bmap! { - fname!("assetOwner") => AssignIface::private(OwnedIface::Data(types.get("RGBContract.Allocation")), Req::OneOrMore), + fname!("assetOwner") => AssignIface::one_or_many().typed(types.get("RGBContract.NftAllocation")), }, valencies: none!(), genesis: GenesisIface { @@ -247,7 +246,7 @@ pub fn issuable() -> Iface { metadata: none!(), global_state: none!(), assignments: tiny_bmap! { - fname!("inflationAllowance") => AssignIface::public(OwnedIface::Data(types.get("RGB21.ItemsCount")), Req::OneOrMore), + fname!("inflationAllowance") => AssignIface::one_or_many().typed(types.get("RGB21.ItemsCount")).public(), }, valencies: none!(), genesis: GenesisIface { diff --git a/src/rgb21/mod.rs b/src/rgb21/mod.rs index 409440b..1753945 100644 --- a/src/rgb21/mod.rs +++ b/src/rgb21/mod.rs @@ -31,8 +31,8 @@ use strict_types::TypeLib; use self::iface::{engravable, issuable, limited, nft, unique}; pub use self::types::{ - AttachmentName, AttachmentType, EmbeddedMedia, EngravingData, ItemsCount, TokenData, - LIB_ID_RGB21, LIB_NAME_RGB21, + AttachmentName, AttachmentType, EmbeddedMedia, EngravingData, ItemsCount, NftAllocation, + TokenData, TokenIndex, LIB_ID_RGB21, LIB_NAME_RGB21, }; pub use self::wrapper::{Rgb21Wrapper, RGB21_IFACE_ID, RGB21_UNIQUE_IFACE_ID}; use crate::rgb20::iface::{named_asset, renameable}; diff --git a/src/rgb21/types.rs b/src/rgb21/types.rs index d2afd91..d43090a 100644 --- a/src/rgb21/types.rs +++ b/src/rgb21/types.rs @@ -28,13 +28,13 @@ use std::str::FromStr; use amplify::ascii::AsciiString; use amplify::confinement::{Confined, NonEmptyVec, SmallBlob}; -use rgbstd::stl::{Attachment, Details, MediaType, Name, ProofOfReserves, Ticker}; -use rgbstd::TokenIndex; use strict_encoding::stl::AsciiPrintable; use strict_encoding::{ InvalidRString, StrictDeserialize, StrictEncode, StrictSerialize, TypedWrite, }; -use strict_types::StrictVal; + +use crate::stl::{Attachment, Details, MediaType, Name, ProofOfReserves, Ticker}; +use crate::LIB_NAME_RGB_CONTRACT; pub const LIB_NAME_RGB21: &str = "RGB21"; /// Strict types id for the library providing data types for RGB21 interface. @@ -68,22 +68,8 @@ pub struct EngravingData { pub content: EmbeddedMedia, } -impl EngravingData { - pub fn from_strict_val_unchecked(value: &StrictVal) -> Self { - let index = TokenIndex::from( - value - .unwrap_struct("index") - .unwrap_num() - .unwrap_uint::(), - ); - let content = EmbeddedMedia::from_strict_val_unchecked(value.unwrap_struct("content")); - - Self { - applied_to: index, - content, - } - } -} +impl StrictSerialize for EngravingData {} +impl StrictDeserialize for EngravingData {} #[derive(Clone, Eq, PartialEq, Hash, Debug)] #[derive(StrictType, StrictDumb, StrictEncode, StrictDecode)] @@ -100,17 +86,6 @@ pub struct EmbeddedMedia { pub data: SmallBlob, } -impl EmbeddedMedia { - pub fn from_strict_val_unchecked(value: &StrictVal) -> Self { - let ty = MediaType::from_strict_val_unchecked(value.unwrap_struct("type")); - let data = SmallBlob::from_iter_checked( - value.unwrap_struct("data").unwrap_bytes().iter().copied(), - ); - - Self { ty, data } - } -} - #[derive(Clone, Eq, PartialEq, Hash, Debug)] #[derive(StrictType, StrictDumb, StrictEncode, StrictDecode)] #[strict_type(lib = LIB_NAME_RGB21, dumb = { AttachmentType::with(0, "dumb") })] @@ -210,60 +185,208 @@ pub struct TokenData { impl StrictSerialize for TokenData {} impl StrictDeserialize for TokenData {} -impl TokenData { - pub fn from_strict_val_unchecked(value: &StrictVal) -> Self { - let index = TokenIndex::from( - value - .unwrap_struct("index") - .unwrap_num() - .unwrap_uint::(), - ); - let ticker = value - .unwrap_struct("ticker") - .unwrap_option() - .map(|x| Ticker::from_str(&x.unwrap_string()).expect("invalid uda ticker")); - - let name = value - .unwrap_struct("name") - .unwrap_option() - .map(|x| Name::from_str(&x.unwrap_string()).expect("invalid uda name")); - - let details = value - .unwrap_struct("details") - .unwrap_option() - .map(|x| Details::from_str(&x.unwrap_string()).expect("invalid uda details")); - - let preview = value - .unwrap_struct("preview") - .unwrap_option() - .map(EmbeddedMedia::from_strict_val_unchecked); - let media = value - .unwrap_struct("media") - .unwrap_option() - .map(Attachment::from_strict_val_unchecked); - - let attachments = if let StrictVal::Map(list) = value.unwrap_struct("attachments") { - Confined::from_iter_checked( - list.iter() - .map(|(k, v)| (k.unwrap_uint(), Attachment::from_strict_val_unchecked(v))), - ) - } else { - Confined::default() - }; +#[derive(Clone, PartialEq, Eq, Debug, Display, Error, From)] +#[display(inner)] +pub enum AllocationParseError { + #[display(doc_comments)] + /// invalid token index {0}. + InvalidIndex(String), + + #[display(doc_comments)] + /// invalid fraction {0}. + InvalidFraction(String), + + #[display(doc_comments)] + /// allocation must have format @. + WrongFormat, +} + +#[derive( + Wrapper, WrapperMut, Copy, Clone, Ord, PartialOrd, Eq, PartialEq, Hash, Debug, Default, From +)] +#[wrapper(Display, FromStr, Add, Sub, Mul, Div, Rem)] +#[wrapper_mut(AddAssign, SubAssign, MulAssign, DivAssign, RemAssign)] +#[derive(StrictType, strict_encoding::StrictEncode, StrictDecode)] +#[strict_type(lib = LIB_NAME_RGB_CONTRACT)] +#[cfg_attr( + feature = "serde", + derive(Serialize, Deserialize), + serde(crate = "serde_crate", transparent) +)] +pub struct TokenIndex(u32); + +#[derive( + Wrapper, WrapperMut, Copy, Clone, Ord, PartialOrd, Eq, PartialEq, Hash, Debug, Default, From +)] +#[wrapper(Display, FromStr, Add, Sub, Mul, Div, Rem)] +#[wrapper_mut(AddAssign, SubAssign, MulAssign, DivAssign, RemAssign)] +#[derive(StrictType, strict_encoding::StrictEncode, StrictDecode)] +#[strict_type(lib = LIB_NAME_RGB_CONTRACT)] +#[cfg_attr( + feature = "serde", + derive(Serialize, Deserialize), + serde(crate = "serde_crate", transparent) +)] +pub struct OwnedFraction(u64); + +impl OwnedFraction { + pub const ZERO: Self = OwnedFraction(0); + + pub fn value(self) -> u64 { self.0 } + + pub fn saturating_add(&self, other: impl Into) -> Self { + self.0.saturating_add(other.into().0).into() + } + pub fn saturating_sub(&self, other: impl Into) -> Self { + self.0.saturating_sub(other.into().0).into() + } + + pub fn saturating_add_assign(&mut self, other: impl Into) { + *self = self.0.saturating_add(other.into().0).into(); + } + pub fn saturating_sub_assign(&mut self, other: impl Into) { + *self = self.0.saturating_sub(other.into().0).into(); + } + + #[must_use] + pub fn checked_add(&self, other: impl Into) -> Option { + self.0.checked_add(other.into().0).map(Self) + } + #[must_use] + pub fn checked_sub(&self, other: impl Into) -> Option { + self.0.checked_sub(other.into().0).map(Self) + } + + #[must_use] + pub fn checked_add_assign(&mut self, other: impl Into) -> Option<()> { + *self = self.0.checked_add(other.into().0).map(Self)?; + Some(()) + } + #[must_use] + pub fn checked_sub_assign(&mut self, other: impl Into) -> Option<()> { + *self = self.0.checked_sub(other.into().0).map(Self)?; + Some(()) + } +} + +#[derive(Copy, Clone, Eq, PartialEq, Hash, Debug, Default, Display)] +#[display("{1}@{0}")] +#[derive(StrictType, strict_encoding::StrictEncode, StrictDecode)] +#[strict_type(lib = LIB_NAME_RGB_CONTRACT)] +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize), serde(crate = "serde_crate"))] +pub struct NftAllocation(TokenIndex, OwnedFraction); + +impl NftAllocation { + pub fn with(index: impl Into, fraction: impl Into) -> NftAllocation { + NftAllocation(index.into(), fraction.into()) + } + + pub fn token_index(self) -> TokenIndex { self.0 } + + pub fn fraction(self) -> OwnedFraction { self.1 } +} - let reserves = value - .unwrap_struct("reserves") - .unwrap_option() - .map(ProofOfReserves::from_strict_val_unchecked); - Self { - index, - ticker, - name, - details, - preview, - media, - attachments, - reserves, +impl StrictSerialize for NftAllocation {} +impl StrictDeserialize for NftAllocation {} + +impl FromStr for NftAllocation { + type Err = AllocationParseError; + + fn from_str(s: &str) -> Result { + if !s.contains('@') { + return Err(AllocationParseError::WrongFormat); } + + match s.split_once('@') { + Some((fraction, token_index)) => Ok(NftAllocation( + token_index + .parse() + .map_err(|_| AllocationParseError::InvalidIndex(token_index.to_owned()))?, + fraction + .parse() + .map_err(|_| AllocationParseError::InvalidFraction(fraction.to_lowercase()))?, + )), + None => Err(AllocationParseError::WrongFormat), + } + } +} + +#[cfg(test)] +mod test { + use super::*; + + #[test] + fn owned_fraction_from_str() { + let owned_fraction = match OwnedFraction::from_str("1") { + Ok(value) => value, + Err(_) => OwnedFraction::ZERO, + }; + + assert_eq!(owned_fraction.value(), 1); + assert_eq!(format!("{owned_fraction}"), "1"); + } + + #[test] + fn owned_fraction_add_assign() { + let mut owned_fraction = match OwnedFraction::from_str("1") { + Ok(value) => value, + Err(_) => OwnedFraction::ZERO, + }; + + let _ = owned_fraction.checked_add_assign(OwnedFraction::ZERO); + assert_eq!(owned_fraction.value(), 1); + assert_eq!(format!("{owned_fraction}"), "1"); + } + + #[test] + fn owned_fraction_add() { + let owned_fraction = match OwnedFraction::from_str("1") { + Ok(value) => value, + Err(_) => OwnedFraction::ZERO, + }; + + let owned = match owned_fraction.checked_add(OwnedFraction::ZERO) { + Some(value) => value, + None => OwnedFraction::ZERO, + }; + assert_eq!(owned.value(), 1); + assert_eq!(format!("{owned}"), "1"); + } + + #[test] + fn owned_fraction_sub() { + let owned_fraction = match OwnedFraction::from_str("1") { + Ok(value) => value, + Err(_) => OwnedFraction::ZERO, + }; + + let other_fraction = match OwnedFraction::from_str("1") { + Ok(value) => value, + Err(_) => OwnedFraction::ZERO, + }; + + let owned = match owned_fraction.checked_sub(other_fraction) { + Some(value) => value, + None => OwnedFraction::ZERO, + }; + assert_eq!(owned.value(), 0); + assert_eq!(format!("{owned}"), "0"); + } + + #[test] + fn owned_fraction_sub_assign() { + let mut owned_fraction = match OwnedFraction::from_str("1") { + Ok(value) => value, + Err(_) => OwnedFraction::ZERO, + }; + + let other_fraction = match OwnedFraction::from_str("1") { + Ok(value) => value, + Err(_) => OwnedFraction::ZERO, + }; + + let _ = owned_fraction.checked_sub_assign(other_fraction); + assert_eq!(owned_fraction.value(), 0); + assert_eq!(format!("{owned_fraction}"), "0"); } } diff --git a/src/rgb21/wrapper.rs b/src/rgb21/wrapper.rs index 9cfb14b..43466d5 100644 --- a/src/rgb21/wrapper.rs +++ b/src/rgb21/wrapper.rs @@ -20,37 +20,40 @@ // limitations under the License. use rgbstd::interface::{ - AssignmentsFilter, ContractIface, ContractOp, DataAllocation, IfaceClass, IfaceId, IfaceWrapper, + AssignmentsFilter, ContractIface, ContractOp, IfaceClass, IfaceId, IfaceWrapper, Output, }; use rgbstd::persistence::ContractStateRead; -use rgbstd::stl::{bp_tx_stl, rgb_contract_stl, AssetSpec, ContractTerms}; -use rgbstd::{Allocation, ContractId, SchemaId, WitnessInfo, XWitnessId}; +use rgbstd::stl::bp_tx_stl; +use rgbstd::{ContractId, SchemaId, WitnessInfo, XWitnessId}; use strict_types::stl::std_stl; use strict_types::{CompileError, LibBuilder, TypeLib}; -use super::{AttachmentType, EngravingData, ItemsCount, Rgb21, TokenData, LIB_NAME_RGB21}; +use super::{ + AttachmentType, EngravingData, ItemsCount, NftAllocation, Rgb21, TokenData, LIB_NAME_RGB21, +}; use crate::rgb20::Rgb20Info; +use crate::stl::{rgb_contract_stl, AssetSpec, ContractTerms}; pub const RGB21_UNIQUE_IFACE_ID: IfaceId = IfaceId::from_array([ - 0xcd, 0xa8, 0x94, 0x87, 0x6e, 0xc5, 0xd9, 0xc6, 0x16, 0x7d, 0xc7, 0x45, 0x7c, 0xbe, 0x65, 0x05, - 0xcb, 0x94, 0x7a, 0x73, 0xba, 0xe8, 0x86, 0x19, 0x13, 0x40, 0xfd, 0x19, 0xe5, 0x48, 0xbc, 0x65, + 0x93, 0x29, 0x82, 0x38, 0x62, 0x1a, 0x36, 0x62, 0xaf, 0xc2, 0x99, 0xf5, 0x77, 0xab, 0x6f, 0x01, + 0x97, 0xb8, 0xbe, 0x29, 0x5f, 0x12, 0xf9, 0xe5, 0xba, 0x03, 0xdf, 0xb3, 0x4c, 0x36, 0x3f, 0xf7, ]); pub const RGB21_IFACE_ID: IfaceId = IfaceId::from_array([ - 0x31, 0x36, 0xc2, 0xd3, 0x12, 0x32, 0xb7, 0x89, 0x23, 0x9d, 0x13, 0xba, 0x96, 0xb7, 0x9f, 0x31, - 0x34, 0x03, 0x0f, 0x1b, 0x52, 0x35, 0x23, 0x4e, 0x1d, 0xe9, 0xff, 0x58, 0x47, 0xb2, 0xc9, 0xf7, + 0x22, 0xf1, 0x39, 0x64, 0x48, 0x63, 0x2c, 0xfc, 0xe6, 0xb8, 0xa5, 0x2c, 0xb4, 0x55, 0xeb, 0x39, + 0x81, 0x8c, 0x0e, 0x07, 0xe8, 0x3e, 0x2e, 0x47, 0x48, 0xc7, 0xb2, 0x9c, 0x5c, 0xc4, 0x59, 0xfd, ]); fn _rgb21_stl() -> Result { LibBuilder::new(libname!(LIB_NAME_RGB21), tiny_bset! { std_stl().to_dependency(), bp_tx_stl().to_dependency(), - rgb_contract_stl().to_dependency() + rgb_contract_stl().to_dependency(), }) .transpile::() .transpile::() .transpile::() - .transpile::() + .transpile::() .transpile::() .compile() } @@ -87,48 +90,41 @@ impl IfaceWrapper for Rgb21Wrapper { impl Rgb21Wrapper { pub fn spec(&self) -> AssetSpec { - let strict_val = &self - .0 - .global("spec") + self.0 + .global_typed::("spec") .expect("RGB21 interface requires global `spec`") .next() - .expect("RGB21 interface requires global state `spec` to have at least one item"); - AssetSpec::from_strict_val_unchecked(strict_val) + .expect("RGB21 interface requires global state `spec` to have at least one item") } pub fn contract_terms(&self) -> ContractTerms { - let strict_val = &self - .0 - .global("terms") + self.0 + .global_typed::("terms") .expect("RGB21 interface requires global `terms`") .next() - .expect("RGB21 interface requires global state `terms` to have at least one item"); - ContractTerms::from_strict_val_unchecked(strict_val) + .expect("RGB21 interface requires global state `terms` to have at least one item") } pub fn token_data(&self) -> TokenData { - let strict_val = &self - .0 - .global("tokens") + self.0 + .global_typed::("tokens") .expect("RGB21 interface requires global `tokens`") .next() - .expect("RGB21 interface requires global state `tokens` to have at least one item"); - TokenData::from_strict_val_unchecked(strict_val) + .expect("RGB21 interface requires global state `tokens` to have at least one item") } pub fn engraving_data(&self) -> impl Iterator + '_ { self.0 - .global("engravings") + .global_typed::("engravings") .expect("RGB21 interface requires global state `engravings`") - .map(|strict_val| EngravingData::from_strict_val_unchecked(&strict_val)) } pub fn allocations<'c>( &'c self, filter: impl AssignmentsFilter + 'c, - ) -> impl Iterator + 'c { + ) -> impl Iterator> + 'c { self.0 - .data("assetOwner", filter) + .outputs_typed::("assetOwner", filter) .expect("RGB21 interface requires `assetOwner` state") } diff --git a/src/rgb25/iface.rs b/src/rgb25/iface.rs index 6261e55..c5bf71f 100644 --- a/src/rgb25/iface.rs +++ b/src/rgb25/iface.rs @@ -20,9 +20,9 @@ // limitations under the License. use rgbstd::interface::{GenesisIface, GlobalIface, Iface, Modifier, VerNo}; -use rgbstd::stl::StandardTypes; use rgbstd::{Identity, Occurrences}; +use crate::stl::StandardTypes; use crate::LNPBP_IDENTITY; pub fn named_contract() -> Iface { diff --git a/src/rgb25/info.rs b/src/rgb25/info.rs index b196704..dea7a25 100644 --- a/src/rgb25/info.rs +++ b/src/rgb25/info.rs @@ -22,10 +22,9 @@ use std::fmt::{self, Display, Formatter}; use rgbstd::info::ContractInfo; -use rgbstd::stl::Attachment; -use rgbstd::Precision; use crate::rgb25::Rgb25; +use crate::stl::{Attachment, Precision}; #[derive(Clone, PartialEq, Eq, Hash, Debug)] #[cfg_attr( diff --git a/src/rgb25/issuer.rs b/src/rgb25/issuer.rs index 46a5010..fec74e2 100644 --- a/src/rgb25/issuer.rs +++ b/src/rgb25/issuer.rs @@ -24,14 +24,12 @@ use std::str::FromStr; use bp::dbc::Method; use rgbstd::containers::ValidContract; use rgbstd::interface::{BuilderError, ContractBuilder, IfaceClass, TxOutpoint}; -use rgbstd::invoice::{Amount, Precision}; -use rgbstd::persistence::PersistedState; -use rgbstd::stl::{Attachment, ContractTerms, Details, Name, RicardianContract}; -use rgbstd::{AltLayer1, AssetTag, BlindingFactor, GenesisSeal, Identity}; +use rgbstd::{AltLayer1, GenesisSeal, Identity}; use strict_encoding::InvalidRString; use super::Rgb25; use crate::rgb20::IssuerError; +use crate::stl::{Amount, Attachment, ContractTerms, Details, Name, Precision, RicardianContract}; use crate::{IssuerWrapper, SchemaIssuer}; #[derive(Clone, Debug)] @@ -39,7 +37,6 @@ pub struct Issue { builder: ContractBuilder, issued: Amount, terms: ContractTerms, - deterministic: bool, } impl Issue { @@ -63,16 +60,15 @@ impl Issue { types, scripts, ) - .add_global_state("name", Name::try_from(name.to_owned())?) + .serialize_global_state("name", &Name::try_from(name.to_owned())?) .expect("invalid RGB25 schema (name mismatch)") - .add_global_state("precision", precision) + .serialize_global_state("precision", &precision) .expect("invalid RGB25 schema (precision mismatch)"); Ok(Self { builder, terms, issued: Amount::ZERO, - deterministic: false, }) } @@ -93,21 +89,6 @@ impl Issue { Self::testnet_int(issuer, by, name, precision) } - pub fn testnet_det>( - by: &str, - name: &str, - precision: Precision, - asset_tag: AssetTag, - ) -> Result { - let mut me = Self::testnet_int(C::issuer(), by, name, precision)?; - me.builder = me - .builder - .add_asset_tag("assetOwner", asset_tag) - .expect("invalid RGB25 schema (assetOwner mismatch)"); - me.deterministic = true; - Ok(me) - } - pub fn support_liquid(mut self) -> Self { self.builder = self .builder @@ -119,7 +100,7 @@ impl Issue { pub fn add_details(mut self, details: &str) -> Result { self.builder = self .builder - .add_global_state("details", Details::try_from(details.to_owned())?) + .serialize_global_state("details", &Details::try_from(details.to_owned())?) .expect("invalid RGB25 schema (details mismatch)"); Ok(self) } @@ -140,11 +121,6 @@ impl Issue { beneficiary: O, amount: Amount, ) -> Result { - debug_assert!( - !self.deterministic, - "for creating deterministic contracts please use allocate_det method" - ); - let beneficiary = beneficiary.map_to_xchain(|outpoint| { GenesisSeal::new_random(method, outpoint.txid, outpoint.vout) }); @@ -153,7 +129,7 @@ impl Issue { .ok_or(IssuerError::AmountOverflow)?; self.builder = self.builder - .add_fungible_state("assetOwner", beneficiary, amount.value())?; + .serialize_owned_state("assetOwner", beneficiary, &amount, None)?; Ok(self) } @@ -175,29 +151,16 @@ impl Issue { beneficiary: O, seal_blinding: u64, amount: Amount, - amount_blinding: BlindingFactor, ) -> Result { - debug_assert!( - self.deterministic, - "to add asset allocation in deterministic way the contract builder has to be created \ - using `*_det` constructor" - ); - - let tag = self - .builder - .asset_tag("assetOwner") - .expect("internal library error: asset tag is unassigned"); let beneficiary = beneficiary.map_to_xchain(|outpoint| { GenesisSeal::with_blinding(method, outpoint.txid, outpoint.vout, seal_blinding) }); self.issued .checked_add_assign(amount) .ok_or(IssuerError::AmountOverflow)?; - self.builder = self.builder.add_owned_state_det( - "assetOwner", - beneficiary, - PersistedState::Amount(amount, amount_blinding, tag), - )?; + self.builder = + self.builder + .serialize_owned_state("assetOwner", beneficiary, &amount, None)?; Ok(self) } @@ -221,11 +184,11 @@ impl Issue { #[allow(clippy::result_large_err)] fn pre_issue_contract(self) -> ContractBuilder { self.builder - .add_global_state("issuedSupply", self.issued) + .serialize_global_state("issuedSupply", &self.issued) .expect("invalid RGB25 schema (issued supply mismatch)") - .add_global_state("terms", self.terms) + .serialize_global_state("terms", &self.terms) .expect("invalid RGB25 schema (contract terms mismatch)") } - - // TODO: Add secondary issuance and other methods } + +// TODO: Add secondary issuance and other actors diff --git a/src/rgb25/mod.rs b/src/rgb25/mod.rs index acb60d9..6e8e859 100644 --- a/src/rgb25/mod.rs +++ b/src/rgb25/mod.rs @@ -30,13 +30,13 @@ pub use issuer::Issue; use rgbstd::info::FeatureList; use rgbstd::interface::{Iface, IfaceClass, IfaceId}; use rgbstd::persistence::ContractStateRead; -use rgbstd::stl::rgb_contract_stl; use strict_types::TypeLib; pub use wrapper::{Rgb25Wrapper, RGB25_IFACE_ID}; use crate::rgb20::iface::{burnable, fungible}; use crate::rgb25::iface::named_contract; use crate::rgb25::wrapper::RGB25_BASE_IFACE_ID; +use crate::stl::rgb_contract_stl; #[derive(Copy, Clone, Ord, PartialOrd, Eq, PartialEq, Hash, Debug, Default)] #[cfg_attr( diff --git a/src/rgb25/wrapper.rs b/src/rgb25/wrapper.rs index 2bba10c..3a74c7c 100644 --- a/src/rgb25/wrapper.rs +++ b/src/rgb25/wrapper.rs @@ -20,25 +20,24 @@ // limitations under the License. use rgbstd::interface::{ - AssignmentsFilter, ContractIface, FungibleAllocation, IfaceClass, IfaceId, IfaceWrapper, + AssignmentsFilter, ContractIface, IfaceClass, IfaceId, IfaceWrapper, Output, }; -use rgbstd::invoice::{Amount, Precision}; use rgbstd::persistence::ContractStateRead; -use rgbstd::stl::{ContractTerms, Details, Name}; -use rgbstd::{AssetTag, ContractId, SchemaId, WitnessInfo, XWitnessId}; +use rgbstd::{ContractId, SchemaId, WitnessInfo, XWitnessId}; use strict_encoding::InvalidRString; use super::{Issue, Rgb25, Rgb25Info}; +use crate::stl::{Amount, ContractTerms, Details, Name, Precision}; use crate::IssuerWrapper; pub const RGB25_BASE_IFACE_ID: IfaceId = IfaceId::from_array([ - 0x05, 0xd2, 0xa2, 0x30, 0x7b, 0x9b, 0x45, 0x94, 0xd8, 0xad, 0xb4, 0xb5, 0xdc, 0x6d, 0xf0, 0xb7, - 0xae, 0x2e, 0x21, 0xc8, 0x72, 0x3c, 0xc4, 0x05, 0xd0, 0xa9, 0xa6, 0xb1, 0x88, 0x1e, 0x32, 0x46, + 0xc4, 0x28, 0x29, 0x06, 0xeb, 0x65, 0x20, 0x6d, 0xfd, 0x36, 0x4f, 0x9a, 0xca, 0x79, 0x80, 0x12, + 0x63, 0x9d, 0xe6, 0xf7, 0x3d, 0xf7, 0x95, 0x86, 0xb5, 0x16, 0xc8, 0x7a, 0x3e, 0x7e, 0x16, 0x26, ]); pub const RGB25_IFACE_ID: IfaceId = IfaceId::from_array([ - 0x09, 0x02, 0xdc, 0xc8, 0x58, 0x1c, 0x4c, 0xc0, 0xa1, 0xc5, 0x94, 0x3a, 0xff, 0xc3, 0xb0, 0x77, - 0x31, 0xce, 0xca, 0xda, 0xe6, 0x85, 0x3f, 0x50, 0x0f, 0xcb, 0x4b, 0x78, 0x7c, 0xbc, 0x65, 0x41, + 0x35, 0xd3, 0x3e, 0x07, 0xb1, 0xc6, 0xb9, 0xe6, 0x02, 0x13, 0x45, 0x38, 0x5c, 0x41, 0x2e, 0x91, + 0x1b, 0x43, 0x88, 0x67, 0xb3, 0x41, 0x39, 0xf3, 0x62, 0xb6, 0xae, 0x44, 0xd2, 0x52, 0x0a, 0xd7, ]); #[derive(Clone, Eq, PartialEq, Debug)] @@ -77,76 +76,58 @@ impl Rgb25Wrapper { Issue::testnet::(issuer, name, precision) } - pub fn testnet_det>( - issuer: &str, - name: &str, - precision: Precision, - asset_tag: AssetTag, - ) -> Result { - Issue::testnet_det::(issuer, name, precision, asset_tag) - } - pub fn name(&self) -> Name { - let strict_val = &self - .0 - .global("name") + self.0 + .global_typed::("name") .expect("RGB25 interface requires global `name`") .next() - .expect("RGB25 interface requires global state `name`"); - Name::from_strict_val_unchecked(strict_val) + .expect("RGB25 interface requires global state `name`") } pub fn details(&self) -> Option
{ self.0 - .global("details") + .global_typed::
("details") .expect("RGB25 interface requires global state `details`") .next() - .map(|strict_val| Details::from_strict_val_unchecked(&strict_val)) } pub fn precision(&self) -> Precision { - let strict_val = &self - .0 - .global("precision") + self.0 + .global_typed::("precision") .expect("RGB25 interface requires global state `precision`") .next() - .expect("RGB25 interface requires global state `precision` to have at least one item"); - Precision::from_strict_val_unchecked(strict_val) + .expect("RGB25 interface requires global state `precision` to have at least one item") } pub fn allocations<'c>( &'c self, filter: impl AssignmentsFilter + 'c, - ) -> impl Iterator + 'c { + ) -> impl Iterator> + 'c { self.0 - .fungible("assetOwner", filter) + .outputs_typed("assetOwner", filter) .expect("RGB25 interface requires `assetOwner` state") } pub fn total_issued_supply(&self) -> Amount { self.0 - .global("issuedSupply") + .global_typed::("issuedSupply") .expect("RGB25 interface requires global state `issuedSupply`") - .map(|strict_val| Amount::from_strict_val_unchecked(&strict_val)) .sum() } pub fn total_burned_supply(&self) -> Amount { self.0 - .global("burnedSupply") + .global_typed::("burnedSupply") .into_iter() .flatten() - .map(|strict_val| Amount::from_strict_val_unchecked(&strict_val)) .sum() } pub fn contract_terms(&self) -> ContractTerms { - let strict_val = &self - .0 - .global("terms") + self.0 + .global_typed::("terms") .expect("RGB25 interface requires global state `terms`") .next() - .expect("RGB25 interface requires global state `terms` to have at least one item"); - ContractTerms::from_strict_val_unchecked(strict_val) + .expect("RGB25 interface requires global state `terms` to have at least one item") } } diff --git a/src/stl/asset.rs b/src/stl/asset.rs new file mode 100644 index 0000000..8f919fa --- /dev/null +++ b/src/stl/asset.rs @@ -0,0 +1,239 @@ +// RGB interfaces by LNP/BP Standards Association +// +// SPDX-License-Identifier: Apache-2.0 +// +// Written in 2023-2024 by +// Dr Maxim Orlovsky +// +// Copyright (C) 2023 LNP/BP Standards Association. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +use std::iter::Sum; + +use bp::Sats; +#[cfg(feature = "serde")] +use serde::{Deserialize, Serialize}; +use strict_encoding::{StrictDeserialize, StrictSerialize}; + +use crate::LIB_NAME_RGB_CONTRACT; + +#[derive( + Wrapper, WrapperMut, Copy, Clone, Ord, PartialOrd, Eq, PartialEq, Hash, Debug, Default, From +)] +#[wrapper(Add, Sub, Mul, Div, Rem, Display, FromStr)] +#[wrapper_mut(AddAssign, SubAssign, MulAssign, DivAssign, RemAssign)] +#[derive(StrictType, StrictEncode, StrictDecode)] +#[strict_type(lib = LIB_NAME_RGB_CONTRACT)] +#[cfg_attr( + feature = "serde", + derive(Serialize, Deserialize), + serde(crate = "serde_crate", transparent) +)] +pub struct Amount( + #[from] + #[from(u32)] + #[from(u16)] + #[from(u8)] + #[from(Sats)] + u64, +); + +impl StrictSerialize for Amount {} +impl StrictDeserialize for Amount {} + +impl Amount { + pub const ZERO: Self = Amount(0); + + pub fn with_precision(amount: u64, precision: impl Into) -> Self { + precision.into().unchecked_convert(amount) + } + + pub fn with_precision_checked(amount: u64, precision: impl Into) -> Option { + precision.into().checked_convert(amount) + } + + pub fn value(self) -> u64 { self.0 } + + pub fn split(self, precision: impl Into) -> (u64, u64) { + let precision = precision.into(); + let int = self.floor(precision); + let fract = self.rem(precision); + (int, fract) + } + + pub fn round(&self, precision: impl Into) -> u64 { + let precision = precision.into(); + let mul = precision.multiplier(); + if self.0 == 0 { + return 0; + } + let inc = 2 * self.rem(precision) / mul; + self.0 / mul + inc + } + + pub fn ceil(&self, precision: impl Into) -> u64 { + let precision = precision.into(); + if self.0 == 0 { + return 0; + } + let inc = if self.rem(precision) > 0 { 1 } else { 0 }; + self.0 / precision.multiplier() + inc + } + + pub fn floor(&self, precision: impl Into) -> u64 { + if self.0 == 0 { + return 0; + } + self.0 / precision.into().multiplier() + } + + pub fn rem(&self, precision: impl Into) -> u64 { + self.0 % precision.into().multiplier() + } + + pub fn saturating_add(&self, other: impl Into) -> Self { + self.0.saturating_add(other.into().0).into() + } + pub fn saturating_sub(&self, other: impl Into) -> Self { + self.0.saturating_sub(other.into().0).into() + } + + pub fn saturating_add_assign(&mut self, other: impl Into) { + *self = self.0.saturating_add(other.into().0).into(); + } + pub fn saturating_sub_assign(&mut self, other: impl Into) { + *self = self.0.saturating_sub(other.into().0).into(); + } + + #[must_use] + pub fn checked_add(&self, other: impl Into) -> Option { + self.0.checked_add(other.into().0).map(Self) + } + #[must_use] + pub fn checked_sub(&self, other: impl Into) -> Option { + self.0.checked_sub(other.into().0).map(Self) + } + + #[must_use] + pub fn checked_add_assign(&mut self, other: impl Into) -> Option<()> { + *self = self.0.checked_add(other.into().0).map(Self)?; + Some(()) + } + #[must_use] + pub fn checked_sub_assign(&mut self, other: impl Into) -> Option<()> { + *self = self.0.checked_sub(other.into().0).map(Self)?; + Some(()) + } +} + +impl Sum for Amount { + fn sum>(iter: I) -> Self { + iter.fold(Amount::ZERO, |sum, value| sum.saturating_add(value)) + } +} + +impl Sum for Amount { + fn sum>(iter: I) -> Self { + iter.fold(Amount::ZERO, |sum, value| sum.saturating_add(value)) + } +} + +#[derive(Copy, Clone, Ord, PartialOrd, Eq, PartialEq, Hash, Debug, Default)] +#[repr(u8)] +#[derive(StrictType, StrictEncode, StrictDecode)] +#[strict_type(lib = LIB_NAME_RGB_CONTRACT, tags = repr, into_u8, try_from_u8)] +#[cfg_attr( + feature = "serde", + derive(Serialize, Deserialize), + serde(crate = "serde_crate", rename_all = "camelCase") +)] +pub enum Precision { + Indivisible = 0, + Deci = 1, + Centi = 2, + Milli = 3, + DeciMilli = 4, + CentiMilli = 5, + Micro = 6, + DeciMicro = 7, + #[default] + CentiMicro = 8, + Nano = 9, + DeciNano = 10, + CentiNano = 11, + Pico = 12, + DeciPico = 13, + CentiPico = 14, + Femto = 15, + DeciFemto = 16, + CentiFemto = 17, + Atto = 18, +} + +impl StrictSerialize for Precision {} +impl StrictDeserialize for Precision {} + +impl Precision { + pub const fn decimals(self) -> u8 { self as u8 } + + pub const fn multiplier(self) -> u64 { + match self { + Precision::Indivisible => 1, + Precision::Deci => 10, + Precision::Centi => 100, + Precision::Milli => 1000, + Precision::DeciMilli => 10_000, + Precision::CentiMilli => 100_000, + Precision::Micro => 1_000_000, + Precision::DeciMicro => 10_000_000, + Precision::CentiMicro => 100_000_000, + Precision::Nano => 1_000_000_000, + Precision::DeciNano => 10_000_000_000, + Precision::CentiNano => 100_000_000_000, + Precision::Pico => 1_000_000_000_000, + Precision::DeciPico => 10_000_000_000_000, + Precision::CentiPico => 100_000_000_000_000, + Precision::Femto => 1_000_000_000_000_000, + Precision::DeciFemto => 10_000_000_000_000_000, + Precision::CentiFemto => 100_000_000_000_000_000, + Precision::Atto => 1_000_000_000_000_000_000, + } + } + + pub fn unchecked_convert(self, amount: impl Into) -> Amount { + (amount.into() * self.multiplier()).into() + } + + pub fn checked_convert(self, amount: impl Into) -> Option { + amount + .into() + .checked_mul(self.multiplier()) + .map(Amount::from) + } + pub fn saturating_convert(self, amount: impl Into) -> Amount { + amount.into().saturating_mul(self.multiplier()).into() + } +} + +impl From for u16 { + fn from(value: Precision) -> Self { value as u8 as u16 } +} + +impl From for u32 { + fn from(value: Precision) -> Self { value as u8 as u32 } +} + +impl From for u64 { + fn from(value: Precision) -> Self { value as u8 as u64 } +} diff --git a/src/stl/chain.rs b/src/stl/chain.rs new file mode 100644 index 0000000..29aed06 --- /dev/null +++ b/src/stl/chain.rs @@ -0,0 +1,43 @@ +// RGB standard library for working with smart contracts on Bitcoin & Lightning +// +// SPDX-License-Identifier: Apache-2.0 +// +// Written in 2019-2024 by +// Dr Maxim Orlovsky +// +// Copyright (C) 2019-2024 LNP/BP Standards Association. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +use amplify::confinement::SmallBlob; +use bp::Outpoint; +use strict_encoding::{StrictDeserialize, StrictSerialize}; + +use crate::LIB_NAME_RGB_CONTRACT; + +#[derive(Clone, Ord, PartialOrd, Eq, PartialEq, Hash, Debug, From)] +#[derive(StrictType, StrictDumb, StrictEncode, StrictDecode)] +#[strict_type(lib = LIB_NAME_RGB_CONTRACT, dumb = ProofOfReserves::new(strict_dumb!(), strict_dumb!()))] +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize), serde(crate = "serde_crate"))] +pub struct ProofOfReserves { + pub utxo: Outpoint, + pub proof: SmallBlob, +} +impl StrictSerialize for ProofOfReserves {} +impl StrictDeserialize for ProofOfReserves {} + +impl ProofOfReserves { + pub fn new(utxo: Outpoint, proof: SmallBlob) -> ProofOfReserves { + ProofOfReserves { utxo, proof } + } +} diff --git a/src/stl/mime.rs b/src/stl/mime.rs new file mode 100644 index 0000000..6642181 --- /dev/null +++ b/src/stl/mime.rs @@ -0,0 +1,190 @@ +// RGB standard library for working with smart contracts on Bitcoin & Lightning +// +// SPDX-License-Identifier: Apache-2.0 +// +// Written in 2019-2024 by +// Dr Maxim Orlovsky +// +// Copyright (C) 2019-2024 LNP/BP Standards Association. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#![allow(unused_braces)] + +use std::fmt::{self, Debug}; +use std::str::FromStr; + +use strict_encoding::stl::AlphaSmall; +use strict_encoding::{ + RString, RestrictedCharSet, StrictDeserialize, StrictDumb, StrictEncode, StrictSerialize, +}; + +use super::LIB_NAME_RGB_CONTRACT; + +#[derive(Clone, Ord, PartialOrd, Eq, PartialEq, Debug, Hash)] +#[derive(StrictType, StrictEncode, StrictDecode)] +#[strict_type(lib = LIB_NAME_RGB_CONTRACT)] +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize), serde(crate = "serde_crate"))] +pub struct MediaType { + #[strict_type(rename = "type")] + #[cfg_attr(feature = "serde", serde(rename = "type"))] + pub ty: MediaRegName, + pub subtype: Option, + pub charset: Option, +} +impl StrictDumb for MediaType { + fn strict_dumb() -> Self { MediaType::with("text/plain") } +} +impl StrictSerialize for MediaType {} +impl StrictDeserialize for MediaType {} + +impl MediaType { + /// # Safety + /// + /// Panics is the provided string is an invalid type specifier. + pub fn with(s: &'static str) -> Self { + let (ty, subty) = s.split_once('/').expect("invalid static media type string"); + MediaType { + ty: MediaRegName::from(ty), + subtype: if subty == "*" { None } else { Some(MediaRegName::from(subty)) }, + charset: None, + } + } +} + +impl fmt::Display for MediaType { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + write!( + f, + "{}/{}", + self.ty, + if let Some(subty) = &self.subtype { subty.to_string() } else { s!("*") } + ) + } +} + +#[derive(Wrapper, Clone, Ord, PartialOrd, Eq, PartialEq, Hash, From)] +#[wrapper(Deref, Display, FromStr)] +#[derive(StrictType, StrictDumb, StrictEncode, StrictDecode)] +#[strict_type(lib = LIB_NAME_RGB_CONTRACT, dumb = { MediaRegName::from("dumb") })] +#[cfg_attr( + feature = "serde", + derive(Serialize, Deserialize), + serde(crate = "serde_crate", transparent) +)] +pub struct MediaRegName(RString); + +impl_ident_type!(MediaRegName); +impl_ident_subtype!(MediaRegName); + +#[derive(Copy, Clone, Ord, PartialOrd, Eq, PartialEq, Hash, Debug, Display)] +#[derive(StrictDumb, StrictType, StrictEncode, StrictDecode)] +#[strict_type(lib = LIB_NAME_RGB_CONTRACT, tags = repr, into_u8, try_from_u8)] +#[display(inner)] +#[repr(u8)] +#[allow(non_camel_case_types)] +pub enum MimeChar { + #[display("!")] + Excl = b'!', + #[display("#")] + Hash = b'#', + #[display("$")] + Dollar = b'$', + #[display("&")] + Amp = b'&', + #[display("+")] + Plus = b'+', + #[display("-")] + Dash = b'-', + #[display(".")] + Dot = b'.', + #[display("0")] + Zero = b'0', + #[display("1")] + One = b'1', + #[display("2")] + Two = b'2', + #[display("3")] + Three = b'3', + #[display("4")] + Four = b'4', + #[display("5")] + Five = b'5', + #[display("6")] + Six = b'6', + #[display("7")] + Seven = b'7', + #[display("8")] + Eight = b'8', + #[display("9")] + Nine = b'9', + #[display("^")] + Caret = b'^', + #[display("_")] + Lodash = b'_', + #[strict_type(dumb)] + #[display("a")] + a = b'a', + #[display("b")] + b = b'b', + #[display("c")] + c = b'c', + #[display("d")] + d = b'd', + #[display("e")] + e = b'e', + #[display("f")] + f = b'f', + #[display("g")] + g = b'g', + #[display("h")] + h = b'h', + #[display("i")] + i = b'i', + #[display("j")] + j = b'j', + #[display("k")] + k = b'k', + #[display("l")] + l = b'l', + #[display("m")] + m = b'm', + #[display("n")] + n = b'n', + #[display("o")] + o = b'o', + #[display("p")] + p = b'p', + #[display("q")] + q = b'q', + #[display("r")] + r = b'r', + #[display("s")] + s = b's', + #[display("t")] + t = b't', + #[display("u")] + u = b'u', + #[display("v")] + v = b'v', + #[display("w")] + w = b'w', + #[display("x")] + x = b'x', + #[display("y")] + y = b'y', + #[display("z")] + z = b'z', +} + +impl RestrictedCharSet for MimeChar {} diff --git a/src/stl/mod.rs b/src/stl/mod.rs new file mode 100644 index 0000000..d34f208 --- /dev/null +++ b/src/stl/mod.rs @@ -0,0 +1,38 @@ +// RGB standard library for working with smart contracts on Bitcoin & Lightning +// +// SPDX-License-Identifier: Apache-2.0 +// +// Written in 2019-2024 by +// Dr Maxim Orlovsky +// +// Copyright (C) 2019-2024 LNP/BP Standards Association. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +mod specs; +#[allow(clippy::module_inception)] +mod stl; +mod mime; +mod chain; +mod asset; + +pub use asset::{Amount, Precision}; +pub use chain::ProofOfReserves; +pub use mime::{MediaRegName, MediaType}; +pub use specs::{ + Article, AssetSpec, Attachment, BurnMeta, ContractSpec, ContractTerms, Details, IssueMeta, + Name, RicardianContract, Ticker, +}; +pub use stl::{rgb_contract_stl, StandardTypes, LIB_ID_RGB_CONTRACT}; + +pub const LIB_NAME_RGB_CONTRACT: &str = "RGBContract"; diff --git a/src/stl/specs.rs b/src/stl/specs.rs new file mode 100644 index 0000000..9fe5fac --- /dev/null +++ b/src/stl/specs.rs @@ -0,0 +1,330 @@ +// RGB standard library for working with smart contracts on Bitcoin & Lightning +// +// SPDX-License-Identifier: Apache-2.0 +// +// Written in 2019-2024 by +// Dr Maxim Orlovsky +// +// Copyright (C) 2019-2024 LNP/BP Standards Association. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#![allow(unused_braces)] // caused by rustc unable to understand strict_dumb + +use std::fmt::{self, Debug, Formatter}; +use std::hash::{Hash, Hasher}; +use std::str::FromStr; + +use amplify::confinement::{Confined, NonEmptyString, SmallOrdSet, SmallString, U8}; +use amplify::Bytes32; +use strict_encoding::stl::{Alpha, AlphaNum, AsciiPrintable}; +use strict_encoding::{ + InvalidRString, RString, StrictDeserialize, StrictDumb, StrictEncode, StrictSerialize, + StrictType, +}; + +use super::{MediaType, Precision, ProofOfReserves, LIB_NAME_RGB_CONTRACT}; + +#[derive(Clone, Eq, PartialEq, Hash, Debug, Default)] +#[derive(StrictType, StrictEncode, StrictDecode)] +#[strict_type(lib = LIB_NAME_RGB_CONTRACT)] +#[cfg_attr( + feature = "serde", + derive(Serialize, Deserialize), + serde(crate = "serde_crate", rename_all = "camelCase") +)] +pub struct BurnMeta { + pub burn_proofs: SmallOrdSet, +} +impl StrictSerialize for BurnMeta {} +impl StrictDeserialize for BurnMeta {} + +#[derive(Clone, Eq, PartialEq, Hash, Debug, Default)] +#[derive(StrictType, StrictEncode, StrictDecode)] +#[strict_type(lib = LIB_NAME_RGB_CONTRACT)] +#[cfg_attr( + feature = "serde", + derive(Serialize, Deserialize), + serde(crate = "serde_crate", rename_all = "camelCase") +)] +pub struct IssueMeta { + pub reserves: SmallOrdSet, +} +impl StrictSerialize for IssueMeta {} +impl StrictDeserialize for IssueMeta {} + +#[derive(Wrapper, Clone, Ord, PartialOrd, Eq, PartialEq, Hash, From)] +#[wrapper(Deref, Display, FromStr)] +#[derive(StrictDumb, StrictType, StrictEncode, StrictDecode)] +#[strict_type(lib = LIB_NAME_RGB_CONTRACT, dumb = { Article::from("DUMB") })] +#[cfg_attr( + feature = "serde", + derive(Serialize, Deserialize), + serde(crate = "serde_crate", transparent) +)] +pub struct Article(RString); + +impl_ident_type!(Article); +impl_ident_subtype!(Article); + +#[derive(Wrapper, Clone, Ord, PartialOrd, Eq, From)] +#[wrapper(Deref, Display, FromStr)] +#[derive(StrictDumb, StrictType, StrictEncode, StrictDecode)] +#[strict_type(lib = LIB_NAME_RGB_CONTRACT, dumb = { Ticker::from("DUMB") })] +#[cfg_attr( + feature = "serde", + derive(Serialize, Deserialize), + serde(crate = "serde_crate", transparent) +)] +pub struct Ticker(RString); + +impl PartialEq for Ticker { + fn eq(&self, other: &Self) -> bool { + self.as_str() + .to_uppercase() + .eq(&other.as_str().to_uppercase()) + } +} + +impl Hash for Ticker { + fn hash(&self, state: &mut H) { self.as_str().to_uppercase().hash(state) } +} + +impl_ident_type!(Ticker); +impl_ident_subtype!(Ticker); + +#[derive(Wrapper, Clone, Ord, PartialOrd, Eq, PartialEq, Hash, From)] +#[wrapper(Deref, Display, FromStr)] +#[derive(StrictType, StrictDumb, StrictEncode, StrictDecode)] +#[strict_type(lib = LIB_NAME_RGB_CONTRACT)] +#[cfg_attr( + feature = "serde", + derive(Serialize, Deserialize), + serde(crate = "serde_crate", transparent) +)] +pub struct Name(RString); + +impl StrictSerialize for Name {} +impl StrictDeserialize for Name {} + +impl_ident_type!(Name); +impl_ident_subtype!(Name); + +#[derive(Wrapper, Clone, Ord, PartialOrd, Eq, PartialEq, Hash, From)] +#[wrapper(Deref, Display)] +#[derive(StrictType, StrictEncode, StrictDecode)] +#[strict_type(lib = LIB_NAME_RGB_CONTRACT)] +#[cfg_attr( + feature = "serde", + derive(Serialize, Deserialize), + serde(crate = "serde_crate", transparent) +)] +pub struct Details(NonEmptyString); +impl StrictSerialize for Details {} +impl StrictDeserialize for Details {} + +impl AsRef for Details { + #[inline] + fn as_ref(&self) -> &str { self.0.as_str() } +} + +impl StrictDumb for Details { + fn strict_dumb() -> Self { + Self(Confined::try_from(s!("Dumb long description which is stupid and so on...")).unwrap()) + } +} + +impl FromStr for Details { + type Err = InvalidRString; + + fn from_str(s: &str) -> Result { + let s = Confined::try_from_iter(s.chars())?; + Ok(Self(s)) + } +} + +impl From<&'static str> for Details { + fn from(s: &'static str) -> Self { Self::from_str(s).expect("invalid details") } +} + +impl TryFrom for Details { + type Error = InvalidRString; + + fn try_from(name: String) -> Result { + let s = Confined::try_from(name)?; + Ok(Self(s)) + } +} + +impl Debug for Details { + fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result { + f.debug_tuple("ContractDetails") + .field(&self.as_str()) + .finish() + } +} + +#[derive(Clone, Eq, PartialEq, Hash, Debug)] +#[derive(StrictDumb, StrictType, StrictEncode, StrictDecode)] +#[strict_type(lib = LIB_NAME_RGB_CONTRACT)] +#[cfg_attr( + feature = "serde", + derive(Serialize, Deserialize), + serde(crate = "serde_crate", rename_all = "camelCase") +)] +pub struct AssetSpec { + pub ticker: Ticker, + pub name: Name, + pub details: Option
, + pub precision: Precision, +} +impl StrictSerialize for AssetSpec {} +impl StrictDeserialize for AssetSpec {} + +impl AssetSpec { + pub fn new(ticker: &'static str, name: &'static str, precision: Precision) -> AssetSpec { + AssetSpec { + ticker: Ticker::from(ticker), + name: Name::from(name), + details: None, + precision, + } + } + + pub fn with( + ticker: &str, + name: &str, + precision: Precision, + details: Option<&str>, + ) -> Result { + Ok(AssetSpec { + ticker: Ticker::try_from(ticker.to_owned())?, + name: Name::try_from(name.to_owned())?, + details: details.map(Details::from_str).transpose()?, + precision, + }) + } + + pub fn ticker(&self) -> &str { self.ticker.as_str() } + + pub fn name(&self) -> &str { self.name.as_str() } + + pub fn details(&self) -> Option<&str> { self.details.as_ref().map(|d| d.as_str()) } +} + +#[derive(Clone, Eq, PartialEq, Hash, Debug)] +#[derive(StrictDumb, StrictType, StrictEncode, StrictDecode)] +#[strict_type(lib = LIB_NAME_RGB_CONTRACT)] +#[cfg_attr( + feature = "serde", + derive(Serialize, Deserialize), + serde(crate = "serde_crate", rename_all = "camelCase") +)] +pub struct ContractSpec { + pub article: Option
, + pub name: Name, + pub details: Option
, + pub precision: Precision, +} +impl StrictSerialize for ContractSpec {} +impl StrictDeserialize for ContractSpec {} + +impl ContractSpec { + pub fn new(name: &'static str, precision: Precision) -> ContractSpec { + ContractSpec { + article: None, + name: Name::from(name), + details: None, + precision, + } + } + + pub fn with( + article: &str, + name: &str, + precision: Precision, + details: Option<&str>, + ) -> Result { + Ok(ContractSpec { + article: Some(Article::try_from(article.to_owned())?), + name: Name::try_from(name.to_owned())?, + details: details.map(Details::from_str).transpose()?, + precision, + }) + } + + pub fn article(&self) -> Option<&str> { self.article.as_ref().map(|a| a.as_str()) } + + pub fn name(&self) -> &str { self.name.as_str() } + + pub fn details(&self) -> Option<&str> { self.details.as_ref().map(|d| d.as_str()) } +} + +#[derive(Clone, Eq, PartialEq, Hash, Debug, Display, Default)] +#[display(inner)] +#[derive(StrictType, StrictEncode, StrictDecode)] +#[strict_type(lib = LIB_NAME_RGB_CONTRACT)] +#[cfg_attr( + feature = "serde", + derive(Serialize, Deserialize), + serde(crate = "serde_crate", transparent) +)] +pub struct RicardianContract(SmallString); +impl StrictSerialize for RicardianContract {} +impl StrictDeserialize for RicardianContract {} + +impl AsRef for RicardianContract { + #[inline] + fn as_ref(&self) -> &str { self.0.as_str() } +} + +impl FromStr for RicardianContract { + type Err = InvalidRString; + + fn from_str(s: &str) -> Result { + let s = Confined::try_from_iter(s.chars())?; + Ok(Self(s)) + } +} + +#[derive(Clone, Eq, PartialEq, Ord, PartialOrd, Hash, Debug)] +#[derive(StrictType, StrictDumb, StrictEncode, StrictDecode)] +#[strict_type(lib = LIB_NAME_RGB_CONTRACT)] +#[cfg_attr( + feature = "serde", + derive(Serialize, Deserialize), + serde(crate = "serde_crate", rename_all = "camelCase") +)] +pub struct Attachment { + #[strict_type(rename = "type")] + #[cfg_attr(feature = "serde", serde(rename = "type"))] + pub ty: MediaType, + pub digest: Bytes32, +} +impl StrictSerialize for Attachment {} +impl StrictDeserialize for Attachment {} + +#[derive(Clone, Eq, PartialEq, Hash, Debug)] +#[derive(StrictDumb, StrictType, StrictEncode, StrictDecode)] +#[strict_type(lib = LIB_NAME_RGB_CONTRACT)] +#[cfg_attr( + feature = "serde", + derive(Serialize, Deserialize), + serde(crate = "serde_crate", rename_all = "camelCase") +)] +pub struct ContractTerms { + pub text: RicardianContract, + pub media: Option, +} +impl StrictSerialize for ContractTerms {} +impl StrictDeserialize for ContractTerms {} diff --git a/src/stl/stl.rs b/src/stl/stl.rs new file mode 100644 index 0000000..f178bc6 --- /dev/null +++ b/src/stl/stl.rs @@ -0,0 +1,108 @@ +// RGB standard library for working with smart contracts on Bitcoin & Lightning +// +// SPDX-License-Identifier: Apache-2.0 +// +// Written in 2019-2024 by +// Dr Maxim Orlovsky +// +// Copyright (C) 2019-2024 LNP/BP Standards Association. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +use bp::bc::stl::bp_tx_stl; +use strict_types::stl::std_stl; +use strict_types::typesys::SystemBuilder; +use strict_types::{typesys, CompileError, LibBuilder, SemId, SymbolicSys, TypeLib, TypeSystem}; + +use super::{ + Amount, AssetSpec, BurnMeta, ContractSpec, ContractTerms, IssueMeta, MediaType, + LIB_NAME_RGB_CONTRACT, +}; +use crate::rgb21::NftAllocation; +use crate::stl::ProofOfReserves; + +/// Strict types id for the library providing standard data types which may be +/// used in RGB smart contracts. +pub const LIB_ID_RGB_CONTRACT: &str = + "stl:7GmoWq88-jLLJ!cA-VvIr8On-6LIDMVf-sqL4LmV-R7H$kyY#atlas-iron-figure"; + +fn _rgb_contract_stl() -> Result { + LibBuilder::new(libname!(LIB_NAME_RGB_CONTRACT), tiny_bset! { + std_stl().to_dependency(), + bp_tx_stl().to_dependency() + }) + .transpile::() + .transpile::() + .transpile::() + .transpile::() + .transpile::() + .transpile::() + .transpile::() + .transpile::() + .transpile::() + .compile() +} + +/// Generates strict type library providing standard data types which may be +/// used in RGB smart contracts. +pub fn rgb_contract_stl() -> TypeLib { + _rgb_contract_stl().expect("invalid strict type RGBContract library") +} + +#[derive(Debug)] +pub struct StandardTypes(SymbolicSys); + +impl Default for StandardTypes { + fn default() -> Self { StandardTypes::new() } +} + +impl StandardTypes { + pub fn new() -> Self { + Self::try_with([std_stl(), bp_tx_stl(), rgb_contract_stl()]) + .expect("error in standard RGBContract type system") + } + + pub fn with(lib: TypeLib) -> Self { + Self::try_with([std_stl(), bp_tx_stl(), rgb_contract_stl(), lib]) + .expect("error in standard RGBContract type system") + } + + #[allow(clippy::result_large_err)] + fn try_with(libs: impl IntoIterator) -> Result> { + let mut builder = SystemBuilder::new(); + for lib in libs.into_iter() { + builder = builder.import(lib).map_err(|e| vec![e])?; + } + let sys = builder.finalize()?; + Ok(Self(sys)) + } + + pub fn type_system(&self) -> TypeSystem { self.0.as_types().clone() } + + pub fn get(&self, name: &'static str) -> SemId { + *self.0.resolve(name).unwrap_or_else(|| { + panic!("type '{name}' is absent in standard RGBContract type library") + }) + } +} + +#[cfg(test)] +mod test { + use super::*; + + #[test] + fn contract_lib_id() { + let lib = rgb_contract_stl(); + assert_eq!(lib.id().to_string(), LIB_ID_RGB_CONTRACT); + } +}