diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 80efcaa9..0662fcb8 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -57,7 +57,7 @@ jobs: strategy: fail-fast: false matrix: - toolchain: [ nightly, beta, stable, 1.76.0 ] + toolchain: [ nightly, beta, stable, 1.77.0 ] steps: - uses: actions/checkout@v4 - uses: dtolnay/rust-toolchain@master diff --git a/.rustfmt.toml b/.rustfmt.toml index 9017cd7d..6d14899a 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 1e4aa19b..6faa5cd9 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4,9 +4,9 @@ version = 3 [[package]] name = "aluvm" -version = "0.11.0-beta.8" +version = "0.11.0-beta.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db04c1d697d7f5b86d935bfe06cfd0310fd8a6c491b043118bec228597dcede9" +checksum = "f2a6767842958f458dc7010a2a1005db96dfaceadd366d07532c5045bbc81f24" dependencies = [ "amplify", "ascii-armor", @@ -101,9 +101,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 +135,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" @@ -172,12 +172,28 @@ version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d86b93f97252c47b41663388e6d155714a9d0c398b99f1005cbc5f978b29f445" +[[package]] +name = "bitcoin-io" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "340e09e8399c7bd8912f495af6aa58bea0c9214773417ffaa8f6460f93aaee56" + [[package]] name = "bitcoin-private" version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "73290177011694f38ec25e165d0387ab7ea749a4b81cd4c80dae5988229f7a57" +[[package]] +name = "bitcoin_hashes" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb18c03d0db0247e147a21a6faafd5a7eb851c743db062de72018b6b7e8e4d16" +dependencies = [ + "bitcoin-io", + "hex-conservative", +] + [[package]] name = "bitflags" version = "1.3.2" @@ -214,14 +230,14 @@ dependencies = [ [[package]] name = "bp-consensus" -version = "0.11.0-beta.8" +version = "0.11.0-beta.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae3a99a46063d23d20a3177a04923652b245f31c2a04a6d0c47d5a93dc201a80" +checksum = "54db63118d55e32ea78f8775e98871d442a33e3bdef6419c7964d71b308316c0" dependencies = [ "amplify", "chrono", "commit_verify", - "secp256k1", + "secp256k1 0.30.0", "serde", "strict_encoding", "strict_types", @@ -229,9 +245,9 @@ dependencies = [ [[package]] name = "bp-core" -version = "0.11.0-beta.8" +version = "0.11.0-beta.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60b8caf04291e2703ce267b1f8baf14f03879a6d1a5afe76e011ada489f172f9" +checksum = "2e51a329150531b12243adf51d978490c796a6a20ec76c506b41c8e1226022bc" dependencies = [ "amplify", "bp-consensus", @@ -248,24 +264,24 @@ dependencies = [ [[package]] name = "bp-dbc" -version = "0.11.0-beta.8" +version = "0.11.0-beta.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11fc4081db2147411381b9650765ce683e5065559f1125508696f79cc4cbfedf" +checksum = "9286fb448160672148262317f4647ebdcdd4699ed2bd34401f9799d0920cc376" dependencies = [ "amplify", "base85", "bp-consensus", "commit_verify", - "secp256k1", + "secp256k1 0.30.0", "serde", "strict_encoding", ] [[package]] name = "bp-invoice" -version = "0.11.0-beta.8" +version = "0.11.0-beta.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f29c4f672b4b82ce7a218b2900254ac8e4b15b0022ed13abffa722571e73d375" +checksum = "2cfe7be7b2d740de57e895f2ac93b305bbd67a2a0914dac424f8569bb9981679" dependencies = [ "amplify", "bech32", @@ -275,9 +291,9 @@ dependencies = [ [[package]] name = "bp-seals" -version = "0.11.0-beta.8" +version = "0.11.0-beta.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d607238c2bf2c34d048d14cd798a6365306e0fb6b02211235f3ccad0bc7fa8f1" +checksum = "9873cfe420f4ce5cc539c394c75df0669cdbe2c23eed1930dffe024cb0f13a57" dependencies = [ "amplify", "baid64", @@ -304,9 +320,9 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "cc" -version = "1.1.16" +version = "1.1.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e9d013ecb737093c0e86b151a7b837993cf9ec6c502946cfb44bedc392421e0b" +checksum = "c2e7962b54006dcfcc61cb72735f4d89bb97061dd6a7ed882ec6b8ee53714c6f" dependencies = [ "shlex", ] @@ -347,9 +363,9 @@ dependencies = [ [[package]] name = "commit_verify" -version = "0.11.0-beta.8" +version = "0.11.0-beta.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82a1982dc6c54d2dcfa2bf4398d97e4e80a93f24d2537e58d6110b2b272cff0c" +checksum = "3bf08c4941e147937551f6a3d370552d67f98cf72c9eb18948142596beadd31e" dependencies = [ "amplify", "commit_encoding_derive", @@ -386,9 +402,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", ] @@ -427,9 +443,9 @@ checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" [[package]] name = "fast32" -version = "1.0.2" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "27ea9bdb2356e5a92403cf23ac493f9b43bd71e4ffd0f800862b841dd723994c" +checksum = "a35a73237400bde66c82e38387343f90d7182a2f2f22729e096a2abd57d75db9" [[package]] name = "fluent-uri" @@ -475,9 +491,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" @@ -485,11 +501,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", @@ -510,12 +535,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]] @@ -526,18 +552,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.161" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8adc4bb1803a324070e64a98ae98f38934d91957a99cfb3a43dcbc01bc56439" +checksum = "8e9489c2807c139ffd9c1794f4af0ebe86a828db53ecdc7fea2111d0fed085d1" [[package]] name = "log" @@ -559,9 +585,9 @@ checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" [[package]] name = "minicov" -version = "0.3.5" +version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c71e683cd655513b99affab7d317deb690528255a0d5f717f1024093c12b169" +checksum = "def6d99771d7c499c26ad4d40eb6645eafd3a1553b35fc26ea5a489a45e82d9a" dependencies = [ "cc", "walkdir", @@ -575,9 +601,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", ] @@ -593,9 +619,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" @@ -620,9 +646,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.86" +version = "1.0.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77" +checksum = "f139b0662de085916d1fb67d2b4169d1addddda1919e696f3252b740b629986e" dependencies = [ "unicode-ident", ] @@ -668,9 +694,9 @@ dependencies = [ [[package]] name = "rgb-core" -version = "0.11.0-beta.8" +version = "0.11.0-beta.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43dc70212f5eff8189f3cdfef2d11f53f7be4c4128db9839b5d56a0f9ef60c98" +checksum = "1cf48c4e395882c5228cd788a78e04674c94f7c177d82afdd87def8619f5dff8" dependencies = [ "aluvm", "amplify", @@ -690,7 +716,7 @@ dependencies = [ [[package]] name = "rgb-invoice" -version = "0.11.0-beta.8" +version = "0.11.0-beta.9" dependencies = [ "amplify", "baid64", @@ -709,7 +735,7 @@ dependencies = [ [[package]] name = "rgb-std" -version = "0.11.0-beta.8" +version = "0.11.0-beta.9" dependencies = [ "aluvm", "amplify", @@ -734,7 +760,7 @@ dependencies = [ [[package]] name = "rgb-stl" -version = "0.11.0-beta.8" +version = "0.11.0-beta.9" dependencies = [ "amplify", "commit_verify", @@ -774,10 +800,22 @@ checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294" [[package]] name = "secp256k1" -version = "0.29.0" +version = "0.29.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9465315bc9d4566e1724f0fffcbcc446268cb522e60f9a27bcded6b19c108113" +dependencies = [ + "rand", + "secp256k1-sys", + "serde", +] + +[[package]] +name = "secp256k1" +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", @@ -785,9 +823,9 @@ 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", ] @@ -800,16 +838,16 @@ checksum = "52a44aed3002b5ae975f8624c5df3a949cfbf00479e18778b6058fcd213b76e3" dependencies = [ "bitcoin-private", "rand", - "secp256k1", + "secp256k1 0.29.1", "secp256k1-zkp-sys", "serde", ] [[package]] name = "secp256k1-zkp-sys" -version = "0.10.0" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c6eea7919e0cab992510edfbf40bd9342c0a3c2bb910f2c51355c2cb2d69839" +checksum = "57f08b2d0b143a22e07f798ae4f0ab20d5590d7c68e0d090f2088a48a21d1654" dependencies = [ "cc", "secp256k1-sys", @@ -817,29 +855,29 @@ dependencies = [ [[package]] name = "serde" -version = "1.0.209" +version = "1.0.214" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99fce0ffe7310761ca6bf9faf5115afbc19688edd00171d81b1bb1b116c63e09" +checksum = "f55c3193aca71c12ad7890f1785d2b73e1b9f63a0bbc353c08ef26fe03fc56b5" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.209" +version = "1.0.214" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5831b979fd7b5439637af1752d535ff49f4860c0f341d1baeb6faf0f4242170" +checksum = "de523f781f095e28fa605cdce0f8307e451cc0fd14e2eb4cd2e98a355b147766" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.85", ] [[package]] name = "serde_json" -version = "1.0.128" +version = "1.0.132" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ff5456707a1de34e7e37f2a6fd3d3f808c318259cbd01ab6377795054b483d8" +checksum = "d726bfaff4b320266d395898905d0eba0345aae23b54aee3a737e260fd46db03" dependencies = [ "itoa", "memchr", @@ -849,9 +887,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", ] @@ -898,9 +936,9 @@ checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" [[package]] name = "single_use_seals" -version = "0.11.0-beta.8" +version = "0.11.0-beta.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1a4c51f21507cf63984c367507f281215073e85b08711ed7da4fc63dbd709e0" +checksum = "ec071f3b3153217f1cb2bca5ba7ac87eeafc446cb35a5c0643dec33495a37244" dependencies = [ "amplify_derive", ] @@ -933,9 +971,9 @@ dependencies = [ [[package]] name = "strict_types" -version = "2.7.0" +version = "2.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f16e8855a575633815f01482ac927ebaca3d2485aec8e17226c6826de29154e" +checksum = "8bae7475fc901144d8a35d25e36d76aa020b840f233d60532d6d52318718781b" dependencies = [ "amplify", "ascii-armor", @@ -975,9 +1013,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.77" +version = "2.0.85" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f35bcdf61fd8e7be6caf75f429fdca8beb3ed76584befb503b1569faee373ed" +checksum = "5023162dfcd14ef8f32034d8bcd4cc5ddc61ef7a247c024a33e24e1f24d21b56" dependencies = [ "proc-macro2", "quote", @@ -986,22 +1024,22 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.63" +version = "1.0.65" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0342370b38b6a11b6cc11d6a805569958d54cfa061a29969c3b5ce2ea405724" +checksum = "5d11abd9594d9b38965ef50805c5e469ca9cc6f197f883f717e0269a3057b3d5" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.63" +version = "1.0.65" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4558b58466b9ad7ca0f102865eccc95938dca1a74a856f2b57b6629050da261" +checksum = "ae71770322cbd277e69d762a16c444af02aa0575ac0d174f0b9562d3b37f8602" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.85", ] [[package]] @@ -1027,9 +1065,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", @@ -1046,9 +1084,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" @@ -1090,9 +1128,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", @@ -1101,24 +1139,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.85", "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", @@ -1128,9 +1166,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", @@ -1138,28 +1176,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.85", "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", @@ -1172,20 +1210,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.85", ] [[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", @@ -1284,9 +1322,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", ] @@ -1309,5 +1347,5 @@ checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.85", ] diff --git a/Cargo.toml b/Cargo.toml index b4715406..36f65cf0 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -11,13 +11,13 @@ default-members = [ resolver = "2" [workspace.package] -version = "0.11.0-beta.8" +version = "0.11.0-beta.9" authors = ["Dr Maxim Orlovsky "] homepage = "https://github.com/RGB-WG" repository = "https://github.com/RGB-WG/rgb-std" keywords = ["bitcoin", "lightning", "rgb", "smart-contracts", "lnp-bp"] categories = ["cryptography::cryptocurrencies"] -rust-version = "1.76.0" # Due to use of `inspect_err` +rust-version = "1.77.0" # Due to use of `rustfix` edition = "2021" license = "Apache-2.0" @@ -27,11 +27,11 @@ nonasync = "0.1.0" ascii-armor = "0.7.2" baid64 = "0.2.2" strict_encoding = "2.7.0" -strict_types = "2.7.0" -commit_verify = { version = "0.11.0-beta.8", features = ["stl"] } -bp-core = { version = "0.11.0-beta.8", features = ["stl"] } -bp-invoice = { version = "0.11.0-beta.8" } -rgb-core = { version = "0.11.0-beta.8", features = ["stl"] } +strict_types = "2.7.2" +commit_verify = { version = "0.11.0-beta.9", features = ["stl"] } +bp-core = { version = "0.11.0-beta.9", features = ["stl"] } +bp-invoice = { version = "0.11.0-beta.9" } +rgb-core = { version = "0.11.0-beta.9", features = ["stl"] } indexmap = "2.4.0" serde_crate = { package = "serde", version = "1", features = ["derive"] } @@ -63,8 +63,8 @@ strict_types = { workspace = true } commit_verify = { workspace = true } bp-core = { workspace = true } rgb-core = { workspace = true } -rgb-invoice = { version = "0.11.0-beta.6", path = "invoice" } -aluvm = "0.11.0-beta.7" +rgb-invoice = { version = "0.11.0-beta.9", path = "invoice" } +aluvm = "0.11.0-beta.9" base85 = "=2.0.0" chrono = "0.4.38" indexmap = { workspace = true } diff --git a/MANIFEST.yml b/MANIFEST.yml index c5f31a0d..6e84d0f4 100644 --- a/MANIFEST.yml +++ b/MANIFEST.yml @@ -3,7 +3,7 @@ Type: Library Kind: Free software License: Apache-2.0 Language: Rust -Compiler: 1.76 +Compiler: 1.77 Author: Maxim Orlovsky Maintained: LNP/BP Standards Association, Switzerland Maintainers: diff --git a/invoice/Cargo.toml b/invoice/Cargo.toml index b0cfb329..05673093 100644 --- a/invoice/Cargo.toml +++ b/invoice/Cargo.toml @@ -18,7 +18,7 @@ name = "rgbinvoice" [dependencies] amplify = { workspace = true } baid64 = { workspace = true } -fast32 = "1.0.2" +fast32 = "1.0.3" strict_encoding = { workspace = true } strict_types = { workspace = true } bp-core = { workspace = true } diff --git a/src/containers/anchors.rs b/src/containers/anchors.rs index d9beb866..2c7c1671 100644 --- a/src/containers/anchors.rs +++ b/src/containers/anchors.rs @@ -20,18 +20,36 @@ // limitations under the License. use std::cmp::Ordering; +use std::vec; use amplify::ByteArray; use bp::dbc::opret::OpretProof; use bp::dbc::tapret::TapretProof; use bp::dbc::{anchor, Anchor}; -use bp::{Tx, Txid}; +use bp::{dbc, Tx, Txid}; use commit_verify::mpc; -use rgb::validation::DbcProof; -use rgb::{BundleId, DiscloseHash, TransitionBundle, XChain, XWitnessId}; +use rgb::validation::{DbcProof, EAnchor}; +use rgb::{ + BundleId, DiscloseHash, OpId, Operation, Transition, TransitionBundle, XChain, XGraphSeal, + XWitnessId, +}; use strict_encoding::StrictDumb; -use crate::{MergeReveal, MergeRevealError, LIB_NAME_RGB_STD}; +use crate::containers::Dichotomy; +use crate::{MergeReveal, MergeRevealError, TypedAssignsExt, LIB_NAME_RGB_STD}; + +#[derive(Clone, Eq, PartialEq, Debug, Display, Error)] +#[display("state transition {0} is not a part of the bundle.")] +pub struct UnrelatedTransition(OpId, Transition); + +#[derive(Copy, Clone, Eq, PartialEq, Debug, Display, Error)] +#[display(doc_comments)] +pub enum AnchoredBundleMismatch { + /// witness bundle for witness id {0} already has both opret and tapret information. + AlreadyDouble(XWitnessId), + /// the combined anchored bundles for witness id {0} are of the same type. + SameBundleType(XWitnessId), +} #[derive(Clone, Eq, PartialEq, Debug)] #[derive(StrictType, StrictDumb, StrictEncode, StrictDecode)] @@ -159,36 +177,255 @@ impl PubWitness { )] #[derive(CommitEncode)] #[commit_encode(strategy = strict, id = DiscloseHash)] -pub struct WitnessBundle { +pub struct WitnessBundle { pub pub_witness: XPubWitness, - pub anchor: Anchor, - pub bundle: TransitionBundle, + pub anchored_bundles: AnchoredBundles, } -impl PartialEq for WitnessBundle

{ +impl PartialEq for WitnessBundle { fn eq(&self, other: &Self) -> bool { self.pub_witness == other.pub_witness } } -impl Ord for WitnessBundle

{ +impl Ord for WitnessBundle { fn cmp(&self, other: &Self) -> Ordering { self.pub_witness.cmp(&other.pub_witness) } } -impl PartialOrd for WitnessBundle

{ +impl PartialOrd for WitnessBundle { fn partial_cmp(&self, other: &Self) -> Option { Some(self.cmp(other)) } } -impl WitnessBundle { +impl WitnessBundle { + #[inline] + pub fn with(pub_witness: XPubWitness, anchored_bundle: ClientBundle) -> Self { + Self { + pub_witness, + anchored_bundles: AnchoredBundles::from(anchored_bundle), + } + } + + pub fn into_double(mut self, other: ClientBundle) -> Result { + match (self.anchored_bundles, other.dbc_proof) { + (AnchoredBundles::Double { .. }, _) => { + return Err(AnchoredBundleMismatch::AlreadyDouble( + self.pub_witness.to_witness_id(), + )); + } + (AnchoredBundles::Opret(opret), DbcProof::Tapret(tapret)) => { + self.anchored_bundles = AnchoredBundles::Double { + tapret: ClientBundle::new(other.mpc_proof, tapret, other.bundle), + opret, + } + } + (AnchoredBundles::Tapret(tapret), DbcProof::Opret(opret)) => { + self.anchored_bundles = AnchoredBundles::Double { + opret: ClientBundle::new(other.mpc_proof, opret, other.bundle), + tapret, + } + } + _ => { + return Err(AnchoredBundleMismatch::SameBundleType( + self.pub_witness.to_witness_id(), + )); + } + } + Ok(self) + } + pub fn witness_id(&self) -> XWitnessId { self.pub_witness.to_witness_id() } + + pub fn reveal_seal(&mut self, bundle_id: BundleId, seal: XGraphSeal) -> bool { + let bundle = match &mut self.anchored_bundles { + AnchoredBundles::Tapret(tapret) | AnchoredBundles::Double { tapret, .. } + if tapret.bundle.bundle_id() == bundle_id => + { + Some(&mut tapret.bundle) + } + AnchoredBundles::Opret(opret) | AnchoredBundles::Double { opret, .. } + if opret.bundle.bundle_id() == bundle_id => + { + Some(&mut opret.bundle) + } + _ => None, + }; + let Some(bundle) = bundle else { + return false; + }; + bundle + .known_transitions + .values_mut() + .flat_map(|t| t.assignments.values_mut()) + .for_each(|a| a.reveal_seal(seal)); + + true + } + + pub fn anchored_bundles(&self) -> impl Iterator { + self.anchored_bundles.iter() + } + + #[inline] + pub fn known_transitions(&self) -> impl Iterator { + self.anchored_bundles + .bundles() + .flat_map(|bundle| bundle.known_transitions.values()) + } } -impl WitnessBundle { - pub fn merge_reveal(mut self, other: Self) -> Result { - self.pub_witness = self.pub_witness.merge_reveal(other.pub_witness)?; - if self.anchor != other.anchor { - return Err(MergeRevealError::AnchorsNonEqual(self.bundle.bundle_id())); +/// Keeps client-side data - a combination of client-side witness (anchor) and state (transition +/// bundle). Ensures that transition bundle uses the same DBC close method as used by the +/// client-side witness (anchor). +#[derive(Clone, PartialEq, Eq, Debug)] +#[derive(StrictType, StrictDumb, StrictEncode, StrictDecode)] +#[strict_type(lib = LIB_NAME_RGB_STD)] +#[cfg_attr( + feature = "serde", + derive(Serialize, Deserialize), + serde(crate = "serde_crate", rename_all = "camelCase") +)] +pub struct ClientBundle { + mpc_proof: mpc::MerkleProof, + dbc_proof: D, + bundle: TransitionBundle, +} + +impl ClientBundle { + /// # Panics + /// + /// Panics if DBC proof and bundle have different closing methods + pub fn new(mpc_proof: mpc::MerkleProof, dbc_proof: D, bundle: TransitionBundle) -> Self { + assert_eq!(dbc_proof.method(), bundle.close_method); + Self { + mpc_proof, + dbc_proof, + bundle, } - self.bundle = self.bundle.merge_reveal(other.bundle)?; - Ok(self) + } + + #[inline] + pub fn bundle_id(&self) -> BundleId { self.bundle.bundle_id() } + + pub fn reveal_transition( + &mut self, + transition: Transition, + ) -> Result { + let opid = transition.id(); + if self.bundle.input_map.values().all(|id| *id != opid) { + return Err(UnrelatedTransition(opid, transition)); + } + if self.bundle.known_transitions.contains_key(&opid) { + return Ok(false); + } + self.bundle + .known_transitions + .insert(opid, transition) + .expect("same size as input map"); + Ok(true) + } +} + +#[derive(Clone, PartialEq, Eq, Debug)] +#[derive(StrictType, StrictEncode, StrictDecode)] +#[strict_type(lib = LIB_NAME_RGB_STD, tags = custom)] +#[cfg_attr( + feature = "serde", + derive(Serialize, Deserialize), + serde(crate = "serde_crate", rename_all = "camelCase") +)] +pub enum AnchoredBundles { + #[strict_type(tag = 0x01)] + Tapret(ClientBundle), + #[strict_type(tag = 0x02)] + Opret(ClientBundle), + #[strict_type(tag = 0x03)] + Double { + tapret: ClientBundle, + opret: ClientBundle, + }, +} + +impl StrictDumb for AnchoredBundles { + fn strict_dumb() -> Self { Self::Opret(strict_dumb!()) } +} + +impl From for AnchoredBundles { + fn from(ab: ClientBundle) -> Self { + match ab.dbc_proof { + DbcProof::Opret(proof) => { + Self::Opret(ClientBundle::::new(ab.mpc_proof, proof, ab.bundle)) + } + DbcProof::Tapret(proof) => { + Self::Tapret(ClientBundle::::new(ab.mpc_proof, proof, ab.bundle)) + } + } + } +} + +impl AnchoredBundles { + pub fn bundles(&self) -> impl Iterator { + match self { + AnchoredBundles::Tapret(tapret) => Dichotomy::single(&tapret.bundle), + AnchoredBundles::Opret(opret) => Dichotomy::single(&opret.bundle), + AnchoredBundles::Double { tapret, opret } => { + Dichotomy::double(&tapret.bundle, &opret.bundle) + } + } + .into_iter() + } + + pub fn into_bundles(self) -> impl Iterator { + match self { + AnchoredBundles::Tapret(tapret) => Dichotomy::single(tapret.bundle), + AnchoredBundles::Opret(opret) => Dichotomy::single(opret.bundle), + AnchoredBundles::Double { tapret, opret } => { + Dichotomy::double(tapret.bundle, opret.bundle) + } + } + .into_iter() + } + + pub fn iter(&self) -> impl Iterator { + match self { + AnchoredBundles::Tapret(tapret) => { + let anchor = + EAnchor::new(tapret.mpc_proof.clone(), tapret.dbc_proof.clone().into()); + Dichotomy::single((anchor, &tapret.bundle)) + } + AnchoredBundles::Opret(opret) => { + let anchor = EAnchor::new(opret.mpc_proof.clone(), opret.dbc_proof.into()); + Dichotomy::single((anchor, &opret.bundle)) + } + AnchoredBundles::Double { tapret, opret } => { + let tapret_anchor = + EAnchor::new(tapret.mpc_proof.clone(), tapret.dbc_proof.clone().into()); + let opret_anchor = EAnchor::new(opret.mpc_proof.clone(), opret.dbc_proof.into()); + Dichotomy::double((tapret_anchor, &tapret.bundle), (opret_anchor, &opret.bundle)) + } + } + .into_iter() + } +} + +impl IntoIterator for AnchoredBundles { + type Item = (EAnchor, TransitionBundle); + type IntoIter = vec::IntoIter<(EAnchor, TransitionBundle)>; + + fn into_iter(self) -> Self::IntoIter { + match self { + AnchoredBundles::Tapret(tapret) => { + let anchor = EAnchor::new(tapret.mpc_proof, tapret.dbc_proof.into()); + Dichotomy::single((anchor, tapret.bundle)) + } + AnchoredBundles::Opret(opret) => { + let anchor = EAnchor::new(opret.mpc_proof, opret.dbc_proof.into()); + Dichotomy::single((anchor, opret.bundle)) + } + AnchoredBundles::Double { tapret, opret } => { + let tapret_anchor = EAnchor::new(tapret.mpc_proof, tapret.dbc_proof.into()); + let opret_anchor = EAnchor::new(opret.mpc_proof, opret.dbc_proof.into()); + Dichotomy::double((tapret_anchor, tapret.bundle), (opret_anchor, opret.bundle)) + } + } + .into_iter() } } diff --git a/src/containers/consignment.rs b/src/containers/consignment.rs index cd91798f..f76d4162 100644 --- a/src/containers/consignment.rs +++ b/src/containers/consignment.rs @@ -50,7 +50,7 @@ use super::{ use crate::interface::{Iface, IfaceImpl}; use crate::persistence::{MemContract, MemContractState}; use crate::resolvers::ConsignmentResolver; -use crate::{BundleExt, SecretSeal, LIB_NAME_RGB_STD}; +use crate::{SecretSeal, LIB_NAME_RGB_STD}; pub type Transfer = Consignment; pub type Contract = Consignment; @@ -296,10 +296,7 @@ impl Consignment { for mut witness_bundle in self.bundles { for (bundle_id, secret) in &self.terminals { if let Some(seal) = f(*secret)? { - if witness_bundle.bundle.bundle_id() == *bundle_id { - witness_bundle.bundle.reveal_seal(seal); - break; - } + witness_bundle.reveal_seal(*bundle_id, seal); } } bundles.push(witness_bundle).ok(); @@ -560,23 +557,23 @@ Check-SHA256: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa // Wrong type // TODO: Uncomment once ASCII headers get checked /*assert!(matches!( - Transfer::from_str( - r#"-----BEGIN RGB CONSIGNMENT----- -Id: rgb:csg:9jMKgkmP-alPghZC-bu65ctP-GT5tKgM-cAbaTLT-rhu8xQo#urban-athena-adam -Version: 2 -Type: contract -Contract: rgb:T24t0N1D-eiInTgb-BXlrrXz-$7OgV6n-WJWHPUD-BWNuqZw -Schema: rgb:sch:CyqM42yAdM1moWyNZPQedAYt73BM$k9z$dKLUXY1voA#cello-global-deluxe -Check-SHA256: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa - -0s#O3000000000000000000000000000000000000000000000000000000D0CRI`I$>^aZh38Qb#nj! -0000000000000000000000d59ZDjxe00000000dDb8~4rVQz13d2MfXa{vGU00000000000000000000 -0000000000000 - ------END RGB CONSIGNMENT-----"# - ), - Err(ConsignmentParseError::Type) - ));*/ + Transfer::from_str( + r#"-----BEGIN RGB CONSIGNMENT----- + Id: rgb:csg:9jMKgkmP-alPghZC-bu65ctP-GT5tKgM-cAbaTLT-rhu8xQo#urban-athena-adam + Version: 2 + Type: contract + Contract: rgb:T24t0N1D-eiInTgb-BXlrrXz-$7OgV6n-WJWHPUD-BWNuqZw + Schema: rgb:sch:CyqM42yAdM1moWyNZPQedAYt73BM$k9z$dKLUXY1voA#cello-global-deluxe + Check-SHA256: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + + 0s#O3000000000000000000000000000000000000000000000000000000D0CRI`I$>^aZh38Qb#nj! + 0000000000000000000000d59ZDjxe00000000dDb8~4rVQz13d2MfXa{vGU00000000000000000000 + 0000000000000 + + -----END RGB CONSIGNMENT-----"# + ), + Err(ConsignmentParseError::Type) + ));*/ assert!(matches!( Transfer::from_str(include_str!("../../asset/armored_contract.default")), Err(ConsignmentParseError::Type) diff --git a/src/containers/indexed.rs b/src/containers/indexed.rs index a8e332a5..355d8c28 100644 --- a/src/containers/indexed.rs +++ b/src/containers/indexed.rs @@ -36,7 +36,7 @@ use crate::containers::anchors::ToWitnessId; pub struct IndexedConsignment<'c, const TRANSFER: bool> { consignment: &'c Consignment, scripts: Scripts, - anchor_idx: BTreeMap, + anchor_idx: BTreeMap, bundle_idx: BTreeMap, op_witness_idx: BTreeMap, op_bundle_idx: BTreeMap, @@ -61,14 +61,15 @@ impl<'c, const TRANSFER: bool> IndexedConsignment<'c, TRANSFER> { for witness_bundle in &consignment.bundles { witness_idx .insert(witness_bundle.pub_witness.to_witness_id(), &witness_bundle.pub_witness); - let bundle = &witness_bundle.bundle; - let bundle_id = bundle.bundle_id(); let witness_id = witness_bundle.pub_witness.to_witness_id(); - bundle_idx.insert(bundle_id, bundle); - anchor_idx.insert(bundle_id, (witness_id, &witness_bundle.anchor)); - for opid in witness_bundle.bundle.known_transitions.keys() { - op_witness_idx.insert(*opid, witness_id); - op_bundle_idx.insert(*opid, bundle_id); + for (anchor, bundle) in witness_bundle.anchored_bundles() { + let bundle_id = bundle.bundle_id(); + bundle_idx.insert(bundle_id, bundle); + anchor_idx.insert(bundle_id, (witness_id, anchor)); + for opid in bundle.known_transitions.keys() { + op_witness_idx.insert(*opid, witness_id); + op_bundle_idx.insert(*opid, bundle_id); + } } } for extension in &consignment.extensions { @@ -137,7 +138,7 @@ impl<'c, const TRANSFER: bool> ConsignmentApi for IndexedConsignment<'c, TRANSFE } fn anchor(&self, bundle_id: BundleId) -> Option<(XWitnessId, &EAnchor)> { - self.anchor_idx.get(&bundle_id).map(|(id, set)| (*id, *set)) + self.anchor_idx.get(&bundle_id).map(|(id, set)| (*id, set)) } fn op_witness_id(&self, opid: OpId) -> Option { diff --git a/src/containers/kit.rs b/src/containers/kit.rs index c764aa83..4316f83c 100644 --- a/src/containers/kit.rs +++ b/src/containers/kit.rs @@ -289,9 +289,8 @@ mod test { #[test] fn error_kit_strs() { - assert!( - Kit::from_str( - r#"-----BEGIN RGB KIT----- + assert!(Kit::from_str( + r#"-----BEGIN RGB KIT----- Id: rgb:kit:e1jW6Rgc-2$JzXDg-XmR8XRJ-v!q$Dzf-yImkPjD-t8EjfvI Version: 2 Type-System: sts:8Vb$sM1F-5MsQc20-HEixf55-gJR37FM-0zRKfpY-SwIp35w#design-farmer-camel @@ -300,14 +299,12 @@ Check-SHA256: 5563cc1568e244183804e0db3cec6ff9bf577f4a403924096177bf4a586160da 0ssI2000000000 -----END RGB KIT-----"# - ) - .is_ok() - ); + ) + .is_ok()); // Wrong Id - assert!( - Kit::from_str( - r#"-----BEGIN RGB KIT----- + assert!(Kit::from_str( + r#"-----BEGIN RGB KIT----- Id: rgb:kit:11111111-2222222-XmR8XRJ-v!q$Dzf-yImkPjD-t8EjfvI Version: 2 Type-System: sts:8Vb$sM1F-5MsQc20-HEixf55-gJR37FM-0zRKfpY-SwIp35w#design-farmer-camel @@ -316,14 +313,12 @@ Check-SHA256: 5563cc1568e244183804e0db3cec6ff9bf577f4a403924096177bf4a586160da 0ssI2000000000 -----END RGB KIT-----"# - ) - .is_err() - ); + ) + .is_err()); // wrong checksum - assert!( - Kit::from_str( - r#"-----BEGIN RGB KIT----- + assert!(Kit::from_str( + r#"-----BEGIN RGB KIT----- Id: rgb:kit:e1jW6Rgc-2$JzXDg-XmR8XRJ-v!q$Dzf-yImkPjD-t8EjfvI Version: 2 Type-System: sts:8Vb$sM1F-5MsQc20-HEixf55-gJR37FM-0zRKfpY-SwIp35w#design-farmer-camel @@ -332,8 +327,7 @@ Check-SHA256: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 0ssI2000000000 -----END RGB KIT-----"# - ) - .is_err() - ); + ) + .is_err()); } } diff --git a/src/containers/mod.rs b/src/containers/mod.rs index 277138e2..76ed6377 100644 --- a/src/containers/mod.rs +++ b/src/containers/mod.rs @@ -38,7 +38,10 @@ mod file; mod kit; mod suppl; -pub use anchors::{AnchorSet, PubWitness, SealWitness, ToWitnessId, WitnessBundle, XPubWitness}; +pub use anchors::{ + AnchorSet, AnchoredBundleMismatch, AnchoredBundles, ClientBundle, PubWitness, SealWitness, + ToWitnessId, UnrelatedTransition, WitnessBundle, XPubWitness, +}; pub use consignment::{ Consignment, ConsignmentExt, ConsignmentId, ConsignmentParseError, Contract, Transfer, ValidConsignment, ValidContract, ValidTransfer, diff --git a/src/containers/partials.rs b/src/containers/partials.rs index 28e9ca61..ed2d6ee9 100644 --- a/src/containers/partials.rs +++ b/src/containers/partials.rs @@ -31,7 +31,10 @@ use rgb::{ ContractId, OpId, Operation, Transition, TransitionBundle, TxoSeal, XOutpoint, XOutputSeal, XWitnessId, }; -use strict_encoding::{StrictDecode, StrictDeserialize, StrictDumb, StrictEncode, StrictSerialize}; +use strict_encoding::{ + DecodeError, ReadStruct, StrictDecode, StrictDeserialize, StrictDumb, StrictEncode, + StrictProduct, StrictSerialize, StrictStruct, StrictType, TypedRead, TypedWrite, WriteStruct, +}; use crate::containers::{AnchorSet, XPubWitness}; use crate::LIB_NAME_RGB_STD; @@ -86,7 +89,13 @@ impl BitOrAssign for Option { impl> BitOr for CloseMethodSet { type Output = Self; - fn bitor(self, rhs: T) -> Self::Output { if self == rhs.into() { self } else { Self::Both } } + fn bitor(self, rhs: T) -> Self::Output { + if self == rhs.into() { + self + } else { + Self::Both + } + } } impl> BitOrAssign for CloseMethodSet { @@ -247,20 +256,54 @@ impl Batch { pub type BundleDichotomy = Dichotomy; pub type TransitionDichotomy = Dichotomy; +// TODO: Move to amplify #[derive(Clone, PartialEq, Eq, Hash, Debug)] -#[derive(StrictType, StrictDumb, StrictEncode, StrictDecode)] -#[strict_type(lib = LIB_NAME_RGB_STD)] #[cfg_attr( feature = "serde", derive(Serialize, Deserialize), serde(crate = "serde_crate", rename_all = "camelCase") )] -pub struct Dichotomy { +pub struct Dichotomy { pub first: T, pub second: Option, } -impl FromIterator for Dichotomy { +impl StrictType for Dichotomy { + const STRICT_LIB_NAME: &'static str = LIB_NAME_RGB_STD; +} +impl StrictProduct for Dichotomy {} +impl StrictStruct for Dichotomy { + const ALL_FIELDS: &'static [&'static str] = &["first", "second"]; +} +impl StrictEncode for Dichotomy { + fn strict_encode(&self, writer: W) -> std::io::Result { + writer.write_struct::(|w| { + Ok(w.write_field(fname!("first"), &self.first)? + .write_field(fname!("second"), &self.second)? + .complete()) + }) + } +} +impl StrictDecode for Dichotomy { + fn strict_decode(reader: &mut impl TypedRead) -> Result { + reader.read_struct(|r| { + Ok(Self { + first: r.read_field(fname!("first"))?, + second: r.read_field(fname!("second"))?, + }) + }) + } +} +impl StrictDumb for Dichotomy { + fn strict_dumb() -> Self { + Self { + first: T::strict_dumb(), + second: None, + } + } +} + +impl FromIterator for Dichotomy { fn from_iter>(iter: I) -> Self { let mut iter = iter.into_iter(); let first = iter.next().expect("iterator must have at least one item"); @@ -270,7 +313,7 @@ impl FromIterator for Dichotomy< } } -impl IntoIterator for Dichotomy { +impl IntoIterator for Dichotomy { type Item = T; type IntoIter = vec::IntoIter; @@ -284,7 +327,21 @@ impl IntoIterator for Dichotomy } } -impl Dichotomy { +impl Dichotomy { + pub fn single(first: T) -> Self { + Self { + first, + second: None, + } + } + + pub fn double(first: T, second: T) -> Self { + Self { + first, + second: Some(second), + } + } + pub fn with(first: T, second: Option) -> Self { Self { first, second } } pub fn iter(&self) -> vec::IntoIter<&T> { diff --git a/src/contract/assignments.rs b/src/contract/assignments.rs index 8d66b25a..d4967520 100644 --- a/src/contract/assignments.rs +++ b/src/contract/assignments.rs @@ -22,6 +22,7 @@ use std::cmp::Ordering; use std::collections::HashMap; use std::fmt::Debug; +use std::hash::Hash; use amplify::confinement::SmallVec; use commit_verify::Conceal; @@ -39,18 +40,50 @@ use crate::LIB_NAME_RGB_STD; /// Trait used by contract state. Unlike [`ExposedState`] it doesn't allow /// concealment of the state, i.e. may contain incomplete data without blinding /// factors, asset tags etc. -pub trait KnownState: Debug + StrictDumb + StrictEncode + StrictDecode + Eq + Clone {} - -impl KnownState for () {} -impl KnownState for VoidState {} -impl KnownState for DataState {} -impl KnownState for Amount {} -impl KnownState for AttachState {} -impl KnownState for RevealedValue {} -impl KnownState for RevealedData {} -impl KnownState for RevealedAttach {} - -#[derive(Copy, Clone, Eq, Debug)] +pub trait KnownState: Debug + StrictDumb + StrictEncode + StrictDecode + Eq + Clone + Hash { + const IS_FUNGIBLE: bool; +} + +impl KnownState for () { + const IS_FUNGIBLE: bool = false; +} +impl KnownState for VoidState { + const IS_FUNGIBLE: bool = false; +} +impl KnownState for DataState { + const IS_FUNGIBLE: bool = false; +} +impl KnownState for Amount { + const IS_FUNGIBLE: bool = true; +} +impl KnownState for AttachState { + const IS_FUNGIBLE: bool = false; +} +impl KnownState for RevealedValue { + const IS_FUNGIBLE: bool = true; +} +impl KnownState for RevealedData { + const IS_FUNGIBLE: bool = false; +} +impl KnownState for RevealedAttach { + const IS_FUNGIBLE: bool = false; +} + +#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)] +#[derive(StrictType, StrictDumb, StrictEncode, StrictDecode)] +#[strict_type(lib = LIB_NAME_RGB_STD)] +#[cfg_attr( + feature = "serde", + derive(Serialize, Deserialize), + serde(crate = "serde_crate", rename_all = "camelCase") +)] +pub struct WitnessInfo { + pub id: XWitnessId, + pub ord: WitnessOrd, +} + +#[allow(clippy::derived_hash_with_manual_eq)] +#[derive(Copy, Clone, Eq, Hash, Debug)] #[derive(StrictType, StrictDumb, StrictEncode, StrictDecode)] #[strict_type(lib = LIB_NAME_RGB_STD)] #[cfg_attr( @@ -142,6 +175,7 @@ impl OutputAssignment { } } + /// Transmutes output assignment from one form of state to another pub fn transmute>(self) -> OutputAssignment { OutputAssignment { opout: self.opout, diff --git a/src/contract/bundle.rs b/src/contract/bundle.rs deleted file mode 100644 index ef9788ca..00000000 --- a/src/contract/bundle.rs +++ /dev/null @@ -1,68 +0,0 @@ -// 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 rgb::{GraphSeal, OpId, Operation, Transition, TransitionBundle, XChain}; - -use crate::contract::TypedAssignsExt; - -#[derive(Clone, Eq, PartialEq, Debug, Display, Error)] -#[display(doc_comments)] -pub enum RevealError { - /// the provided state transition is not a part of the bundle - UnrelatedTransition(OpId, Transition), -} - -pub trait BundleExt { - /// Ensures that the seal is revealed inside the bundle. - fn reveal_seal(&mut self, seal: XChain); - - /// Ensures that the transition is revealed inside the bundle. - /// - /// # Returns - /// - /// `true` if the transition was previously concealed; `false` if it was - /// already revealed; error if the transition is unrelated to the bundle. - fn reveal_transition(&mut self, transition: Transition) -> Result; -} - -impl BundleExt for TransitionBundle { - fn reveal_seal(&mut self, seal: XChain) { - for (_, transition) in self.known_transitions.keyed_values_mut() { - for (_, assign) in transition.assignments.keyed_values_mut() { - assign.reveal_seal(seal) - } - } - } - - fn reveal_transition(&mut self, transition: Transition) -> Result { - let opid = transition.id(); - if self.input_map.values().all(|id| id != &opid) { - return Err(RevealError::UnrelatedTransition(opid, transition)); - } - if self.known_transitions.contains_key(&opid) { - return Ok(false); - } - self.known_transitions - .insert(opid, transition) - .expect("same size as input map"); - Ok(true) - } -} diff --git a/src/contract/mod.rs b/src/contract/mod.rs index b7905e89..624830ed 100644 --- a/src/contract/mod.rs +++ b/src/contract/mod.rs @@ -20,11 +20,9 @@ // limitations under the License. mod assignments; -mod bundle; mod merge_reveal; -pub use assignments::{KnownState, OutputAssignment, TypedAssignsExt}; -pub use bundle::{BundleExt, RevealError}; +pub use assignments::{KnownState, OutputAssignment, TypedAssignsExt, WitnessInfo}; pub use merge_reveal::{MergeReveal, MergeRevealError}; use rgb::vm::OrdOpRef; use rgb::{ExtensionType, OpId, TransitionType, XWitnessId}; diff --git a/src/interface/contract.rs b/src/interface/contract.rs index b54e45d2..2709a054 100644 --- a/src/interface/contract.rs +++ b/src/interface/contract.rs @@ -20,21 +20,19 @@ // limitations under the License. use std::borrow::Borrow; -use std::cmp::Ordering; -use std::collections::HashMap; +use std::collections::{BTreeSet, HashMap, HashSet}; -use amplify::confinement::SmallOrdSet; use invoice::{Allocation, Amount}; use rgb::{ - AttachState, ContractId, DataState, OpId, RevealedAttach, RevealedData, RevealedValue, Schema, - VoidState, XOutpoint, XOutputSeal, XWitnessId, + AssignmentType, AttachState, ContractId, DataState, OpId, RevealedAttach, RevealedData, + RevealedValue, Schema, VoidState, XOutpoint, XOutputSeal, XWitnessId, }; use strict_encoding::{FieldName, StrictDecode, StrictDumb, StrictEncode}; use strict_types::{StrictVal, TypeSystem}; -use crate::contract::{KnownState, OutputAssignment}; +use crate::contract::{KnownState, OutputAssignment, WitnessInfo}; use crate::info::ContractInfo; -use crate::interface::{IfaceImpl, OutpointFilter}; +use crate::interface::{AssignmentsFilter, IfaceImpl}; use crate::persistence::ContractStateRead; use crate::LIB_NAME_RGB_STD; @@ -78,7 +76,18 @@ pub enum AllocatedState { Attachment(AttachState), } -impl KnownState for AllocatedState {} +impl KnownState for AllocatedState { + const IS_FUNGIBLE: bool = false; +} + +impl AllocatedState { + fn unwrap_fungible(&self) -> Amount { + match self { + AllocatedState::Amount(amount) => *amount, + _ => panic!("unwrapping non-fungible state"), + } + } +} pub type OwnedAllocation = OutputAssignment; pub type RightsAllocation = OutputAssignment; @@ -86,118 +95,136 @@ pub type FungibleAllocation = OutputAssignment; pub type DataAllocation = OutputAssignment; pub type AttachAllocation = OutputAssignment; -pub trait StateChange: Clone + Eq + StrictDumb + StrictEncode + StrictDecode { - type State: KnownState; - fn from_spent(state: Self::State) -> Self; - fn from_received(state: Self::State) -> Self; - fn merge_spent(&mut self, state: Self::State); - fn merge_received(&mut self, state: Self::State); -} - -#[derive(Copy, Clone, Ord, PartialOrd, Eq, PartialEq, Hash, Debug, Display)] -#[derive(StrictType, StrictDumb, StrictEncode, StrictDecode)] -#[strict_type(lib = LIB_NAME_RGB_STD, tags = custom)] +#[derive(Copy, Clone, Eq, PartialEq, Hash, Debug, Display)] #[cfg_attr( feature = "serde", derive(Serialize, Deserialize), serde(crate = "serde_crate", rename_all = "camelCase") )] -pub enum AmountChange { - #[display("-{0}")] - #[strict_type(tag = 0xFF)] - Dec(Amount), - - #[display("0")] - #[strict_type(tag = 0, dumb)] - Zero, - - #[display("+{0}")] - #[strict_type(tag = 0x01)] - Inc(Amount), -} - -impl StateChange for AmountChange { - type State = Amount; - - fn from_spent(state: Self::State) -> Self { AmountChange::Dec(state) } - - fn from_received(state: Self::State) -> Self { AmountChange::Inc(state) } - - fn merge_spent(&mut self, sub: Self::State) { - *self = match self { - AmountChange::Dec(neg) => AmountChange::Dec(*neg + sub), - AmountChange::Zero => AmountChange::Dec(sub), - AmountChange::Inc(pos) => match sub.cmp(pos) { - Ordering::Less => AmountChange::Inc(*pos - sub), - Ordering::Equal => AmountChange::Zero, - Ordering::Greater => AmountChange::Dec(sub - *pos), - }, - }; - } - - fn merge_received(&mut self, add: Self::State) { - *self = match self { - AmountChange::Inc(pos) => AmountChange::Inc(*pos + add), - AmountChange::Zero => AmountChange::Inc(add), - AmountChange::Dec(neg) => match add.cmp(neg) { - Ordering::Less => AmountChange::Dec(*neg - add), - Ordering::Equal => AmountChange::Zero, - Ordering::Greater => AmountChange::Inc(add - *neg), - }, - }; - } +#[display(lowercase)] +pub enum OpDirection { + Issued, + Received, + Sent, } #[derive(Clone, Eq, PartialEq, Hash, Debug)] -#[derive(StrictType, StrictDumb, StrictEncode, StrictDecode)] -#[strict_type(lib = LIB_NAME_RGB_STD)] #[cfg_attr( feature = "serde", derive(Serialize, Deserialize), - serde(crate = "serde_crate", rename_all = "camelCase") + serde(crate = "serde_crate", rename_all = "camelCase", tag = "type") )] -pub struct IfaceOp { - pub opids: SmallOrdSet, // may come from multiple bundles - pub inputs: SmallOrdSet, // may come from multiple bundles - pub state_change: S, - pub payers: SmallOrdSet, - pub beneficiaries: SmallOrdSet, +pub struct ContractOp { + pub direction: OpDirection, + pub ty: AssignmentType, + pub opids: BTreeSet, + pub state: AllocatedState, + pub to: BTreeSet, + pub witness: Option, } -impl IfaceOp { - fn from_spent(alloc: OutputAssignment) -> Self { +fn reduce_to_ty(allocations: impl IntoIterator) -> AssignmentType { + allocations + .into_iter() + .map(|a| a.opout.ty) + .reduce(|ty1, ty2| { + assert_eq!(ty1, ty2); + ty1 + }) + .expect("empty list of allocations") +} + +impl ContractOp { + fn non_fungible_genesis( + our_allocations: HashSet, + ) -> impl ExactSizeIterator { + our_allocations.into_iter().map(|a| Self { + direction: OpDirection::Issued, + ty: a.opout.ty, + opids: bset![a.opout.op], + state: a.state, + to: bset![a.seal], + witness: None, + }) + } + + fn non_fungible_sent( + witness: WitnessInfo, + ext_allocations: HashSet, + ) -> impl ExactSizeIterator { + ext_allocations.into_iter().map(move |a| Self { + direction: OpDirection::Sent, + ty: a.opout.ty, + opids: bset![a.opout.op], + state: a.state, + to: bset![a.seal], + witness: Some(witness), + }) + } + + fn non_fungible_received( + witness: WitnessInfo, + our_allocations: HashSet, + ) -> impl ExactSizeIterator { + our_allocations.into_iter().map(move |a| Self { + direction: OpDirection::Received, + ty: a.opout.ty, + opids: bset![a.opout.op], + state: a.state, + to: bset![a.seal], + witness: Some(witness), + }) + } + + fn fungible_genesis(our_allocations: HashSet) -> Self { + let to = our_allocations.iter().map(|a| a.seal).collect(); + let opids = our_allocations.iter().map(|a| a.opout.op).collect(); + let issued = our_allocations + .iter() + .map(|a| a.state.unwrap_fungible()) + .sum(); Self { - opids: none!(), - inputs: small_bset![alloc.opout.op], - state_change: C::from_spent(alloc.state), - payers: none!(), - // TODO: Do something with beneficiary info - beneficiaries: none!(), + direction: OpDirection::Issued, + ty: reduce_to_ty(our_allocations), + opids, + state: AllocatedState::Amount(issued), + to, + witness: None, } } - fn from_received(alloc: OutputAssignment) -> Self { + + fn fungible_sent(witness: WitnessInfo, ext_allocations: HashSet) -> Self { + let opids = ext_allocations.iter().map(|a| a.opout.op).collect(); + let to = ext_allocations.iter().map(|a| a.seal).collect(); + let amount = ext_allocations + .iter() + .map(|a| a.state.unwrap_fungible()) + .sum(); Self { - opids: small_bset![alloc.opout.op], - inputs: none!(), - state_change: C::from_received(alloc.state), - // TODO: Do something with payer info - payers: none!(), - beneficiaries: none!(), + direction: OpDirection::Sent, + ty: reduce_to_ty(ext_allocations), + opids, + state: AllocatedState::Amount(amount), + to, + witness: Some(witness), } } - fn merge_spent(&mut self, alloc: OutputAssignment) { - self.inputs - .push(alloc.opout.op) - .expect("internal inconsistency of stash data"); - self.state_change.merge_spent(alloc.state); - // TODO: Do something with beneficiary info - } - fn merge_received(&mut self, alloc: OutputAssignment) { - self.opids - .push(alloc.opout.op) - .expect("internal inconsistency of stash data"); - self.state_change.merge_received(alloc.state); - // TODO: Do something with payer info + + fn fungible_received(witness: WitnessInfo, our_allocations: HashSet) -> Self { + let opids = our_allocations.iter().map(|a| a.opout.op).collect(); + let to = our_allocations.iter().map(|a| a.seal).collect(); + let amount = our_allocations + .iter() + .map(|a| a.state.unwrap_fungible()) + .sum(); + Self { + direction: OpDirection::Received, + ty: reduce_to_ty(our_allocations), + opids, + state: AllocatedState::Amount(amount), + to, + witness: Some(witness), + } } } @@ -249,7 +276,21 @@ impl ContractIface { &'c self, state: impl IntoIterator> + 'c, name: impl Into, - filter: impl OutpointFilter + 'c, + filter: impl AssignmentsFilter + 'c, + ) -> Result> + 'c, ContractError> + where + A: Clone + KnownState + 'c, + U: From + KnownState + 'c, + { + Ok(self + .extract_state_unfiltered(state, name)? + .filter(move |outp| filter.should_include(outp.seal, outp.witness))) + } + + fn extract_state_unfiltered<'c, A, U>( + &'c self, + state: impl IntoIterator> + 'c, + name: impl Into, ) -> Result> + 'c, ContractError> where A: Clone + KnownState + 'c, @@ -263,7 +304,6 @@ impl ContractIface { Ok(state .into_iter() .filter(move |outp| outp.opout.ty == type_id) - .filter(move |outp| filter.include_outpoint(outp.seal)) .cloned() .map(OutputAssignment::::transmute)) } @@ -271,81 +311,41 @@ impl ContractIface { pub fn rights<'c>( &'c self, name: impl Into, - filter: impl OutpointFilter + 'c, + filter: impl AssignmentsFilter + 'c, ) -> Result + 'c, ContractError> { self.extract_state(self.state.rights_all(), name, filter) } - pub fn rights_all<'c>( - &'c self, - name: impl Into, - filter: impl OutpointFilter + 'c, - ) -> Result, ContractError> { - Ok(self - .extract_state(self.state.rights_all(), name, filter)? - .collect()) - } - pub fn fungible<'c>( &'c self, name: impl Into, - filter: impl OutpointFilter + 'c, + filter: impl AssignmentsFilter + 'c, ) -> Result + 'c, ContractError> { self.extract_state(self.state.fungible_all(), name, filter) } - pub fn fungible_all<'c>( - &'c self, - name: impl Into, - filter: impl OutpointFilter + 'c, - ) -> Result, ContractError> { - Ok(self - .extract_state(self.state.fungible_all(), name, filter)? - .collect()) - } - pub fn data<'c>( &'c self, name: impl Into, - filter: impl OutpointFilter + 'c, + filter: impl AssignmentsFilter + 'c, ) -> Result + 'c, ContractError> { self.extract_state(self.state.data_all(), name, filter) } - pub fn data_all<'c>( - &'c self, - name: impl Into, - filter: impl OutpointFilter + 'c, - ) -> Result, ContractError> { - Ok(self - .extract_state(self.state.data_all(), name, filter)? - .collect()) - } - pub fn attachments<'c>( &'c self, name: impl Into, - filter: impl OutpointFilter + 'c, + filter: impl AssignmentsFilter + 'c, ) -> Result + 'c, ContractError> { self.extract_state(self.state.attach_all(), name, filter) } - pub fn attachments_all<'c>( - &'c self, - name: impl Into, - filter: impl OutpointFilter + 'c, - ) -> Result, ContractError> { - Ok(self - .extract_state(self.state.attach_all(), name, filter)? - .collect()) - } - pub fn allocations<'c>( &'c self, - filter: impl OutpointFilter + Copy + 'c, + filter: impl AssignmentsFilter + Copy + 'c, ) -> impl Iterator + 'c { fn f<'a, S, U>( - filter: impl OutpointFilter + 'a, + filter: impl AssignmentsFilter + 'a, state: impl IntoIterator> + 'a, ) -> impl Iterator> + 'a where @@ -354,7 +354,7 @@ impl ContractIface { { state .into_iter() - .filter(move |outp| filter.include_outpoint(outp.seal)) + .filter(move |outp| filter.should_include(outp.seal, outp.witness)) .cloned() .map(OutputAssignment::::transmute) } @@ -373,105 +373,155 @@ impl ContractIface { self.allocations(outpoint) } - // TODO: Ignore blank state transition - fn operations<'c, C: StateChange>( + pub fn history( + &self, + filter_outpoints: impl AssignmentsFilter + Clone, + filter_witnesses: impl AssignmentsFilter + Clone, + ) -> Vec { + self.history_fungible(filter_outpoints.clone(), filter_witnesses.clone()) + .into_iter() + .chain(self.history_rights(filter_outpoints.clone(), filter_witnesses.clone())) + .chain(self.history_data(filter_outpoints.clone(), filter_witnesses.clone())) + .chain(self.history_attach(filter_outpoints, filter_witnesses)) + .collect() + } + + fn operations<'c, T: KnownState + 'c, I: Iterator>>( &'c self, - state: impl IntoIterator> + 'c, - allocations: impl Iterator> + 'c, - ) -> HashMap> + state: impl Fn(&'c S) -> I, + filter_outpoints: impl AssignmentsFilter, + filter_witnesses: impl AssignmentsFilter, + ) -> Vec where - C::State: 'c, + AllocatedState: From, { - fn f<'a, S, U>( - state: impl IntoIterator> + 'a, - ) -> impl Iterator> + 'a - where - S: Clone + KnownState + 'a, - U: From + KnownState + 'a, - { - state.into_iter().map(OutputAssignment::::transmute) - } - - let spent = f::<_, C::State>(state).map(OutputAssignment::from); - let mut ops = HashMap::>::new(); - for alloc in spent { - let Some(witness_id) = alloc.witness else { - continue; - }; - if let Some(op) = ops.get_mut(&witness_id) { - op.merge_spent(alloc); + // get all allocations which ever belonged to this wallet and store them by witness id + let mut allocations_our_outpoint = state(&self.state) + .filter(move |outp| filter_outpoints.should_include(outp.seal, outp.witness)) + .fold(HashMap::<_, HashSet<_>>::new(), |mut map, a| { + map.entry(a.witness) + .or_default() + .insert(a.clone().transmute::()); + map + }); + // get all allocations which has a witness transaction belonging to this wallet + let mut allocations_our_witness = state(&self.state) + .filter(move |outp| filter_witnesses.should_include(outp.seal, outp.witness)) + .fold(HashMap::<_, HashSet<_>>::new(), |mut map, a| { + let witness = a.witness.expect( + "all empty witnesses must be already filtered out by wallet.filter_witness()", + ); + map.entry(witness) + .or_default() + .insert(a.clone().transmute::()); + map + }); + + // gather all witnesses from both sets + let mut witness_ids = allocations_our_witness + .keys() + .cloned() + .collect::>(); + witness_ids.extend(allocations_our_outpoint.keys().filter_map(|x| *x)); + + // reconstruct contract history from the wallet perspective + let mut ops = Vec::with_capacity(witness_ids.len() + 1); + // add allocations with no witness to the beginning of the history + if let Some(genesis_allocations) = allocations_our_outpoint.remove(&None) { + if T::IS_FUNGIBLE { + ops.push(ContractOp::fungible_genesis(genesis_allocations)); } else { - ops.insert(witness_id, IfaceOp::from_spent(alloc)); + ops.extend(ContractOp::non_fungible_genesis(genesis_allocations)); } } - - for alloc in allocations { - let Some(witness_id) = alloc.witness else { - continue; + for witness_id in witness_ids { + let our_outpoint = allocations_our_outpoint.remove(&Some(witness_id)); + let our_witness = allocations_our_witness.remove(&witness_id); + let witness_info = self.witness_info(witness_id).expect( + "witness id was returned from the contract state above, so it must be there", + ); + match (our_outpoint, our_witness) { + // we own both allocation and witness transaction: these allocations are changes and + // outgoing payments. The difference between the change and the payments are whether + // a specific allocation is listed in the first tuple pattern field. + (Some(our_allocations), Some(all_allocations)) => { + // all_allocations - our_allocations = external payments + let ext_allocations = all_allocations + .difference(&our_allocations) + .cloned() + .collect::>(); + // This was a blank state transition with no external payment + if ext_allocations.is_empty() { + continue; + } + if T::IS_FUNGIBLE { + ops.push(ContractOp::fungible_sent(witness_info, ext_allocations)) + } else { + ops.extend(ContractOp::non_fungible_sent(witness_info, ext_allocations)) + } + } + // the same as above, but the payment has no change + (None, Some(ext_allocations)) => { + if T::IS_FUNGIBLE { + ops.push(ContractOp::fungible_sent(witness_info, ext_allocations)) + } else { + ops.extend(ContractOp::non_fungible_sent(witness_info, ext_allocations)) + } + } + // we own allocation but the witness transaction was made by other wallet: + // this is an incoming payment to us. + (Some(our_allocations), None) => { + if T::IS_FUNGIBLE { + ops.push(ContractOp::fungible_received(witness_info, our_allocations)) + } else { + ops.extend(ContractOp::non_fungible_received(witness_info, our_allocations)) + } + } + // these can't get into the `witness_ids` due to the used filters + (None, None) => unreachable!("broken allocation filters"), }; - if let Some(op) = ops.get_mut(&witness_id) { - op.merge_received(alloc); - } else { - ops.insert(witness_id, IfaceOp::from_received(alloc)); - } } ops } - pub fn fungible_ops<'c, C: StateChange>( - &'c self, - name: impl Into, - outpoint_filter: impl OutpointFilter + Copy + 'c, - ) -> Result>, ContractError> { - Ok(self.operations( - self.state - .fungible_all() - .copied() - .map(OutputAssignment::transmute), - self.fungible(name, outpoint_filter)?, - )) + pub fn history_fungible( + &self, + filter_outpoints: impl AssignmentsFilter, + filter_witnesses: impl AssignmentsFilter, + ) -> Vec { + self.operations(|state| state.fungible_all(), filter_outpoints, filter_witnesses) } - pub fn data_ops<'c, C: StateChange>( - &'c self, - name: impl Into, - outpoint_filter: impl OutpointFilter + Copy + 'c, - ) -> Result>, ContractError> { - Ok(self.operations( - self.state - .data_all() - .cloned() - .map(OutputAssignment::transmute), - self.data(name, outpoint_filter)?, - )) + pub fn history_rights( + &self, + filter_outpoints: impl AssignmentsFilter, + filter_witnesses: impl AssignmentsFilter, + ) -> Vec { + self.operations(|state| state.rights_all(), filter_outpoints, filter_witnesses) } - pub fn rights_ops<'c, C: StateChange>( - &'c self, - name: impl Into, - outpoint_filter: impl OutpointFilter + Copy + 'c, - ) -> Result>, ContractError> { - Ok(self.operations( - self.state - .rights_all() - .copied() - .map(OutputAssignment::transmute), - self.rights(name, outpoint_filter)?, - )) + pub fn history_data( + &self, + filter_outpoints: impl AssignmentsFilter, + filter_witnesses: impl AssignmentsFilter, + ) -> Vec { + self.operations(|state| state.data_all(), filter_outpoints, filter_witnesses) } - pub fn attachment_ops<'c, C: StateChange>( - &'c self, - name: impl Into, - outpoint_filter: impl OutpointFilter + Copy + 'c, - ) -> Result>, ContractError> { - Ok(self.operations( - self.state - .attach_all() - .cloned() - .map(OutputAssignment::transmute), - self.attachments(name, outpoint_filter)?, - )) + pub fn history_attach( + &self, + filter_outpoints: impl AssignmentsFilter, + filter_witnesses: impl AssignmentsFilter, + ) -> Vec { + self.operations(|state| state.attach_all(), filter_outpoints, filter_witnesses) + } + + pub fn witness_info(&self, witness_id: XWitnessId) -> Option { + let ord = self.state.witness_ord(witness_id)?; + Some(WitnessInfo { + id: witness_id, + ord, + }) } } diff --git a/src/interface/filter.rs b/src/interface/filter.rs index 5e802fff..b76ccd65 100644 --- a/src/interface/filter.rs +++ b/src/interface/filter.rs @@ -22,88 +22,110 @@ use std::collections::{BTreeMap, BTreeSet, HashMap, HashSet}; use std::ops::Deref; -use rgb::XOutpoint; - -pub trait OutpointFilter { - fn include_outpoint(&self, outpoint: impl Into) -> bool; +use rgb::{XOutpoint, XWitnessId}; + +pub trait AssignmentsFilter { + fn should_include( + &self, + outpoint: impl Into, + witness_id: Option, + ) -> bool; } pub struct FilterIncludeAll; pub struct FilterExclude(pub T); -impl OutpointFilter for FilterIncludeAll { - fn include_outpoint(&self, _: impl Into) -> bool { true } +impl AssignmentsFilter for FilterIncludeAll { + fn should_include(&self, _: impl Into, _: Option) -> bool { true } } -impl OutpointFilter for FilterExclude { - fn include_outpoint(&self, outpoint: impl Into) -> bool { - !self.0.include_outpoint(outpoint.into()) +impl AssignmentsFilter for FilterExclude { + fn should_include( + &self, + outpoint: impl Into, + witness_id: Option, + ) -> bool { + !self.0.should_include(outpoint.into(), witness_id) } } -impl OutpointFilter for &T { - fn include_outpoint(&self, outpoint: impl Into) -> bool { - (*self).include_outpoint(outpoint) +impl AssignmentsFilter for &T { + fn should_include( + &self, + outpoint: impl Into, + witness_id: Option, + ) -> bool { + (*self).should_include(outpoint, witness_id) } } -impl OutpointFilter for &mut T { - fn include_outpoint(&self, outpoint: impl Into) -> bool { - self.deref().include_outpoint(outpoint) +impl AssignmentsFilter for &mut T { + fn should_include( + &self, + outpoint: impl Into, + witness_id: Option, + ) -> bool { + self.deref().should_include(outpoint, witness_id) } } -impl OutpointFilter for Option { - fn include_outpoint(&self, outpoint: impl Into) -> bool { +impl AssignmentsFilter for Option { + fn should_include( + &self, + outpoint: impl Into, + witness_id: Option, + ) -> bool { self.as_ref() - .map(|filter| filter.include_outpoint(outpoint)) + .map(|filter| filter.should_include(outpoint, witness_id)) .unwrap_or(true) } } -impl OutpointFilter for XOutpoint { - fn include_outpoint(&self, outpoint: impl Into) -> bool { *self == outpoint.into() } +impl AssignmentsFilter for XOutpoint { + fn should_include(&self, outpoint: impl Into, _: Option) -> bool { + *self == outpoint.into() + } } -impl OutpointFilter for [XOutpoint; LEN] { - fn include_outpoint(&self, outpoint: impl Into) -> bool { +impl AssignmentsFilter for [XOutpoint; LEN] { + fn should_include(&self, outpoint: impl Into, _: Option) -> bool { self.contains(&outpoint.into()) } } -impl OutpointFilter for &[XOutpoint] { - fn include_outpoint(&self, outpoint: impl Into) -> bool { +impl AssignmentsFilter for &[XOutpoint] { + fn should_include(&self, outpoint: impl Into, _: Option) -> bool { self.contains(&outpoint.into()) } } -impl OutpointFilter for Vec { - fn include_outpoint(&self, outpoint: impl Into) -> bool { +impl AssignmentsFilter for Vec { + fn should_include(&self, outpoint: impl Into, _: Option) -> bool { self.contains(&outpoint.into()) } } -impl OutpointFilter for HashSet { - fn include_outpoint(&self, outpoint: impl Into) -> bool { +impl AssignmentsFilter for HashSet { + fn should_include(&self, outpoint: impl Into, _: Option) -> bool { self.contains(&outpoint.into()) } } -impl OutpointFilter for BTreeSet { - fn include_outpoint(&self, outpoint: impl Into) -> bool { +impl AssignmentsFilter for BTreeSet { + fn should_include(&self, outpoint: impl Into, _: Option) -> bool { self.contains(&outpoint.into()) } } -impl OutpointFilter for HashMap { - fn include_outpoint(&self, outpoint: impl Into) -> bool { +impl AssignmentsFilter for HashMap { + fn should_include(&self, outpoint: impl Into, _: Option) -> bool { let outpoint = outpoint.into(); self.keys().any(|o| *o == outpoint) } } -impl OutpointFilter for BTreeMap { - fn include_outpoint(&self, outpoint: impl Into) -> bool { +impl AssignmentsFilter for BTreeMap { + fn should_include(&self, outpoint: impl Into, _: Option) -> bool { let outpoint = outpoint.into(); self.keys().any(|o| *o == outpoint) } diff --git a/src/interface/iface.rs b/src/interface/iface.rs index c6cbfaaf..d4a904fc 100644 --- a/src/interface/iface.rs +++ b/src/interface/iface.rs @@ -30,7 +30,7 @@ use amplify::{ByteArray, Bytes32}; use baid64::{Baid64ParseError, DisplayBaid64, FromBaid64Str}; use chrono::{DateTime, TimeZone, Utc}; use commit_verify::{CommitId, CommitmentId, DigestExt, Sha256}; -use rgb::{Identity, Occurrences}; +use rgb::{ContractId, Identity, Occurrences, SchemaId, XWitnessId}; use strict_encoding::{ FieldName, StrictDecode, StrictDeserialize, StrictDumb, StrictEncode, StrictSerialize, StrictType, TypeName, VariantName, @@ -39,7 +39,7 @@ use strict_types::{SemId, SymbolicSys, TypeLib}; use crate::interface::{ContractIface, IfaceDisplay, IfaceImpl, VerNo}; use crate::persistence::{ContractStateRead, SchemaIfaces}; -use crate::LIB_NAME_RGB_STD; +use crate::{WitnessInfo, LIB_NAME_RGB_STD}; /// Interface identifier. /// @@ -246,7 +246,11 @@ pub enum OwnedIface { impl OwnedIface { pub fn sem_id(&self) -> Option { - if let Self::Data(id) = self { Some(*id) } else { None } + if let Self::Data(id) = self { + Some(*id) + } else { + None + } } } @@ -355,6 +359,15 @@ pub trait IfaceWrapper { /// Constructs information object describing a specific class in terms of /// the interface class. fn info(&self) -> Self::Info; + + /// Returns contract id. + fn contract_id(&self) -> ContractId; + + /// Returns schema id of the contract. + fn schema_id(&self) -> SchemaId; + + /// Returns information about a witness, if it is known to the contract state. + fn witness_info(&self, witness_id: XWitnessId) -> Option; } /// Interface definition. @@ -600,7 +613,11 @@ impl Iface { } } - if errors.is_empty() { Ok(()) } else { Err(errors) } + if errors.is_empty() { + Ok(()) + } else { + Err(errors) + } } // TODO: Implement checking interface inheritance. diff --git a/src/interface/iimpl.rs b/src/interface/iimpl.rs index bad1a1c6..1e528ed1 100644 --- a/src/interface/iimpl.rs +++ b/src/interface/iimpl.rs @@ -554,6 +554,10 @@ impl IfaceImpl { } } - if errors.is_empty() { Ok(()) } else { Err(errors) } + if errors.is_empty() { + Ok(()) + } else { + Err(errors) + } } } diff --git a/src/interface/inheritance.rs b/src/interface/inheritance.rs index 8a1f945b..518c0595 100644 --- a/src/interface/inheritance.rs +++ b/src/interface/inheritance.rs @@ -137,7 +137,11 @@ impl CheckInheritance for Schema { } } - if status.is_empty() { Ok(()) } else { Err(status) } + if status.is_empty() { + Ok(()) + } else { + Err(status) + } } } @@ -208,7 +212,11 @@ where T: OpSchema } } - if status.is_empty() { Ok(()) } else { Err(status) } + if status.is_empty() { + Ok(()) + } else { + Err(status) + } } } @@ -503,7 +511,11 @@ impl Iface { .map_err(|_| errors.push(ExtensionError::InheritanceOverflow)) .ok(); - if errors.is_empty() { Ok(self) } else { Err(errors) } + if errors.is_empty() { + Ok(self) + } else { + Err(errors) + } } } @@ -575,7 +587,11 @@ impl GenesisIface { check_presence(&mut self.valencies, ext.valencies, op.clone(), "valency", &mut errors); check_presence(&mut self.errors, ext.errors, op.clone(), "error", &mut errors); - if errors.is_empty() { Ok(self) } else { Err(errors) } + if errors.is_empty() { + Ok(self) + } else { + Err(errors) + } } } @@ -612,7 +628,11 @@ impl TransitionIface { } } - if errors.is_empty() { Ok(self) } else { Err(errors) } + if errors.is_empty() { + Ok(self) + } else { + Err(errors) + } } } @@ -649,7 +669,11 @@ impl ExtensionIface { } } - if errors.is_empty() { Ok(self) } else { Err(errors) } + if errors.is_empty() { + Ok(self) + } else { + Err(errors) + } } } diff --git a/src/interface/mod.rs b/src/interface/mod.rs index ea5ef2d9..496ce87e 100644 --- a/src/interface/mod.rs +++ b/src/interface/mod.rs @@ -34,11 +34,11 @@ mod inheritance; pub use builder::{BuilderError, ContractBuilder, TransitionBuilder, TxOutpoint}; pub use contract::{ - AllocatedState, AmountChange, AttachAllocation, ContractError, ContractIface, DataAllocation, - FungibleAllocation, IfaceOp, OwnedAllocation, RightsAllocation, StateChange, + AllocatedState, AttachAllocation, ContractError, ContractIface, ContractOp, DataAllocation, + FungibleAllocation, OpDirection, OwnedAllocation, RightsAllocation, }; pub use contractum::IfaceDisplay; -pub use filter::{FilterExclude, FilterIncludeAll, OutpointFilter}; +pub use filter::{AssignmentsFilter, FilterExclude, FilterIncludeAll}; pub use iface::{ ArgMap, AssignIface, ExtensionIface, GenesisIface, GlobalIface, Iface, IfaceClass, IfaceId, IfaceInconsistency, IfaceRef, IfaceWrapper, Modifier, OpName, OwnedIface, Req, TransitionIface, diff --git a/src/lib.rs b/src/lib.rs index 5adfce94..d428aa06 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -47,8 +47,7 @@ pub mod info; pub use bp::{Outpoint, Txid}; pub use contract::{ - BundleExt, KnownState, MergeReveal, MergeRevealError, OutputAssignment, RevealError, - TypedAssignsExt, + KnownState, MergeReveal, MergeRevealError, OutputAssignment, TypedAssignsExt, WitnessInfo, }; pub use invoice::{Allocation, Amount, CoinAmount, OwnedFraction, Precision, TokenIndex}; pub use rgb::prelude::*; diff --git a/src/persistence/index.rs b/src/persistence/index.rs index a047d7d0..b07b831c 100644 --- a/src/persistence/index.rs +++ b/src/persistence/index.rs @@ -171,12 +171,13 @@ impl Index

{ } for WitnessBundle { pub_witness, - bundle, - anchor: _, + anchored_bundles, } in consignment.bundled_witnesses() { let witness_id = pub_witness.to_witness_id(); - self.index_bundle(contract_id, bundle, witness_id)?; + for bundle in anchored_bundles.bundles() { + self.index_bundle(contract_id, bundle, witness_id)?; + } } Ok(()) diff --git a/src/persistence/memory.rs b/src/persistence/memory.rs index 7d4ce810..5b5d229e 100644 --- a/src/persistence/memory.rs +++ b/src/persistence/memory.rs @@ -580,7 +580,7 @@ impl StateReadProvider for MemState { let ord = self .witnesses .get(&witness_id) - .ok_or(StateInconsistency::AbsentValidWitness)?; + .ok_or(StateInconsistency::AbsentWitness(witness_id))?; Ok(ord.is_valid()) } } @@ -1082,6 +1082,11 @@ impl> ContractStateRead for MemContract { #[inline] fn schema_id(&self) -> SchemaId { self.unfiltered.borrow().schema_id } + #[inline] + fn witness_ord(&self, witness_id: XWitnessId) -> Option { + self.filter.get(&witness_id).copied() + } + #[inline] fn rights_all(&self) -> impl Iterator> { self.unfiltered @@ -1340,7 +1345,7 @@ impl IndexReadProvider for MemIndex { &self, bundle_id: BundleId, ) -> Result<(impl Iterator, ContractId), IndexReadError> { - let witness_ids = self + let witness_id = self .bundle_witness_index .get(&bundle_id) .ok_or(IndexInconsistency::BundleWitnessUnknown(bundle_id))?; @@ -1348,7 +1353,7 @@ impl IndexReadProvider for MemIndex { .bundle_contract_index .get(&bundle_id) .ok_or(IndexInconsistency::BundleContractUnknown(bundle_id))?; - Ok((witness_ids.iter().copied(), *contract_id)) + Ok((witness_id.iter().cloned(), *contract_id)) } } @@ -1382,12 +1387,10 @@ impl IndexWriteProvider for MemIndex { } .into()); } - let mut set = self - .bundle_witness_index - .remove(&bundle_id)? - .unwrap_or_default(); - set.push(witness_id)?; - self.bundle_witness_index.insert(bundle_id, set)?; + self.bundle_witness_index + .entry(bundle_id)? + .or_default() + .push(witness_id)?; let present2 = self .bundle_contract_index .insert(bundle_id, contract_id)? @@ -1516,7 +1519,10 @@ impl MemIndex { .remove(&seal) .expect("can have zero elements") { - Some(mut existing_opouts) => existing_opouts.push(opout)?, + Some(mut existing_opouts) => { + existing_opouts.push(opout)?; + let _ = self.terminal_index.insert(seal, existing_opouts); + } None => { self.terminal_index.insert(seal, tiny_bset![opout])?; } diff --git a/src/persistence/stash.rs b/src/persistence/stash.rs index 0924fdd0..c42764e9 100644 --- a/src/persistence/stash.rs +++ b/src/persistence/stash.rs @@ -513,8 +513,8 @@ impl Stash

{ .map_err(StashError::WriteProvider)?; } - for bw in consignment.bundles { - self.consume_bundled_witness(contract_id, bw)?; + for witness_bundles in consignment.bundles { + self.consume_witness_bundle(contract_id, witness_bundles)?; } for (id, attach) in consignment.attachments { @@ -545,28 +545,95 @@ impl Stash

{ }) } - fn consume_bundled_witness( + fn consume_witness_bundle( &mut self, contract_id: ContractId, - bundled_witness: WitnessBundle, + witness_bundle: WitnessBundle, ) -> Result<(), StashError

> { let WitnessBundle { pub_witness, - bundle, - anchor, - } = bundled_witness; + anchored_bundles, + } = witness_bundle; - // TODO: Save pub witness transaction and SPVs + // TODO: Save pub witness transaction SPVs - let bundle_id = bundle.bundle_id(); - self.consume_bundle(bundle)?; + let mut anchors = Vec::with_capacity(2); + for (anchor, bundle) in anchored_bundles.into_iter() { + let bundle_id = bundle.bundle_id(); + self.consume_bundle(bundle)?; - let proto = mpc::ProtocolId::from_byte_array(contract_id.to_byte_array()); - let msg = mpc::Message::from_byte_array(bundle_id.to_byte_array()); - let merkle_block = MerkleBlock::with(&anchor.mpc_proof, proto, msg)?; - let anchors = match anchor.dbc_proof { - DbcProof::Tapret(tapret) => AnchorSet::Tapret(Anchor::new(merkle_block, tapret)), - DbcProof::Opret(opret) => AnchorSet::Opret(Anchor::new(merkle_block, opret)), + let proto = mpc::ProtocolId::from_byte_array(contract_id.to_byte_array()); + let msg = mpc::Message::from_byte_array(bundle_id.to_byte_array()); + let merkle_block = MerkleBlock::with(&anchor.mpc_proof, proto, msg)?; + anchors.push(Anchor::new(merkle_block, anchor.dbc_proof)); + } + + let anchors = match (anchors.pop().unwrap(), anchors.pop()) { + ( + Anchor { + dbc_proof: DbcProof::Opret(opret), + mpc_proof, + .. + }, + None, + ) => AnchorSet::Opret(Anchor::new(mpc_proof, opret)), + ( + Anchor { + dbc_proof: DbcProof::Tapret(tapret), + mpc_proof, + .. + }, + None, + ) => AnchorSet::Tapret(Anchor::new(mpc_proof, tapret)), + ( + Anchor { + dbc_proof: DbcProof::Tapret(tapret), + mpc_proof: mpc_proof_tapret, + .. + }, + Some(Anchor { + dbc_proof: DbcProof::Opret(opret), + mpc_proof: mpc_proof_opret, + .. + }), + ) + | ( + Anchor { + dbc_proof: DbcProof::Opret(opret), + mpc_proof: mpc_proof_opret, + .. + }, + Some(Anchor { + dbc_proof: DbcProof::Tapret(tapret), + mpc_proof: mpc_proof_tapret, + .. + }), + ) => AnchorSet::Double { + tapret: Anchor::new(mpc_proof_tapret, tapret), + opret: Anchor::new(mpc_proof_opret, opret), + }, + ( + Anchor { + dbc_proof: DbcProof::Opret(_), + .. + }, + Some(Anchor { + dbc_proof: DbcProof::Opret(_), + .. + }), + ) + | ( + Anchor { + dbc_proof: DbcProof::Tapret(_), + .. + }, + Some(Anchor { + dbc_proof: DbcProof::Tapret(_), + .. + }), + ) => unreachable!( + "these combinations must be prevented at the `AnchoredBundles` structure level" + ), }; let witness = SealWitness { public: pub_witness.clone(), @@ -707,7 +774,7 @@ pub trait StashWriteProvider: StoreTransaction { fn replace_bundle(&mut self, bundle: TransitionBundle) -> Result; fn replace_witness(&mut self, witness: SealWitness) -> Result; fn replace_attachment(&mut self, id: AttachId, attach: MediumBlob) - -> Result; + -> Result; fn replace_lib(&mut self, lib: Lib) -> Result; fn consume_types(&mut self, types: TypeSystem) -> Result<(), Self::Error>; diff --git a/src/persistence/state.rs b/src/persistence/state.rs index 621ec2eb..4e8c21d8 100644 --- a/src/persistence/state.rs +++ b/src/persistence/state.rs @@ -52,6 +52,10 @@ pub enum StateError { #[display(doc_comments)] Resolver(XWitnessId, WitnessResolverError), + /// valid (non-archived) witness is absent in the list of witnesses for a + /// state transition bundle. + AbsentValidWitness, + /// {0} /// /// It may happen due to RGB standard library bug, or indicate internal @@ -66,9 +70,8 @@ pub enum StateError { pub enum StateInconsistency { /// contract state {0} is not known. UnknownContract(ContractId), - /// valid (non-archived) witness is absent in the list of witnesses for a - /// state transition bundle. - AbsentValidWitness, + /// a witness {0} is absent from the state data. + AbsentWitness(XWitnessId), } #[derive(Clone, Eq, PartialEq, Debug, Hash)] @@ -148,7 +151,7 @@ impl State

{ return Ok(witness_id); } } - Err(StateError::Inconsistency(StateInconsistency::AbsentValidWitness)) + Err(StateError::AbsentValidWitness) } pub fn update_from_bundle( @@ -190,7 +193,7 @@ impl State

{ .collect::>(); let mut ordered_extensions = BTreeMap::new(); for witness_bundle in consignment.bundled_witnesses() { - for transition in witness_bundle.bundle.known_transitions.values() { + for transition in witness_bundle.known_transitions() { let witness_id = witness_bundle.pub_witness.to_witness_id(); let witness_ord = resolver .resolve_pub_witness_ord(witness_id) @@ -305,6 +308,7 @@ pub trait StateWriteProvider: StoreTransaction { pub trait ContractStateRead: ContractStateAccess { fn contract_id(&self) -> ContractId; fn schema_id(&self) -> SchemaId; + fn witness_ord(&self, witness_id: XWitnessId) -> Option; fn rights_all(&self) -> impl Iterator>; fn fungible_all(&self) -> impl Iterator>; fn data_all(&self) -> impl Iterator>; diff --git a/src/persistence/stock.rs b/src/persistence/stock.rs index 3f2e1849..4b778ca1 100644 --- a/src/persistence/stock.rs +++ b/src/persistence/stock.rs @@ -27,7 +27,7 @@ use std::fmt::Debug; use amplify::confinement::{Confined, U24}; use amplify::Wrapper; -use bp::dbc::{Anchor, Method}; +use bp::dbc::Method; use bp::seals::txout::CloseMethod; use bp::Vout; use chrono::Utc; @@ -49,17 +49,18 @@ use super::{ StateWriteProvider, StoreTransaction, }; use crate::containers::{ - AnchorSet, Batch, BuilderSeal, Consignment, ContainerVer, ContentId, ContentRef, Contract, - Fascia, Kit, SealWitness, SupplItem, SupplSub, Transfer, TransitionDichotomy, TransitionInfo, - TransitionInfoError, ValidConsignment, ValidContract, ValidKit, ValidTransfer, VelocityHint, - WitnessBundle, SUPPL_ANNOT_VELOCITY, + AnchorSet, AnchoredBundleMismatch, Batch, BuilderSeal, ClientBundle, Consignment, ContainerVer, + ContentId, ContentRef, Contract, Fascia, Kit, SealWitness, SupplItem, SupplSub, Transfer, + TransitionDichotomy, TransitionInfo, TransitionInfoError, UnrelatedTransition, + ValidConsignment, ValidContract, ValidKit, ValidTransfer, VelocityHint, WitnessBundle, + SUPPL_ANNOT_VELOCITY, }; use crate::info::{ContractInfo, IfaceInfo, SchemaInfo}; use crate::interface::{ BuilderError, ContractBuilder, ContractIface, Iface, IfaceClass, IfaceId, IfaceRef, IfaceWrapper, TransitionBuilder, }; -use crate::{BundleExt, MergeRevealError, RevealError}; +use crate::MergeRevealError; pub type ContractAssignments = HashMap>; @@ -107,6 +108,10 @@ pub enum StockError< #[from] StashData(StashDataError), + /// valid (non-archived) witness is absent in the list of witnesses for a + /// state transition bundle. + AbsentValidWitness, + /// witness {0} can't be resolved: {1} WitnessUnresolved(XWitnessId, WitnessResolverError), } @@ -133,6 +138,7 @@ impl From Self::StateWrite(err), StateError::Inconsistency(e) => Self::StateInconsistency(e), StateError::Resolver(id, e) => Self::WitnessUnresolved(id, e), + StateError::AbsentValidWitness => Self::AbsentValidWitness, } } } @@ -169,7 +175,11 @@ pub enum ConsignError { #[from] #[display(inner)] - Reveal(RevealError), + Transition(UnrelatedTransition), + + #[from] + #[display(inner)] + AnchoredBundle(AnchoredBundleMismatch), /// the spent state from transition {1} inside bundle {0} is concealed. Concealed(BundleId, OpId), @@ -187,10 +197,16 @@ impl From Self { Self::InvalidInput(err.into()) } } -impl From +impl From for StockError { - fn from(err: RevealError) -> Self { Self::InvalidInput(err.into()) } + fn from(err: UnrelatedTransition) -> Self { Self::InvalidInput(err.into()) } +} + +impl From + for StockError +{ + fn from(err: AnchoredBundleMismatch) -> Self { Self::InvalidInput(err.into()) } } #[derive(Clone, PartialEq, Eq, Debug, Display, Error, From)] @@ -303,6 +319,7 @@ macro_rules! stock_err_conv { StockError::IndexWrite(e) => StockError::IndexWrite(e), StockError::StateRead(e) => StockError::StateRead(e), StockError::StateWrite(e) => StockError::StateWrite(e), + StockError::AbsentValidWitness => StockError::AbsentValidWitness, StockError::StashData(e) => StockError::StashData(e), StockError::StashInconsistency(e) => StockError::StashInconsistency(e), StockError::StateInconsistency(e) => StockError::StateInconsistency(e), @@ -493,8 +510,8 @@ impl Stock { &'a self, ) -> Result< impl Iterator< - Item = > as IfaceWrapper>>::Info, - > + 'a, + Item = > as IfaceWrapper>>::Info, + > + 'a, StockError, > { Ok(self.stash.geneses_by::()?.filter_map(|genesis| { @@ -526,8 +543,14 @@ impl Stock { let state = self.state.contract_state(contract_id)?; let schema_id = state.schema_id(); let schema_ifaces = self.stash.schema(schema_id)?; - let info = ContractInfo::with(self.stash.genesis(contract_id)?); - Ok((schema_ifaces, state, info)) + Ok((schema_ifaces, state, self.contract_info(contract_id)?)) + } + + pub fn contract_info( + &self, + contract_id: ContractId, + ) -> Result> { + Ok(ContractInfo::with(self.stash.genesis(contract_id)?)) } pub fn contract_state( @@ -745,7 +768,7 @@ impl Stock { opouts.extend(self.index.opouts_by_terminals(secret_seal.into_iter())?); // 1.3. Collect all state transitions assigning state to the provided outpoints - let mut witness_bundles = BTreeMap::::new(); + let mut anchored_bundles = BTreeMap::::new(); let mut transitions = BTreeMap::::new(); let mut terminals = BTreeMap::>::new(); for opout in opouts { @@ -768,9 +791,8 @@ impl Stock { } } - if let Entry::Vacant(entry) = witness_bundles.entry(bundle_id) { - let bw = self.witness_bundle(bundle_id)?; - entry.insert(bw); + if let Entry::Vacant(entry) = anchored_bundles.entry(bundle_id) { + entry.insert(self.client_bundle(bundle_id)?); } } @@ -787,10 +809,9 @@ impl Stock { ids.extend(transition.inputs().iter().map(|input| input.prev_out.op)); transitions.insert(id, transition.clone()); let bundle_id = self.index.bundle_id_for_op(transition.id())?; - witness_bundles + anchored_bundles .entry(bundle_id) - .or_insert(self.witness_bundle(bundle_id)?.clone()) - .bundle + .or_insert(self.client_bundle(bundle_id)?.clone()) .reveal_transition(transition.clone())?; } @@ -836,16 +857,16 @@ impl Stock { let ifaces = Confined::from_checked(ifaces); let mut bundles = BTreeMap::::new(); - for witness_bundle in witness_bundles.into_values() { - let witness_id = witness_bundle.witness_id(); - match bundles.get_mut(&witness_id) { - Some(prev) => { - *prev = prev.clone().merge_reveal(witness_bundle)?; - } - None => { - bundles.insert(witness_id, witness_bundle); - } - } + for anchored_bundle in anchored_bundles.into_values() { + let witness_ids = self.index.bundle_info(anchored_bundle.bundle_id())?.0; + let witness_id = self.state.select_valid_witness(witness_ids)?; + let pub_witness = self.stash.witness(witness_id)?.public.clone(); + let wb = match bundles.remove(&witness_id) { + Some(bundle) => bundle.into_double(anchored_bundle)?, + None => WitnessBundle::with(pub_witness, anchored_bundle), + }; + let res = bundles.insert(witness_id, wb); + debug_assert!(res.is_none()); } let bundles = Confined::try_from_iter(bundles.into_values()) .map_err(|_| ConsignError::TooManyBundles)?; @@ -1340,7 +1361,7 @@ impl Stock { .ok_or(ConsignError::Concealed(bundle_id, opid).into()) } - fn witness_bundle(&self, bundle_id: BundleId) -> Result> { + fn client_bundle(&self, bundle_id: BundleId) -> Result> { let (witness_ids, contract_id) = self.index.bundle_info(bundle_id)?; let bundle = self.stash.bundle(bundle_id)?.clone(); @@ -1370,15 +1391,10 @@ impl Stock { ) .into()); }; - let anchor = Anchor::new(mpc_proof, dbc); // TODO: Conceal all transitions except the one we need - Ok(WitnessBundle { - pub_witness: witness.public.clone(), - bundle, - anchor, - }) + Ok(ClientBundle::new(mpc_proof, dbc, bundle)) } pub fn store_secret_seal( diff --git a/src/stl/stl.rs b/src/stl/stl.rs index 2aeb050b..c0243564 100644 --- a/src/stl/stl.rs +++ b/src/stl/stl.rs @@ -41,7 +41,7 @@ use crate::LIB_NAME_RGB_STD; /// Strict types id for the library providing standard data types which may be /// used in RGB smart contracts. pub const LIB_ID_RGB_STORAGE: &str = - "stl:YBgLtVmT-FuzNBPe-1fxIqay-JW4Evd5-Za7fm9w-GLF6JAg#transit-xray-giraffe"; + "stl:mG$H7b6I-$T8qp18-07PSNeA-rbEBNS5-$J5X4y0-1vPxRWg#channel-vortex-bandit"; /// Strict types id for the library providing standard data types which may be /// used in RGB smart contracts. @@ -50,7 +50,7 @@ pub const LIB_ID_RGB_CONTRACT: &str = /// Strict types id for the library representing of RGB StdLib data types. pub const LIB_ID_RGB_STD: &str = - "stl:H1HLPfyC-5YLlAk!-KWhcUo1-0vtex!9-ODxSmIA-zj1J$qc#western-craft-bogart"; + "stl:JhUC5JgH-Kwps4cO-ZNUklUj-UP6boFp-OY!18Kx-xOSJaVQ#hair-magnum-helena"; fn _rgb_std_stl() -> Result { LibBuilder::new(libname!(LIB_NAME_RGB_STD), tiny_bset! { diff --git a/stl/RGBStd@0.11.0.sta b/stl/RGBStd@0.11.0.sta index bec475b7..5c9d924c 100644 --- a/stl/RGBStd@0.11.0.sta +++ b/stl/RGBStd@0.11.0.sta @@ -1,306 +1,311 @@ -----BEGIN STRICT TYPE LIB----- -Id: stl:H1HLPfyC-5YLlAk!-KWhcUo1-0vtex!9-ODxSmIA-zj1J$qc#western-craft-bogart +Id: stl:JhUC5JgH-Kwps4cO-ZNUklUj-UP6boFp-OY!18Kx-xOSJaVQ#hair-magnum-helena Name: RGBStd Dependencies: + RGBCommit#harvest-person-orion, StrictTypes#century-comrade-chess, + BPCore#austin-story-retro, AluVM#congo-archive-folio, - RGBCommit#tuna-safari-design, - RGBLogic#explain-marvin-bless, CommitVerify#miller-pancake-elastic, - BPCore#totem-holiday-helena, Std#ralph-blue-lucky, Bitcoin#signal-color-cipher -Check-SHA256: 04b8598c3e334bc5ad1ed6d7f4d5b7aaec4e86a6205329e4b40d3a089dbc918f +Check-SHA256: 6a9228bc3dd61ed396d19a0d3e71c3a3dfc999d232e57ec13c1488bb0b6eeb91 -22w{tQ*>kqMe3tp+xFv-0Xp&G?S=|}9rRaeU`~uMrbA>C`}q*r3sZD*X=8L$d2nTOVsJHoA?4$swuZp1 -Wc+9AOf`(TIbyKWjTy4WkGaM+1wm|eR!wBY)d@|xKsr716mTQmaB}ROZ@Dgs2ia_2=g^?i+KdTOM?yny -ZEb0EZYmQ7jMFx!r5s@rJ-O*H1;I5Y*Jq{lbOS_Kbz-c)2vSEvOmAmtV|oJ}-)Viz@~C%8KNS}Z0aQ3s -^SOqbBwN-D{wl@OCJaMwZEb0ER%LQ&W_hMrvQRIBF~gy)hQg^4yxce6i-HaxmCGKABZpBR?$8E8P(yEW -Wy&lbZ-bfLFbqC#o>4E?M+l67UG^w8*<_XZ#%uyqCj(P-Wc6$lVk7oBr%DNv+($;q`HHK!gIHa)*%m(- -e#9sm3I{@IbYpL6ZU_ZIY;{&m1^^NSr?vtRe2PRb^)}W8ZdqCQlr&gKJ5X<}{fp(f$H -b>aU=OZ$bvG|>z)+>9PT;Au-7)~D;-++hbyX<}1pbY+s|KgxOTbXgHlB~91)qbQqD?1jgn -N8blYb74+lZDpr0RRS&fT*&Z=qeY@Wmfle*z!SF)@h8|JkU^FEQwjx4X<|uavkfUR&BN*@p#4(ibP}+p -taQ)Oq;;uu>eaRuf?``QO_k(5tm>UaGoca9LuK7Ij+X8IutaRAF#(Wpqw&WMxoca&&HGau2p2m_Hir -tB!lh<{Yi-S-!KI0_27BH<@sVme~^s3=33YaB^jIP;zf?W)s9yQf4Q+L?w(nXY|a%e*XOAC%4aD5B-6U -FMfO2d=FG%aB^jIP+@dvP;zf?W-hl7CAn^87TS9h9ibhaZ&^Bcn*B*;w|~I;-PD|t>jq6_bZBp6I6q=8 -aZ}RBA(1@GcO9QSWZ!o3C{DXc_Cg)w39@m$R6qOEzWQ+NTC@=;{OM>iY* -&c?b?aZznm(1lyi>kUF|X>MdwWnpYocxhy@ZeT05|jA;vvYupWm6Q)O{ZZweWZ*HiKem1Z9kJM|+< -C6E3~$lVDiq#NV}y^f+rssvPcNp2zIK10Q-T=FR=Q=>S+XYD&bY*ifyRPVjiFd`Y2QhLn&64&owka*miGSR> --o?7a>3`V^RAF#VZ)9aiVRL9T+8q@+Aa1+e+@!-jhcW8%o2S}z-#y5JARJB>wYeM!OmAarRB3HxICTWE -OMDJSZAYFLM|~u8B!Bn=Wb8dls`ok|_d#@P2~%ljQ)6;zaCBd+*=^-NPQ?`2v5jYd+6t@dEhY>7H!Y*U -dZb-BpG^u(WnpGhV{&P5bdWn_aCwA}8zxgKpy7|rEn>a@Jg9&ldILR+=b-aAzAVr?5I2ooM2Ulry -Ze??Gqk=;7%h%D+p%U7S;b1RT)c9`>#Kd;Rz-U=aO9W+B1XOrwWTLLzo&{8RR%LRjg@kugo@o29zwXDHA;ech!BqJAy+4@X(~&*rw>NkSNp5sya&BR4P;0g`38@&r -wvr8Q$XKK#ha*N>X+Ls92fzOv*E(~7PRR#MWnpGkWpcj!9{gsd8U18ZYC02#KAOx^Y=h@ -bX*KmV{&P5bWn9-Yh`)Fa%+!|DA9Vsm&hHC4WXN2M4aZ(WL^Hp>3BS~hw-BaLV0v$Q*?60dm);?_c?BI -Mu4qFRxf<)p=@qHCf(fs{C;c$=G;UARCwrWK+Rkw`Mu(V|7oQWGN(Z+AyvH&RuaL#N4?X)a%pCH1^_soLxv|6 -1vo|i^jdP;% -w2}rc(F;vwa%*g5P;zf?W|Q||cyL4!ji%3ykIJtwI*nu%&Q~z;Vl^%5w -S6(#;{6ajG64wDPk{-(rQe|^xa&~28LV0v$b2R>f7D?ZDzCQez5c=X9w<(f6`q$DH-G17V_XV{1(H;&` -Wpib6c4cHjd30rSI0;fmLPKwDZE18w00U?O%&6V>N}#h955#ht!=;R2Lj=uo+MI7C_W0!u+z&-~bY*UH -X>V>*V`yb|`fdzI -Y;R&=Y*t}xb!BrDB|MH$#iox7(epK^GJZz3uq*Cb2l>R6Lh9EroO>_{O=WapR$**)WfhrcWXrXyKnGOw -A#t$mH2bG7pQ)aE=^FQF!@KkQhzLn;aCLM|VQ?5o)zidWvABmX&uCxQ{9vUAsn@)h(<^=)@3p(i4FwHH -Wo~72X>(I!Xk~3-Bv(?{Wq|OU%4#DwR1!oWV0@!2f9}lj6c7M!3JEHV3_)ykOksItaxqh7bR|V}zQMU~ -Cv3(oCX8r!*SiR9zOp;)>$$b(q=dpw@(@pVZe?UsbYXO5Q)6glZDA=T4hF%Q&3qd{UvF)tP|M@Vc@bh1 -|A(%Z=^thBTg(YTb8}^MRAFaxF0!Tm7r-z?Fqq(6n;Tke)*kJ44PoBPfF{#q^A_Q|307}uWK(oubY(K0 -R#67|O%*Grnxkw0HI;&$`LH+T3zWkAaKFZV1ceDiVRT_rbYXO5G*S<)6P6lYy(#<=BR_>s@(?%#f7ArN --=Rj?7Ns(14peesZgXjLX>V>+d2nSm!8D=zpn(&o-7tVWUa<1Q{n`|;)uYyv!)~4rGOBqCPh(?sa&l#E -V`XzWC-dJ*Ygad93@i9pCb+uV$agN<27ESr7(9FG*~&H@L349yXKq$+X=GD$VRU6eY-w&}Q)OXnRCrKy -ayffohRF9oualB}P71SaJfwx=uHX^JIK`}x&T2C;PAKlCCveQ{N4udSh#@3Dqj&&J9b8~5DZf#|5baO&% -X>MdwWnpYocu;h5M(yUq2ps*m=2xUDT;RqCgn#@WzFu~@adfH5^@&-|3szxlWo~16RC#b^NWB_v7yE`g -7JPmsUNvXifRDiWpZ<6ZbNTvZE19EWo~pzXnF^bIJ{KZXc;Wm98lWo=MdwWnpYocxhx>Z)vk7 -zTZV$_{ZYwZsV-}v4k`%cR+ywTd+-_+35lqRC#b^WI=OtX=iS8LTqVnWK(5fY*ct@WLl4N2_;P0H1c!=^sIJb7^O8Qe}2!VQgh&L}7GcLTqVnWK(5fY*ct@WMS$T_RVyy866uW -6(UoUJMwlSx^W#RES3wGAo{t~Y8XLtb7^O8ZDnqBb3$xsZe&wsVQf@*X=G$|9zv-Vp*%wog4O?q)g04A -aHEjnO6;Ie%sNwVNZt)acywiMb7^mGRC#b^ZA8ZOFKPukLlqCE=E5w*=z8TWl=ueJ45i$M_H~V*5K?7! -WnpY(WJYyvXK7+=WpE8;5VC@SZy&ckV>*V`yb+BFjcr)z~Z#|7V!q4uVJ{nYcaAjmcb8~5D -ZgWCxX>MdwWnpYocu;h5fgb0V4v@cHO73HjlbgFm42mCs2<+~e+;O=m63^mMAVG6;X=iRyWp-s@Y-MCb -VRT_aY-w&}Q)OXnRCrKya)JyEuWS7@0e2{bYWv?No0k%_$#~gq^1qCzduE|50q|r -gTt*-ZIkqGqXDRHN7@cTY-w&}X>MmmVPkY}a)xYW^+v~7{W03rq(;firJ6j(!OVQFqcY-w&}Q)OXnRCrKy -a+46efUz`Mi!Z}iQtl5;XwV(E`Zdd&WRj~^37YhpmjzF7Z*_E&z?57PmRE;x*JyQZ??N1%-?X%h&UrKU%$CX5lEZwTb6rTk%m8vvBgJ_74J{Jehz7Np5g;baSek)I|~ROXFB3|9;oFKZ_7pLug@XZcue%S7~%^Wpi_{jhE2@R4ADY@XOb3WHJm&VktwD1&R~J8Qi15 -W{8UrRB~Z%b7^#GZ*D?$Ze(m_w&;L{94K`ndk%K5+?9Jv$dw7jc}U5p5@2#$kUJ%u2uWmRZggpMdB|&m -dkb29#*qXha^)f?kI>J>8dqqbOFybHKpQ-MBMCulbWCA+WpXjekD95&21^?K{bw7Oyej@6CZq~drvB7pz2;cIXd9lO&nf5a*AnfQld~-bdb4MdwWnpYocu;h5+M7`mSQb`xkca!3_>4e9YQ#rfba;u!+d5tm#=h2RwFD4YLug@XZc}Ara%FT=WnpaHg=PS6VPp{$?vC--s`v@B8YHl) -C#jpVFzBk!DMw8SR$**qZewX>bKWD7Yo@G%*b#-tU^&3KX?w7l?~*Sh8@1jRRblZzybDKcZ(?C=Q*>c; -W#7-Kk@bh=O+>c=6Nvv2!%yAASLvLGVedrqOkAVG6;X=iRyWp-s@Y-MCtVQh6}LTqVnWK(5fY*ct@WC&76LQHRGX=4EZ -4!$0V0pzZFIpSn)xsYw`yZK|qY&x6i)e}5MB-6;q2t;CIP;zf?W&=}nWC#E!gwc#^4#qsMUl{*1zNe>I -^CwqAYJB+ZKALhJOg5MaL2PhnVMAeXb4b1;7b@t4MVjY>G@u4Q3HlB(d+LiLJm-R=h;`?dxDG*cV`*tn -a%paKVPb4$VTK~nd#>@6JWikDr@YkEAs#9)9JJvRH-Qc7Q2s%Kf+=VCy -OABEU3kOtrQ)O*QWJFFoaz*WZZ5##rf6bm&7qffY6*N`B##bI~HzDmr7z##dWo%?qWo=1hQx*t>6v={g -sJ=SZlTl1iF5eQ8IAl(q%E@>So406W2vm7+WlmvjWn_%h53p;7sgGx&z)8&prN#D&cR=tS@df05SQ3Z* -PZCvbZeeX@WJYOaY-Dp&Wo=1hYXqYdo~D%m7H6OD0<^0n_2##VWXRdjy=DB@qgYOj1yf~hNo0M=LMPN> -0NEy%g(UCHeUkYj{YR7-159lqXIqm$}teZO^;JC(UrZ-Ks{e+7M1*ZDnLeX=Q9=b5mt)No1EHgR0RS -PeIWLGZ_*YTjUMn3>33lep74@i%V@}#Ze4JZgp)|VRC6;+#Z*Ep$ -a%o|1baPW>ZAoPPfv$so3kRF1PV2}fOp_vjQ6FdFHId|V>$VQpmv0RRO80?I5NZ-bfLFbqC#o>4E?M+l67UG^w8*<_XZ#%uyqCnto_jB5_YJg;9E|1`d*r&;qS -S3+uh`0YNLave-Im;eX@$}AplgPGkh3_fq3Q7_j=2#kPT_9!;lWR>~GYywm#cxiZMvTM3tQ2*(p5s~Z{ -6V3QiK&W#-F~+s6raGiL0000000000{r~^~000003qfvfZ**aFX>V?G1pxpG0WnM89|TAhYfrNblQVQ` -LpZXKteHopy#|_NJkG`K5da7P06+i$00000009600000000000000000093000000000X?b8~5DZb@cg -V`T;e3U7CAWn@!yVRU5y-Vzs+-~y(u)KQ?3g=q&>T!Ej;9TxQjc0+10Fg2)p25@y^Y-wWx$}AplgPGkh -3_fq3Q7_j=2#kPT_9!;lWR>~GYywm#VTK~nd#>C -WCF@89&dx0-7pM3Z=O*v*GCA9fL-<|HrZsA`NnJlR3~AEBGG%U@MZ$v=XJ?|;InIPy66cFfOYp#JM2r7 -_Du+Fb!>ELaBO7)$}AplgPGkh3_fq3Q7_j=2#kPT_9!;lWR>~GYywm#VTK~nd#>V=;l-_zLn%tmAe68Jly{Qj?Kss0ny)C8x -zFm#1PkyMk2y}8`ZgXa3astXM9&dx0-7pM3Z=O*v*GCA9fL-<|HrZsA`NnJlR3~AEBGG%U@MZ$v=XJ?| -;InIPy66cFfOYp#JM2r7_DuKtpQ8M_qJyiO1VIUJ=H=)@ii_0000000000|Nj60000002WMq&WpinB0%XM12~D{` -Iz96ga3kGta_pUNxh{zZ*=%3u(4f-VjO?=JcE6dyPJT+tk%Iz|R3_dTDo~ZL;TN>NvV?G00{zQ#MKE+xj;HS^AvC+-Eea3oo~4=i3iziU+2)E(%Otur}OFoDdEE8rbT!M3y4gMJ*2_uUvGVL -lsE)B`jpK80000000030|Ns9000007Vs&n0Y-Mu*2?0Hl)<>d4I}(*_lNXA@iYQk^RnB@|WjyHfhANam -kKF(O0000000960|Nj60000JaV`ybV!Z000000RI300000001I<Z4!V -_T!KNI`QJ|h6;Zj^jB$MPK+?7Lu3>C`4HLtfv$so3kRF1PV2}fOp_vjQ6FdFHId|lr&gK9B000000000400000000YNbaY{3Xl-R~baMa-0%XM12~D{`Iz96ga3kGta_pUNxh{zZ*=%3u -(4f-VjD&FwlPpg3!?y@aX^XIja4CK{WF&t@k=WXUZP9(YH~kpAXg`>_lQgbaV_>=c$Ts04O39g2dD_h*R5>c*5<{j2~tNwLvL+uX>>*EqhH(h&*4NaBbD49mT$3z|G4nQgoFBhHh%l@K06L}1!AJ%| +P(yEWWnyqOe<9`Lptgpr6F_xjAC6(~TLj#*ewiHU&X!byiJ!10COKearHwcS=7M7YzYaI8*bv +hMOc?)(rkC#nUDXLvL+uX>?X)a%pCH$}AplgPGkh3_fq3Q7_j=2#kPT_9!;lWR>~GYywm#15DT%6aZ| +SrJerP1pIOD57`7Ol|-ogQ6Pjg~y>s-v>!^VNPLfWv4Jz0xkJm$nc4yMWR2J-cc#Q6SofWC)gp7L6!Sc +3I$AQVo7AP4Jk3r!|EoW{Zi$060oMN(jLzPuNboiNpoRSWoOdj7+WWC1?EKi+6QrwlvP$n +l8x-M691f9z+~t)>6ivgX<}1lX9hx0LvM0r3IG9o2VDR_OBR)w8yCZ2EylR&t_^>1Sz?kFbz0>alMxYA +VQ_L~bWU$%Wl&*qbZ%vG54IneKN{_;j(f`H9IfkFzO$PGD6U0+e +W+%HuC5$^~^vuG3{`}-8x6fV={eh1!etXz_4^&}ra%FT-VRUFva&K>DF1HXRxo%|^+Itiop&gxXSvq){ +{YhrGf57_P)SQy*22EvjXm4aVKVmL%Q_{#Gkvz+H9iKg9-*)mSRaq_gMnjYqO>G4cRAF#(Wpq+$XJ~Xn +a$#;`XhtWfE>N`F8f<{_M@^MEhcVy#omh=bI-rl&{j_4Y)eb^zX>MdwWnpYocu;h5M^4XN(CAD)cag{3QuryWpq$-Z*OL38SA{&vly$FvzVnzHf7z~rv`86=_Ka^V5yX|y#`JS +Q)OdvWpq?<6X>Jq%0U2$DDaiKPL`@Y=jhu|Vo)3+Q0$Mw; +ks-!CQm`I}1yf~lPHzeskk?c43YBIb6Fc=IN+pl}OUT^`C!`zX1ig-;MydoD@qdC-Hdlhx3aZBNPbr@aHF*SPB$t~%I3sYlqX>fEx +d30rSF}tqlgo$^>um>@6G0l?pFt#Zz&53{9y57aQ#OZ(83shlnPH$voNMUnmHQF5&IUsJk-Q1+ZJ%=&s +@|&mHbl*M5f*>4D7PYw?2uyEdYgB1%WjJ*Nu}gdoMr}u)7e{?0bR>WH17z$yORD!eAooFZYY9_nXH#Qx +X>fF3tl4elKTgFI*|CjhfZ7VH>n$b={WmS6z+ej~gaaD&)?_rinzL +Q&_n0fy*YdyZ9}hJM#rpcu#e7m-W{MLar(^k|jH+P94s~ljFZW({ZtfbA~le%!q<(1XE#jbDdR_th)Kl +;F~x`_=5>?(>Td5ZgsqT;~+(zt2h~^9tT%xbZ%vHbEASn^UK%K(4i9Ajp1M~R@C@!4#dQE#lUD;OiKi1 +Rs>XdX=JE;#(89COl4taR%LR& +{2u&fr5XKXQffLAhd}4?5G@P7|2n}&PV@Ibc63|}Q)6;zaCA_0Vryl2#Bytok0{Z4!I#J#jt!xkVnm$g +&}3cy$LV-HwTJPe2SRytWm9x=#d{%|zxO$Aaz=oyMOH6-?4fLKKPKJW|NMSz1LoXB0#tbDYCz3gCHcML +g#T%!5i+MiDe1kloHngE|MP04pL=vWpZ|9WI}m#WpgzCf)+{N +c)mXTm=OBn8@DNvJ^I(u7Ttc@lJ^C)`OzK@Qe|^xa&~28LV0v$b2tf7M?ynyZEb0EL;wS50?er0_e!9% +6%WL6o5Q7yVM7GXa@w44CHDB`4cre!cywiMb7^mGQ)6glZD9j@leIk>g)RqK0VQ|Mwn6X+txo3vSYd;; +z)HQ~0$d0}b#7#AWl3ZSwto`e>uZ$?1z+)WysMU3t2e*FfKh32^DD>YKF13Ts`WEp!#kMM{I9mVQf}mY;|RG6eT>4P{pQ?3(@m6s4{*=wy-PiS_k>W +l|t&*Fr0fZ2~A~mVOC*mb!8QqXJpH@t3U@-^C5At>@@qQFQ2KNd+8eYXv4en`-lihZg6#UO<`~tNY&HC +T(P)^FVARS*Zg3m2dUS*m(weL9PhQe$_)h#M`dnhb7^x^V`ybEPw9I +@e~jMZwd)2j0{0+bWCA+WpXi7WppJ)biTp4ZzpWVEhda;c-OlKZN9QQ?CZI;=cI(fPVx{>cWz~5Q*>c; +Wm98lWo=<8B@PC`naz9~L0@lerBKV`$$1fC6#s{=m+2p6@mtIZL349ubW~wyb1t%_{ujV7L@=1(T$>wO +Y}Ov_b`4?P%YY`+Wb+o`y9rirX=GD$VRU6Oo>ox?`Aroor<$W|05z3@o%yggc;Wi(O`t`n9TUcD*&5hFi^PVx{q1b@^7zTcrn*%qZTXbx0zVQzD2bZKvHRC#b^Ho-KZ`k;Xmr`<4s +JYKN!!u{G5u+^j1lf!PF4>GEG3r}NXb#iiLZewM0IVbbqN^4g)WDG0#SSGl-+Q@e<+6H_!d>A}?>eT16ofolpo#8 +?XuHZHx7d=!p7E)2#$3bL349yXKrm}Zgg`(Y-w&}Q)OXnRCrKyaz^du!w4MxxaL=+DqP^k2!wz9AHH68 +xp8!<%Jqp^&I?vyY-Mg^c~p6DWk|gmZWsH8I~II?C0;dW+k!*yDqgzlqQwf$39g<|8WK=tWMy)5Wo|=n +ZEb0EZDnqBN@#iqkT|?l*=bx{^0c**fmF&H)l(b`S3$sb4!MK-5kqfoV`X7%Wn@NmZf9v?Y-Ljs%|ogz +QLxC5#{z1Bs(ImjcZKu%4y_xMoB3q3{238PY;R&=Y*Tb$bY)XxXk~3-Q>XLl0V(0al +>0fVsbCfs)I{K8&2}O8xWo~n6Z*Ei2ZB|09R9osd9G^&mV=@u*B|k@iff^?C=mvC@noA);b8~5DZc=4- +WnpY(WI=RvVPj}QY-w&}Q)OXnRCsA*T5oByCBEN9T=>W0>u%$${;`BKEO$VG0b8(5pxNmH8B}?2Wn@8f +b7^O8b3$xsZe&wsVQf@*X=GZDa|tC)BU>oS@xONigke(HCtahRyiRHf-TMdwWnpYocxhy0bsj>g6`?#s5rWnKhSeO?L~x^!;Y#eFP|P}0Z%Ez^MR;^&ZgXjGZd7@2Wo<;p^e<`! +Iztr?rsl#d#OQkEER^^L)C{HEhxT=ipb%1Jc4c8~Wn@NmZf9v?Y-Ml_We~E0fo~tTJ>?Q(lLJ=>rBY$7 +0^roXTE)+&>In@)Z*F5{VQgh&L}7Gcb>vO>-_DBy8`Vb0jGrW9$=2qSMXvL3HlVN`i= +Wp=e2Xp5rzopjE#5h98`u~h0v`BV8NkLOrpFzp4z*br25VQzD2bZKvHQ)6glZDD(|HElq4!)_b{H>!() +nCt8iM0hjp5N|z=I>OKHojw{=d2nT9L349yXKr&sY-w&}Q)OXnRCrKya)BP_mkyA>T}tj_kdvFcMGT4` +fC%jFncQ)?C=$=&Q6NEcb7^O8Qe}2!VQgh&L}7GcLTqVnWK(5fY*ctqbaH|W4XEgn0epQ +k*PX+nL>xOm%pK>soN7+Lug@XZbEEnZe&wsVQf@*X=H?P4U;TR^uxCZOKFR+hj1x=IbKf +Z0H=mhJ>?uV^xB4~9n`Dx!RtcK)nwJGn +aBp>VlfaZ*5|&qoaMx&cZSO)Ho!_*yjLvyQo1^f$X+6j;96@t)X=iR$Z)s#xbYXO5LTqVnWK(5fY*ct@ +WRz0V+XJhss8OG%_CC-Q>(otsF+cqN0Qy}ddQ=3E5C~IaXk~3-No1AC=6W7=VqesjRYGc!>wZFzp>JB4 +@xD;^wu&SY_r(NHa7kpJ2rNlD$O59e#ogQsB77jPl+h5j^*S;NLvL<$a$#e1No1ysFp)<~ +$~wYgjK`HkjV#@&#T1_fGnK3MJXK)_7bXoxb#7;AVr*qobYXO5siJyUlgOLOB};96cGdSG6&iv=7PD~j +ruGj4o;;a=21#ykb#!y8wrKJIUBJXnP(l%Y$cDDuY1Bm#?@QxYCjWldxIc>!SVL%GX>L$;VpnN&Ze??G +uZ@?{0aPfN4Did>Ze%hHN@6KPlLd+s#TneAz-EYx5L9wuZgXjLX>V>qb#7#AWwz*mh8!q$B6|*YuiTY; +OURW8#d%1{rxIXtTaY^?oCrx|Wo~q7ba}{Yf_n>Eea4XlBy!~v3=AX`3Ri2tjjmWpq?wXVr~g2n?Horiuqf0^m>2O`jNR +ziT$b7#=ya6uYYC;sr@=aCLOm?vf5kh_h+&YE#h%O8d1V_{UOl9{V;uR#^q%R5PSyeIwjVvMyte)HLS3WfgRB~Z%b7^#GZ*JDSGqJ&TQwZPkn|ZOr{h9VN +EFkRYIec?G`g2UV1s5Vgb8~5DZc=4-WnpY(WI=RvVPj}QY-w&}Q)OXnRCrKya@w0w6Id2jc94hrndMfL +ayEe1ISdA&%p{mB1!VWk)dNOmcG|`19mwqd!6t9MpF6k$l8zT&IM0)BxIjDir5zArRUtuhb7^O8Qe}2! +VQgh&R$**)WkPIeZe&wsVQf@*P;_$Jidq_i6cBYN^7xEELu$lFU37Sf$J;ty5yrmOX|)6pSVL%GX>LWpmymk!z-`g4hv-$6z_Y +xoLZ_neUP>BpbEf7FA*KKfDV^Y;R&=Y*Tb$bY;{@O*mP8`7qV21dnrCyk{{a-lF$FG0V5TNAc?Tc{K=4 +WprU=VRT{n^sESGu0eNZ)cp(*eFU-DRQ(QTUJ^TE1nY56>E%WYMs;pyX<}?;RC#b^{4_<~U(XE-|Ev|H +db$N7;9H9;8!%;3hl7uME$faw4?}NmV`X7%Wn@8gbYWv?|7c^tcv66A`G>fI&S@S1XLTY^Y?LL}v9ZWWu2|;XdXkkNP +aC1n$BNr;@ghiU?gEXK9KMDE{F?;HZBRuDVqlk6qmbeZmb;*F> +vukd;=m`ygb@x#_>`RmOO$0)3Z)|vJcxJL|x?WKK>7x;m>=zTw_)ojDN{iR+YxT1qeJQTRI%yh?{hxxA$ +L2PhnVMAeXb4+h!VRLBFJq*Jt8?Abrta^#~Iw-!oZ%zqO(A&rh^vGm~tg_w^L2PhnVN-2kY-~(#WMOk? +3sZD*X=8L$d2nTO4*&^LN2X=Q9=Q)O*QWK$LhgcQkwbf~^M){{|8P%hsRk~m~ep32F151Y4W +WC&DwaAi(mZDnMP)DN(0hN+Kdp}ZAoN($wDX8VgT7DmW3qm%zcviBmGB|7z0dgBIJ4& +sCG^VR$+2!VQzGR(<~&{!{{>E!(#o&^pB98KZhv1GEPn8Orhb4n;8ZMQ)zl>ZfBCy0{K32d-H~a`3x8b +375ImR&CF_#3#*gz1^xtuG$bzVQpn(MrmbiWOGwxZAoO8A%m*X98W>f2s0TH8C&EH;|vtDTYgh)4~t7} +WW`YoMQ(L%R$+2!VQzGDn938Qb#DiI%LhXtBc@pg0t!L7$2{bU&sPXOO(dS=5LRJwX<=@3Np5CuQ)O*Q +Wc?UbbJ9Xwr}~3wv^yxa@v}v^+kiGSR2X#8M$tG2GZIy9X>V>;VRC6_vj93RHP;Wm9=`bY*QQ01rWKV`y)3Wn@BiZe(m_a|8nc26SO?a%FS?1pxsz +U(P2B2NqiWU>yu4AB#Dm;I?Y3kL%RWN&q1Y-Ioj0tR$paB^jI0XARGCkqD_TK!-h3?(0nIicXTch2QnD}62L@rHg-X9aI? +a%FS@hd|-Wi=lHam_X!<3uvO83$-e(J0!3HH}n+hlR66r4nb~iZ**aFX>V>$VQpmv0RRO80?I5NZ-bfL +FbqC#o>4E?M+l67UG^w8*<_XZ#%uyqCnto_jB5_YJg;9E|1`d*r&;qSS3+uh`0YNLave-Im;eX@$}Apl +gPGkh3_fq3Q7_j=2#kPT_9!;lWR>~GYywm#cxiZMvTM3tQ2*(p5s~Z{6V3QiK&W#-F~+s6raGiL00000 +00000{r~^~000003qfvfZ**aFX>V?G1pxpG0WnM89|TAhYfrNblQVQ`LpZXKteHopy#|_NJkG`K5da7P +06+i$00000009600000000000000000093000000000X?b8~5DZb@cgV`T;e3U7CAWn@!yVRU5y-Vzs+ +-~y(u)KQ?3g=q&>T!Ej;9TxQjc0+10Fg2)p25@y^Y-wWx$}AplgPGkh3_fq3Q7_j=2#kPT_9!;lWR>~G +Yywm#VTK~nd#>CWCF@89&dx0-7pM3Z=O*v*GCA9 +fL-<|HrZsA`NnJlR3~AEBGG%U@MZ$v=XJ?|;InIPy66cFfOYp#JM2r7_Du+Fb!>ELaBO7)$}AplgPGkh +3_fq3Q7_j=2#kPT_9!;lWR>~GYywm#VTK~nd#>0|;$!V^DH$Z)O5|10COKearHwcS=7M7YzYaI8*bvhMOc?)(rkC#nUE*(LK3V +&vL%&i(~ao9rExlGMgPx_&tqtqVlwo1}@PEWMX4ba&K>D0#*~&*VKn|nRBmPlPrrd^EP>$AHP6|FsuXs +I;G3ONJmc3T+rxDK6vW;JU&?LxLM72H?wDC1Zo}=N}D)4mj+^WZe(m_0w7l>toMja192_(UwD?W=?zm* +&IhOn$k(lG-qz;DsjrQf(E(H_nGEpD*KTAo3`$}tLz4xH6U7D0(t`--)Viz@~C%8KNS}Z0aQ3s^SOqbBwN-D{wl@OCWX;GxmM3|zUzx)^-Ue} +@Gdf&9Z>i^jdP;%w2}rc(FkN>V^DH$Z)O5k6V}(%hjW>8uUwNXi!t*yd7K}=K!`A`1OPgv%fUzwwjY>3 +8tto&d&=ez4Ev5gyU5%_yeyFzybaG*Cb7p070?I5NZ-bfLFbqC#o>4E?M+l67UG^w8 +*<_XZ#%uyqCt-#n(R;4&W&+>mb;*F>vukd;=m`ygb@x#_>`RmOO$l^ma&2jDVQg~%3IZTkC#?5~OapN( +_Fs6GvFQy{P|gRa2*}s1Y~I%9#i;{(leIk>g)RqK0VQ|Mwn6X+txo3vSYd;;z)HQ~0$c(hS0}9Zh)e@< +E%sk{ma*v#Q&7$as0hf{t!&=b=EbSoidq_i6cBYN^7xEELu$lFU37Sf$J;ty5yrmOX|)6Z0000000030 +{{R3000007XJu|>b7^w|AXg`>_lQgbaV_>=c$Ts04O39g2dD_h*R5>c*5<{j?6T%|znQ^KeoD%bg94CL +Cf*q;P?fLY7qq^#2NiM*3T1e7Wo~n6Z*Fq{2?8KjC#?5~OapN(_Fs6GvFQy{P|gRa2*}s1Y~I%9#i>)L +^XdU9;lkvmMR*4bh)jz;q`~Q5Z+&x=I0QQSl+6GD0000000960|Nj60000MKb#7#AWpe-t0nT^OmoUfe +VvhY+ARw!>`>M$upk~C-sV(3xjy;4dI{*Lx000000RR90{{R3000whoXk~3-0w7l>toMja192_(UwD?W +=?zm*&IhOn$k(lG-qz;DsX2RKhRF9oualB}P71SaJfwx=uHX^JIK`}#x3$o4Af`kVHyQ&~TYCSRqgWgjZ$<5FZnjcuT6B5B6)POqpHCTrHl4#QtZa;zni700000 +00000{{R30000003v+dFaBO95Wo~qH00{wOJ=2M>OG#EL&$!Mwbx&PZd +lOljoA7|k;k>s6qoa5|8f~f~{V{&P5baMa+0%CAAe<9`Lptgpr6F_xjAC6(~TLj#*ewiHWCD< +wgM1*ibOB +_lQgbaV_>=c$Ts04O39g2dD_h*R5>c*5<{jgmDd%EKc;pw+KsVi?D}qDSkO*B!5Mb*xG|_(S5o&00;m8 +KmY&$000000RR900000000000000000RR6000000019(yXKrD1b#i5M015%()D=(>(T2L(qY0=?Nz4Ev5gyU5%_yeyFzybaG*C +b7p070?I5NZ-bfLFbqC#o>4E?M+l67UG^w8*<_XZ#%uyqCt-#n(R;4&W&+>mb;*F>vukd;=m`ygb@x#_ +>`RmOO$l^ma&2jDVQg~%3IZTkC#?5~OapN(_Fs6GvFQy{P|gRa2*}s1Y~I%9#i;{(leIk>g)RqK0VQ|M +wn6X+txo3vSYd;;z)HQ~0$c(hS0}9Zh)e@b7^w|AXg`>_lQgbaV_>=c$Ts04O39g +2dD_h*R5>c*5<{j?6T%|znQ^KeoD%bg94CLCf*q;P?fLY7qq^#2NiM*3T1e7Wo~n6Z*Fq{2?8KjC#?5~ +OapN(_Fs6GvFQy{P|gRa2*}s1Y~I%9#i>)L^XdU9;lkvmMR*4bh)jz;q`~Q5Z+&x=I0QQSl+6GD00000 +00960|Nj60000MKb#7#AWpe-t0nT^OmoUfeVvhY+ARw!>`>M$upk~C-sV(3xjy;4dI{*Lx000000RR90 +{{R3000whoXk~3-0w7l>toMja192_(UwD?W=?zm*&IhOn$k(lG-qz;DsX2RKhRF9oualB}P71SaJfwx= +uHX^JIK`}#x3$o4Af`kVHyQ&~TYCSRqgWgjZ$<5FZnj +cuT6B5B6)POqpHCTrHl4#QtZa;zni70000000000{{R30000003v+dFaBO95Wo~qH00{wOJ=2M>OG#EL +&$!Mwbx&PZdlOljoA7|k;k>s6qoa5|8f~f~{V{&P5baMa+0%CAAe<9`L +ptgpr6F_xjAC6(~TLj#*ewiHWCD_lQgbaV_>=c$Ts04O39g2dD_h*R5>c*5<{jgmDd%EKc;p +w+KsVi?D}qDSkO*B!5Mb*xG|_(S5o&00;m8KmY&$000000RR900000000000000000RR6000000019(y +XKrD1b#i5M015%()D=(>(T2L(qY0=?N_lQgbaV_>=c$Ts04O39g2dD_h*R5>c*5<{jp9m~TI>-W|y2ahx +3nF|Vuawki#7NH?S|Q-Q!u2{b0tIPiVPjm(ZiUQ7;QU9z@vLsQUy3b9HcVYybrT0cSFYzzA^b +6`Drj_fC5M7<0km5x1u)VS{2*yf9yYl?p>|ZggdCbW&wz1OxyEb7N>_ZD9Zf0RkXbC#?5~OapN(_Fs6G +vFQy{P|gRa2*}s1Y~I%9#i^81)7t~9tEf?*r}jS36zkMYeK9}${s8)2BzjZ?kPra}XJu|>b7^w`1pxve +S0}9Zh)e@2rNlD$O59e#ogQsB77jPl+h5j^*S;F +1!-nsV`TsZ0RcP8z<~n@;VY|KA!vt$qMEp^75#kD_Tqj3WXX=Y(#Wl3#tYybrT0anNlc)Z3! +7CPHT_+Dq|&?jn_(4)LjFAF^$MA+G=`wK&FZggdCbW>?(a|Hna3IZTkC#?5~OapN(_Fs6GvFQy{P|gRa +2*}s1Y~I%9#i_RFfQB3>bs~EXcCXx(drQcb3B`Fx$)^%va$Ar)C7b~v#}{qTDnK1gUZ=~4IPtBJuMnKC +WEcQ$kD_ZvQg;gh000000000A000000000EMR;^&ZgXjGZb@cgV`T;j2yJg~GYywm# +VTK~nd#>C`}q*r8?;yf@?frQ$owe+rTo-{AMw{vgzX#P!9p!}0yp?_0000000000{{R30000002WM<= +Vqt7^015&{>Z4!V_T!KNI`QJ|h6;Zj^jB$MPK+?7Lu3>C`4HI~v{(W1V6JV*{3!yZ{M3XW@z+p_lQgbaV_>=c$Ts04O39g2dD_h*R5>c*5<{jHo-KZ`k;Xmr`<4sJYKN!!u{G5u+^j1 +lf!PF4>GEG0000000000{{R30000003t@9}X=iS2Wo~qH015&{>Z4!V_T!KNI`QJ|h6;Zj^jB$MPK+?7 +Lu3>C`4HI~v{(W1V6JV*{3!yZ{M3XW@z+p_lQgbaV_>=c$Ts04O39g2dD_h +*R5>c*5<{jHo-KZ`k;Xmr`<4sJYKN!!u{G5u+^j1lf!PF4>GEG0000000000{{R30000002XbX(Wo2!1 +00{y`>Z4!V_T!KNI`QJ|h6;Zj^jB$MPK+?7Lu3>C`4HI~v{(W1V6JV*{3!yZ{M3XW@z+pa{vhfMe3tp+xFv-0Xp&G?S=|}9rRaeU`~uMrbA>C`}q*r +8?;yf@?frQ$owe+rTo-{AMw{vgzX#P!9p!}0yp?_0000000000{{R300000024!+`Z*p@02?9mxqhH(h +&Z4!V_T!KN +I`QJ|h6;Zj^jB$MPK+?7Lu3>C`4HI~v{(W1V6JV*{3!yZ{M3XW@z+pa{vhfMe3tp+xFv-0Xp&G?S=|}9rRaeU`~uMrbA>C`}q*r8?;yf@?frQ$owe+rTo-{ +AMw{vgzX#P!9p!}0yp?_0000000000{{R300000024!+`Z*p@02?9mxqhH(hNn`*70ssVVZ*FA(00035b8l^B00jX8Me3tp+xFv-0Xp&G?S=|}9rRaeU`~uMrbA>C +`}q*rYXqYdo~D%m7H6OD0<^0n_2##VWXRdjy=DB@qgYOj2y$g{b!l>CWCF@89&dx0-7pM3Z=O*v*GCA9 +fL-<|HrZsA`NnJlR3~AEBGG%U@MZ$v=XJ?|;InIPy66cFfOYp#JM2r7_Du+Fb!>ELaBO7)$}AplgPGkh +3_fq3Q7_j=2#kPT_9!;lWR>~GYywm#VTK~nd#>Z4!V_T!KNI`QJ|h6;Zj +^jB$MPK+?7Lu3>C`4HJt76^nC$%1sKzB<;EQA|)S-x88IWKN#S$#@T&w`gPtX>Mp`a%psP00;p)%D{mG +2;nQMTOnwNgyXhzrB~SH04;UKo5i(1Vxw^Y00000000300000000009bZKp6b97;CZ~y>E2yJC_VPs)+ +VE_sOMe3tp+xFv-0Xp&G?S=|}9rRaeU`~uMrbA>C`}q*r8?;yf@?frQ$owe+rTo-{AMw{vgzX#P!9p!} +0yp?_0!8YhU)%QMkO4aJ;_ZeCe;xE!X<$x_Fs4If6Z`oP*=q!&6rQG)02XJT?*g=|B=zREie$*y(7k2+ +*P~cYjQ{`u000000RI300000001IbqZ(?C=Q*>c;WdI5SMe3tp+xFv-0Xp&G?S=|}9rRaeU`~uMrbA>C +`}q*r8?;yf@?frQ$owe+rTo-{AMw{vgzX#P!9p!}0yp?_0m=yGke?j1l!xqXd>q7+-P0pRHy9#PwIC +`}q*r8?;yf@?frQ$owe+rTo-{AMw{vgzX#P!9p!}0yp?_0ZXaKh^f@$D{A?t{IfX>#}PNp!L%7{0GY9x +pq!KXGXMYp000000RI3000000010+sY-Mg^X=QT&3IavyqhH(hb7^w{b?qhoJW!8=sKG~^&Ni^C7tcO}co=3CQC(GPVoWSC3v_Z} +ZgXjLX>V?G015&{>Z4!V_T!KNI`QJ|h6;Zj^jB$MPK+?7Lu3>C`4HI~v{(W1V6JV*{3!yZ{M3XW@z+p< +?Hl01LM?X!H~4Y^Hx3&bJ$HXE2K+s|vHZ6#&ske5?JSDZAfr}PGrQJ;0000000000{{R30000003T1e7 +Wo~n6Z*Fq{3IavyqhH(hD`aAk5~bZKvH00aU61a5C`WdHyG0R(ezZDjxj0RlzpqhH(hC`}q*r35LOoBKkGaY9#cS7Qj{WgyAGcS>>g~&^g7bS0}9Zh)e@p#+${pKVqYC33O>~Wpi|4ZEyepNC<6ZbYWy+bYTDq0lk5UVp0y6#Opn49V(cQc;WdI2QadI6-(bd|-i#!&GYaF>qoh8ar +da{vheR)?jU+FZ2DLr`QR#xHIKjC^A48Li8o +%k$8HEod=_0000000000{{R30000003v_Z}ZgXjLX>V?G00{v&KD$)QXhhr5^*YH=BF-=c +yOsxg-v9sr000000RI300000000w1pa&K~T00{xZXXT7NJOW`Spw3o_*cmz+=1%_1gm*5-D79nn{HtC7 +00000000300000000009WMy_`Y;SO7asnV%C#?5~OapN(_Fs6GvFQy{P|gRa2*}s1Y~I%9#i_RFfQB3> +bs~EXcCXx(drQcb3B`Fx$)^%va$Ar)C7cFHZE$Q!WCZ~L2LJ#-AOHhPX>#x3$o4Af`kVHyQ&~TYC +SRqgV00000000300000000008b7N>_ZDDj_00{yhS0}9Zh)e@ite$I%(jAWg00000000300000000006X=!b6Y;yn!0fbj(2M`|< +m3T|4oDcSEr%ah$$XqR+hQ$77qvA$o%>V!Z000000RI300000001I<Z4!V_T!KNI`QJ|h6;Zj +^jB$MPK+?7Lu3>C`4HLtfv$so3kRF1PV2}fOp_vjQ6FdFHId|lr&gK9B00000 0096000000000VeX=iR>bairNa{vkf;?xyT5z&Ua+M@}mOiDpYxh>^^GknUxTJ!XL#OUcE0frb5ENEw7 -&f?o%+)B!ZpG}K!%4G?I4vp$|ttu*CMF0Q*000000RI300000001rcNZgXj8Zf#|5baZlcWd;ogc4cyN -X>V=;l-_zLn%tmAe68Jly{Qj?Kss0ny)C8xzFm#1PkyMk2y}8`ZgXa3astXM9&dx0-7pM3Z=O*v*GCA9 -fL-<|HrZsA`NnJlR3~AEBGG%U@MZ$v=XJ?|;InIPy66cFfOYp#JM2r7_DuKtpQ8M_qJyiO1VIUJ=H=)@ii_00000 -00000|Nj60000002WMq&WpinB0%XM12~D{`Iz96ga3kGta_pUNxh{zZ*=%3u(4f-VjO?=JcE6dyPJT+t -k%Iz|R3_dTDo~ZL;TN>NvV?G00{zQ#MKE+xj;HS^AvC+-Eea3oo~4=i3iziU+2)E -(%Otur}OFoDdEE8rbT!M3y4gMJ*2_uUvGVLlsE)B`jpK80000000030|Ns9000007Vs&n0Y-Mu*2?0Hl -)<>d4I}(*_lNXA@iYQk^RnB@|WjyHfhANamkKF(O0000000960|Nj60000JaV`ybV!Z000000RI300000001I<Z4!V_T!KNI`QJ|h6;Zj^jB$MPK+?7Lu3>C`4HLtfv$so3kRF1 -PV2}fOp_vjQ6FdFHId|lr&gK9B000000000400000000YNbaY{3Xl-R~baMa- -0%XM12~D{`Iz96ga3kGta_pUNxh{zZ*=%3u(4f-VjD&FwlPpg3!?y@aX^XIja4CK{WF&t@k=WXUZP9(Y -H~bairNa{vkf;?xyT5z&Ua+M@}m -OiDpYxh>^^GknUxTJ!XL#OUcE0frb5ENEw7&f?o%+)B!ZpG}K!%4G?I4vp$|ttu*CMF0Q*000000RI30 -0000001QKKZggR3Ze?;-WpV=n0(LS22}5sgbY*UINn`{C00whoXk~3-00jX8WW?18O}RiiJ@XWBBi(Rv -?4579E{O-(Y+vWlpwilmlv2~%1FNg3QJ<&wKF}2F)J=UcKm7gx`duV?R0NO^0S9MgZe??6a{vVa0%XM1 -2~D{`Iz96ga3kGta_pUNxh{zZ*=%3u(4f-VjGqWBNjk^^qPoT1+zTRnAg`3vXv9d*8d@RXy~6c6G6Dr@ -W?^Gx00jX7JIcU;0|?p#+${pKVqYC0|{wnVPj=UZE$P=1pxt8$PakD#zGc4 -+eY|aXXwx;YM0QXyiqR;Jsw2Z*{J&j1#@+9aBKht0Rd++hrkGM>lK-W|y2ahx3nF|Vuawki#7NH?S|Q-Q!u2{b0tIPiVPjm(ZiUQ7;QU9z@vL -sQU{;Z*FvDZgf*=XLAJs015(R#MKE+xj;HS^AvC+-Eea3oo~4=i3iziU+2)E(%Ou+=zxYCD0L!x4tB5H -m3vFbl?lapNXe%XU~*fKJ0+X}A;%YO&?-P3O4E?M+l67UG^w8*<_XZ#%uyqCt-#n(R;4&W&+>mb;*F>vukd;=m`yg -b@x#_>`RmOO$cpebYWy+bYTDq0!8YhU)%QMkO4aJ;_ZeCe;xE!X<$x_Fs4If6Z`oP*&DQ20rFt3ZOHs7 -0;T-agdg$OP=xIp;K4#IcLF!~asU7T000000RI300000000(DmZ(?C=a{vkgMe3tp+xFv-0Xp&G?S=|} -9rRaeU`~uMrbA>C`}q*r8?;yf@?frQ$owe+rTo-{AMw{vgzX#P!9p!}0yp?_0%XM12~D{`Iz96ga3kGt -a_pUNxh{zZ*=%3u(4f-Vj5fhEq57bK6Q|uUfIMEX^1}Vv6tLB!)|10-o)0prc>n+a000000RI3000000 -01IJrb7^O8ZDnqBa{vkgMe3tp+xFv-0Xp&G?S=|}9rRaeU`~uMrbA>C`}q*r8?;yf@?frQ$owe+rTo-{ -AMw{vgzX#P!9p!}0yp?_0%XM12~D{`Iz96ga3kGta_pUNxh{zZ*=%3u(4f-Vj5fhEq57bK6Q|uUfIMEX -^1}Vv6tLB!)|10-o)0prc>n+a000000RI300000000(kqWMyS-a{vhfMe3tp+xFv-0Xp&G?S=|}9rRae -U`~uMrbA>C`}q*r8?;yf@?frQ$owe+rTo-{AMw{vgzX#P!9p!}0yp?_0000000000{{R300000033g#@ -Wo~0>Wpe-t0!8YhU)%QMkO4aJ;_ZeCe;xE!X<$x_Fs4If6Z`oP*&DQ20rFt3ZOHs70;T-agdg$OP=xIp -;K4#IcLF!~asU7T000000RI300000000w1pa&K~T00{y`>Z4!V_T!KNI`QJ|h6;Zj^jB$MPK+?7Lu3>C -`4HI&hQW&>`ZdvNB=ndTz*X~v;Uq>`<)y^XImOPdju4Lk0000000030000000000HWMyVyb!>D&b8~5D -Zf#|5bN~bb00eGtZe;)f009JZZ*64&1pxv@>Z4!V_T!KNI`QJ|h6;Zj^jB$MPK+?7Lu3>C`4HI~v{(W1 -V6JV*{3!yZ{M3XW@z+pZODNcTE%yi#yB_`&o2yJC_VPs)+VE_pNMe3tp+xFv-0Xp&G?S=|}9rRaeU`~uMrbA>C`}q*r -8?;yf@?frQ$owe+rTo-{AMw{vgzX#P!9p!}0yp?_0000000000{{R30000002WM<=Vqt7^015&{>Z4!V -_T!KNI`QJ|h6;Zj^jB$MPK+?7Lu3>C`4HI~v{(W1V6JV*{3!yZ{M3XW@z+pGEG00000 -00000{{R30000003t@9}X=iS2Wo~qH015&{>Z4!V_T!KNI`QJ|h6;Zj^jB$MPK+?7Lu3>C`4HI~v{(W1 -V6JV*{3!yZ{M3XW@z+pGEG0000000000{{R300000033g#@Wo~0>Wpe-t0!8YhU)%QM -kO4aJ;_ZeCe;xE!X<$x_Fs4If6Z`oP*&DQ20rFt3ZOHs70;T-agdg$OP=xIp;K4#IcLF!~asU7T00000 -0RI300000000w1pa&K~T00{y`>Z4!V_T!KNI`QJ|h6;Zj^jB$MPK+?7Lu3>C`4HI&hQW&>`ZdvNB=ndT -z*X~v;Uq>`<)y^XImOPdju4Lk0000000030000000000BM{I9mVQfieVPjM0!8YhU)%QMkO4aJ;_ZeCe;xE!X<$x_Fs4If6Z`oP*=q!&6rQG)02XJT?*g=|B=zRE -ie$*y(7k2+*P~cYjRuJC38 --{*D7fZ(%hZo23R4S;p`Q9JBQllDyrZFOvPX>e?10?I5NZ-bfLFbqC#o>4E?M+l67UG^w8*<_XZ#%uyq -Ct-#n(R;4&W&+>mb;*F>vukd;=m`ygb@x#_>`RmOO$AA2VPjC`}q*rQx*t>6v={g -sJ=SZlTl1iF5eQ8IAl(q%E@>So406W2x)F;WpZhBa{vedJIcU;0|?p#+${p -KVqYC0000000000{{R300000033O>~Wpi|4ZEyepNC<6ZbYWy+bYTDr0!8YhU)%QMkO4aJ;_ZeCe;xE! -X<$x_Fs4If6Z`oP*&DQ20rFt3ZOHs70;T-agdg$OP=xIp;K4#IcLF!~asox_qhH(hioJpYH;+t0eX2w~A!Q+0eaZ{MVycPK^Kn000000093000000000YT -Y;R&=Y*Tb$bY%bv0!8YhU)%QMkO4aJ;_ZeCe;xE!X<$x_Fs4If6Z`oP*&DQ20rFt3ZOHs70;T-agdg$O -P=xIp;K4#IcLF!~askQ+=8&Hpw3LVJZG0TWlikxJMmHEDQne=0G(X}F$%Fs^000000093000000000YN -b8~5DZf#|5baMa-0!8YhU)%QMkO4aJ;_ZeCe;xE!X<$x_Fs4If6Z`oP*&DQ20rFt3ZOHs70;T-agdg$O -P=xIp;K4#IcLF!~asf-J$cU-b<11?Ur~I=y495{S&B3%8Yyg?DnxLGM`ZE9k000000093000000000Sg -VQgh?V`*h`015&{>Z4!V_T!KNI`QJ|h6;Zj^jB$MPK+?7Lu3>C`4HI~v{(W1V6JV*{3!yZ{M3XW@z+p< -?Hl01LM?X!H~4Y^K5OyylhJC`}q*r8?;yf@?frQ$owe+rTo-{AMw{vgzX#P!9p!}0yp?_0XGgC8a;P^F9!TQ -ys`YZF3(w8EA1?b(;%Z(R5QEQf&c&j000000RI3000000019PzbY*UHX>V?G015&{>Z4!V_T!KNI`QJ| -h6;Zj^jB$MPK+?7Lu3>C`4HI~v{(W1V6JV*{3!yZ{M3XW@z+p&VRUJ4ZU6)V00eGtZe;)f -009JZZ*64&1pxv@>Z4!V_T!KNI`QJ|h6;Zj^jB$MPK+?7Lu3>C`4HI~v{(W1V6JV*{3!yZ{M3XW@z+p< -?Hl01LM?X!H~4Y}WpZ+Fa&rI*0!8YhU)%QMkO4aJ;_ZeCe;xE!X<$x_Fs4If6Z`oP*$IZhiz50p(P||0 -m=?fQ^Mv6fMp@;h#Lzj#&aRFSj{pb&0RR91000000RI300000000000000000RI3000000010Gec4cgD -aAk4=WW?18O}RiiJ@XWBBi(Rv?4579E{O-(Y+vWlpwilmw&;L{94K`ndk%K5+?9Jv$dw7jc}U5p5@2#$ -kUJ%u2T5jOV`WKX1pxpD002NB00~KEVPj=UZE$P`3n8fQnYaJ?>kL6XG(3esa0W5QyJn#ohg24a)0000000930 -00000000YTY;R&=Y*Tb$bY%bu0daC2M$y&U#EU!@hie?UNS!6hQhW-W8INxxf{Fuzg#Z8m000000RI30 -0000001IJrb7^O8ZDnqBa{vhenIb5$QI^$V6PNW$vdMt6d#0>Rmk*`=dQ)K)k7d+w0000000000{{R30 -0000033g#@Wo~0>Wpe-t0ak~ln%Z2n%R^9PBgQXo1&n-R?HR4hpUd;mfGub-hyVZp000000RI3000000 -01I?-VQzD2bZKvHa{vheI6k{n`X+XC81LasyqR+($`>jwnD57lV5q8m)(2RS0000000000{{R3000000 -3T1e7Wo~n6Z*Fq{2?1%uWwlwnKfCTqC!TnpV`xO%(e*mXP$JGS1-q69d*1*6000000093000000000JM -a&m8Sa{vhe!)N7;Jv;(oC!o$&iP#xB8s<*^%!GF?$0)U9@BFJ?0000000000{{R300000031nq0{baMa+0b@PWiLgsaRw~c9&Ny{YCK_TCaeS`x+X~XLW@}|U -wEzGB000000RI300000000ne;aAk7>Me3tp+xFv-0Xp&G?S=|}9rRaeU`~uMrbA>C`}q*r{eiB7ehUYi -s7~w1CQOqefKeZ3;Wd%uopqe!>_vj92XkX`X>fFN00{zOa5aA+<>R2XhQO_4{AcS-HH^7AVzASV8M4NY -xyCjU1gEwF5PXV6FZDLo1#Vec_~kix7WfVQ#Sd|CM9$^_0000000030{{R300000Ab7^O8VRUtJWpe-u -0pipZP!Z9Fy4s@&s7y*hO1UlNfirx{z*_V4e8lMKApwRM5G-hCV9w&(UffE`hM!G~aLQ!~gAR@AcC9KZ -Uqt`_000000093000000000P0Z)9m^X=QQ)0|;Sab98cHV{`xrZ+2yJa%p5`0R?7hZeeWy7*1hrWn@Na -Wo%?Yb8~5DZf#|5bX0k8Wd;KRX=DOq#MKE+xj;HS^AvC+-Eea3oo~4=i3iziU+2)E(%OuN{^Dg=h-~N_ -zJ`Red1EINWrM}GXaQb}6c#qIM2EQqZeeX@0!8YhU)%QMkO4aJ;_ZeCe;xE!X<$x_Fs4If6Z`oP*&DQ2 -0rFt3ZOHs70;T-agdg$OP=xIp;K4#IcLF!~atLx|b7gXNWn=<+10COKearHwcS=7M7YzYaI8*bvhMOc? -)(rkC#nUG5>JtwI*nu%&Q~z;Vl^%5wS6(#;{6ajG64wDPk{-(!PGN0jWJYOaY-B}vbY*UHX>V>+d2nS0 -0|IGe0%XM12~D{`Iz96ga3kGta_pUNxh{zZ*=%3u(4f-VjAV5lLa7y@JVOzJ)&GXo9MeQ_qmbcB?4VH0 -I#X{*-UM!8ZDj&Q>Z4!V_T!KNI`QJ|h6;Zj^jB$MPK+?7Lu3>C`4HI~v{(W1V6JV*{3!yZ{M3XW@z+p< -?Hl01LM?X!H~4Z0a%FR6a&~280(t`--)Viz@~C%8KNS}Z0aQ3s^SOqbBwN-D{wl@OChzJK4+YqPF=12x -aaxrgbrDxyH3xis%LHy=ZDj&Q>Z4!V +&f?o%+)B!ZpG}K!%4G?I4vp$|ttu*CMF0Q*000000RI300000000>QQWNBt;WpV=p2w`G#baG*1bN~o% +c4cyMX=G&q1!ie(VQl{xPGN0jWJYOaY-B-mb7^O8ZDnqBRC#b^1_J_VWC9>pC#?5~OapN(_Fs6GvFQy{ +P|gRa2*}s1Y~I%9#i@t>;$>KfZ0H=mhJ>?uVC`}q*r8?;yf@?frQ$owe+rTo-{AMw{vgzX#P!9p!}0yp?_2y$g}WpZ|9WCD5v +9p7nv%krpqNFdAXg`>_lQgbaV_>=c$Ts04O39g2dD_h*R5>c*5<{jWOW`w +sTH9-LlJ`2|Ay5Z(?oEikl{+~pis;@Q*TJ#1a4t%WdcR&qhH(he1kloHngE|MP08BSqsWn@NaWo%?eY;R&=Y*Tb$ +bY)a|aAgJq0%>FdAXg`>_lQgbaV_>=c$Ts04O39g2dD_h*R5>c*5<{j)$WoGNre1kloHngE|MP05>8=lWn@NaWo%?kWprUwd2nS00|IGe0w7l>toMja192_( +UwD?W=?zm*&IhOn$k(lG-qz;DsdeN{_}|Wp0vpvv$c&#PW69R$ltr%da5t5w^x+8!q6BVXZDj&Q>Z4!V _T!KNI`QJ|h6;Zj^jB$MPK+?7Lu3>C`4HI~v{(W1V6JV*{3!yZ{M3XW@z+pC -`}q*r8?;yf@?frQ$owe+rTo-{AMw{vgzX#P!9p!}0yp?_2y$g}WpZ|9WCD5v9p7nv%krpqNV>+d2nS00|IGe0%XM12~D{`Iz96ga3kGta_pUNxh{zZ*=%3u(4f-Vj5JaYt`n9TUcD*&5hFi^PVx{q -1b@^7zTcrn*%qZTXasIyZDj&Q>Z4!V_T!KNI`QJ|h6;Zj^jB$MPK+?7Lu3>C`4HI~v{(W1V6JV*{3!yZ -{M3XW@z+pZ4!V_T!KNI`QJ|h6;Zj^jB$MPK+?7Lu3>C`4HI~v{(W1V6JV*{3!yZ{M3XW@z+ppG1a4t%WdcR&qhH(he1kloHngE|MP03Qu=#Wn@WaVPjZ4!V_T!KNI`QJ|h6;Zj^jB$MPK+?7Lu3>C`4HJ_1fvw5rj-B|XP@r^w5ufb=C_Ju$l1`nW&GEpSWb-! -P<3KgX>@L7b8`d&00eY+X=DHe0Rr`G6JjIwIj2eqliWu}$@z+_xPw?-wb>Rw7=FYk8VaL=Li5Yl(a@n1 -+Ku60FILp}Zw|!7cE!MGSxid=WmW+Kba(&-0Rr`G6JjIwIj2eqliWu}$@z+_xPw?-wb>Rw7=FYk8VbdG -A)3GUIc{=BfUQMVFMRBwY;Hd$-Q55DeryBg+(ZXcX=g%gZ(;=j00;m8Kmh;%00000000mG0000000&cb -aByr%WCZ~L2LJ#-AOHzdb#QQONpxjx1O)&GWMyVyb!>D100037ba`-PPHzAO0RR935eRg7aAi(mZDjxj -0RlzpqhH(hOi(W05|TJ%PM*ricn_Pm -Xk-!zW@%+?WKLmiWdH>M0!8YhU)%QMkO4aJ;_ZeCe;xE!X<$x_Fs4If6Z`oP*&DQ20rFt3ZOHs70;T-a -gdg$OP=xIp;K4#IcLF!~auW-7VRC6NdhVC3z)=0wst0Y0}#&o=rIt`?a&Fa))1(#TPD!jC~PR_M88ajEx^RR910000000RI3000000 -00>icaByr>bz%bw25EG2Wo%{u1Z`z>VF3nbY;R&=Yyt&ucWz~50|$0tY-Mg^c?1e!b8~5DZf#|5bOi@z -Wo~72X>$e&baG*Cb7^#GZ*B((Wq5RDZgXjGZU_lwcw=R7bZKvH2?|qnaBys8ZDnqB1_TLXZ*FvDZgfdx -0S1_@x7s+uExGllhUte$e$Op^sMk_Bzn7+|3$axzr3rLtZDn(GVQp{#07wU8a%Ew3Z*l@;#MKE+xj;HS -^AvC+-Eea3oo~4=i3iziU+2)E(%Ou+=zxYCD0L!x4tB5Hm3vFbl?lapNXe%XU~*fKJ0+Y8VQy}3bYXO9 -Z*Fq{3ISO55nb$VTQ?X>xA?XXJF{2H^dT~zWT)b=0OBT1J2L^)|BtqCIH`QK6F1|v)Z${_U85pQj^zm^ -DU~vi8uS+c0000000030000000000FRB~Z%b7^#GZ*ECuVPj4E?M+l67UG^w8*<_XZ#%uyqCt-#n -(R;4&W&+>mb;*F>vukd;=m`ygb@x#_>`RmOO$cpebYWy+bYTDq0!8YhU)%QMkO4aJ;_ZeCe;xE!X<$x_ -Fs4If6Z`oP*&DQ20rFt3ZOHs70;T-agdg$OP=xIp;K4#IcLF!~asU7T000000RI300000000(DmZ(?C= -a{vkgMe3tp+xFv-0Xp&G?S=|}9rRaeU`~uMrbA>C`}q*r8?;yf@?frQ$owe+rTo-{AMw{vgzX#P!9p!} -0yp?_0%XM12~D{`Iz96ga3kGta_pUNxh{zZ*=%3u(4f-Vj5fhEq57bK6Q|uUfIMEX^1}Vv6tLB!)|10- -o)0prc>n+a000000RI300000000wDpaCLNZ015&{>Z4!V_T!KNI`QJ|h6;Zj^jB$MPK+?7Lu3>C`4HI~ -v{(W1V6JV*{3!yZ{M3XW@z+pGEG0000000000{{R30000003t@9}X=iS2Wo~qH015&{ ->Z4!V_T!KNI`QJ|h6;Zj^jB$MPK+?7Lu3>C`4HI~v{(W1V6JV*{3!yZ{M3XW@z+pGEG -0000000000{{R300000033g#@Wo~0>Wpe-t0!8YhU)%QMkO4aJ;_ZeCe;xE!X<$x_Fs4If6Z`oP*&DQ2 -0rFt3ZOHs70;T-agdg$OP=xIp;K4#IcLF!~asU7T000000RI300000000w1pa&K~T00{y`>Z4!V_T!KN -I`QJ|h6;Zj^jB$MPK+?7Lu3>C`4HI&hQW&>`ZdvNB=ndTz*X~v;Uq>`<)y^XImOPdju4Lk0000000030 -000000000HWMyVyb!>D&b8~5DZf#|5bN~bb00eGtZe;)f009JZZ*64&1pxv@>Z4!V_T!KNI`QJ|h6;Zj -^jB$MPK+?7Lu3>C`4HI~v{(W1V6JV*{3!yZ{M3XW@z+p~GYywm#VTK~nd#>Ze%hHN@6KPlLd+s#TneA -z-EYx +0WOjr%NR~!ZDnLeX=Q9=RB~Z%b7^#GZ*Ek1aAgJq0%>FdAXg`>_lQgbaV_>=c$Ts04O39g2dD_h*R5>c +*5<{jG*S<)6P6lYy(#<=BR_>s@(?%#f7ArN-=Rj?7Ns(11a4t%WdcR&qhH(he1kloHngE|MP06;5GoWn@NaWo%?t +VQgh?V|i40aAgJq0%>FdAXg`>_lQgbaV_>=c$Ts04O39g2dD_h*R5>c*5<{jM(yUq2ps*m=2xUDT;RqC +gn#@WzFu~@adfH5^@&-|1a4t%WdcR&qhH(he1kloHngE|MP04o+chWn@-ia%o|1bagle0|IGe00035ZeeX@0!8Yh +U)%QMkO4aJ;_ZeCe;xE!X<$x_Fs4If6Z`oP*$IZhiz50p(P||0m=?fQ^Mv6fMp@;h#Lzj#&aRFSj|g&Q +b7gXNWn=<+10COKearHwcS=7M7YzYaI8*bvhMOc?)(rkC#nUG5>JtwI*nu%&Q~z;Vl^%5wS6(#;{6ajG +64wDPk{-(nPj_x*WJzXWV`T&e00Uuec>n+a0S0nuXJ~YD0000224QV)b#8P30009AVQzUuVRT^t000CD +VQzUrbaY{3XaE2J1q5VabYTDm0RlzpqhH(hioJ +pYH;+t0eX2w~A!Q+0eaZ{MVycPK^psbz)a(bZ%vHa|8ka1ax?5WB>&L0`+VYVk7oBr%DNv+($;q`HHK! +gIHa)*%m(-e#9sm3ZsHT^UK%K(4i9Ajp1M~R@C@!4#dQE#lUD;OiKi1RsjNZcmM?f0`+VYVk7oBr%DNv ++($;q`HHK!gIHa)*%m(-e#9sm3dMUNn!oosZgNI|twmNZeC(lYZa*g7-2eQ3Yy;-pL1po(RWoBV@Y;*ts009Pc +d2nS;ZvX`W0006J2y}UHWlmvjWdH>M0!8YhU)%QMkO4aJ;_ZeCe;xE!X<$x_Fs4If6Z`oP*;5t>gcQkw +bf~^M){{|8P%hsRk~m~ep32F151Y4WWD*HxX=Q9=PGN0j00jX8Me3tp+xFv-0Xp&G?S=|}9rRaeU`~uM +rbA>C`}q*r8?;yf@?frQ$owe+rTo-{AMw{vgzX#P!9p!}0yp?_6AN}>a%o|1bWUMyWdH>M0!8YhU)%QM +kO4aJ;_ZeCe;xE!X<$x_Fs4If6Z`oP*$IZhiz50p(P||0m=?fQ^Mv6fMp@;h#Lzj#&aRFSj|fwBaByr* +VQ>Wj015$yz}|oy`cC#6Uw2{wE+Sw~);*uMH+9Bf@aCY-RuiZDn*}0S0GmZ(?C=0tIh(Ze?Tx +2XWo~161PWnub7^O8ZDnqB1qWwkZe??6a|Q}@a$#@6CZU+fvcywiMb7^mG2nl6)V`Xr3X>V=` +3R87(aBO95Wo~o^1PNnrZggdCbV+0Z2AHk4+Bm{3x%H=p>4!*u&n~Wpi|4 +ZEyepNC#tbWnpx0asnV%C#?5~OapN(_Fs6GvFQy{P|gRa2*}s1Y~I%9#i_RFfQB3>bs~EXcCXx(drQcb +3B`Fx$)^%va$Ar)C7cUkZfdKHyBH|__hx_vscRWAu^w2r{b^x;wDWyGXd29 +kG60)seH8)H{-R`;$q)jqasX>@6CZb@cgV`T;j +2yJg~GYywm#VTK~nd#>C`}q*r8?;yf@?frQ$owe+rTo-{AMw{vgzX#P!9p!}0yp?_ +0000000000{{R30000002WM<=Vqt7^015&{>Z4!V_T!KNI`QJ|h6;Zj^jB$MPK+?7Lu3>C`4HI~v{(W1 +V6JV*{3!yZ{M3XW@z+p_lQgbaV_>=c$Ts04O39g2dD_h*R5>c*5<{jHo-KZ +`k;Xmr`<4sJYKN!!u{G5u+^j1lf!PF4>GEG0000000000{{R300000025D|^b#!w83IavyqhH(ha{vhfMe3tp+xFv-0Xp&G +?S=|}9rRaeU`~uMrbA>C`}q*r8?;yf@?frQ$owe+rTo-{AMw{vgzX#P!9p!}0yp?_0000000000{{R30 +0000024!+`Z*p@02?9mxqhH(huJC38-{*D7fZ(%hZo23R4S;p`Q9JBQllDyoR%LQdZvz4Xb}#?}b}<1BS7~%^Wpi^vb#7#AWd;HY +aCKr=X>@L7b8`Y9S0}9Zh)e@zVQyn+Z*pa1LUnFrY-Mu+hzwODL;*@eYE_8FVm19wjO(ZbIvDI)B0PALl`~a8 -----END STRICT TYPE LIB----- diff --git a/stl/RGBStd@0.11.0.stl b/stl/RGBStd@0.11.0.stl index 986636e0..aa9bc8cd 100644 Binary files a/stl/RGBStd@0.11.0.stl and b/stl/RGBStd@0.11.0.stl differ diff --git a/stl/RGBStd@0.11.0.sty b/stl/RGBStd@0.11.0.sty index 1501e86a..25c3be31 100644 --- a/stl/RGBStd@0.11.0.sty +++ b/stl/RGBStd@0.11.0.sty @@ -1,5 +1,5 @@ {- - Id: stl:H1HLPfyC-5YLlAk!-KWhcUo1-0vtex!9-ODxSmIA-zj1J$qc#western-craft-bogart + Id: stl:JhUC5JgH-Kwps4cO-ZNUklUj-UP6boFp-OY!18Kx-xOSJaVQ#hair-magnum-helena Name: RGBStd Version: 0.11.0 Description: RGB standard library @@ -11,32 +11,7 @@ @context typelib RGBStd -import StrictTypes#century-comrade-chess - use VariantName#theory-austin-before - use FieldName#present-flute-herman - use Primitive#deliver-arrow-boxer - use TySemId#popcorn-super-young - use FieldSemId#spiral-road-marco - use TypeName#edgar-carol-mystery - use UnnamedFieldsSemId#freedom-degree-gregory - use SemId#logic-absorb-hilton - use Variant#humor-regard-promise - use Sizing#courage-alien-salon - use NamedFieldsSemId#solar-salad-smoke - use EnumVariants#dispute-natasha-vega - use VariantInfoSemId#museum-edward-mirror - use UnionVariantsSemId#santana-address-pepper - use TypeSystem#adrian-boris-sponsor - -import AluVM#congo-archive-folio - use Lib#gate-biology-optimal - use LibSite#ultra-grace-message - use IsaName#taboo-olympic-cloud - use LibId#germany-culture-olivia - use IsaSeg#size-shake-olga - use LibSeg#lemon-philips-horse - -import RGBCommit#tuna-safari-design +import RGBCommit#harvest-person-orion use ExtensionSchema#active-eddie-empty use BundleId#carmen-farmer-diesel use AttachState#lady-japan-fiesta @@ -106,18 +81,24 @@ import RGBCommit#tuna-safari-design use RevealedData#olivia-copper-stamp use AssignRevealedValueBlindSealTxid#photo-jump-silicon -import RGBLogic#explain-marvin-bless - use DbcProof#needle-change-forest - -import CommitVerify#miller-pancake-elastic - use MerkleHash#horse-popcorn-bundle - use MerkleProof#price-aloha-grid - use ReservedBytes1#origin-roger-relax - use ReservedBytes2#florida-libra-circus - use ReservedBytes4#young-goblin-academy - use ReservedBytes8#rudolf-tape-adrian +import StrictTypes#century-comrade-chess + use VariantName#theory-austin-before + use FieldName#present-flute-herman + use Primitive#deliver-arrow-boxer + use TySemId#popcorn-super-young + use FieldSemId#spiral-road-marco + use TypeName#edgar-carol-mystery + use UnnamedFieldsSemId#freedom-degree-gregory + use SemId#logic-absorb-hilton + use Variant#humor-regard-promise + use Sizing#courage-alien-salon + use NamedFieldsSemId#solar-salad-smoke + use EnumVariants#dispute-natasha-vega + use VariantInfoSemId#museum-edward-mirror + use UnionVariantsSemId#santana-address-pepper + use TypeSystem#adrian-boris-sponsor -import BPCore#totem-holiday-helena +import BPCore#austin-story-retro use TapretNodePartner#roger-member-educate use TapretProof#marco-border-sample use TapretPathProof#kiwi-mirror-paris @@ -126,10 +107,25 @@ import BPCore#totem-holiday-helena use BlindSealTxPtr#fortune-iron-salmon use OpretProof#good-village-flex use SecretSeal#dollar-iris-wizard - use AnchorMerkleProofDbcProof#flash-justice-paradox use BlindSealTxid#media-judge-anita use TxPtr#italian-july-eddie +import AluVM#congo-archive-folio + use Lib#gate-biology-optimal + use LibSite#ultra-grace-message + use IsaName#taboo-olympic-cloud + use LibId#germany-culture-olivia + use IsaSeg#size-shake-olga + use LibSeg#lemon-philips-horse + +import CommitVerify#miller-pancake-elastic + use MerkleHash#horse-popcorn-bundle + use MerkleProof#price-aloha-grid + use ReservedBytes1#origin-roger-relax + use ReservedBytes2#florida-libra-circus + use ReservedBytes4#young-goblin-academy + use ReservedBytes8#rudolf-tape-adrian + import Std#ralph-blue-lucky use AlphaCaps#picnic-soprano-aurora use AsciiPrintable#ultra-sunset-format @@ -163,6 +159,11 @@ import Bitcoin#signal-color-cipher use XOnlyPk#clever-swim-carpet +@mnemonic(mayday-rider-diploma) +data AnchoredBundles : tapret#1 ClientBundleTapretProof + | opret ClientBundleOpretProof + | double (tapret ClientBundleTapretProof, opret ClientBundleOpretProof) + @mnemonic(domino-waiter-orlando) data AnnotationName : Std.AlphaCaps, [Std.AlphaNumDash ^ ..0xfe] @@ -175,6 +176,16 @@ data AssignIface : ownedState OwnedIface , required Std.Bool , multiple Std.Bool +@mnemonic(scoop-deluxe-action) +data ClientBundleOpretProof : mpcProof CommitVerify.MerkleProof + , dbcProof BPCore.OpretProof + , bundle RGBCommit.TransitionBundle + +@mnemonic(fame-iris-habitat) +data ClientBundleTapretProof : mpcProof CommitVerify.MerkleProof + , dbcProof BPCore.TapretProof + , bundle RGBCommit.TransitionBundle + @mnemonic(tango-hotel-jamaica) data Consignmentfalse : version ContainerVer , transfer Std.Bool @@ -392,9 +403,7 @@ data ValencyIface : required Std.Bool data VerNo : v0 | v1 -@mnemonic(special-almond-anatomy) -data WitnessBundle : pubWitness RGBCommit.XChainPubWitness - , anchor BPCore.AnchorMerkleProofDbcProof - , bundle RGBCommit.TransitionBundle +@mnemonic(storm-left-reflex) +data WitnessBundle : pubWitness RGBCommit.XChainPubWitness, anchoredBundles AnchoredBundles diff --git a/stl/RGBStorage@0.11.0.sta b/stl/RGBStorage@0.11.0.sta index 85b7610d..3a12b1b6 100644 --- a/stl/RGBStorage@0.11.0.sta +++ b/stl/RGBStorage@0.11.0.sta @@ -1,23 +1,23 @@ -----BEGIN STRICT TYPE LIB----- -Id: stl:YBgLtVmT-FuzNBPe-1fxIqay-JW4Evd5-Za7fm9w-GLF6JAg#transit-xray-giraffe +Id: stl:mG$H7b6I-$T8qp18-07PSNeA-rbEBNS5-$J5X4y0-1vPxRWg#channel-vortex-bandit Name: RGBStorage Dependencies: - RGBStd#western-craft-bogart, + RGBCommit#harvest-person-orion, + RGBStd#hair-magnum-helena, StrictTypes#century-comrade-chess, + BPCore#austin-story-retro, AluVM#congo-archive-folio, - RGBCommit#tuna-safari-design, - RGBLogic#explain-marvin-bless, CommitVerify#miller-pancake-elastic, - BPCore#totem-holiday-helena, + RGBLogic#import-boxer-seminar, Std#ralph-blue-lucky, Bitcoin#signal-color-cipher -Check-SHA256: d9ad4313afd685354c6846af7c3cc13a907b553af88f8e584482c6541807b6dd +Check-SHA256: 1b751fa1bbeea231625cc17129d356fefecb85e0974f343cadf022d6c227ad17 -3Q|WxQ*>`~VP|CtA5qIa{DS3zlS>Z4!V_T!KNI`QJ| -h6;Zj^jB$MPK+?7Lu3>C`4HI)Q*?4^V{}w`aAk91a5aA+<>R2XhQO_4{AcS-HH^7AVzASV8M4NYxyCjH -L2PwaO=QH?2~D{`Iz96ga3kGta_pUNxh{zZ*=%3u(4f-Vj0sXlLPKwDZE19FDia2b(>AB29AOeYx#=(k -!8In=XQlLX14LMLVywRiQb$5eZ)a&^dIKHbX?@G`sCP;~6&DQwR5(-fxrUo0Th*%N~j&hfyEy&;~+KLvM0r$}AplgPGkh3_fq3Q7_j=2#kPT +3Q|WxQ*>`~VP|CtAXg`>_lQgbaV_>=c$Ts04O39g2dD_h*R5>c*5<{j2~tNwLvL+uX>=wP0_2znD++Ak +!AD4^=04ZLvBczwX;cPMM?zC{WJT(uU)%QMkO4aJ;_ZeCe;xE!X<$x_Fs4If6Z`oP*$Y#2 +a%p39RC#b^b5;}9*VKn|nRBmPlPrrd^EP>$AHP6|FsuXsI;G3ONCrYsLvM0rVsJHoA?4$swuZp1Wc+9A +Of`(TIbyKWjTy4WkGaM+1wm|eR!w>X9p7nv%krpqN@X!nKLI&Lh~GYywm#15DT%6aZ|SrJerP1pIOD57`7Ol|-ogQ6Pjg~y>s-v>!^VNPLfWv4Jz0xkJm$nc4y @@ -25,12 +25,12 @@ MWR2J-cc#Q6SofWC)gp7L6!Sc3I$AQVo7AP4Jk3r!|EoW{Zi$060oMN(jLzPuNboiNpoRS WoOdj7+WWC1?EKi+6QrwlvP$nl8x-M691f9z+~t)>6ivgX<}1lX9hx0LvM0r4FCar2VDR_OBR)w8yCZ2 EylR&t_^>1Sz?kFbz0>alMxYAVQ_L~bWU$%Wl&*qbZ%vG1JyK;>qK>mX$cszrKCL=@F5H{a;)B(Tlt4r og*WC5Jh-!Y-wX@bW>$vY*ct@WDm98Wft0d6dj=*oo`t> -c$)o5X19O9`rXu=lIsRdWprq7WH>)!E^$-R$RUwD%Xb~0J!Ic@@+ehVE%-)5lom~G1rbzXaB^jIQfX&s -bV71rZewUhC#Wt^wA&hNfbvI8l{tqo-}{|djZ8YAkJtUQVz<=}LTqVnWK(5fY*ctqbaF>d&s@;xOg?z( -`#e5a?6_IYcQ>qF5t# -xf?-lV`y)3O=WUxY-K`hZ)0muaB^jIP;zf?W@s7fyw$T9tCzEwrAszt-P)%HZ|LbH=L2A=l(W4CP6|_H +W)s9yQf4Q+L?w(nXY|a%e*XOAC%4aD5B-6UFMfO2d=FG%aB^jIP+@dvP;zf?W-hl7CAn^87TS9h9ibha +Z&^Bcn*B*;w|~I;-PD|t>jq6_bZBp6I6q=8aZ}RBA(1@GcO9QSWZ!o3C{DWI)5Jeow&v$k6@5bjw%EMbM&T%L^glVtzy>c`nt +RvSTXV`y)3O=WUxY-K`hZ)0muaB^jIP;zf?W@s7fyw$T9tCzEwrAszt-P)%HZ|LbH=L2A=l(W4CP6|_H V{&D5Q)OXnu*Pw&hI`xNV4B0;>oUbhHyi-Y#=22)QEgSwgbZe&wsVQf@*X=JhGI5`vwIKJ?2 8qdBQV5M*2;q-lY2q<~K(fZR6A>9R3cu;h52SRCdV{d706aWDkZG|bw_S!^E6;6$ujJ=)@jfnzUJFt-< #ywK79)|@}WpPe#3K@{sQ}POxW*-wf^&?6pkN!)@-3ce88{`DNj-p1Y1XOrQZXx47L&d6G@+l`%qd385 @@ -51,7 +51,7 @@ H8-hI70Bv^+*0?ef%0)>Q3WPbltNdpi4*91)SI!>2Tf&jb75y?IG#g>Clv)aMjKgwAH@`bu1x<7g|G$} _h5K%L=laq&yA1JoJ^{7>oKLkF4~iax8KK|47hp@Qe|^xa&~28LV0v$b1}=fEj#9D^K)f#Cf|Xn@L3mU 0Z2&n-dr?jcD1Ll0RawDWpib6c4cHjd30rSGT61bmh)A>-9G+(AKhLw+s!eDmlO2>&}_PPHjCBJR|r&c Wo1rpWM%K_6AuO0fiYoI|8ZKC9(55{UNs2(LOhfb*8wh)9?K3=Wpib6c4cHjd30rSH2#7XN#A(BKKz&v -`r;e6DUv<<*U}c>*a184%wsNMHUptBVZ#B!U% +`r;e6DUv<<*U}c>;b184%wsNMHUptBVZ#B!U% rHo-i1kG~VoNp!e_~i}U4@G!%Wo~n6Z*Eg#Xk~3-1ACLTJsO2B2U!6ncg?mz@CdC==Kxq?gSEg)z2E{| 2tsvkWNc+gWC^x^65s1c;WeUUgB8EM+V1n+T F3m?Yd1DC`X&GvUv9(-1>WQHGZVX3kZ(?C=R$**)WpflIJdRMsrjHBJ^EIe4enz&iEACnc`NWk%>en!w @@ -75,149 +75,149 @@ Y-w&}Q)OXnRCsA*Vd@w5&2+699UCMSB2$w)@^&J+aUCZtmJ634`nl9<7(sJ$X=iS2Wo~qHLTqVnWK(5f Y*ct@WMp+7La7y@JVOzJ)&GXo9MeQ_qmbcB?4VH0I#X{*-VH@~bY*UHX>V>+d2nTIM8@PY!h`6Z9%SYt5l1;p48RB~Z%b7^#GZ*Eg#Xk~3-d$KicKz74!90ND1i-DNy><~nF -Gwl#>J&iiT&+eT*8dQ03Wn@8fb7^O8b3$xsZe&wsVQf@*P;_#E9_N=1kiT6@?qiUXo4Z8}iXVUo?CzP| -ak(fG&*D)aL349yXKqquc4c8~Wn@HQbYVhlX>MdwWnpYocu;h5f(#9>YyC6dKSj6?lx}!~!>v+nlk{(+0jO?A+73c&X>Md`Zf8beV{~tFhyLPaScq)s9KMEx -vw34D6J>+NwrBxfixd_%u|$Wt4ncEsX=iS2Wo~p-d2nTkYgi@C#*klFTE}3hP#3Wmki}o*nL&Ed10e7t -M;q}9SVL%GX>L?_X=IPP!sthuPUKDEU2%WC`V+X+(UG)mk--2W1{>juaWxcJLug@XZbEEnZe&wsVQf@* -P;_#W5WIk~G+K)5%bR49t5yk`^qQ9iPjGK_bd$i8ToRU7hj7c;WkPIeZe&wsVQf@*X=IdA)7t~9tEf?*r}jS36zkMYeK9}${s8)2 -BzjZ?kPrw{V`yb-W|y2ahx -3nF|Vuawki#7NH?S|Q-Q!u2{b3PW#hbaG*1bV+2Uj4+W$OUgRJVvNU?M2#%ns>Kwa1v8ba_B>T#2Nxy{ -Ms;pyX<}?;Q*>c;WvQZiSChz_$|Xx}eRkFNAr%^eLl(1e@}~9=0-ijXfCfo!aCLNZuZ@?{0aPfN4Did> -Ze%hHN@6KPlLd+s#TneAz-EYx5L9wuZgXjLX>V>qb#7#AWwz*mh8!q$B6|*YuiTY;OURW8#d%1{rxIXt -TaY^?oCrx|Wo~q7ba}{Yf_n>Eea4XlBy!~v3=AX`3Ri2tjjmWpq?wXVGUDy+ac4_6daU{%%bk3j+fu`A*2Y1(Gbp$uTFE -suoy7Xklq?MR;&*X=7=0Q)OXnRCsA*)s0^W44Z@6CZq~drvB7pz2;cIXd9lO&nf5a*AnfQld~-bdb4MdwWnpYocu;h5+M7`mSQb`xkca!3_>4e9YQ#rfba;u!+d5tm#=h2RwFD4YLug@XZc}Ara%FT=WnpaHg=PS6VPp{$?vC-- -s`v@B8YHl)C#jpVFzBk!DMw8SR$**qZewX>bKWD7Yo@G%*b#-tU^&3KX?w7l?~*Sh8@1jRRblZzybDKc -Z(?C=Q*>c;W#7-Kk@bh=O+>c=6Nvv2!%cWh5H`};;G4e`yboldn7 -SVL%GX>L$;VpnN&Ze??G{4_<~U(XE-|Ev|Hdb$N7;9H9;8!%;3hl7uME$faw4?}NmV`X7%Wn@8gbYWv? -|7c^tcv66A`G>fIP}NCm0qyW47Umu?kmdbZ%vHb5L({_6sAL7mGp}OcA!CL~}i)2Slu_c$oJJbQGPZ -GGuje3Rh`#Ze??GPjX}iQb$5lbYv<320KfVtdv3E%6>Cqk43jf-YC|}(kgS&RQe`%bQtg9 -OuU(MB+3^mE|~AfiD0OzeAWk8kQh#3ZDnLeX=Q9=RB~Z%b7^#GZ*Ek1aAi1aE_h*Lbg9zSQXNeF+Qu*8 -L^1@@Y8ulZ0qRRZb7l@jcywiMb7^mGNoHYVWjV(hK7J55&$qsubbafuzL1-^j%|=cN>I>nnK4))Pz6b5 -VPj=G%D{mG2;nQMTOnwNgyXhzrB~SH04;UKo5i(1Vxw^fNoHYVWl3Z{Yw`7y(SHDgMM6vX0;lo=W-SML -KDgmdc1Y|2T5mrLR$**qZew{#W?^GxKDS8EHu@2+7MVFP1hs6^$We8|k3le2=(%KZsrQgo3qfvfZ**aF -X>V?GOR30+snp{uYWb)9vpEdM5jV}jv>9vwnX#InoRj)93qf;pX=iRpW?^GxOmsqKkxP5xCLpf?kur-g -(F6&@HI9dWN1yNftOldQ1y*HpPH$F+rJCAYw97+KWFy8eZUu~dV(l5N%b&~h(10yyF^CmTVQpn(Mrmbi -WL9BpWo~16RC#b^R>%){yv9NnI@?D0UT5ggCu*0_qr6cs3q2l0*x9K221#vjY)NET_7Pp|Zd*4POSky8 -4?DA0%Jd;JpJb=vumIvFO*=CPQ+04~Y*Te&UNH8E>xBrIwS50cCx~Y4>vpbO6eBrP2Wxp8;c>|H3sYrb -Y*%S?Ze??GU_W_(!uc?s(BakzdJ7?EF9^9Gyf?ad??x_c(9*_N98Yz0aCLM+b8~5DZf#|5bW&w@WnpY( -WJFFkgU`2UB%$aBN9rX=%!lt4v-5=I26&L{nTGW3do8V16r+p^9tR;mq;f9#3_2aCLM+ -b8~5DZf#|5bW&w@WnpY(WI=RvVPj}%#AUTvyg$3{N++IppJQl5+tKwp$xtHBFa^7o2YcTaPGN0jWJYOa -Y-B}vbY*UHX>V>+d2nTFC(1LJY0Wqjnq=?-uFQU?YI{u_&s!j~X7+MC!AG3V -Hn6J~&pv~A7-khwT~%sgOe`@BM`dnhb7^x)W?^GxgjZ$<5FZnjcuT6B5B6)POqpHCTrHl4#QtZa;zni7 -2}x#QV`WKgaBPMc5G-hCV9w&(UffE`hM!G~aLQ!~gAR@AcC9KZUquT;Z*FvDZgf*=XLE+Y-hdqXPWBsL -cVYo9B4AF|J)gHXb;e-i?Yrhg(m4rJb#QQONpxjxlpOD6#%EY0CLclTa6hZC<#>ZODNcTE%yi#yB_`&o -2u*KfX=Z6cbOl5XuY`uYqVp0y6#Opn49V(cQq7+-P0pRHy9#PwIZe?UiW?^Gx;?xyT5z&Ua+M@}mOiDpYxh>^^GknUxTJ!XL -#OUcE2}5sgbY*UINo3<=9kcvVUUjCQt9$#kE#Vw&S@S1XLTY^Y?LL}v9ZWWu2|;XdXkkNPaC1n$BNr;@ghiU?gEXK9KMDE{F?;HZBRuDVqlk6q -mbeZmb;*F>vukd;=m`ygb@x#_>`RmOO$0)3Z)|2*aM+Gq(Fu_0 -Ocz)^+@GUUoV7w&pu=F9->y0X3z7m=HF#-wX0mI#UQqw(qY;tp7Zc6+Qb4G4KrzO(t)@DpIt)Q@6JWikDr@YkEAs#9)9JJvRH-Qc7Q2s%Kf+=VCyOABEU3kOtrQ)O*QWJFFoaz*WZ -Z5##rf6bm&7qffY6*N`B##bI~HzDmr7z##dWo%?qWo=1hQx*t>6v={gsJ=SZlTl1iF5eQ8IAl(q%E@>S -o406W2vm7+WlmvjWn_%h53p;7sgGx&z)8&prN#D&cR=tS@df05SQ3Z*PZCvbZeeX@WJYOaY-Dp&Wo=1h -YXqYdo~D%m7H6OD0<^0n_2##VWXRdjy=DB@qgYOj1yf~hNo0M=LMPN>0NEy%g(UCHeUkYj{YR7-159lq -XIqm$}teZO^;JC(UrZ-Ks{e+7M1*ZDnLeX=Q9=b5mt)No1EHgR0RSPeIWLGZ_*YTjUMn3>33lep74@ -i%V@}#Ze4JZgp)|VRC6;+#Z*Ep$a%o|1baPW>ZAoPPfv$so3kRF1 -PV2}fOp_vjQ6FdFHId|V -a{vhfWW?18O}RiiJ@XWBBi(Rv?4579E{O-(Y+vWlpwilmlMuXsu{2tXFT+?;?hj39&>gq>HOrf1lB-q; -n)I5N0000000000|Ns90000004sUgIaBpdDbWd<^b#!w83Ib%r)d@|xKsr716mTQmaB}ROZ@Dgs2ia_2 -=g^?i+Kka>7rjFg@b(FW?*48~9t#5lC;3juy9JUg#K|!ymZ|^=0%XM12~D{`Iz96ga3kGta_pUNxh{zZ -*=%3u(4f-VjFS+&fUz`Mi!Z}iQtl5;XwV(E`Zdd&WRj~^37YhpmjD0&000000RR90000000000000000 -0RR900000001!=OZ9{KvbaG*1bW?O;bY%ty2yJmcWTI{*Lx000000RI300000000wetXJ~YD00{ygQOiC2g5`qc -0#Axs7ZjsiFSYD`^x*MIVgSxPN&ctwsMp|!ND`2%gc_Nxrh2qVwA%Us#V;Pkm;mDO$Szy}0000000030 -|Ns9000009W_507X<}?;a{vhfA5qIa{DS3z$bhcTl`&GYj0000000000|NsC0000001Y}`!VE_pNA5qIa{DS3z6r)`)wd{WM;PFag0M0#0{-c;Wd;HTYi@6MZU71bA5qIa{DS3z00Rh3Wo=1rWMy~;1r2X-LUnFrY-LGqWMy~&3Ib%r)d@|xKsr716mTQmaB}ROZ@Dgs2ia_2 -=g^?i+KiRR=6W7=VqesjRYGc!>wZFzp>JB4@xD;^wu&SY_r(Ha#MKE+xj;HS^AvC+-Eea3oo~4=i3izi -U+2)E(%Oszdy}<28ig(gSpg+?&9*`C2(3=%09avzwZKZf-~wC#0000000030|Nj600000JVs&n0Y-K}l -Zgg^CV{}PwWMy~&3Ib%r)d@|xKsr716mTQmaB}ROZ@Dgs2ia_2=g^?i+KdBxleIk>g)RqK0VQ|Mwn6X+ -txo3vSYd;;z)HQ~0$c)Q#MKE+xj;HS^AvC+-Eea3oo~4=i3iziU+2)E(%Oul2rNlD$O59e#ogQsB77jP -l+h5j^*S;D0000000030|Nj600000IVs&n0Y-LwzbZ%vHb4hMwWq1Gz0%XM12~D{`Iz96g -a3kGta_pUNxh{zZ*=%3u(4f-Vj01aUXjT --wZT0^&Yy7N)`YB000000093000000000eiWpZt4ZeeUmZe(S6015(R#MKE+xj;HS^AvC+-Eea3oo~4= -i3iziU+2)E(%OvMidq_i6cBYN^7xEELu$lFU37Sf$J;ty5yrmOX|)6Z2?Auq)d@|xKsr716mTQmaB}RO -Z@Dgs2ia_2=g^?i+KiJBynwMZT8l5kSW@l}O=!>^xB4~9n`Dx!RtcK)nwJ0o00000009300000000000 -0000000960{{R30000P0Wo=V*VRL8(4G42%Xk~3-bYTDr0%XM12~D{`Iz96ga3kGta_pUNxh{zZ*=%3u -(4f-VjFeK-+XJhss8OG%_CC-Q>(otsF+cqN0Qy}ddQ=3E5CR`j%RT&p<$~n`Pl{R>6r)`)wd{WM;PFag -0M0#0{-@G+FLmd)8^C0+InTyb%?WTG%$DZ$m;bAR)ya#VGE@Kn000000093000000000JQW?^Gxa{vkg -A5qIa{DS3zp#+${pKVqYC -0v}P!J^X^@g5?5Fidq*Gqg^kx?0)p%@k(L<&OJ%~r#Z(OK7J55&$qsubbafuzL1-^j%|=cN>I>nnK4)) -Pyhe`000000RI300000000(DfZe??2a{vkgWW?18O}RiiJ@XWBBi(Rv?4579E{O-(Y+vWlpwilmp9m~T -I>-W|y2ahx3nF|Vuawki#7NH?S|Q-Q!u2{b0%XM12~D{`Iz96ga3kGta_pUNxh{zZ*=%3u(4f-VjO?=J -cE6dyPJT+tk%Iz|R3_dTDo~ZL;TN>Nv6r)`)wd{WM;PFag0M0#0{-*|*t+(1Z!Y#S=r-tc=NPf>PeW=$`IKP*ssSB}HE2RJl0v}P!J^X^@ -g5?5Fidq*Gqg^kx?0)p%@k(L<&OJ%~r(-?SiLgsaRw~c9&Ny{YCK_TCaeS`x+X~XLW@}|UwEzGB00000 -0RI300000000000000000RI300000000&}qZe(m_a{vkgWW?18O}RiiJ@XWBBi(Rv?4579E{O-(Y+vWl -pwilm1ACLTJsO2B2U!6ncg?mz@CdC==Kxq?gSEg)z2E{|0%XM12~D{`Iz96ga3kGta_pUNxh{zZ*=%3u -(4f-VjIWKC(E(H_nGEpD*KTAo3`$}tLz4xH6U7V?G -015(R#MKE+xj;HS^AvC+-Eea3oo~4=i3iziU+2)E(%Oub$mV(;bz)!CmQ_M(k?Vd!kfCo{nDM?)_qK{8 -68FUdWW?18O}RiiJ@XWBBi(Rv?4579E{O-(Y+vWlpwilmQ>XLl0V(0al>0fVsbCfs) -I{K8&0000000000|NsC00000033q99Ze??GWpe-u0%XM12~D{`Iz96ga3kGta_pUNxh{zZ*=%3u(4f-V -jEQSlCC$c=UszhlV5m?Ru@{iVU*wrVdeH+Q@FPbX@d6)F%RT&p<$~n`Pl{R>6r)`)wd{WM;PFag0M0#0 -{-<6r_K53+2$;2e|4Ao^X6@^Cu3Qu&Ia3E~c^u(!$n*dJ0000000960|Nj60000YNbaY{3Xl-R~baMa- -0%XM12~D{`Iz96ga3kGta_pUNxh{zZ*=%3u(4f-VjD&FwlPpg3!?y@aX^XIja4CK{WF&t@k=WXUZP9(Y -H~bW>$vY;yn!0%XM12~D{`Iz96g -a3kGta_pUNxh{zZ*=%3u(4f-VjE}p*=tr7Pr6F_xjAC6(~TLj#*ewiHWCD6r)`)wd{WM;PFag0M0#0{-=f*5G-hCV9w&(UffE` -hM!G~aLQ!~gAR@AcC9KZUqt`_000000096000000000P0Wo=V*VRU5%0tt6%bZ%vHb7gY?3Ib%r)d@|x -Ksr716mTQmaB}ROZ@Dgs2ia_2=g^?i+Kh>7SS8KIkY89@$6%;X7qJ(R#b4x^L3+^xAn+qc8}R~eDia2b -(>AB29AOeYx#=(k!8In=XQlLX14LMLVywUR3nQ8ri$WPp5w@a4b3LR7M69fMnD+{F6rHCsWOZ=>00000 -00030|Ns9000009V{dMBa$#e1a{vkgWW?18O}RiiJ@XWBBi(Rv?4579E{O-(Y+vWlpwilmp9m~TI>-W| -y2ahx3nF|Vuawki#7NH?S|Q-Q!u2{b0d|^F*?W9|>m72;^XjNjCf456piKdvUO#1@>k1Zy`v3p{00000 -0RI300000000 +qWhh6&a)9BiaoJZ>PY!h`6Z9%SYt5l1;p48RB~Z%b7^#GZ*Eg#Xk~3-dBoUB2y8Zom7+;NN8Xgkb3WeV +)QDb*=NiflQ)(Iz225djWpXilvNdf$cEfHQ12?LRftc&;5JY%0?GSH0jXJ{5?wvjwRC#b^WI=OtX=iS8 +LTqVnWK(5fY*ctqbaH_n=a&wUzgWZ$SVL%GX>LMnX>MdwWnpYo +cxhyWaSf9!PV~dK2uo>;u!nFdemP_$e?^hl+JkM;eY!XZL3DIsV`xcag}C@DyY!@{4YR*LMYs=?Zg_*k +tx|21^lzg9sBTBv4nk~cZe(e0XGURTbZ>Hp{^Dg=h-~N_zJ`Red1EINWrM}GXaQb}6c#qIM2EQ!L349y +XKrm}Zgf<6aAk>WSS8KIkY89@$6%;X7qJ(R#b4x^L3+^xAn+qc8}SNQLug@XZd7<_WRJVT=tr7P^xB4~9 +n`Dx!RtcK)nwJGnaBp>VlfaZ*5|&qoaMx&cZSO)Ho!_*yjLvyQo1^f$X+6j;96@t)X=iR$Z)s#xbYXO5 +LTqVnWK(5fY*ct@WRz0V+XJhss8OG%_CC-Q>(otsF+cqN0Qy}ddQ=3E5C~IaXk~3-No1AC=6W7=Vqesj +RYGc!>wZFzp>JB4@xD;^wu&SY_r(NHa7kpJ2rNlD$O59e#ogQsB77jPl+h5j^*S;NLvL<$ +a$#e1No1ysFp)<~$~wYgjK`HkjV#@&#T1_fGnK3MJXK)_7bXoxb#7;AVr*qobYXO5siJyUlgOLOB};96 +cGdSG6&iv=7PD~jruGj4o;;a=21#ykb#!yDjhE2@R4ADY@XOb3WHJm&VktwD1&R~J8Qi15W{8UrRB~Z% +b7^#GZ*D?$Ze(m_w&;L{94K`ndk%K5+?9Jv$dw7jc}U5p5@2#$kUJ%u2uWmRZggpMdB|&mdkb29#*qXh +a^)f?kI>J>8dqqbOFybHKpQ-MBMCulbWCA+WpXjekD95&21^?K{bw7Oyejxis%MV9vZ(?C=Q*>c;WmI`^W!4yF%LYxT^jDrckDVwO1AtjoG6an*A`7gZ+wE6AH40R6VQzD2bZKvH +*1R*Z!FE#!-}0MzvBUkD_A@LX?C3dsb3FQUOt}RYB0+O=X=iRyWp-s@Y-MCYbaY{3XhLjhZe&wsVQf@* +P;_$In^6;37FKqUhx?i3R+Mr!fY&(;2BFL(m@EZk_srD;MrL-}#pxZ$?Eb+fZ@!;9xB`-n7hgEflW({{ +JNKm>5Mos!L349yXKqquc4c8~Wn@-iY;|QqY-w&}Q)OXnRCrKya@&ep8iEuMbtv-qj6g$b#7A9pc!|f` +I$jaRzSe2A1Q1w5Xklq?Q)OdvWpqv&8b0-V>p(oz$%022vTKaWo2z;WalM|{+CCYqok=CI6O*0D2Q5~XK8~xVetWFewK9hZ4Odpc4c8~ +Wn@8gbYWv??6T%|znQ^KeoD%bg94CLCf*q;P?fLY7qq^#2NiM*2S;UYWpinB^?FS>S$_F2)vN@Mb6UJ- +F(lri_dqerx4lR4>iBsz2u)>lVPs)+Vfpl|2xhK9cV^W63=w?=$`$i`X@y)HBPPGtNLug@XZcue%S7~%^Wpi`yAASLvLGVedrqOkAVG6;X=iRyWp-s@ +Y-MCtVQh6}LTqVnWK(5fY*ct@WC&76LQHRGX=4HaT-**L6)$-r+lRyXoI{GIo*U3CNI7Emc=xo*$N+#6 +3Rh`#Ze??GP;YZ`yF$nqQ(ZC7jQ{zx3L?h_$J($?&iPIm+b{NqZ<^r>S7~%^Wpi^+a%2WlM?zC{WGVm# +J4=$RltJLk?Nfj|sXiSdmgaJi@wPyW+dHeUQG($LP<3KgX>@L7b8`lmt+(1Z!Y#S=r-tc=NPf>PeW=$` +IKP*ssSB}HE2RoUZ*FvDZgf&*W+BHHZO|$}9Zg=R%ZE7et&pz}oUddU0B(<>YerIc3kOqaXF_amVlhkK +9|TAhYfrNblQVQ`LpZXKteHopy#|_NJkG`K5e`9aZf|s9bZKvHPGN0jHx3&bJ$HXE2K+s|vHZ6#&ske5 +?JSDZAfr}PGrQJ;4^(ntZgXjLX>V>xW?^GxI6k{n`X+XC81LasyqR+($`>jwnD57lV5q8m)(2RS7*1hr +Wn@NaWo%?ra$#@6CZd7@2WjJdtcwu66snXR_9Zdb&#xLPSG6d3U8q**F>Pta$W)4MobY*UHX>V>x +W?^GxIma44eh@g%x4xWoee18jkej%UZIDDtP|$FhF<2o`1xaRMV`V$az<~n@;VY|KA!vt$qM +Ep^75#kD_Tqj3jGW?^GxNn}22@%59@e*l9;LQD7pr}6`4EeCo&xZzHANbCVxZ$AuHVQgh?V|httVPj=J +w@A-6`Vp=cnK>{7wQSPJQFX$PK`>V6xnyyv_mEW!L2hnubYXO9Z*Fr-smO?_)Z;5^`KSD|ISj`UH_gGc +8EgQVv6`Tqlln6YL349yXKqPmVPj=XbV6p4OMBubAg=+DGK(xA?XXJF{2H^dT~zWT)b=0OBT1J2MDVb#QQO +Q*~lsKY4$``7oZ);noRy3n6DO2)Q4;H@bN5MlNj7(#BUDPjz%~b#y^6%<dWpinBNoHYVWq36o>AP`=z3=Ru;NRp0 +56I1tGJoS+I(F^t&c0kHT?s*MV`y)3Q)P67S7rwg9}|^$ORAg?_G_n1nO(?SEuMzN{%51&MrF+jNoHYV +Wl3#tY=#&RENEw7&f?o%+)B!ZpG}K!%4G?I4vp$|ttu*CMGHf3ZggdCbW>?(bB4g)fE@Zx_8VV!VgW89 +U{2OOpSL%4#$e>_yXHjFISEsBaByr%bY*Rn9PeeuXILaAA3^JIKdZ3ic!M@6PJV67bl-3#Cg!RLO>bmr +W@%+|nIb5$QI^$V6PNW$vdMt6d#0>Rmk*`=dQ)K)k7d+w7*1hrWn@NaWo%?Yb8~5DZf#|5bX0k8Wuo9& +)X}ib9i^%gOs*8bY}uR&S59aNAMwsm_ykY{pbAuSb#rt~Wp-t3y@7~gQVy8J>pg27DwvPuRhrP3QWOC! +bDKQy2TX#&5>8=lWn@NaWo%?kWprUwd2nUJXXT7NJOW`Spw3o_*cmz+=1%_1gm*5-D79nn{HtCLPGN0j +WL9BvX<=@3bvVaOk0BBjil877-n>SP^xWIoCC77|*ORF1g-x>(>`)0$a93$`Ze??G$6skVRwOM6wz9dS +Yg6i3-rmX0uFE(Y8AEY@srN=83sYrbY*%S?Ze??G$_VC=pB%K5hwN>99K@5|(<4SV7$Q=&CebuM;tt7# +3rB2kVqt7aW?^Gx(swU)=eHZcWUx8U##PM;a30K-=Jl8VtAf?Zi=Hx63{zuhWo=T!Ej;9TxQjc0+10Fg2)p +3Qu=#Wn@WaVPj?D)D=(>(T2L(qY0=?Nc;Wdl=mWC;K#gwc#^4#qsMUl{*1zNe>I^CwqAYJB+ZKALhJOg5Ma +L2PhnVMAeXb4b1;7b@t4MVjY>G@u4Q3HlB(d+LiLJm-R=h;`?dxDG*cV`*tna%paKVPb4$VTK~nd#>-Vi}-aA;vuZDDL|OmAdib7%`wbaH89bX0k8WpfVz35LOoBKkGa +Y9#cS7Qj{WgyAGcS>>g~&^g7Kv@4tY;$BCg=lGO40qbyjMBe4%@A^HhWa%pX8bZK^FG5w(M*PErP +Q*K8));4q9;G_%)IzXn}g(wG03t}BM5{Lay5>;+)VQpn(MrmbiWOGwxZAoNn1fvw5rj-B|XP@r^w5ufb=C_Ju$l1`n +W&GEpSWb-vQ)O*QWPQm(C)8p9*(R2SB=5|9lKCV3N0b-?Ol>0MdKRd5P6t+Da%o|1bb-?>B-g{}GTFmo +{mAr>kexq=D7-RGP2^0W;fb3W1_o1UdTDNFlG6hDK5~2WhJ*PG7zYWLxz$!}&%4AY&2YWlsz$Eb5Kduj +Wn@NaWo%?~Q)O*QWS1d>s?i)zLD2{^84?*=6Qgx+ +2Ybs0Lm?xkSqB0NLAl2~i-ZdPG(X<=@3b5mt)No4(ju7iFH2b-u)>&PZdlOljoA7|k;k>s6qoa5|8f~g8r +d2nS@d2@7SZ3X}hLvL<$a$#e1Np56icm@ItaCKsAX=6`tZ*_EY00{yhS0}9Zh)e@5%bR49t5yk`^qQ9d0000000030|Nj600000EZ*_EV +Z)t9HPjGK_baMa-0w7l>toMja192_(UwD?W=?zm*&IhOn$k(lG-qz;DsnKT_y+ac4_6daU{%%bk3j+fu +`A*2Y1(Gbp$uTFEssITBAXg`>_lQgbaV_>=c$Ts04O39g2dD_h*R5>c*5<{jlMuXsu{2tXFT+?;?hj39 +&>gq>HOrf1lB-q;n)I5N0000000000|Ns90000000000000000|Ns90000005KU!mLvL<$a$#e1Q*>c; +Wd;Wbb7N>_ZDC1d0w7l>toMja192_(UwD?W=?zm*&IhOn$k(lG-qz;DsgzRF+XJhss8OG%_CC-Q>(ots +F+cqN0Qy}ddQ=3E5DH^&Zgg^CV{}Pm0w7l>toMja192_(UwD?W=?zm*&IhOn$k(lG-qz;DshAD4^=04ZLvBczwX;k#6 +*Wiap5|FEe8kw!8dbCNj+WG;-FCN910OIk;E?fWr0000000960|Nj60000SQb#7;AVr*q|00{yn6$0d# +2P+C};lr6VNhMM>59zuEq~<=?!m-5UiD^{RS{k*RP>KQ|D6@UrgHD8Pn~kr<(gaR)wpptCRljin00000 +00030|Ns9000004WMOn+00{yn6$0d#2P+C};lr6VNhMM>59zuEq~<=?!m-5UiD^_|KY4$``7oZ);noRy +3n6DO2)Q4;H@bN5MlNj7(#BT+0000000030|Ns9000006VRUq1V`u;g0wxs#KG(vr#N>%-RB36-k*iEz1m@>LhD1|b9AmK%IADG&k)euf*x}6a-2eap000000RR90{{R3001i!M +ZAWZxVqt7kbYXO51_A|ZZf|#P015&o6$0d#2P+C};lr6VNhMM>59zuEq~<=?!m-5UiD^{hV;!^nQC@YX +pR0TOwJqTsbD!F2W4d9F8pxqnXBGnjAXg`>_lQgbaV_>=c$Ts04O39g2dD_h*R5>c*5<{jGM-jZ2Kh}D +E2o;HYydTtf}Q!WH{}bI!u)W*#(e~Z0000000000|NsC0000001#D?;X>toMja192_(UwD?W=?zm*&IhOn$k(lG-qz;Dsg=m)dLDIRU(}XWLTZugenOC; +Z(5k~zEJnJiX;;E#R4E#C#?5~OapN(_Fs6GvFQy{P|gRa2*}s1Y~I%9#i;{(leIk>g)RqK0VQ|Mwn6X+ +txo3vSYd;;z)HQ~0$cz90000000960{{R30000wWb#7#AWkYXnbaG*1bV+VxWq1Gz0w7l>toMja192_( +UwD?W=?zm*&IhOn$k(lG-qz;DsRMhHwLKbzE(ciwC3nrXLGTEzPUiqvVS}~6O1_lQgbaV_>=c$Ts04O39g2dD_h*R5>c*5<{j1ACLT +JsO2B2U!6ncg?mz@CdC==Kxq?gSEg)z2E{|00{yhS0}9Zh)e@_lQgbaV_>=c$Ts04O39g2dD_h*R5>c*5<{jp9m~TI>-W|y2ahx3nF|V +uawki#7NH?S|Q-Q!u2{b0W8#V&bbGUt!Bq`S1yuTOW~jDcd`iI3^X_>4e9 +YQ#rfba;u!+d5tm#=h2RwFCeO0w7l>toMja192_(UwD?W=?zm*&IhOn$k(lG-qz;Dsgn@AfUz`Mi!Z}i +Qtl5;XwV(E`Zdd&WRj~^37YhpmjD0&000000RI300000000000000000RR900000000>QGZBuk%b7%$) +2y_lQgbaV_>=c$Ts04O39g2dD_h*R5>c*5<{jlv2~%1FNg3QJ<&wKF}2F)J=Uc +Km7gx`duV?R0NO^0wxs#KG(vr#N>%-RMK}Zb?3Jmz+|vF&&E~F32+|F +mge=B|Eq%4$%~#cQ~&?~000000RI300000000wDhVPj=;015&o6$0d#2P+C};lr6VNhMM>59zuEq~<=? +!m-5UiD^_j%D{mG2;nQMTOnwNgyXhzrB~SH04;UKo5i(1Vxw^aCKUqYmH4o{!1*GOa +*TS*H2rNlD$O59e#ogQsB77jPl+h5j +^*S;FAXg`>_lQgbaV_>=c$Ts04O39g2dD_h*R5>c*5<{j?6T%|znQ^KeoD%bg94CLCf*q;P?fLY7qq^# +2NiM*0000000000{{R30000001#@+9aBKhy0wxs#KG(vr#N>%-R0f!> +x7s+uExGllhUte$e$Op^sMk_Bzn7+|3$axzr2q*6CKUqYmH4o{!1*GOa*TS*H_lQgbaV_>=c$Ts04O39g2dD_h*R5>c*5<{juZ@?{0aPfN4Did>Ze%hHN@6KP +lLd+s#TneAz-EYx0000000000|NsC0000003T1e7Wo~n6Z*Fq{3IZTkC#?5~OapN(_Fs6GvFQy{P|gRa +2*}s1Y~I%9#i^CZ=6W7=VqesjRYGc!>wZFzp>JB4@xD;^wu&SY_r(GrS0}9Zh)e@_lQgbaV_>=c$Ts04O39g2dD_h*R5>c*5<{jiECIT&Bl;lSX#$ms8AQN7m&qYKG(vr#N>%-RL5UwIaVYs3AVDiqia*@S>E2s&92Kh +8W}@zf2sFIAOHXW000000RR90{{R3001IJsbYWv?ZDnqBa{vkgAXg`>_lQgbaV_>=c$Ts04O39g2dD_h +*R5>c*5<{jgmDd%EKc;pw+KsVi?D}qDSkO*B!5Mb*xG|_(S5o&00;m8KmY&$000000RR900000000000 +000000RR600000001I_lQgbaV_>=c$Ts04O39g2dD_h*R5>c*5<{jkGsO? +N19ILP2yc~f4%w>xYW^+v~7{W03rq(;firJ0000000000|Ns90000003UqmJWm9=`bY*PC`}q*r{eiB7ehUYis7~w1CQOqefKeZ3;Wd%uopqe!>_vj93Tb3zZggpM +X=QT&3IZTkC#?5~OapN(_Fs6GvFQy{P|gRa2*}s1Y~I%9#i_RFfQB3>bs~EXcCXx(drQcb3B`Fx$)^%v +a$Ar)C7c2#6$0d#2P+C};lr6VNhMM>59zuEq~<=?!m-5UiD^`#;91nsu+1H%suE1D6u@lRoC;S?XbB(j +&QSOSPz0a=0000000030{{R3000004Y-wV1015(Pa5aA+<>R2XhQO_4{AcS-HH^7AVzASV8M4NYxyCl9 +FjWFA`CQ2GiK9iLKbGE6DZmrA4)G`0A&^0p`%?-6VsJHoA?4$swuZp1Wc+9AOf`(TIbyKWjTy4WkGaM+ +5(KBV0uX$PL@)I=)&*`^S@`8Scoz5#{lyP)a751L0000000000|Nj60000001aoO;a{vkgCKUqYmH4o{!1*GOa*TS*H^^GknUxTJ!XL#OUcE0wxs#KG(vr#N>%-RE8K3ENEw7&f?o%+)B!ZpG}K!%4G?I4vp$|ttu*CMF0Q*00000 +0RR600000000>QGZBuk%bY%tt33q99Ze??GWpe-u0w7l>toMja192_(UwD?W=?zm*&IhOn$k(lG-qz;D +sflY?CC$c=UszhlV5m?Ru@{iVU*wrVdeH+Q@FPbX@dBEuZK_k`JKyPG=Rp7@Nbf+-FrJ*HF>i&!wTZgU +Bh_-dLdY0XT`|v$|M|2EBF6^D+OST}`A!+zFZPFTn&AKd0000000960|Nj60000SNZ*FvQVPkZ2015&i +S0}9Zh)e@2rNlD$O59e#ogQsB77jPl+h5j^*S;E +cA8SzdwhWF9dgX`>ZnjA*51^hO#z=?KV_fm3KoU?0000000000{{R3000000 -----END STRICT TYPE LIB----- diff --git a/stl/RGBStorage@0.11.0.stl b/stl/RGBStorage@0.11.0.stl index ccf4334f..29e2bdda 100644 Binary files a/stl/RGBStorage@0.11.0.stl and b/stl/RGBStorage@0.11.0.stl differ diff --git a/stl/RGBStorage@0.11.0.sty b/stl/RGBStorage@0.11.0.sty index c647d3e2..e6631235 100644 --- a/stl/RGBStorage@0.11.0.sty +++ b/stl/RGBStorage@0.11.0.sty @@ -1,5 +1,5 @@ {- - Id: stl:YBgLtVmT-FuzNBPe-1fxIqay-JW4Evd5-Za7fm9w-GLF6JAg#transit-xray-giraffe + Id: stl:mG$H7b6I-$T8qp18-07PSNeA-rbEBNS5-$J5X4y0-1vPxRWg#channel-vortex-bandit Name: RGBStorage Version: 0.11.0 Description: RGB storage library @@ -11,76 +11,7 @@ @context typelib RGBStorage -import RGBStd#western-craft-bogart - use PubWitness#paper-visa-storm - use ContentRef#polo-ramirez-parker - use SigBlob#insect-cello-avalon - use AnnotationName#domino-waiter-orlando - use TransitionIface#axiom-parker-pyramid - use NamedFieldTransitionType#express-brush-desire - use ExtensionIface#model-ramirez-mentor - use Iface#violin-student-system - use IfaceId#nova-cola-carbon - use ValencyIface#buzzer-holiday-fiber - use Annotations#spend-linda-romeo - use AssignIface#fractal-baker-outside - use VerNo#textile-next-stretch - use NamedFieldValencyType#invest-apollo-inca - use ImplId#seminar-data-table - use SupplSub#canoe-denmark-short - use SealWitness#vanilla-crimson-zero - use OutputAssignmentRevealedData#dinner-honey-saturn - use Supplement#caviar-zebra-precise - use SupplId#pilot-claudia-minute - use OutputAssignmentRevealedAttach#miami-diagram-mineral - use NamedFieldExtensionType#tuna-archer-melon - use AnchorSet#shadow-dominic-pencil - use NamedFieldGlobalStateType#museum-ohio-arizona - use GenesisIface#rocket-paradox-press - use IfaceImpl#permit-learn-samba - use ContentSigs#oval-sister-triton - use SupplItem#jargon-orchid-forget - use Modifier#saturn-escort-jordan - use NamedFieldAssignmentType#origin-caramel-flipper - use TrustLevel#cobra-script-albino - use NamedFieldMetaType#prefix-carmen-artist - use NamedVariantu8#star-pilgrim-pilgrim - use OpWitness#valid-toronto-gibson - use GlobalIface#concert-combat-charm - use SchemaIfaces#fossil-nepal-airline - use OutputAssignmentRevealedValue#aspect-caramel-diana - use SupplMap#sailor-observe-bundle - use OwnedIface#delphi-athlete-fresh - use ContentId#scarlet-portal-office - use GlobalOut#capital-agatha-bruno - use OutputAssignmentVoidState#mars-alabama-public - -import StrictTypes#century-comrade-chess - use VariantName#theory-austin-before - use FieldName#present-flute-herman - use Primitive#deliver-arrow-boxer - use TySemId#popcorn-super-young - use FieldSemId#spiral-road-marco - use TypeName#edgar-carol-mystery - use UnnamedFieldsSemId#freedom-degree-gregory - use SemId#logic-absorb-hilton - use Variant#humor-regard-promise - use Sizing#courage-alien-salon - use NamedFieldsSemId#solar-salad-smoke - use EnumVariants#dispute-natasha-vega - use VariantInfoSemId#museum-edward-mirror - use UnionVariantsSemId#santana-address-pepper - use TypeSystem#adrian-boris-sponsor - -import AluVM#congo-archive-folio - use Lib#gate-biology-optimal - use LibSite#ultra-grace-message - use IsaName#taboo-olympic-cloud - use LibId#germany-culture-olivia - use IsaSeg#size-shake-olga - use LibSeg#lemon-philips-horse - -import RGBCommit#tuna-safari-design +import RGBCommit#harvest-person-orion use ExtensionSchema#active-eddie-empty use BundleId#carmen-farmer-diesel use AttachState#lady-japan-fiesta @@ -113,6 +44,7 @@ import RGBCommit#tuna-safari-design use ConcealedData#ivan-tripod-young use MetaType#quebec-mission-quota use TransitionSchema#jumbo-matrix-normal + use Layer1#camilla-basket-justin use TypedAssignsBlindSealTxPtr#airline-video-travel use AssignRevealedDataBlindSealTxPtr#ritual-license-arcade use XChainBlindSealTxid#dynamic-life-brown @@ -152,36 +84,105 @@ import RGBCommit#tuna-safari-design use RevealedData#olivia-copper-stamp use AssignRevealedValueBlindSealTxid#photo-jump-silicon -import RGBLogic#explain-marvin-bless - use WitnessPos#snow-local-tonight - use WitnessOrd#exhibit-erosion-dallas +import RGBStd#hair-magnum-helena + use PubWitness#paper-visa-storm + use ContentRef#polo-ramirez-parker + use SigBlob#insect-cello-avalon + use AnnotationName#domino-waiter-orlando + use TransitionIface#axiom-parker-pyramid + use NamedFieldTransitionType#express-brush-desire + use ExtensionIface#model-ramirez-mentor + use Iface#violin-student-system + use IfaceId#nova-cola-carbon + use ValencyIface#buzzer-holiday-fiber + use Annotations#spend-linda-romeo + use AssignIface#fractal-baker-outside + use VerNo#textile-next-stretch + use NamedFieldValencyType#invest-apollo-inca + use ImplId#seminar-data-table + use SupplSub#canoe-denmark-short + use OutputAssignmentRevealedData#dinner-honey-saturn + use Supplement#caviar-zebra-precise + use SupplId#pilot-claudia-minute + use OutputAssignmentRevealedAttach#miami-diagram-mineral + use NamedFieldExtensionType#tuna-archer-melon + use NamedFieldGlobalStateType#museum-ohio-arizona + use GenesisIface#rocket-paradox-press + use AnchorSet#pluto-plasma-diagram + use IfaceImpl#permit-learn-samba + use ContentSigs#oval-sister-triton + use SupplItem#jargon-orchid-forget + use Modifier#saturn-escort-jordan + use NamedFieldAssignmentType#origin-caramel-flipper + use TrustLevel#cobra-script-albino + use NamedFieldMetaType#prefix-carmen-artist + use NamedVariantu8#star-pilgrim-pilgrim + use OpWitness#valid-toronto-gibson + use SealWitness#cotton-lopez-isabel + use GlobalIface#concert-combat-charm + use SchemaIfaces#fossil-nepal-airline + use OutputAssignmentRevealedValue#aspect-caramel-diana + use SupplMap#sailor-observe-bundle + use OwnedIface#delphi-athlete-fresh + use ContentId#scarlet-portal-office + use GlobalOut#capital-agatha-bruno + use OutputAssignmentVoidState#mars-alabama-public -import CommitVerify#miller-pancake-elastic - use ProtocolId#shadow-eclipse-program - use Message#druid-blitz-rover - use MerkleHash#horse-popcorn-bundle - use MerkleBlock#pegasus-delta-eddie - use ReservedBytes1#origin-roger-relax - use ReservedBytes2#florida-libra-circus - use TreeNode#kansas-scarlet-ricardo - use ReservedBytes4#young-goblin-academy - use ReservedBytes8#rudolf-tape-adrian +import StrictTypes#century-comrade-chess + use VariantName#theory-austin-before + use FieldName#present-flute-herman + use Primitive#deliver-arrow-boxer + use TySemId#popcorn-super-young + use FieldSemId#spiral-road-marco + use TypeName#edgar-carol-mystery + use UnnamedFieldsSemId#freedom-degree-gregory + use SemId#logic-absorb-hilton + use Variant#humor-regard-promise + use Sizing#courage-alien-salon + use NamedFieldsSemId#solar-salad-smoke + use EnumVariants#dispute-natasha-vega + use VariantInfoSemId#museum-edward-mirror + use UnionVariantsSemId#santana-address-pepper + use TypeSystem#adrian-boris-sponsor -import BPCore#totem-holiday-helena +import BPCore#austin-story-retro use TapretNodePartner#roger-member-educate use ExplicitSealTxid#nova-roger-campus use TapretProof#marco-border-sample use TapretPathProof#kiwi-mirror-paris - use AnchorMerkleBlockTapretProof#poem-serpent-broken use Method#bali-boris-plasma use TapretRightBranch#miracle-patriot-touch use BlindSealTxPtr#fortune-iron-salmon use OpretProof#good-village-flex - use AnchorMerkleBlockOpretProof#gentle-gate-page + use AnchorMerkleBlockTapretProof#ventura-palma-trumpet + use AnchorMerkleBlockOpretProof#sheriff-alex-degree use SecretSeal#dollar-iris-wizard use BlindSealTxid#media-judge-anita use TxPtr#italian-july-eddie +import AluVM#congo-archive-folio + use Lib#gate-biology-optimal + use LibSite#ultra-grace-message + use IsaName#taboo-olympic-cloud + use LibId#germany-culture-olivia + use IsaSeg#size-shake-olga + use LibSeg#lemon-philips-horse + +import CommitVerify#miller-pancake-elastic + use ProtocolId#shadow-eclipse-program + use Message#druid-blitz-rover + use MerkleHash#horse-popcorn-bundle + use MerkleBlock#pegasus-delta-eddie + use ReservedBytes1#origin-roger-relax + use ReservedBytes2#florida-libra-circus + use TreeNode#kansas-scarlet-ricardo + use ReservedBytes4#young-goblin-academy + use ReservedBytes8#rudolf-tape-adrian + +import RGBLogic#import-boxer-seminar + use WitnessPos#cliff-enrico-nominal + use WitnessOrd#frank-ohio-forum + import Std#ralph-blue-lucky use AlphaCaps#picnic-soprano-aurora use AsciiPrintable#ultra-sunset-format @@ -238,7 +239,7 @@ data MemIndex : opBundleIndex {RGBCommit.OpId -> ^ ..0xffffff RGBCommit , contractIndex {RGBCommit.ContractId -> ^ ..0xff ContractIndex} , terminalIndex {RGBCommit.XChainSecretSeal -> ^ ..0xffffff {RGBCommit.Opout ^ ..0xff}} -@mnemonic(ultra-sweden-limbo) +@mnemonic(level-open-morph) data MemStash : schemata {RGBCommit.SchemaId -> ^ ..0xff RGBStd.SchemaIfaces} , ifaces {RGBStd.IfaceId -> ^ ..0xff RGBStd.Iface} , geneses {RGBCommit.ContractId -> ^ ..0xff RGBCommit.Genesis} @@ -253,7 +254,7 @@ data MemStash : schemata {RGBCommit.SchemaId -> ^ ..0xff RGBStd.SchemaI , libs {AluVM.LibId -> AluVM.Lib} , sigs {RGBStd.ContentId -> RGBStd.ContentSigs} -@mnemonic(opinion-romeo-hunter) +@mnemonic(paradox-polka-juliet) data MemState : witnesses {RGBCommit.XChainTxid -> ^ ..0xffffffff RGBLogic.WitnessOrd}, contracts {RGBCommit.ContractId -> ^ ..0xff MemContractState} diff --git a/stl/Transfer.vesper b/stl/Transfer.vesper index 737079e6..ca6ac774 100644 --- a/stl/Transfer.vesper +++ b/stl/Transfer.vesper @@ -473,263 +473,1072 @@ Consignmenttrue rec witness bytes len=2 aka=ReservedBytes2 bundles set len=0..MAX32 WitnessBundle rec - bundle rec TransitionBundle - closeMethod enum Method opretFirst=0 tapretFirst=1 - inputMap map len=1..MAX16 aka=InputMap - key is U32 aka=Vout - value bytes len=32 aka=OpId - knownTransitions map len=1..MAX16 - key bytes len=32 aka=OpId - value rec Transition - ffv is U16 aka=Ffv - contractId bytes len=32 aka=ContractId - nonce is U64 - transitionType is U16 aka=TransitionType - metadata map len=0..MAX8 aka=Metadata - key is U16 aka=MetaType - value bytes len=0..MAX16 aka=MetaValue - globals map len=0..MAX8 aka=GlobalState - key is U16 aka=GlobalStateType - value list len=1..MAX16 aka=GlobalValues - element bytes len=0..MAX16 aka=DataState - inputs set len=0..MAX16 aka=Inputs - Input rec - prevOut rec Opout - op bytes len=32 aka=OpId - ty is U16 aka=AssignmentType - no is U16 - reserved bytes len=2 aka=ReservedBytes2 - assignments map len=0..MAX8 aka=AssignmentsBlindSealTxPtr - key is U16 aka=AssignmentType - value union TypedAssignsBlindSealTxPtr - declarative list len=0..MAX16 wrapped tag=0 - AssignVoidStateBlindSealTxPtr union - confidential rec tag=0 - seal union XChainSecretSeal - bitcoin bytes len=32 wrapped aka=SecretSeal tag=0 - liquid bytes len=32 wrapped aka=SecretSeal tag=1 - state is Unit aka=VoidState - lock bytes len=2 aka=ReservedBytes2 - confidentialState rec tag=1 - seal union XChainBlindSealTxPtr - bitcoin rec BlindSealTxPtr wrapped tag=0 - method enum Method opretFirst=0 tapretFirst=1 - txid union TxPtr - witnessTx is Unit tag=0 - txid bytes len=32 wrapped aka=Txid tag=1 - vout is U32 aka=Vout - blinding is U64 - liquid rec BlindSealTxPtr wrapped tag=1 - method enum Method opretFirst=0 tapretFirst=1 - txid union TxPtr - witnessTx is Unit tag=0 - txid bytes len=32 wrapped aka=Txid tag=1 - vout is U32 aka=Vout - blinding is U64 - state is Unit aka=VoidState - lock bytes len=2 aka=ReservedBytes2 - confidentialSeal rec tag=2 - seal union XChainSecretSeal - bitcoin bytes len=32 wrapped aka=SecretSeal tag=0 - liquid bytes len=32 wrapped aka=SecretSeal tag=1 - state is Unit aka=VoidState - lock bytes len=2 aka=ReservedBytes2 - revealed rec tag=3 - seal union XChainBlindSealTxPtr - bitcoin rec BlindSealTxPtr wrapped tag=0 - method enum Method opretFirst=0 tapretFirst=1 - txid union TxPtr - witnessTx is Unit tag=0 - txid bytes len=32 wrapped aka=Txid tag=1 - vout is U32 aka=Vout - blinding is U64 - liquid rec BlindSealTxPtr wrapped tag=1 - method enum Method opretFirst=0 tapretFirst=1 - txid union TxPtr - witnessTx is Unit tag=0 - txid bytes len=32 wrapped aka=Txid tag=1 - vout is U32 aka=Vout - blinding is U64 - state is Unit aka=VoidState - lock bytes len=2 aka=ReservedBytes2 - fungible list len=0..MAX16 wrapped tag=1 - AssignRevealedValueBlindSealTxPtr union - confidential rec tag=0 - seal union XChainSecretSeal - bitcoin bytes len=32 wrapped aka=SecretSeal tag=0 - liquid bytes len=32 wrapped aka=SecretSeal tag=1 - state rec ConcealedFungible - commitment bytes len=33 aka=PedersenCommitment - rangeProof bytes len=33 aka=PedersenCommitment - lock bytes len=2 aka=ReservedBytes2 - confidentialState rec tag=1 - seal union XChainBlindSealTxPtr - bitcoin rec BlindSealTxPtr wrapped tag=0 - method enum Method opretFirst=0 tapretFirst=1 - txid union TxPtr - witnessTx is Unit tag=0 - txid bytes len=32 wrapped aka=Txid tag=1 - vout is U32 aka=Vout - blinding is U64 - liquid rec BlindSealTxPtr wrapped tag=1 - method enum Method opretFirst=0 tapretFirst=1 - txid union TxPtr - witnessTx is Unit tag=0 - txid bytes len=32 wrapped aka=Txid tag=1 - vout is U32 aka=Vout - blinding is U64 - state rec ConcealedFungible - commitment bytes len=33 aka=PedersenCommitment - rangeProof bytes len=33 aka=PedersenCommitment - lock bytes len=2 aka=ReservedBytes2 - confidentialSeal rec tag=2 - seal union XChainSecretSeal - bitcoin bytes len=32 wrapped aka=SecretSeal tag=0 - liquid bytes len=32 wrapped aka=SecretSeal tag=1 - state rec RevealedFungible - value union FungibleState - bits64 is U64 wrapped tag=0 - blinding bytes len=32 aka=BlindingFactor - tag bytes len=32 aka=AssetTag - lock bytes len=2 aka=ReservedBytes2 - revealed rec tag=3 - seal union XChainBlindSealTxPtr - bitcoin rec BlindSealTxPtr wrapped tag=0 - method enum Method opretFirst=0 tapretFirst=1 - txid union TxPtr - witnessTx is Unit tag=0 - txid bytes len=32 wrapped aka=Txid tag=1 - vout is U32 aka=Vout - blinding is U64 - liquid rec BlindSealTxPtr wrapped tag=1 - method enum Method opretFirst=0 tapretFirst=1 - txid union TxPtr - witnessTx is Unit tag=0 - txid bytes len=32 wrapped aka=Txid tag=1 - vout is U32 aka=Vout - blinding is U64 - state rec RevealedFungible - value union FungibleState - bits64 is U64 wrapped tag=0 - blinding bytes len=32 aka=BlindingFactor - tag bytes len=32 aka=AssetTag - lock bytes len=2 aka=ReservedBytes2 - structured list len=0..MAX16 wrapped tag=2 - AssignRevealedDataBlindSealTxPtr union - confidential rec tag=0 - seal union XChainSecretSeal - bitcoin bytes len=32 wrapped aka=SecretSeal tag=0 - liquid bytes len=32 wrapped aka=SecretSeal tag=1 - state bytes len=32 aka=ConcealedData - lock bytes len=2 aka=ReservedBytes2 - confidentialState rec tag=1 - seal union XChainBlindSealTxPtr - bitcoin rec BlindSealTxPtr wrapped tag=0 - method enum Method opretFirst=0 tapretFirst=1 - txid union TxPtr - witnessTx is Unit tag=0 - txid bytes len=32 wrapped aka=Txid tag=1 - vout is U32 aka=Vout - blinding is U64 - liquid rec BlindSealTxPtr wrapped tag=1 - method enum Method opretFirst=0 tapretFirst=1 - txid union TxPtr - witnessTx is Unit tag=0 - txid bytes len=32 wrapped aka=Txid tag=1 - vout is U32 aka=Vout - blinding is U64 - state bytes len=32 aka=ConcealedData - lock bytes len=2 aka=ReservedBytes2 - confidentialSeal rec tag=2 - seal union XChainSecretSeal - bitcoin bytes len=32 wrapped aka=SecretSeal tag=0 - liquid bytes len=32 wrapped aka=SecretSeal tag=1 - state rec RevealedData - value bytes len=0..MAX16 aka=DataState - salt is U128 - lock bytes len=2 aka=ReservedBytes2 - revealed rec tag=3 - seal union XChainBlindSealTxPtr - bitcoin rec BlindSealTxPtr wrapped tag=0 - method enum Method opretFirst=0 tapretFirst=1 - txid union TxPtr - witnessTx is Unit tag=0 - txid bytes len=32 wrapped aka=Txid tag=1 - vout is U32 aka=Vout - blinding is U64 - liquid rec BlindSealTxPtr wrapped tag=1 - method enum Method opretFirst=0 tapretFirst=1 - txid union TxPtr - witnessTx is Unit tag=0 - txid bytes len=32 wrapped aka=Txid tag=1 - vout is U32 aka=Vout - blinding is U64 - state rec RevealedData - value bytes len=0..MAX16 aka=DataState - salt is U128 - lock bytes len=2 aka=ReservedBytes2 - attachment list len=0..MAX16 wrapped tag=3 - AssignRevealedAttachBlindSealTxPtr union - confidential rec tag=0 - seal union XChainSecretSeal - bitcoin bytes len=32 wrapped aka=SecretSeal tag=0 - liquid bytes len=32 wrapped aka=SecretSeal tag=1 - state bytes len=32 aka=ConcealedAttach - lock bytes len=2 aka=ReservedBytes2 - confidentialState rec tag=1 - seal union XChainBlindSealTxPtr - bitcoin rec BlindSealTxPtr wrapped tag=0 - method enum Method opretFirst=0 tapretFirst=1 - txid union TxPtr - witnessTx is Unit tag=0 - txid bytes len=32 wrapped aka=Txid tag=1 - vout is U32 aka=Vout - blinding is U64 - liquid rec BlindSealTxPtr wrapped tag=1 - method enum Method opretFirst=0 tapretFirst=1 - txid union TxPtr - witnessTx is Unit tag=0 - txid bytes len=32 wrapped aka=Txid tag=1 - vout is U32 aka=Vout - blinding is U64 - state bytes len=32 aka=ConcealedAttach - lock bytes len=2 aka=ReservedBytes2 - confidentialSeal rec tag=2 - seal union XChainSecretSeal - bitcoin bytes len=32 wrapped aka=SecretSeal tag=0 - liquid bytes len=32 wrapped aka=SecretSeal tag=1 - state rec RevealedAttach - file rec AttachState - id bytes len=32 aka=AttachId - mediaType enum MediaType any=255 - salt is U64 - lock bytes len=2 aka=ReservedBytes2 - revealed rec tag=3 - seal union XChainBlindSealTxPtr - bitcoin rec BlindSealTxPtr wrapped tag=0 - method enum Method opretFirst=0 tapretFirst=1 - txid union TxPtr - witnessTx is Unit tag=0 - txid bytes len=32 wrapped aka=Txid tag=1 - vout is U32 aka=Vout - blinding is U64 - liquid rec BlindSealTxPtr wrapped tag=1 - method enum Method opretFirst=0 tapretFirst=1 - txid union TxPtr - witnessTx is Unit tag=0 - txid bytes len=32 wrapped aka=Txid tag=1 - vout is U32 aka=Vout - blinding is U64 - state rec RevealedAttach - file rec AttachState - id bytes len=32 aka=AttachId - mediaType enum MediaType any=255 - salt is U64 - lock bytes len=2 aka=ReservedBytes2 - valencies set len=0..MAX8 aka=Valencies - element is U16 aka=ValencyType - validator bytes len=1 aka=ReservedBytes1 - witness bytes len=2 aka=ReservedBytes2 + anchoredBundles union AnchoredBundles + tapret rec ClientBundleTapretProof wrapped tag=0 + mpcProof rec MerkleProof + pos is U32 + cofactor is U16 + path list len=0..32 + element bytes len=32 aka=MerkleHash + dbcProof rec TapretProof + pathProof rec TapretPathProof + some union TapretNodePartner option wrapped tag=1 + rightBranch rec TapretRightBranch wrapped tag=2 + nonce is U8 + bundle rec TransitionBundle + closeMethod enum Method opretFirst=0 tapretFirst=1 + inputMap map len=1..MAX16 aka=InputMap + key is U32 aka=Vout + value bytes len=32 aka=OpId + knownTransitions map len=1..MAX16 + key bytes len=32 aka=OpId + value rec Transition + ffv is U16 aka=Ffv + contractId bytes len=32 aka=ContractId + nonce is U64 + transitionType is U16 aka=TransitionType + metadata map len=0..MAX8 aka=Metadata + key is U16 aka=MetaType + value bytes len=0..MAX16 aka=MetaValue + globals map len=0..MAX8 aka=GlobalState + key is U16 aka=GlobalStateType + value list len=1..MAX16 aka=GlobalValues + element bytes len=0..MAX16 aka=DataState + inputs set len=0..MAX16 aka=Inputs + Input rec + prevOut rec Opout + op bytes len=32 aka=OpId + ty is U16 aka=AssignmentType + no is U16 + reserved bytes len=2 aka=ReservedBytes2 + assignments map len=0..MAX8 aka=AssignmentsBlindSealTxPtr + key is U16 aka=AssignmentType + value union TypedAssignsBlindSealTxPtr + declarative list len=0..MAX16 wrapped tag=0 + AssignVoidStateBlindSealTxPtr union + confidential rec tag=0 + seal union XChainSecretSeal + bitcoin bytes len=32 wrapped aka=SecretSeal tag=0 + liquid bytes len=32 wrapped aka=SecretSeal tag=1 + state is Unit aka=VoidState + lock bytes len=2 aka=ReservedBytes2 + confidentialState rec tag=1 + seal union XChainBlindSealTxPtr + bitcoin rec BlindSealTxPtr wrapped tag=0 + method enum Method opretFirst=0 tapretFirst=1 + txid union TxPtr + witnessTx is Unit tag=0 + txid bytes len=32 wrapped aka=Txid tag=1 + vout is U32 aka=Vout + blinding is U64 + liquid rec BlindSealTxPtr wrapped tag=1 + method enum Method opretFirst=0 tapretFirst=1 + txid union TxPtr + witnessTx is Unit tag=0 + txid bytes len=32 wrapped aka=Txid tag=1 + vout is U32 aka=Vout + blinding is U64 + state is Unit aka=VoidState + lock bytes len=2 aka=ReservedBytes2 + confidentialSeal rec tag=2 + seal union XChainSecretSeal + bitcoin bytes len=32 wrapped aka=SecretSeal tag=0 + liquid bytes len=32 wrapped aka=SecretSeal tag=1 + state is Unit aka=VoidState + lock bytes len=2 aka=ReservedBytes2 + revealed rec tag=3 + seal union XChainBlindSealTxPtr + bitcoin rec BlindSealTxPtr wrapped tag=0 + method enum Method opretFirst=0 tapretFirst=1 + txid union TxPtr + witnessTx is Unit tag=0 + txid bytes len=32 wrapped aka=Txid tag=1 + vout is U32 aka=Vout + blinding is U64 + liquid rec BlindSealTxPtr wrapped tag=1 + method enum Method opretFirst=0 tapretFirst=1 + txid union TxPtr + witnessTx is Unit tag=0 + txid bytes len=32 wrapped aka=Txid tag=1 + vout is U32 aka=Vout + blinding is U64 + state is Unit aka=VoidState + lock bytes len=2 aka=ReservedBytes2 + fungible list len=0..MAX16 wrapped tag=1 + AssignRevealedValueBlindSealTxPtr union + confidential rec tag=0 + seal union XChainSecretSeal + bitcoin bytes len=32 wrapped aka=SecretSeal tag=0 + liquid bytes len=32 wrapped aka=SecretSeal tag=1 + state rec ConcealedFungible + commitment bytes len=33 aka=PedersenCommitment + rangeProof bytes len=33 aka=PedersenCommitment + lock bytes len=2 aka=ReservedBytes2 + confidentialState rec tag=1 + seal union XChainBlindSealTxPtr + bitcoin rec BlindSealTxPtr wrapped tag=0 + method enum Method opretFirst=0 tapretFirst=1 + txid union TxPtr + witnessTx is Unit tag=0 + txid bytes len=32 wrapped aka=Txid tag=1 + vout is U32 aka=Vout + blinding is U64 + liquid rec BlindSealTxPtr wrapped tag=1 + method enum Method opretFirst=0 tapretFirst=1 + txid union TxPtr + witnessTx is Unit tag=0 + txid bytes len=32 wrapped aka=Txid tag=1 + vout is U32 aka=Vout + blinding is U64 + state rec ConcealedFungible + commitment bytes len=33 aka=PedersenCommitment + rangeProof bytes len=33 aka=PedersenCommitment + lock bytes len=2 aka=ReservedBytes2 + confidentialSeal rec tag=2 + seal union XChainSecretSeal + bitcoin bytes len=32 wrapped aka=SecretSeal tag=0 + liquid bytes len=32 wrapped aka=SecretSeal tag=1 + state rec RevealedFungible + value union FungibleState + bits64 is U64 wrapped tag=0 + blinding bytes len=32 aka=BlindingFactor + tag bytes len=32 aka=AssetTag + lock bytes len=2 aka=ReservedBytes2 + revealed rec tag=3 + seal union XChainBlindSealTxPtr + bitcoin rec BlindSealTxPtr wrapped tag=0 + method enum Method opretFirst=0 tapretFirst=1 + txid union TxPtr + witnessTx is Unit tag=0 + txid bytes len=32 wrapped aka=Txid tag=1 + vout is U32 aka=Vout + blinding is U64 + liquid rec BlindSealTxPtr wrapped tag=1 + method enum Method opretFirst=0 tapretFirst=1 + txid union TxPtr + witnessTx is Unit tag=0 + txid bytes len=32 wrapped aka=Txid tag=1 + vout is U32 aka=Vout + blinding is U64 + state rec RevealedFungible + value union FungibleState + bits64 is U64 wrapped tag=0 + blinding bytes len=32 aka=BlindingFactor + tag bytes len=32 aka=AssetTag + lock bytes len=2 aka=ReservedBytes2 + structured list len=0..MAX16 wrapped tag=2 + AssignRevealedDataBlindSealTxPtr union + confidential rec tag=0 + seal union XChainSecretSeal + bitcoin bytes len=32 wrapped aka=SecretSeal tag=0 + liquid bytes len=32 wrapped aka=SecretSeal tag=1 + state bytes len=32 aka=ConcealedData + lock bytes len=2 aka=ReservedBytes2 + confidentialState rec tag=1 + seal union XChainBlindSealTxPtr + bitcoin rec BlindSealTxPtr wrapped tag=0 + method enum Method opretFirst=0 tapretFirst=1 + txid union TxPtr + witnessTx is Unit tag=0 + txid bytes len=32 wrapped aka=Txid tag=1 + vout is U32 aka=Vout + blinding is U64 + liquid rec BlindSealTxPtr wrapped tag=1 + method enum Method opretFirst=0 tapretFirst=1 + txid union TxPtr + witnessTx is Unit tag=0 + txid bytes len=32 wrapped aka=Txid tag=1 + vout is U32 aka=Vout + blinding is U64 + state bytes len=32 aka=ConcealedData + lock bytes len=2 aka=ReservedBytes2 + confidentialSeal rec tag=2 + seal union XChainSecretSeal + bitcoin bytes len=32 wrapped aka=SecretSeal tag=0 + liquid bytes len=32 wrapped aka=SecretSeal tag=1 + state rec RevealedData + value bytes len=0..MAX16 aka=DataState + salt is U128 + lock bytes len=2 aka=ReservedBytes2 + revealed rec tag=3 + seal union XChainBlindSealTxPtr + bitcoin rec BlindSealTxPtr wrapped tag=0 + method enum Method opretFirst=0 tapretFirst=1 + txid union TxPtr + witnessTx is Unit tag=0 + txid bytes len=32 wrapped aka=Txid tag=1 + vout is U32 aka=Vout + blinding is U64 + liquid rec BlindSealTxPtr wrapped tag=1 + method enum Method opretFirst=0 tapretFirst=1 + txid union TxPtr + witnessTx is Unit tag=0 + txid bytes len=32 wrapped aka=Txid tag=1 + vout is U32 aka=Vout + blinding is U64 + state rec RevealedData + value bytes len=0..MAX16 aka=DataState + salt is U128 + lock bytes len=2 aka=ReservedBytes2 + attachment list len=0..MAX16 wrapped tag=3 + AssignRevealedAttachBlindSealTxPtr union + confidential rec tag=0 + seal union XChainSecretSeal + bitcoin bytes len=32 wrapped aka=SecretSeal tag=0 + liquid bytes len=32 wrapped aka=SecretSeal tag=1 + state bytes len=32 aka=ConcealedAttach + lock bytes len=2 aka=ReservedBytes2 + confidentialState rec tag=1 + seal union XChainBlindSealTxPtr + bitcoin rec BlindSealTxPtr wrapped tag=0 + method enum Method opretFirst=0 tapretFirst=1 + txid union TxPtr + witnessTx is Unit tag=0 + txid bytes len=32 wrapped aka=Txid tag=1 + vout is U32 aka=Vout + blinding is U64 + liquid rec BlindSealTxPtr wrapped tag=1 + method enum Method opretFirst=0 tapretFirst=1 + txid union TxPtr + witnessTx is Unit tag=0 + txid bytes len=32 wrapped aka=Txid tag=1 + vout is U32 aka=Vout + blinding is U64 + state bytes len=32 aka=ConcealedAttach + lock bytes len=2 aka=ReservedBytes2 + confidentialSeal rec tag=2 + seal union XChainSecretSeal + bitcoin bytes len=32 wrapped aka=SecretSeal tag=0 + liquid bytes len=32 wrapped aka=SecretSeal tag=1 + state rec RevealedAttach + file rec AttachState + id bytes len=32 aka=AttachId + mediaType enum MediaType any=255 + salt is U64 + lock bytes len=2 aka=ReservedBytes2 + revealed rec tag=3 + seal union XChainBlindSealTxPtr + bitcoin rec BlindSealTxPtr wrapped tag=0 + method enum Method opretFirst=0 tapretFirst=1 + txid union TxPtr + witnessTx is Unit tag=0 + txid bytes len=32 wrapped aka=Txid tag=1 + vout is U32 aka=Vout + blinding is U64 + liquid rec BlindSealTxPtr wrapped tag=1 + method enum Method opretFirst=0 tapretFirst=1 + txid union TxPtr + witnessTx is Unit tag=0 + txid bytes len=32 wrapped aka=Txid tag=1 + vout is U32 aka=Vout + blinding is U64 + state rec RevealedAttach + file rec AttachState + id bytes len=32 aka=AttachId + mediaType enum MediaType any=255 + salt is U64 + lock bytes len=2 aka=ReservedBytes2 + valencies set len=0..MAX8 aka=Valencies + element is U16 aka=ValencyType + validator bytes len=1 aka=ReservedBytes1 + witness bytes len=2 aka=ReservedBytes2 + opret rec ClientBundleOpretProof wrapped tag=1 + mpcProof rec MerkleProof + pos is U32 + cofactor is U16 + path list len=0..32 + element bytes len=32 aka=MerkleHash + dbcProof is Unit aka=OpretProof + bundle rec TransitionBundle + closeMethod enum Method opretFirst=0 tapretFirst=1 + inputMap map len=1..MAX16 aka=InputMap + key is U32 aka=Vout + value bytes len=32 aka=OpId + knownTransitions map len=1..MAX16 + key bytes len=32 aka=OpId + value rec Transition + ffv is U16 aka=Ffv + contractId bytes len=32 aka=ContractId + nonce is U64 + transitionType is U16 aka=TransitionType + metadata map len=0..MAX8 aka=Metadata + key is U16 aka=MetaType + value bytes len=0..MAX16 aka=MetaValue + globals map len=0..MAX8 aka=GlobalState + key is U16 aka=GlobalStateType + value list len=1..MAX16 aka=GlobalValues + element bytes len=0..MAX16 aka=DataState + inputs set len=0..MAX16 aka=Inputs + Input rec + prevOut rec Opout + op bytes len=32 aka=OpId + ty is U16 aka=AssignmentType + no is U16 + reserved bytes len=2 aka=ReservedBytes2 + assignments map len=0..MAX8 aka=AssignmentsBlindSealTxPtr + key is U16 aka=AssignmentType + value union TypedAssignsBlindSealTxPtr + declarative list len=0..MAX16 wrapped tag=0 + AssignVoidStateBlindSealTxPtr union + confidential rec tag=0 + seal union XChainSecretSeal + bitcoin bytes len=32 wrapped aka=SecretSeal tag=0 + liquid bytes len=32 wrapped aka=SecretSeal tag=1 + state is Unit aka=VoidState + lock bytes len=2 aka=ReservedBytes2 + confidentialState rec tag=1 + seal union XChainBlindSealTxPtr + bitcoin rec BlindSealTxPtr wrapped tag=0 + method enum Method opretFirst=0 tapretFirst=1 + txid union TxPtr + witnessTx is Unit tag=0 + txid bytes len=32 wrapped aka=Txid tag=1 + vout is U32 aka=Vout + blinding is U64 + liquid rec BlindSealTxPtr wrapped tag=1 + method enum Method opretFirst=0 tapretFirst=1 + txid union TxPtr + witnessTx is Unit tag=0 + txid bytes len=32 wrapped aka=Txid tag=1 + vout is U32 aka=Vout + blinding is U64 + state is Unit aka=VoidState + lock bytes len=2 aka=ReservedBytes2 + confidentialSeal rec tag=2 + seal union XChainSecretSeal + bitcoin bytes len=32 wrapped aka=SecretSeal tag=0 + liquid bytes len=32 wrapped aka=SecretSeal tag=1 + state is Unit aka=VoidState + lock bytes len=2 aka=ReservedBytes2 + revealed rec tag=3 + seal union XChainBlindSealTxPtr + bitcoin rec BlindSealTxPtr wrapped tag=0 + method enum Method opretFirst=0 tapretFirst=1 + txid union TxPtr + witnessTx is Unit tag=0 + txid bytes len=32 wrapped aka=Txid tag=1 + vout is U32 aka=Vout + blinding is U64 + liquid rec BlindSealTxPtr wrapped tag=1 + method enum Method opretFirst=0 tapretFirst=1 + txid union TxPtr + witnessTx is Unit tag=0 + txid bytes len=32 wrapped aka=Txid tag=1 + vout is U32 aka=Vout + blinding is U64 + state is Unit aka=VoidState + lock bytes len=2 aka=ReservedBytes2 + fungible list len=0..MAX16 wrapped tag=1 + AssignRevealedValueBlindSealTxPtr union + confidential rec tag=0 + seal union XChainSecretSeal + bitcoin bytes len=32 wrapped aka=SecretSeal tag=0 + liquid bytes len=32 wrapped aka=SecretSeal tag=1 + state rec ConcealedFungible + commitment bytes len=33 aka=PedersenCommitment + rangeProof bytes len=33 aka=PedersenCommitment + lock bytes len=2 aka=ReservedBytes2 + confidentialState rec tag=1 + seal union XChainBlindSealTxPtr + bitcoin rec BlindSealTxPtr wrapped tag=0 + method enum Method opretFirst=0 tapretFirst=1 + txid union TxPtr + witnessTx is Unit tag=0 + txid bytes len=32 wrapped aka=Txid tag=1 + vout is U32 aka=Vout + blinding is U64 + liquid rec BlindSealTxPtr wrapped tag=1 + method enum Method opretFirst=0 tapretFirst=1 + txid union TxPtr + witnessTx is Unit tag=0 + txid bytes len=32 wrapped aka=Txid tag=1 + vout is U32 aka=Vout + blinding is U64 + state rec ConcealedFungible + commitment bytes len=33 aka=PedersenCommitment + rangeProof bytes len=33 aka=PedersenCommitment + lock bytes len=2 aka=ReservedBytes2 + confidentialSeal rec tag=2 + seal union XChainSecretSeal + bitcoin bytes len=32 wrapped aka=SecretSeal tag=0 + liquid bytes len=32 wrapped aka=SecretSeal tag=1 + state rec RevealedFungible + value union FungibleState + bits64 is U64 wrapped tag=0 + blinding bytes len=32 aka=BlindingFactor + tag bytes len=32 aka=AssetTag + lock bytes len=2 aka=ReservedBytes2 + revealed rec tag=3 + seal union XChainBlindSealTxPtr + bitcoin rec BlindSealTxPtr wrapped tag=0 + method enum Method opretFirst=0 tapretFirst=1 + txid union TxPtr + witnessTx is Unit tag=0 + txid bytes len=32 wrapped aka=Txid tag=1 + vout is U32 aka=Vout + blinding is U64 + liquid rec BlindSealTxPtr wrapped tag=1 + method enum Method opretFirst=0 tapretFirst=1 + txid union TxPtr + witnessTx is Unit tag=0 + txid bytes len=32 wrapped aka=Txid tag=1 + vout is U32 aka=Vout + blinding is U64 + state rec RevealedFungible + value union FungibleState + bits64 is U64 wrapped tag=0 + blinding bytes len=32 aka=BlindingFactor + tag bytes len=32 aka=AssetTag + lock bytes len=2 aka=ReservedBytes2 + structured list len=0..MAX16 wrapped tag=2 + AssignRevealedDataBlindSealTxPtr union + confidential rec tag=0 + seal union XChainSecretSeal + bitcoin bytes len=32 wrapped aka=SecretSeal tag=0 + liquid bytes len=32 wrapped aka=SecretSeal tag=1 + state bytes len=32 aka=ConcealedData + lock bytes len=2 aka=ReservedBytes2 + confidentialState rec tag=1 + seal union XChainBlindSealTxPtr + bitcoin rec BlindSealTxPtr wrapped tag=0 + method enum Method opretFirst=0 tapretFirst=1 + txid union TxPtr + witnessTx is Unit tag=0 + txid bytes len=32 wrapped aka=Txid tag=1 + vout is U32 aka=Vout + blinding is U64 + liquid rec BlindSealTxPtr wrapped tag=1 + method enum Method opretFirst=0 tapretFirst=1 + txid union TxPtr + witnessTx is Unit tag=0 + txid bytes len=32 wrapped aka=Txid tag=1 + vout is U32 aka=Vout + blinding is U64 + state bytes len=32 aka=ConcealedData + lock bytes len=2 aka=ReservedBytes2 + confidentialSeal rec tag=2 + seal union XChainSecretSeal + bitcoin bytes len=32 wrapped aka=SecretSeal tag=0 + liquid bytes len=32 wrapped aka=SecretSeal tag=1 + state rec RevealedData + value bytes len=0..MAX16 aka=DataState + salt is U128 + lock bytes len=2 aka=ReservedBytes2 + revealed rec tag=3 + seal union XChainBlindSealTxPtr + bitcoin rec BlindSealTxPtr wrapped tag=0 + method enum Method opretFirst=0 tapretFirst=1 + txid union TxPtr + witnessTx is Unit tag=0 + txid bytes len=32 wrapped aka=Txid tag=1 + vout is U32 aka=Vout + blinding is U64 + liquid rec BlindSealTxPtr wrapped tag=1 + method enum Method opretFirst=0 tapretFirst=1 + txid union TxPtr + witnessTx is Unit tag=0 + txid bytes len=32 wrapped aka=Txid tag=1 + vout is U32 aka=Vout + blinding is U64 + state rec RevealedData + value bytes len=0..MAX16 aka=DataState + salt is U128 + lock bytes len=2 aka=ReservedBytes2 + attachment list len=0..MAX16 wrapped tag=3 + AssignRevealedAttachBlindSealTxPtr union + confidential rec tag=0 + seal union XChainSecretSeal + bitcoin bytes len=32 wrapped aka=SecretSeal tag=0 + liquid bytes len=32 wrapped aka=SecretSeal tag=1 + state bytes len=32 aka=ConcealedAttach + lock bytes len=2 aka=ReservedBytes2 + confidentialState rec tag=1 + seal union XChainBlindSealTxPtr + bitcoin rec BlindSealTxPtr wrapped tag=0 + method enum Method opretFirst=0 tapretFirst=1 + txid union TxPtr + witnessTx is Unit tag=0 + txid bytes len=32 wrapped aka=Txid tag=1 + vout is U32 aka=Vout + blinding is U64 + liquid rec BlindSealTxPtr wrapped tag=1 + method enum Method opretFirst=0 tapretFirst=1 + txid union TxPtr + witnessTx is Unit tag=0 + txid bytes len=32 wrapped aka=Txid tag=1 + vout is U32 aka=Vout + blinding is U64 + state bytes len=32 aka=ConcealedAttach + lock bytes len=2 aka=ReservedBytes2 + confidentialSeal rec tag=2 + seal union XChainSecretSeal + bitcoin bytes len=32 wrapped aka=SecretSeal tag=0 + liquid bytes len=32 wrapped aka=SecretSeal tag=1 + state rec RevealedAttach + file rec AttachState + id bytes len=32 aka=AttachId + mediaType enum MediaType any=255 + salt is U64 + lock bytes len=2 aka=ReservedBytes2 + revealed rec tag=3 + seal union XChainBlindSealTxPtr + bitcoin rec BlindSealTxPtr wrapped tag=0 + method enum Method opretFirst=0 tapretFirst=1 + txid union TxPtr + witnessTx is Unit tag=0 + txid bytes len=32 wrapped aka=Txid tag=1 + vout is U32 aka=Vout + blinding is U64 + liquid rec BlindSealTxPtr wrapped tag=1 + method enum Method opretFirst=0 tapretFirst=1 + txid union TxPtr + witnessTx is Unit tag=0 + txid bytes len=32 wrapped aka=Txid tag=1 + vout is U32 aka=Vout + blinding is U64 + state rec RevealedAttach + file rec AttachState + id bytes len=32 aka=AttachId + mediaType enum MediaType any=255 + salt is U64 + lock bytes len=2 aka=ReservedBytes2 + valencies set len=0..MAX8 aka=Valencies + element is U16 aka=ValencyType + validator bytes len=1 aka=ReservedBytes1 + witness bytes len=2 aka=ReservedBytes2 + double rec tag=2 + tapret rec ClientBundleTapretProof + mpcProof rec MerkleProof + pos is U32 + cofactor is U16 + path list len=0..32 + element bytes len=32 aka=MerkleHash + dbcProof rec TapretProof + pathProof rec TapretPathProof + some union TapretNodePartner option wrapped tag=1 + rightBranch rec TapretRightBranch wrapped tag=2 + nonce is U8 + bundle rec TransitionBundle + closeMethod enum Method opretFirst=0 tapretFirst=1 + inputMap map len=1..MAX16 aka=InputMap + key is U32 aka=Vout + value bytes len=32 aka=OpId + knownTransitions map len=1..MAX16 + key bytes len=32 aka=OpId + value rec Transition + ffv is U16 aka=Ffv + contractId bytes len=32 aka=ContractId + nonce is U64 + transitionType is U16 aka=TransitionType + metadata map len=0..MAX8 aka=Metadata + key is U16 aka=MetaType + value bytes len=0..MAX16 aka=MetaValue + globals map len=0..MAX8 aka=GlobalState + key is U16 aka=GlobalStateType + value list len=1..MAX16 aka=GlobalValues + element bytes len=0..MAX16 aka=DataState + inputs set len=0..MAX16 aka=Inputs + Input rec + prevOut rec Opout + op bytes len=32 aka=OpId + ty is U16 aka=AssignmentType + no is U16 + reserved bytes len=2 aka=ReservedBytes2 + assignments map len=0..MAX8 aka=AssignmentsBlindSealTxPtr + key is U16 aka=AssignmentType + value union TypedAssignsBlindSealTxPtr + declarative list len=0..MAX16 wrapped tag=0 + AssignVoidStateBlindSealTxPtr union + confidential rec tag=0 + seal union XChainSecretSeal + bitcoin bytes len=32 wrapped aka=SecretSeal tag=0 + liquid bytes len=32 wrapped aka=SecretSeal tag=1 + state is Unit aka=VoidState + lock bytes len=2 aka=ReservedBytes2 + confidentialState rec tag=1 + seal union XChainBlindSealTxPtr + bitcoin rec BlindSealTxPtr wrapped tag=0 + method enum Method opretFirst=0 tapretFirst=1 + txid union TxPtr + witnessTx is Unit tag=0 + txid bytes len=32 wrapped aka=Txid tag=1 + vout is U32 aka=Vout + blinding is U64 + liquid rec BlindSealTxPtr wrapped tag=1 + method enum Method opretFirst=0 tapretFirst=1 + txid union TxPtr + witnessTx is Unit tag=0 + txid bytes len=32 wrapped aka=Txid tag=1 + vout is U32 aka=Vout + blinding is U64 + state is Unit aka=VoidState + lock bytes len=2 aka=ReservedBytes2 + confidentialSeal rec tag=2 + seal union XChainSecretSeal + bitcoin bytes len=32 wrapped aka=SecretSeal tag=0 + liquid bytes len=32 wrapped aka=SecretSeal tag=1 + state is Unit aka=VoidState + lock bytes len=2 aka=ReservedBytes2 + revealed rec tag=3 + seal union XChainBlindSealTxPtr + bitcoin rec BlindSealTxPtr wrapped tag=0 + method enum Method opretFirst=0 tapretFirst=1 + txid union TxPtr + witnessTx is Unit tag=0 + txid bytes len=32 wrapped aka=Txid tag=1 + vout is U32 aka=Vout + blinding is U64 + liquid rec BlindSealTxPtr wrapped tag=1 + method enum Method opretFirst=0 tapretFirst=1 + txid union TxPtr + witnessTx is Unit tag=0 + txid bytes len=32 wrapped aka=Txid tag=1 + vout is U32 aka=Vout + blinding is U64 + state is Unit aka=VoidState + lock bytes len=2 aka=ReservedBytes2 + fungible list len=0..MAX16 wrapped tag=1 + AssignRevealedValueBlindSealTxPtr union + confidential rec tag=0 + seal union XChainSecretSeal + bitcoin bytes len=32 wrapped aka=SecretSeal tag=0 + liquid bytes len=32 wrapped aka=SecretSeal tag=1 + state rec ConcealedFungible + commitment bytes len=33 aka=PedersenCommitment + rangeProof bytes len=33 aka=PedersenCommitment + lock bytes len=2 aka=ReservedBytes2 + confidentialState rec tag=1 + seal union XChainBlindSealTxPtr + bitcoin rec BlindSealTxPtr wrapped tag=0 + method enum Method opretFirst=0 tapretFirst=1 + txid union TxPtr + witnessTx is Unit tag=0 + txid bytes len=32 wrapped aka=Txid tag=1 + vout is U32 aka=Vout + blinding is U64 + liquid rec BlindSealTxPtr wrapped tag=1 + method enum Method opretFirst=0 tapretFirst=1 + txid union TxPtr + witnessTx is Unit tag=0 + txid bytes len=32 wrapped aka=Txid tag=1 + vout is U32 aka=Vout + blinding is U64 + state rec ConcealedFungible + commitment bytes len=33 aka=PedersenCommitment + rangeProof bytes len=33 aka=PedersenCommitment + lock bytes len=2 aka=ReservedBytes2 + confidentialSeal rec tag=2 + seal union XChainSecretSeal + bitcoin bytes len=32 wrapped aka=SecretSeal tag=0 + liquid bytes len=32 wrapped aka=SecretSeal tag=1 + state rec RevealedFungible + value union FungibleState + bits64 is U64 wrapped tag=0 + blinding bytes len=32 aka=BlindingFactor + tag bytes len=32 aka=AssetTag + lock bytes len=2 aka=ReservedBytes2 + revealed rec tag=3 + seal union XChainBlindSealTxPtr + bitcoin rec BlindSealTxPtr wrapped tag=0 + method enum Method opretFirst=0 tapretFirst=1 + txid union TxPtr + witnessTx is Unit tag=0 + txid bytes len=32 wrapped aka=Txid tag=1 + vout is U32 aka=Vout + blinding is U64 + liquid rec BlindSealTxPtr wrapped tag=1 + method enum Method opretFirst=0 tapretFirst=1 + txid union TxPtr + witnessTx is Unit tag=0 + txid bytes len=32 wrapped aka=Txid tag=1 + vout is U32 aka=Vout + blinding is U64 + state rec RevealedFungible + value union FungibleState + bits64 is U64 wrapped tag=0 + blinding bytes len=32 aka=BlindingFactor + tag bytes len=32 aka=AssetTag + lock bytes len=2 aka=ReservedBytes2 + structured list len=0..MAX16 wrapped tag=2 + AssignRevealedDataBlindSealTxPtr union + confidential rec tag=0 + seal union XChainSecretSeal + bitcoin bytes len=32 wrapped aka=SecretSeal tag=0 + liquid bytes len=32 wrapped aka=SecretSeal tag=1 + state bytes len=32 aka=ConcealedData + lock bytes len=2 aka=ReservedBytes2 + confidentialState rec tag=1 + seal union XChainBlindSealTxPtr + bitcoin rec BlindSealTxPtr wrapped tag=0 + method enum Method opretFirst=0 tapretFirst=1 + txid union TxPtr + witnessTx is Unit tag=0 + txid bytes len=32 wrapped aka=Txid tag=1 + vout is U32 aka=Vout + blinding is U64 + liquid rec BlindSealTxPtr wrapped tag=1 + method enum Method opretFirst=0 tapretFirst=1 + txid union TxPtr + witnessTx is Unit tag=0 + txid bytes len=32 wrapped aka=Txid tag=1 + vout is U32 aka=Vout + blinding is U64 + state bytes len=32 aka=ConcealedData + lock bytes len=2 aka=ReservedBytes2 + confidentialSeal rec tag=2 + seal union XChainSecretSeal + bitcoin bytes len=32 wrapped aka=SecretSeal tag=0 + liquid bytes len=32 wrapped aka=SecretSeal tag=1 + state rec RevealedData + value bytes len=0..MAX16 aka=DataState + salt is U128 + lock bytes len=2 aka=ReservedBytes2 + revealed rec tag=3 + seal union XChainBlindSealTxPtr + bitcoin rec BlindSealTxPtr wrapped tag=0 + method enum Method opretFirst=0 tapretFirst=1 + txid union TxPtr + witnessTx is Unit tag=0 + txid bytes len=32 wrapped aka=Txid tag=1 + vout is U32 aka=Vout + blinding is U64 + liquid rec BlindSealTxPtr wrapped tag=1 + method enum Method opretFirst=0 tapretFirst=1 + txid union TxPtr + witnessTx is Unit tag=0 + txid bytes len=32 wrapped aka=Txid tag=1 + vout is U32 aka=Vout + blinding is U64 + state rec RevealedData + value bytes len=0..MAX16 aka=DataState + salt is U128 + lock bytes len=2 aka=ReservedBytes2 + attachment list len=0..MAX16 wrapped tag=3 + AssignRevealedAttachBlindSealTxPtr union + confidential rec tag=0 + seal union XChainSecretSeal + bitcoin bytes len=32 wrapped aka=SecretSeal tag=0 + liquid bytes len=32 wrapped aka=SecretSeal tag=1 + state bytes len=32 aka=ConcealedAttach + lock bytes len=2 aka=ReservedBytes2 + confidentialState rec tag=1 + seal union XChainBlindSealTxPtr + bitcoin rec BlindSealTxPtr wrapped tag=0 + method enum Method opretFirst=0 tapretFirst=1 + txid union TxPtr + witnessTx is Unit tag=0 + txid bytes len=32 wrapped aka=Txid tag=1 + vout is U32 aka=Vout + blinding is U64 + liquid rec BlindSealTxPtr wrapped tag=1 + method enum Method opretFirst=0 tapretFirst=1 + txid union TxPtr + witnessTx is Unit tag=0 + txid bytes len=32 wrapped aka=Txid tag=1 + vout is U32 aka=Vout + blinding is U64 + state bytes len=32 aka=ConcealedAttach + lock bytes len=2 aka=ReservedBytes2 + confidentialSeal rec tag=2 + seal union XChainSecretSeal + bitcoin bytes len=32 wrapped aka=SecretSeal tag=0 + liquid bytes len=32 wrapped aka=SecretSeal tag=1 + state rec RevealedAttach + file rec AttachState + id bytes len=32 aka=AttachId + mediaType enum MediaType any=255 + salt is U64 + lock bytes len=2 aka=ReservedBytes2 + revealed rec tag=3 + seal union XChainBlindSealTxPtr + bitcoin rec BlindSealTxPtr wrapped tag=0 + method enum Method opretFirst=0 tapretFirst=1 + txid union TxPtr + witnessTx is Unit tag=0 + txid bytes len=32 wrapped aka=Txid tag=1 + vout is U32 aka=Vout + blinding is U64 + liquid rec BlindSealTxPtr wrapped tag=1 + method enum Method opretFirst=0 tapretFirst=1 + txid union TxPtr + witnessTx is Unit tag=0 + txid bytes len=32 wrapped aka=Txid tag=1 + vout is U32 aka=Vout + blinding is U64 + state rec RevealedAttach + file rec AttachState + id bytes len=32 aka=AttachId + mediaType enum MediaType any=255 + salt is U64 + lock bytes len=2 aka=ReservedBytes2 + valencies set len=0..MAX8 aka=Valencies + element is U16 aka=ValencyType + validator bytes len=1 aka=ReservedBytes1 + witness bytes len=2 aka=ReservedBytes2 + opret rec ClientBundleOpretProof + mpcProof rec MerkleProof + pos is U32 + cofactor is U16 + path list len=0..32 + element bytes len=32 aka=MerkleHash + dbcProof is Unit aka=OpretProof + bundle rec TransitionBundle + closeMethod enum Method opretFirst=0 tapretFirst=1 + inputMap map len=1..MAX16 aka=InputMap + key is U32 aka=Vout + value bytes len=32 aka=OpId + knownTransitions map len=1..MAX16 + key bytes len=32 aka=OpId + value rec Transition + ffv is U16 aka=Ffv + contractId bytes len=32 aka=ContractId + nonce is U64 + transitionType is U16 aka=TransitionType + metadata map len=0..MAX8 aka=Metadata + key is U16 aka=MetaType + value bytes len=0..MAX16 aka=MetaValue + globals map len=0..MAX8 aka=GlobalState + key is U16 aka=GlobalStateType + value list len=1..MAX16 aka=GlobalValues + element bytes len=0..MAX16 aka=DataState + inputs set len=0..MAX16 aka=Inputs + Input rec + prevOut rec Opout + op bytes len=32 aka=OpId + ty is U16 aka=AssignmentType + no is U16 + reserved bytes len=2 aka=ReservedBytes2 + assignments map len=0..MAX8 aka=AssignmentsBlindSealTxPtr + key is U16 aka=AssignmentType + value union TypedAssignsBlindSealTxPtr + declarative list len=0..MAX16 wrapped tag=0 + AssignVoidStateBlindSealTxPtr union + confidential rec tag=0 + seal union XChainSecretSeal + bitcoin bytes len=32 wrapped aka=SecretSeal tag=0 + liquid bytes len=32 wrapped aka=SecretSeal tag=1 + state is Unit aka=VoidState + lock bytes len=2 aka=ReservedBytes2 + confidentialState rec tag=1 + seal union XChainBlindSealTxPtr + bitcoin rec BlindSealTxPtr wrapped tag=0 + method enum Method opretFirst=0 tapretFirst=1 + txid union TxPtr + witnessTx is Unit tag=0 + txid bytes len=32 wrapped aka=Txid tag=1 + vout is U32 aka=Vout + blinding is U64 + liquid rec BlindSealTxPtr wrapped tag=1 + method enum Method opretFirst=0 tapretFirst=1 + txid union TxPtr + witnessTx is Unit tag=0 + txid bytes len=32 wrapped aka=Txid tag=1 + vout is U32 aka=Vout + blinding is U64 + state is Unit aka=VoidState + lock bytes len=2 aka=ReservedBytes2 + confidentialSeal rec tag=2 + seal union XChainSecretSeal + bitcoin bytes len=32 wrapped aka=SecretSeal tag=0 + liquid bytes len=32 wrapped aka=SecretSeal tag=1 + state is Unit aka=VoidState + lock bytes len=2 aka=ReservedBytes2 + revealed rec tag=3 + seal union XChainBlindSealTxPtr + bitcoin rec BlindSealTxPtr wrapped tag=0 + method enum Method opretFirst=0 tapretFirst=1 + txid union TxPtr + witnessTx is Unit tag=0 + txid bytes len=32 wrapped aka=Txid tag=1 + vout is U32 aka=Vout + blinding is U64 + liquid rec BlindSealTxPtr wrapped tag=1 + method enum Method opretFirst=0 tapretFirst=1 + txid union TxPtr + witnessTx is Unit tag=0 + txid bytes len=32 wrapped aka=Txid tag=1 + vout is U32 aka=Vout + blinding is U64 + state is Unit aka=VoidState + lock bytes len=2 aka=ReservedBytes2 + fungible list len=0..MAX16 wrapped tag=1 + AssignRevealedValueBlindSealTxPtr union + confidential rec tag=0 + seal union XChainSecretSeal + bitcoin bytes len=32 wrapped aka=SecretSeal tag=0 + liquid bytes len=32 wrapped aka=SecretSeal tag=1 + state rec ConcealedFungible + commitment bytes len=33 aka=PedersenCommitment + rangeProof bytes len=33 aka=PedersenCommitment + lock bytes len=2 aka=ReservedBytes2 + confidentialState rec tag=1 + seal union XChainBlindSealTxPtr + bitcoin rec BlindSealTxPtr wrapped tag=0 + method enum Method opretFirst=0 tapretFirst=1 + txid union TxPtr + witnessTx is Unit tag=0 + txid bytes len=32 wrapped aka=Txid tag=1 + vout is U32 aka=Vout + blinding is U64 + liquid rec BlindSealTxPtr wrapped tag=1 + method enum Method opretFirst=0 tapretFirst=1 + txid union TxPtr + witnessTx is Unit tag=0 + txid bytes len=32 wrapped aka=Txid tag=1 + vout is U32 aka=Vout + blinding is U64 + state rec ConcealedFungible + commitment bytes len=33 aka=PedersenCommitment + rangeProof bytes len=33 aka=PedersenCommitment + lock bytes len=2 aka=ReservedBytes2 + confidentialSeal rec tag=2 + seal union XChainSecretSeal + bitcoin bytes len=32 wrapped aka=SecretSeal tag=0 + liquid bytes len=32 wrapped aka=SecretSeal tag=1 + state rec RevealedFungible + value union FungibleState + bits64 is U64 wrapped tag=0 + blinding bytes len=32 aka=BlindingFactor + tag bytes len=32 aka=AssetTag + lock bytes len=2 aka=ReservedBytes2 + revealed rec tag=3 + seal union XChainBlindSealTxPtr + bitcoin rec BlindSealTxPtr wrapped tag=0 + method enum Method opretFirst=0 tapretFirst=1 + txid union TxPtr + witnessTx is Unit tag=0 + txid bytes len=32 wrapped aka=Txid tag=1 + vout is U32 aka=Vout + blinding is U64 + liquid rec BlindSealTxPtr wrapped tag=1 + method enum Method opretFirst=0 tapretFirst=1 + txid union TxPtr + witnessTx is Unit tag=0 + txid bytes len=32 wrapped aka=Txid tag=1 + vout is U32 aka=Vout + blinding is U64 + state rec RevealedFungible + value union FungibleState + bits64 is U64 wrapped tag=0 + blinding bytes len=32 aka=BlindingFactor + tag bytes len=32 aka=AssetTag + lock bytes len=2 aka=ReservedBytes2 + structured list len=0..MAX16 wrapped tag=2 + AssignRevealedDataBlindSealTxPtr union + confidential rec tag=0 + seal union XChainSecretSeal + bitcoin bytes len=32 wrapped aka=SecretSeal tag=0 + liquid bytes len=32 wrapped aka=SecretSeal tag=1 + state bytes len=32 aka=ConcealedData + lock bytes len=2 aka=ReservedBytes2 + confidentialState rec tag=1 + seal union XChainBlindSealTxPtr + bitcoin rec BlindSealTxPtr wrapped tag=0 + method enum Method opretFirst=0 tapretFirst=1 + txid union TxPtr + witnessTx is Unit tag=0 + txid bytes len=32 wrapped aka=Txid tag=1 + vout is U32 aka=Vout + blinding is U64 + liquid rec BlindSealTxPtr wrapped tag=1 + method enum Method opretFirst=0 tapretFirst=1 + txid union TxPtr + witnessTx is Unit tag=0 + txid bytes len=32 wrapped aka=Txid tag=1 + vout is U32 aka=Vout + blinding is U64 + state bytes len=32 aka=ConcealedData + lock bytes len=2 aka=ReservedBytes2 + confidentialSeal rec tag=2 + seal union XChainSecretSeal + bitcoin bytes len=32 wrapped aka=SecretSeal tag=0 + liquid bytes len=32 wrapped aka=SecretSeal tag=1 + state rec RevealedData + value bytes len=0..MAX16 aka=DataState + salt is U128 + lock bytes len=2 aka=ReservedBytes2 + revealed rec tag=3 + seal union XChainBlindSealTxPtr + bitcoin rec BlindSealTxPtr wrapped tag=0 + method enum Method opretFirst=0 tapretFirst=1 + txid union TxPtr + witnessTx is Unit tag=0 + txid bytes len=32 wrapped aka=Txid tag=1 + vout is U32 aka=Vout + blinding is U64 + liquid rec BlindSealTxPtr wrapped tag=1 + method enum Method opretFirst=0 tapretFirst=1 + txid union TxPtr + witnessTx is Unit tag=0 + txid bytes len=32 wrapped aka=Txid tag=1 + vout is U32 aka=Vout + blinding is U64 + state rec RevealedData + value bytes len=0..MAX16 aka=DataState + salt is U128 + lock bytes len=2 aka=ReservedBytes2 + attachment list len=0..MAX16 wrapped tag=3 + AssignRevealedAttachBlindSealTxPtr union + confidential rec tag=0 + seal union XChainSecretSeal + bitcoin bytes len=32 wrapped aka=SecretSeal tag=0 + liquid bytes len=32 wrapped aka=SecretSeal tag=1 + state bytes len=32 aka=ConcealedAttach + lock bytes len=2 aka=ReservedBytes2 + confidentialState rec tag=1 + seal union XChainBlindSealTxPtr + bitcoin rec BlindSealTxPtr wrapped tag=0 + method enum Method opretFirst=0 tapretFirst=1 + txid union TxPtr + witnessTx is Unit tag=0 + txid bytes len=32 wrapped aka=Txid tag=1 + vout is U32 aka=Vout + blinding is U64 + liquid rec BlindSealTxPtr wrapped tag=1 + method enum Method opretFirst=0 tapretFirst=1 + txid union TxPtr + witnessTx is Unit tag=0 + txid bytes len=32 wrapped aka=Txid tag=1 + vout is U32 aka=Vout + blinding is U64 + state bytes len=32 aka=ConcealedAttach + lock bytes len=2 aka=ReservedBytes2 + confidentialSeal rec tag=2 + seal union XChainSecretSeal + bitcoin bytes len=32 wrapped aka=SecretSeal tag=0 + liquid bytes len=32 wrapped aka=SecretSeal tag=1 + state rec RevealedAttach + file rec AttachState + id bytes len=32 aka=AttachId + mediaType enum MediaType any=255 + salt is U64 + lock bytes len=2 aka=ReservedBytes2 + revealed rec tag=3 + seal union XChainBlindSealTxPtr + bitcoin rec BlindSealTxPtr wrapped tag=0 + method enum Method opretFirst=0 tapretFirst=1 + txid union TxPtr + witnessTx is Unit tag=0 + txid bytes len=32 wrapped aka=Txid tag=1 + vout is U32 aka=Vout + blinding is U64 + liquid rec BlindSealTxPtr wrapped tag=1 + method enum Method opretFirst=0 tapretFirst=1 + txid union TxPtr + witnessTx is Unit tag=0 + txid bytes len=32 wrapped aka=Txid tag=1 + vout is U32 aka=Vout + blinding is U64 + state rec RevealedAttach + file rec AttachState + id bytes len=32 aka=AttachId + mediaType enum MediaType any=255 + salt is U64 + lock bytes len=2 aka=ReservedBytes2 + valencies set len=0..MAX8 aka=Valencies + element is U16 aka=ValencyType + validator bytes len=1 aka=ReservedBytes1 + witness bytes len=2 aka=ReservedBytes2 schema rec Schema ffv is U16 aka=Ffv flags bytes len=1 aka=ReservedBytes1