diff --git a/.gitmodules b/.gitmodules index 7b781f5..6dd4e5b 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,12 +1,9 @@ [submodule "rgb-std"] path = rgb-std url = https://github.com/RGB-WG/rgb-std.git -[submodule "rust-aluvm"] - path = rust-aluvm - url = https://github.com/aluvm/rust-aluvm -[submodule "rgb-interfaces"] - path = rgb-interfaces - url = https://github.com/RGB-WG/rgb-interfaces +[submodule "aluvm"] + path = aluvm + url = https://github.com/aluvm/aluvm [submodule "client_side_validation"] path = client_side_validation url = https://github.com/LNP-BP/client_side_validation/ @@ -19,9 +16,6 @@ [submodule "bp-std"] path = bp-std url = https://github.com/BP-WG/bp-std -[submodule "rgb-schemata"] - path = rgb-schemata - url = https://github.com/RGB-WG/rgb-schemata [submodule "strict-types"] path = strict-types url = https://github.com/strict-types/strict-types @@ -46,9 +40,6 @@ [submodule "amplify-derive"] path = amplify-derive url = https://github.com/rust-amplify/amplify-derive.git -[submodule "ascii-armor"] - path = ascii-armor - url = https://github.com/UBIDECO/ascii-armor.git [submodule "bp-esplora-client"] path = bp-esplora-client url = https://github.com/BP-WG/bp-esplora-client.git @@ -61,3 +52,12 @@ [submodule "amplify-nonasync"] path = amplify-nonasync url = https://github.com/rust-amplify/amplify-nonasync.git +[submodule "zk-aluvm"] + path = zk-aluvm + url = https://github.com/AluVM/zk-aluvm +[submodule "ultrasonic"] + path = ultrasonic + url = https://github.com/AluVM/ultrasonic +[submodule "sonic"] + path = sonic + url = https://github.com/AluVM/sonic diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..13566b8 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,8 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Editor-based HTTP Client requests +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/Cargo.lock b/Cargo.lock index 923c3be..9e25c22 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4,18 +4,18 @@ version = 3 [[package]] name = "addr2line" -version = "0.21.0" +version = "0.24.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb" +checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" dependencies = [ "gimli", ] [[package]] -name = "adler" -version = "1.0.2" +name = "adler2" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" +checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" [[package]] name = "aho-corasick" @@ -28,47 +28,31 @@ dependencies = [ [[package]] name = "aluvm" -version = "0.11.0-beta.9" +version = "0.12.0-beta.5" dependencies = [ "amplify", - "ascii-armor", "baid64", - "blake3", - "getrandom", - "half", + "commit_verify", + "getrandom 0.2.15", "paste", - "ripemd", "serde", - "sha2", "strict_encoding", - "strict_types", "wasm-bindgen", ] [[package]] name = "amplify" -version = "4.7.0" +version = "4.8.0" dependencies = [ - "amplify_apfloat", "amplify_derive", "amplify_num", "amplify_syn", "ascii", - "rand", "serde", "stringly_conversions", "wasm-bindgen", ] -[[package]] -name = "amplify_apfloat" -version = "0.3.1" -dependencies = [ - "amplify_num", - "bitflags 2.5.0", - "wasm-bindgen", -] - [[package]] name = "amplify_derive" version = "4.0.1" @@ -111,17 +95,11 @@ dependencies = [ "libc", ] -[[package]] -name = "arrayref" -version = "0.3.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b4930d2cb77ce62f89ee5d5289b4ac049559b1c45539271f5ed4fdc7db34545" - [[package]] name = "arrayvec" -version = "0.7.4" +version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711" +checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" [[package]] name = "ascii" @@ -132,75 +110,68 @@ dependencies = [ "serde", ] -[[package]] -name = "ascii-armor" -version = "0.7.2" -dependencies = [ - "amplify", - "baid64", - "base85", - "sha2", - "strict_encoding", -] - [[package]] name = "autocfg" -version = "1.2.0" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1fdabc7756949593fe60f30ec81974b613357de856987752631dea1e3394c80" +checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" [[package]] name = "aws-lc-rs" -version = "1.7.3" +version = "1.12.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf7d844e282b4b56750b2d4e893b2205581ded8709fddd2b6aa5418c150ca877" +checksum = "4c2b7ddaa2c56a367ad27a094ad8ef4faacf8a617c2575acb2ba88949df999ca" dependencies = [ "aws-lc-sys", - "mirai-annotations", "paste", "zeroize", ] [[package]] name = "aws-lc-sys" -version = "0.18.0" +version = "0.25.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3a2c29203f6bf296d01141cc8bb9dbd5ecd4c27843f2ee0767bcd5985a927da" +checksum = "54ac4f13dad353b209b34cbec082338202cbc01c8f00336b55c750c13ac91f8f" dependencies = [ "bindgen", "cc", "cmake", "dunce", "fs_extra", - "libc", "paste", ] [[package]] name = "backtrace" -version = "0.3.71" +version = "0.3.74" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26b05800d2e817c8b3b4b54abd461726265fa9789ae34330622f2db9ee696f9d" +checksum = "8d82cb332cdfaed17ae235a638438ac4d4839913cc2af585c3c6746e8f8bee1a" dependencies = [ "addr2line", - "cc", "cfg-if", "libc", "miniz_oxide", "object", "rustc-demangle", + "windows-targets", ] [[package]] name = "baid64" -version = "0.2.2" +version = "0.4.1" dependencies = [ "amplify", - "base64", + "base64 0.22.1", "mnemonic", "sha2", ] +[[package]] +name = "base64" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3441f0f7b02788e948e47f457ca01f1d7e6d92c693bc132c22b087d3141c03ff" + [[package]] name = "base64" version = "0.22.1" @@ -224,11 +195,11 @@ checksum = "d86b93f97252c47b41663388e6d155714a9d0c398b99f1005cbc5f978b29f445" [[package]] name = "bindgen" -version = "0.69.4" +version = "0.69.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a00dc851838a2120612785d195287475a3ac45514741da670b735818822129a0" +checksum = "271383c67ccabffb7381723dea0672a673f292304fcb45c01cc648c7a8d58088" dependencies = [ - "bitflags 2.5.0", + "bitflags", "cexpr", "clang-sys", "itertools", @@ -241,21 +212,15 @@ dependencies = [ "regex", "rustc-hash", "shlex", - "syn 2.0.66", + "syn 2.0.98", "which", ] [[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" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73290177011694f38ec25e165d0387ab7ea749a4b81cd4c80dae5988229f7a57" +checksum = "0b47c4ab7a93edb0c7198c5535ed9b52b63095f4e9b45279c6736cec4b856baf" [[package]] name = "bitcoin_hashes" @@ -269,28 +234,9 @@ dependencies = [ [[package]] name = "bitflags" -version = "1.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" - -[[package]] -name = "bitflags" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf4b9d6a944f767f8e5e0db018570623c85f3d925ac718db4e06d0187adb21c1" - -[[package]] -name = "blake3" -version = "1.5.4" +version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d82033247fd8e890df8f740e407ad4d038debb9eb1f40533fffb32e7d17dc6f7" -dependencies = [ - "arrayref", - "arrayvec", - "cc", - "cfg-if", - "constant_time_eq", -] +checksum = "8f68f53c83ab957f72c32642f3868eec03eb974d1fb82e453128456482613d36" [[package]] name = "block-buffer" @@ -301,66 +247,70 @@ dependencies = [ "generic-array", ] +[[package]] +name = "borrow-or-share" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3eeab4423108c5d7c744f4d234de88d18d636100093ae04caf4825134b9c3a32" + [[package]] name = "bp-consensus" -version = "0.11.0-beta.9" +version = "0.12.0-beta.5" dependencies = [ "amplify", "chrono", "commit_verify", - "secp256k1 0.30.0", + "secp256k1", "serde", "strict_encoding", - "strict_types", ] [[package]] name = "bp-core" -version = "0.11.0-beta.9" +version = "0.12.0-beta.5" dependencies = [ "amplify", "bp-consensus", "bp-dbc", "bp-seals", "commit_verify", - "getrandom", + "getrandom 0.2.15", "serde", "single_use_seals", "strict_encoding", - "strict_types", "wasm-bindgen", ] [[package]] name = "bp-dbc" -version = "0.11.0-beta.9" +version = "0.12.0-beta.5" dependencies = [ "amplify", "base85", "bp-consensus", "commit_verify", - "secp256k1 0.30.0", + "secp256k1", "serde", "strict_encoding", ] [[package]] name = "bp-derive" -version = "0.11.0-beta.9.1" +version = "0.12.0-beta.5" dependencies = [ "amplify", "bp-consensus", "bp-invoice", "commit_verify", "hmac", - "indexmap 2.6.0", + "indexmap 2.7.1", "serde", "sha2", ] [[package]] name = "bp-electrum" -version = "0.11.0-beta.9.3" +version = "0.12.0-beta.5" dependencies = [ "amplify", "bp-std", @@ -377,32 +327,34 @@ dependencies = [ [[package]] name = "bp-esplora" -version = "0.11.0-beta.9" +version = "0.12.0-beta.5.1" dependencies = [ "amplify", "bp-std", "log", + "minreq", "reqwest", "serde", - "serde_with", + "serde_with 3.12.0", "sha2", - "ureq", + "tokio", ] [[package]] name = "bp-invoice" -version = "0.11.0-beta.9.1" +version = "0.12.0-beta.5" dependencies = [ "amplify", "bech32", "bp-consensus", "commit_verify", "serde", + "strict_encoding", ] [[package]] name = "bp-seals" -version = "0.11.0-beta.9" +version = "0.12.0-beta.5" dependencies = [ "amplify", "baid64", @@ -417,7 +369,7 @@ dependencies = [ [[package]] name = "bp-std" -version = "0.11.0-beta.9.1" +version = "0.12.0-beta.5" dependencies = [ "amplify", "bp-consensus", @@ -425,23 +377,22 @@ dependencies = [ "bp-derive", "bp-invoice", "descriptors", - "getrandom", + "getrandom 0.2.15", "psbt", - "secp256k1 0.30.0", + "secp256k1", "serde", "wasm-bindgen", ] [[package]] name = "bp-wallet" -version = "0.11.0-beta.9.1" +version = "0.12.0-beta.5" dependencies = [ "amplify", "bp-electrum", "bp-esplora", "bp-std", "descriptors", - "log", "nonasync", "psbt", "serde", @@ -454,9 +405,9 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.16.0" +version = "3.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" +checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf" [[package]] name = "byteorder" @@ -466,15 +417,15 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" -version = "1.6.0" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "514de17de45fdb8dc022b1a7975556c53c86f9f0aa5f534b98977b171857c2c9" +checksum = "f61dac84819c6588b558454b194026eb1f09c293b9036ae9b159e74e73ab6cf9" [[package]] name = "cc" -version = "1.1.18" +version = "1.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b62ac837cdb5cb22e10a256099b4fc502b1dfe560cb282963a974d7abd80e476" +checksum = "0c3d1b2e905a3a7b00a6141adb0e4c0bb941d11caf55349d863942a1cc44e3c9" dependencies = [ "jobserver", "libc", @@ -498,9 +449,9 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "chrono" -version = "0.4.38" +version = "0.4.39" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a21f936df1771bf62b77f047b726c4625ff2e8aa607c01ec06e5a05bd8463401" +checksum = "7e36cc9d416881d2e24f9a963be5fb1cd90966419ac844274161d10488b3e825" dependencies = [ "android-tzdata", "iana-time-zone", @@ -508,7 +459,7 @@ dependencies = [ "num-traits", "serde", "wasm-bindgen", - "windows-targets 0.52.6", + "windows-targets", ] [[package]] @@ -524,16 +475,16 @@ dependencies = [ [[package]] name = "cmake" -version = "0.1.50" +version = "0.1.54" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a31c789563b815f77f4250caee12365734369f942439b7defd71e18a48197130" +checksum = "e7caa3f9de89ddbe2c607f4101924c5abec803763ae9534e4f4d7d8f84aa81f0" dependencies = [ "cc", ] [[package]] name = "commit_encoding_derive" -version = "0.11.0-beta.9" +version = "0.12.0-beta.5" dependencies = [ "amplify", "amplify_syn", @@ -544,7 +495,7 @@ dependencies = [ [[package]] name = "commit_verify" -version = "0.11.0-beta.9" +version = "0.12.0-beta.5" dependencies = [ "amplify", "commit_encoding_derive", @@ -557,12 +508,6 @@ dependencies = [ "vesper-lang", ] -[[package]] -name = "constant_time_eq" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7144d30dcf0fafbce74250a3963025d8d52177934239851c917d29f1df280c2" - [[package]] name = "core-foundation" version = "0.9.4" @@ -575,77 +520,97 @@ dependencies = [ [[package]] name = "core-foundation-sys" -version = "0.8.6" +version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" [[package]] name = "cpufeatures" -version = "0.2.12" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53fe5e26ff1b7aef8bca9c6080520cfb8d9333c7568e1829cef191a9723e5504" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" dependencies = [ "libc", ] [[package]] -name = "crc32fast" -version = "1.4.0" +name = "crypto-common" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3855a8a784b474f333699ef2bbca9db2c4a1f6d9088a90a2d25b1eb53111eaa" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" dependencies = [ - "cfg-if", + "generic-array", + "typenum", ] [[package]] -name = "crunchy" -version = "0.2.2" +name = "darling" +version = "0.13.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" +checksum = "a01d95850c592940db9b8194bc39f4bc0e89dee5c4265e4b1807c34a9aba453c" +dependencies = [ + "darling_core 0.13.4", + "darling_macro 0.13.4", +] [[package]] -name = "crypto-common" -version = "0.1.6" +name = "darling" +version = "0.20.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +checksum = "6f63b86c8a8826a49b8c21f08a2d07338eec8d900540f8630dc76284be802989" dependencies = [ - "generic-array", - "typenum", + "darling_core 0.20.10", + "darling_macro 0.20.10", ] [[package]] -name = "darling" -version = "0.20.8" +name = "darling_core" +version = "0.13.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54e36fcd13ed84ffdfda6f5be89b31287cbb80c439841fe69e04841435464391" +checksum = "859d65a907b6852c9361e3185c862aae7fafd2887876799fa55f5f99dc40d610" dependencies = [ - "darling_core", - "darling_macro", + "fnv", + "ident_case", + "proc-macro2", + "quote", + "strsim 0.10.0", + "syn 1.0.109", ] [[package]] name = "darling_core" -version = "0.20.8" +version = "0.20.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c2cf1c23a687a1feeb728783b993c4e1ad83d99f351801977dd809b48d0a70f" +checksum = "95133861a8032aaea082871032f5815eb9e98cef03fa916ab4500513994df9e5" dependencies = [ "fnv", "ident_case", "proc-macro2", "quote", - "strsim", - "syn 2.0.66", + "strsim 0.11.1", + "syn 2.0.98", +] + +[[package]] +name = "darling_macro" +version = "0.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c972679f83bdf9c42bd905396b6c3588a843a17f0f16dfcfa3e2c5d57441835" +dependencies = [ + "darling_core 0.13.4", + "quote", + "syn 1.0.109", ] [[package]] name = "darling_macro" -version = "0.20.8" +version = "0.20.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a668eda54683121533a393014d8692171709ff57a7d61f187b6e782719f8933f" +checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" dependencies = [ - "darling_core", + "darling_core 0.20.10", "quote", - "syn 2.0.66", + "syn 2.0.98", ] [[package]] @@ -660,11 +625,11 @@ dependencies = [ [[package]] name = "descriptors" -version = "0.11.0-beta.9.1" +version = "0.12.0-beta.5" dependencies = [ "amplify", "bp-derive", - "indexmap 2.6.0", + "indexmap 2.7.1", "serde", ] @@ -679,45 +644,50 @@ dependencies = [ "subtle", ] +[[package]] +name = "displaydoc" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.98", +] + [[package]] name = "dunce" -version = "1.0.4" +version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56ce8c6da7551ec6c462cbaf3bfbc75131ebbfa1c944aeaa9dab51ca1c5f0c3b" +checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" [[package]] name = "either" -version = "1.11.0" +version = "1.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a47c1c47d2f5964e29c61246e81db715514cd532db6b5116a25ea3c03d6780a2" +checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" [[package]] name = "equivalent" -version = "1.0.1" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" [[package]] name = "errno" -version = "0.3.8" +version = "0.3.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a258e46cdc063eb8519c00b9fc845fc47bcfca4130e2f08e88665ceda8474245" +checksum = "33d852cb9b869c2a9b3df2f71a3074817f01e1844f839a144f5fcef059a4eb5d" dependencies = [ "libc", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] -[[package]] -name = "fast32" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a35a73237400bde66c82e38387343f90d7182a2f2f22729e096a2abd57d75db9" - [[package]] name = "fastrand" -version = "2.0.2" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "658bd65b1cf4c852a3cc96f18a8ce7b5640f6b703f905c7d74532294c2a63984" +checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" [[package]] name = "file-format" @@ -725,23 +695,14 @@ version = "0.25.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ffe3a660c3a1b10e96f304a9413d673b2118d62e4520f7ddf4a4faccfe8b9b9" -[[package]] -name = "flate2" -version = "1.0.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46303f565772937ffe1d394a4fac6f411c6013172fadde9dcdb1e147a086940e" -dependencies = [ - "crc32fast", - "miniz_oxide", -] - [[package]] name = "fluent-uri" -version = "0.1.4" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17c704e9dbe1ddd863da1e6ff3567795087b1eb201ce80d8fa81162e1516500d" +checksum = "1918b65d96df47d3591bed19c5cca17e3fa5d0707318e4b5ef2eae01764df7e5" dependencies = [ - "bitflags 1.3.2", + "borrow-or-share", + "ref-cast", ] [[package]] @@ -782,9 +743,9 @@ checksum = "42703706b716c37f96a77aea830392ad231f44c9e9a67872fa5548707e11b11c" [[package]] name = "futures" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "645c6916888f6cb6350d2550b80fb63e734897a8498abe35cfb732b6487804b0" +checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" dependencies = [ "futures-channel", "futures-core", @@ -797,9 +758,9 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78" +checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" dependencies = [ "futures-core", "futures-sink", @@ -807,15 +768,15 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" +checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" [[package]] name = "futures-executor" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a576fc72ae164fca6b9db127eaa9a9dda0d61316034f33a0a0d4eda41f02b01d" +checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" dependencies = [ "futures-core", "futures-task", @@ -824,32 +785,32 @@ dependencies = [ [[package]] name = "futures-io" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1" +checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" [[package]] name = "futures-macro" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" +checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn 2.0.66", + "syn 2.0.98", ] [[package]] name = "futures-sink" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5" +checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" [[package]] name = "futures-task" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004" +checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" [[package]] name = "futures-timer" @@ -859,9 +820,9 @@ checksum = "f288b0a4f20f9a56b5d1da57e2227c661b7b16168e2f72365f57b63326e29b24" [[package]] name = "futures-util" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48" +checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" dependencies = [ "futures-channel", "futures-core", @@ -887,38 +848,40 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.14" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94b22e06ecb0110981051723910cbf0b5f5e09a2062dd7663334ee79a9d1286c" +checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" dependencies = [ "cfg-if", "js-sys", "libc", - "wasi", + "wasi 0.11.0+wasi-snapshot-preview1", "wasm-bindgen", ] [[package]] -name = "gimli" -version = "0.28.1" +name = "getrandom" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" +checksum = "43a49c392881ce6d5c3b8cb70f98717b7c07aabbdff06687b9030dbfbe2725f8" +dependencies = [ + "cfg-if", + "libc", + "wasi 0.13.3+wasi-0.2.2", + "windows-targets", +] [[package]] -name = "glob" -version = "0.3.1" +name = "gimli" +version = "0.31.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" +checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" [[package]] -name = "half" -version = "2.4.1" +name = "glob" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6dd08c532ae367adf81c312a4580bc67f1d0fe8bc9c460520283f4c0ff277888" -dependencies = [ - "cfg-if", - "crunchy", -] +checksum = "a8d1add55171497b4705a648c6b583acafb01d58050a51727785f0b2c8e0a2b2" [[package]] name = "hashbrown" @@ -928,15 +891,9 @@ checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" [[package]] name = "hashbrown" -version = "0.15.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e087f84d4f86bf4b218b927129862374b72199ae7d8657835f1e89000eea4fb" - -[[package]] -name = "heck" -version = "0.4.1" +version = "0.15.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" +checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" [[package]] name = "heck" @@ -970,18 +927,18 @@ dependencies = [ [[package]] name = "home" -version = "0.5.9" +version = "0.5.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3d1354bf6b7235cb4a0576c2619fd4ed18183f689b12b006a0ee7329eeff9a5" +checksum = "589533453244b0995c858700322199b2becb13b627df2851f64a2775d024abcf" dependencies = [ - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] name = "http" -version = "1.1.0" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21b9ddb458710bc376481b842f5da65cdf31522de232c1ca8146abce2a358258" +checksum = "f16ca2af56261c99fba8bac40a10251ce8188205a4c448fbb745a2e4daa76fea" dependencies = [ "bytes", "fnv", @@ -990,9 +947,9 @@ dependencies = [ [[package]] name = "http-body" -version = "1.0.0" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1cac85db508abc24a2e48553ba12a996e87244a0395ce011e62b37158745d643" +checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" dependencies = [ "bytes", "http", @@ -1013,15 +970,15 @@ dependencies = [ [[package]] name = "httparse" -version = "1.8.0" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" +checksum = "f2d708df4e7140240a16cd6ab0ab65c972d7433ab77819ea693fde9c43811e2a" [[package]] name = "hyper" -version = "1.3.1" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe575dd17d0862a9a33781c8c4696a55c320909004a67a00fb286ba8b1bc496d" +checksum = "cc2b571658e38e0c01b1fdca3bbbe93c00d3d71693ff2770043f8c29bc7d6f80" dependencies = [ "bytes", "futures-channel", @@ -1054,9 +1011,9 @@ dependencies = [ [[package]] name = "hyper-util" -version = "0.1.5" +version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b875924a60b96e5d7b9ae7b066540b1dd1cbd90d1828f54c92e02a283351c56" +checksum = "df2dcfbe0677734ab2f3ffa7fa7bfd4706bfdc1ef393f2ee30184aed67e631b4" dependencies = [ "bytes", "futures-channel", @@ -1067,16 +1024,32 @@ dependencies = [ "pin-project-lite", "socket2", "tokio", - "tower", "tower-service", "tracing", ] +[[package]] +name = "hypersonic" +version = "0.12.0-beta.5" +dependencies = [ + "aluvm", + "amplify", + "commit_verify", + "getrandom 0.2.15", + "serde", + "sonic-api", + "sonic-callreq", + "strict_encoding", + "strict_types", + "ultrasonic", + "wasm-bindgen", +] + [[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", @@ -1095,6 +1068,124 @@ dependencies = [ "cc", ] +[[package]] +name = "icu_collections" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db2fa452206ebee18c4b5c2274dbf1de17008e874b4dc4f0aea9d01ca79e4526" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_locid" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13acbb8371917fc971be86fc8057c41a64b521c184808a698c02acc242dbf637" +dependencies = [ + "displaydoc", + "litemap", + "tinystr", + "writeable", + "zerovec", +] + +[[package]] +name = "icu_locid_transform" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "01d11ac35de8e40fdeda00d9e1e9d92525f3f9d887cdd7aa81d727596788b54e" +dependencies = [ + "displaydoc", + "icu_locid", + "icu_locid_transform_data", + "icu_provider", + "tinystr", + "zerovec", +] + +[[package]] +name = "icu_locid_transform_data" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fdc8ff3388f852bede6b579ad4e978ab004f139284d7b28715f773507b946f6e" + +[[package]] +name = "icu_normalizer" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19ce3e0da2ec68599d193c93d088142efd7f9c5d6fc9b803774855747dc6a84f" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec", + "utf16_iter", + "utf8_iter", + "write16", + "zerovec", +] + +[[package]] +name = "icu_normalizer_data" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8cafbf7aa791e9b22bec55a167906f9e1215fd475cd22adfcf660e03e989516" + +[[package]] +name = "icu_properties" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93d6020766cfc6302c15dbbc9c8778c37e62c14427cb7f6e601d849e092aeef5" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_locid_transform", + "icu_properties_data", + "icu_provider", + "tinystr", + "zerovec", +] + +[[package]] +name = "icu_properties_data" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67a8effbc3dd3e4ba1afa8ad918d5684b8868b3b26500753effea8d2eed19569" + +[[package]] +name = "icu_provider" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ed421c8a8ef78d3e2dbc98a973be2f3770cb42b606e3ab18d6237c4dfde68d9" +dependencies = [ + "displaydoc", + "icu_locid", + "icu_provider_macros", + "stable_deref_trait", + "tinystr", + "writeable", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_provider_macros" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.98", +] + [[package]] name = "ident_case" version = "1.0.1" @@ -1103,12 +1194,23 @@ checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" [[package]] name = "idna" -version = "0.5.0" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" +dependencies = [ + "idna_adapter", + "smallvec", + "utf8_iter", +] + +[[package]] +name = "idna_adapter" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" +checksum = "daca1df1c957320b2cf139ac61e7bd64fed304c5040df000a745aa1de3b4ef71" dependencies = [ - "unicode-bidi", - "unicode-normalization", + "icu_normalizer", + "icu_properties", ] [[package]] @@ -1124,20 +1226,20 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.6.0" +version = "2.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "707907fe3c25f5424cce2cb7e1cbcafee6bdbe735ca90ef77c29e84591e5b9da" +checksum = "8c9c992b02b5b4c94ea26e32fe5bccb7aa7d9f390ab5c1221ff895bc7ea8b652" dependencies = [ "equivalent", - "hashbrown 0.15.0", + "hashbrown 0.15.2", "serde", ] [[package]] name = "ipnet" -version = "2.9.0" +version = "2.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3" +checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" [[package]] name = "itertools" @@ -1150,33 +1252,34 @@ dependencies = [ [[package]] name = "itoa" -version = "1.0.11" +version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" +checksum = "d75a2a4b1b190afb6f5425f10f6a8f959d2ea0b9c2b1d79553551850539e4674" [[package]] name = "jobserver" -version = "0.1.31" +version = "0.1.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2b099aaa34a9751c5bf0878add70444e1ed2dd73f347be99003d4577277de6e" +checksum = "48d1dbcbbeb6a7fec7e059840aa538bd62aaccf972c7346c4d9d2059312853d0" dependencies = [ "libc", ] [[package]] name = "js-sys" -version = "0.3.69" +version = "0.3.77" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29c15563dc2726973df627357ce0c9ddddbea194836909d655df6a75d2cf296d" +checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" dependencies = [ + "once_cell", "wasm-bindgen", ] [[package]] name = "lazy_static" -version = "1.4.0" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" [[package]] name = "lazycell" @@ -1186,25 +1289,31 @@ checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" [[package]] name = "libc" -version = "0.2.153" +version = "0.2.169" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd" +checksum = "b5aba8db14291edd000dfcc4d620c7ebfb122c613afb886ca8803fa4e128a20a" [[package]] name = "libloading" -version = "0.8.3" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c2a198fb6b0eada2a8df47933734e6d35d350665a33a3593d7164fa52c75c19" +checksum = "fc2f4eb4bc735547cfed7c0a4922cbd04a4655978c09b54f1f7b228750664c34" dependencies = [ "cfg-if", - "windows-targets 0.52.6", + "windows-targets", ] [[package]] name = "linux-raw-sys" -version = "0.4.13" +version = "0.4.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01cda141df6706de531b6c46c3a33ecca755538219bd484262fa09410c13539c" +checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" + +[[package]] +name = "litemap" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ee93343901ab17bd981295f2cf0026d4ad018c7c31ba84549a4ddbb47a45104" [[package]] name = "lock_api" @@ -1218,15 +1327,15 @@ dependencies = [ [[package]] name = "log" -version = "0.4.22" +version = "0.4.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" +checksum = "04cbf5b083de1c7e0222a7a51dbfdba1cbe1c6ab0b15e29fff3f6c077fd9cd9f" [[package]] name = "memchr" -version = "2.7.2" +version = "2.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c8640c5d730cb13ebd907d8d04b52f55ac9a2eec55b440c8892f40d56c76c1d" +checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" [[package]] name = "mime" @@ -1242,29 +1351,35 @@ checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" [[package]] name = "miniz_oxide" -version = "0.7.2" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d811f3e15f28568be3407c8e7fdb6514c1cda3cb30683f15b6a1a1dc4ea14a7" +checksum = "b3b1c9bd4fe1f0f8b387f6eb9eb3b4a1aa26185e5750efb9140301703f62cd1b" dependencies = [ - "adler", + "adler2", ] [[package]] -name = "mio" -version = "0.8.11" +name = "minreq" +version = "2.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4a650543ca06a924e8b371db273b2756685faae30f8487da1b56505a8f78b0c" +checksum = "da0c420feb01b9fb5061f8c8f452534361dd783756dcf38ec45191ce55e7a161" dependencies = [ - "libc", - "wasi", - "windows-sys 0.48.0", + "base64 0.12.3", + "log", + "serde", + "serde_json", ] [[package]] -name = "mirai-annotations" -version = "1.12.0" +name = "mio" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9be0862c1b3f26a88803c4a49de6889c10e608b3ee9344e6ef5b45fb37ad3d1" +checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd" +dependencies = [ + "libc", + "wasi 0.11.0+wasi-snapshot-preview1", + "windows-sys 0.52.0", +] [[package]] name = "mnemonic" @@ -1274,11 +1389,10 @@ checksum = "f2b8f3a258db515d5e91a904ce4ae3f73e091149b90cadbdb93d210bee07f63b" [[package]] name = "native-tls" -version = "0.2.11" +version = "0.2.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07226173c32f2926027b63cce4bcd8076c3552846cbe7925f3aaffeac0a3b92e" +checksum = "0dab59f8e050d5df8e4dd87d9206fb6f65a483e20ac9fda365ade4fab353196c" dependencies = [ - "lazy_static", "libc", "log", "openssl", @@ -1302,10 +1416,9 @@ dependencies = [ [[package]] name = "nonasync" -version = "0.1.2" +version = "0.1.3" dependencies = [ "amplify", - "log", ] [[package]] @@ -1316,35 +1429,35 @@ checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" [[package]] name = "num-traits" -version = "0.2.18" +version = "0.2.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da0df0e5185db44f69b44f26786fe401b6c293d1907744beaa7fa62b2e5a517a" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" dependencies = [ "autocfg", ] [[package]] name = "object" -version = "0.32.2" +version = "0.36.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6a622008b6e321afc04970976f62ee297fdbaa6f95318ca343e3eebb9648441" +checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" dependencies = [ "memchr", ] [[package]] name = "once_cell" -version = "1.19.0" +version = "1.20.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" +checksum = "945462a4b81e43c4e3ba96bd7b49d834c6f61198356aa858733bc4acf3cbe62e" [[package]] name = "openssl" -version = "0.10.64" +version = "0.10.71" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95a0481286a310808298130d22dd1fef0fa571e05a8f44ec801801e84b216b1f" +checksum = "5e14130c6a98cd258fdcb0fb6d744152343ff729cbfcb28c656a9d12b999fbcd" dependencies = [ - "bitflags 2.5.0", + "bitflags", "cfg-if", "foreign-types", "libc", @@ -1361,20 +1474,20 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.66", + "syn 2.0.98", ] [[package]] name = "openssl-probe" -version = "0.1.5" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" +checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" [[package]] name = "openssl-sys" -version = "0.9.102" +version = "0.9.106" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c597637d56fbc83893a35eb0dd04b2b8e7a50c91e64e9493e398b5df4fb45fa2" +checksum = "8bb61ea9811cc39e3c2069f40b8b8e2e70d8569b361f879786cc7ed48b777cdd" dependencies = [ "cc", "libc", @@ -1402,14 +1515,14 @@ dependencies = [ "libc", "redox_syscall", "smallvec", - "windows-targets 0.52.6", + "windows-targets", ] [[package]] name = "paste" -version = "1.0.14" +version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de3145af08024dea9fa9914f381a17b8fc6034dfb00f3a84013f7ff43f29ed4c" +checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" [[package]] name = "percent-encoding" @@ -1417,31 +1530,11 @@ version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" -[[package]] -name = "pin-project" -version = "1.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6bf43b791c5b9e34c3d182969b4abb522f9343702850a2e57f460d00d09b4b3" -dependencies = [ - "pin-project-internal", -] - -[[package]] -name = "pin-project-internal" -version = "1.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.66", -] - [[package]] name = "pin-project-lite" -version = "0.2.14" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02" +checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" [[package]] name = "pin-utils" @@ -1451,9 +1544,9 @@ checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" [[package]] name = "pkg-config" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec" +checksum = "953ec861398dccce10c670dfeaf3ec4911ca479e9c02154b3a215178c5f566f2" [[package]] name = "powerfmt" @@ -1463,50 +1556,52 @@ checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" [[package]] name = "ppv-lite86" -version = "0.2.17" +version = "0.2.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" +checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04" +dependencies = [ + "zerocopy", +] [[package]] name = "prettyplease" -version = "0.2.20" +version = "0.2.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f12335488a2f3b0a83b14edad48dca9879ce89b2edd10e80237e4e852dd645e" +checksum = "6924ced06e1f7dfe3fa48d57b9f74f55d8915f5036121bef647ef4b204895fac" dependencies = [ "proc-macro2", - "syn 2.0.66", + "syn 2.0.98", ] [[package]] name = "proc-macro2" -version = "1.0.85" +version = "1.0.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22244ce15aa966053a896d1accb3a6e68469b97c7f33f284b99f0d576879fc23" +checksum = "60946a68e5f9d28b0dc1c21bb8a97ee7d018a8b322fa57838ba31cc878e22d99" dependencies = [ "unicode-ident", ] [[package]] name = "psbt" -version = "0.11.0-beta.9.1" +version = "0.12.0-beta.5" dependencies = [ "amplify", - "base64", + "base64 0.22.1", "bp-core", "bp-derive", - "chrono", "commit_verify", "descriptors", - "indexmap 2.6.0", + "indexmap 2.7.1", "serde", "strict_encoding", ] [[package]] name = "quote" -version = "1.0.36" +version = "1.0.38" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7" +checksum = "0e4dccaaaf89514f546c693ddc140f729f958c247918a13380cccc6078391acc" dependencies = [ "proc-macro2", ] @@ -1538,7 +1633,7 @@ version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" dependencies = [ - "getrandom", + "getrandom 0.2.15", ] [[package]] @@ -1547,14 +1642,34 @@ version = "0.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "03a862b389f93e68874fbf580b9de08dd02facb9a788ebadaf4a3fd33cf58834" dependencies = [ - "bitflags 2.5.0", + "bitflags", +] + +[[package]] +name = "ref-cast" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccf0a6f84d5f1d581da8b41b47ec8600871962f2a528115b542b362d4b744931" +dependencies = [ + "ref-cast-impl", +] + +[[package]] +name = "ref-cast-impl" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bcc303e793d3734489387d205e9b186fac9c6cfacedd98cbb2e8a5943595f3e6" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.98", ] [[package]] name = "regex" -version = "1.10.4" +version = "1.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c117dbdfde9c8308975b6a18d71f3f385c89461f7b3fb054288ecf2a2058ba4c" +checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" dependencies = [ "aho-corasick", "memchr", @@ -1564,9 +1679,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.6" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86b83b8b9847f9bf95ef68afb0b8e6cdb80f498442f5179a29fad448fcc1eaea" +checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" dependencies = [ "aho-corasick", "memchr", @@ -1575,9 +1690,9 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.8.3" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adad44e29e4c806119491a7f06f03de4d1af22c3a680dd47f1e6e179439d1f56" +checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" [[package]] name = "relative-path" @@ -1587,11 +1702,11 @@ checksum = "ba39f3699c378cd8970968dcbff9c43159ea4cfbd88d43c00b22f2ef10a435d2" [[package]] name = "reqwest" -version = "0.12.9" +version = "0.12.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a77c62af46e79de0a562e1a9849205ffcb7fc1238876e9bd743357570e04046f" +checksum = "43e734407157c3c2034e0258f5e4473ddb361b1e85f95a66690d67264d7cd1da" dependencies = [ - "base64", + "base64 0.22.1", "bytes", "futures-core", "futures-util", @@ -1617,6 +1732,7 @@ dependencies = [ "tokio", "tokio-native-tls", "tokio-socks", + "tower", "tower-service", "url", "wasm-bindgen", @@ -1627,90 +1743,55 @@ dependencies = [ [[package]] name = "rgb-core" -version = "0.11.0-beta.9" +version = "0.12.0-beta.5" dependencies = [ - "aluvm", "amplify", - "baid64", "bp-core", - "chrono", "commit_verify", - "getrandom", - "mime", - "secp256k1-zkp", + "getrandom 0.2.15", "serde", "single_use_seals", "strict_encoding", - "strict_types", - "wasm-bindgen", -] - -[[package]] -name = "rgb-interfaces" -version = "0.11.0-beta.9" -dependencies = [ - "aluvm", - "amplify", - "bp-core", - "chrono", - "getrandom", - "rgb-std", - "serde_json", - "sha2", - "strict_encoding", - "strict_types", + "ultrasonic", "wasm-bindgen", ] [[package]] name = "rgb-invoice" -version = "0.11.0-beta.9.1" +version = "0.12.0-beta.5" dependencies = [ "amplify", "baid64", "bp-core", "bp-invoice", - "fast32", - "fluent-uri", - "indexmap 2.6.0", - "percent-encoding", - "rand", + "commit_verify", + "hypersonic", "rgb-core", "serde", + "sonic-callreq", "strict_encoding", - "strict_types", ] [[package]] name = "rgb-psbt" -version = "0.11.0-beta.9" +version = "0.12.0-beta.5" dependencies = [ "amplify", - "baid64", "bp-core", "bp-std", - "commit_verify", - "getrandom", "rgb-std", - "strict_encoding", - "wasm-bindgen", ] [[package]] name = "rgb-runtime" -version = "0.11.0-beta.9" +version = "0.12.0-beta.5" dependencies = [ "amplify", - "baid64", - "bp-core", - "bp-electrum", - "bp-esplora", "bp-std", "bp-wallet", - "chrono", "commit_verify", - "getrandom", - "indexmap 2.6.0", + "getrandom 0.2.15", + "indexmap 2.7.1", "nonasync", "rgb-psbt", "rgb-std", @@ -1720,42 +1801,22 @@ dependencies = [ "wasm-bindgen", ] -[[package]] -name = "rgb-schemata" -version = "0.11.0-beta.9" -dependencies = [ - "aluvm", - "amplify", - "bp-core", - "chrono", - "rgb-interfaces", - "rgb-std", - "serde", - "serde_json", - "sha2", - "strict_encoding", - "strict_types", -] - [[package]] name = "rgb-std" -version = "0.11.0-beta.9.1" +version = "0.12.0-beta.5" dependencies = [ - "aluvm", "amplify", - "ascii-armor", - "baid64", - "base85", "bp-core", + "bp-invoice", "chrono", "commit_verify", - "getrandom", - "indexmap 2.6.0", - "nonasync", - "rand", + "getrandom 0.2.15", + "hypersonic", "rgb-core", "rgb-invoice", "serde", + "serde_with 1.14.0", + "single_use_seals", "strict_encoding", "strict_types", "wasm-bindgen", @@ -1766,7 +1827,6 @@ name = "rgb-tests" version = "0.1.0" dependencies = [ "amplify", - "bitcoin_hashes", "bp-core", "bp-electrum", "bp-esplora", @@ -1778,10 +1838,8 @@ dependencies = [ "once_cell", "psbt", "rand", - "rgb-interfaces", "rgb-psbt", "rgb-runtime", - "rgb-schemata", "rgb-std", "rstest", "rstest_reuse", @@ -1796,15 +1854,14 @@ dependencies = [ [[package]] name = "ring" -version = "0.17.8" +version = "0.17.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d" +checksum = "e75ec5e92c4d8aede845126adc388046234541629e76029599ed35a003c7ed24" dependencies = [ "cc", "cfg-if", - "getrandom", + "getrandom 0.2.15", "libc", - "spin", "untrusted", "windows-sys 0.52.0", ] @@ -1843,7 +1900,7 @@ dependencies = [ "regex", "relative-path", "rustc_version", - "syn 2.0.66", + "syn 2.0.98", "unicode-ident", ] @@ -1856,14 +1913,14 @@ dependencies = [ "quote", "rand", "rustc_version", - "syn 2.0.66", + "syn 2.0.98", ] [[package]] name = "rustc-demangle" -version = "0.1.23" +version = "0.1.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" +checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" [[package]] name = "rustc-hash" @@ -1873,36 +1930,35 @@ checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" [[package]] name = "rustc_version" -version = "0.4.0" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" +checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" dependencies = [ "semver", ] [[package]] name = "rustix" -version = "0.38.34" +version = "0.38.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70dc5ec042f7a43c4a73241207cecc9873a06d45debb38b329f8541d85c2730f" +checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" dependencies = [ - "bitflags 2.5.0", + "bitflags", "errno", "libc", "linux-raw-sys", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] name = "rustls" -version = "0.23.7" +version = "0.23.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebbbdb961df0ad3f2652da8f3fdc4b36122f568f968f45ad3316f26c025c677b" +checksum = "47796c98c480fce5406ef69d1c76378375492c3b0a0de587be0c1d9feb12f395" dependencies = [ "aws-lc-rs", "log", "once_cell", - "ring", "rustls-pki-types", "rustls-webpki", "subtle", @@ -1911,25 +1967,24 @@ dependencies = [ [[package]] name = "rustls-pemfile" -version = "2.1.2" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29993a25686778eb88d4189742cd713c9bce943bc54251a33509dc63cbacf73d" +checksum = "dce314e5fee3f39953d46bb63bb8a46d40c2f8fb7cc5a3b6cab2bde9721d6e50" dependencies = [ - "base64", "rustls-pki-types", ] [[package]] name = "rustls-pki-types" -version = "1.5.0" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "beb461507cee2c2ff151784c52762cf4d9ff6a61f3e80968600ed24fa837fa54" +checksum = "917ce264624a4b4db1c364dcc35bfca9ded014d0a958cd47ad3e960e988ea51c" [[package]] name = "rustls-webpki" -version = "0.102.3" +version = "0.102.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3bce581c0dd41bce533ce695a1437fa16a7ab5ac3ccfa99fe1a620a7885eabf" +checksum = "64ca1bc8749bd4cf37b5ce386cc146580777b4e8572c7b97baf22c83f444bee9" dependencies = [ "aws-lc-rs", "ring", @@ -1939,32 +1994,32 @@ dependencies = [ [[package]] name = "rustversion" -version = "1.0.15" +version = "1.0.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80af6f9131f277a45a3fba6ce8e2258037bb0477a67e610d3c1fe046ab31de47" +checksum = "f7c45b9784283f1b2e7fb61b42047c2fd678ef0960d4f6f1eba131594cc369d4" [[package]] name = "ryu" -version = "1.0.17" +version = "1.0.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e86697c916019a8588c99b5fac3cead74ec0b4b819707a682fd4d23fa0ce1ba1" +checksum = "6ea1a2d0a644769cc99faa24c3ad26b379b786fe7c36fd3c546254801650e6dd" [[package]] name = "scc" -version = "2.2.6" +version = "2.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94b13f8ea6177672c49d12ed964cca44836f59621981b04a3e26b87e675181de" +checksum = "ea091f6cac2595aa38993f04f4ee692ed43757035c36e67c180b6828356385b1" dependencies = [ "sdd", ] [[package]] name = "schannel" -version = "0.1.23" +version = "0.1.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbc91545643bcf3a0bbb6569265615222618bdf33ce4ffbbd13c4bbd4c093534" +checksum = "1f29ebaa345f945cec9fbbc532eb307f0fdad8161f281b6369539c8d84876b3d" dependencies = [ - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -1975,20 +2030,9 @@ checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" [[package]] name = "sdd" -version = "3.0.5" +version = "3.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "478f121bb72bbf63c52c93011ea1791dca40140dfe13f8336c4c5ac952c33aa9" - -[[package]] -name = "secp256k1" -version = "0.29.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e0cc0f1cf93f4969faf3ea1c7d8a9faed25918d96affa959720823dfe86d4f3" -dependencies = [ - "rand", - "secp256k1-sys", - "serde", -] +checksum = "b07779b9b918cc05650cb30f404d4d7835d26df37c235eded8a6832e2fb82cca" [[package]] name = "secp256k1" @@ -2004,43 +2048,20 @@ dependencies = [ [[package]] name = "secp256k1-sys" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1433bd67156263443f14d603720b082dd3121779323fce20cba2aa07b874bc1b" -dependencies = [ - "cc", -] - -[[package]] -name = "secp256k1-zkp" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52a44aed3002b5ae975f8624c5df3a949cfbf00479e18778b6058fcd213b76e3" -dependencies = [ - "bitcoin-private", - "rand", - "secp256k1 0.29.0", - "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 = "d4387882333d3aa8cb20530a17c69a3752e97837832f34f6dccc760e715001d9" dependencies = [ "cc", - "secp256k1-sys", ] [[package]] name = "security-framework" -version = "2.10.0" +version = "2.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "770452e37cad93e0a50d5abc3990d2bc351c36d0328f86cefec2f2fb206eaef6" +checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" dependencies = [ - "bitflags 1.3.2", + "bitflags", "core-foundation", "core-foundation-sys", "libc", @@ -2049,9 +2070,9 @@ dependencies = [ [[package]] name = "security-framework-sys" -version = "2.10.0" +version = "2.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41f3cc463c0ef97e11c3461a9d3787412d30e8e7eb907c79180c4a57bf7c04ef" +checksum = "49db231d56a190491cb4aeda9527f1ad45345af50b0851622a7adb8c03b01c32" dependencies = [ "core-foundation-sys", "libc", @@ -2059,46 +2080,47 @@ dependencies = [ [[package]] name = "semver" -version = "1.0.23" +version = "1.0.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" +checksum = "f79dfe2d285b0488816f30e700a7438c5a73d816b5b7d3ac72fbc48b0d185e03" [[package]] name = "serde" -version = "1.0.198" +version = "1.0.217" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9846a40c979031340571da2545a4e5b7c4163bdae79b301d5f86d03979451fcc" +checksum = "02fc4265df13d6fa1d00ecff087228cc0a2b5f3c0e87e258d8b94a156e984c70" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.198" +version = "1.0.217" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e88edab869b01783ba905e7d0153f9fc1a6505a96e4ad3018011eedb838566d9" +checksum = "5a9bf7cf98d04a2b28aead066b7496853d4779c9cc183c440dbac457641e19a0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.66", + "syn 2.0.98", ] [[package]] name = "serde_json" -version = "1.0.116" +version = "1.0.138" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e17db7126d17feb94eb3fad46bf1a96b034e8aacbc2e775fe81505f8b0b2813" +checksum = "d434192e7da787e94a6ea7e9670b26a036d0ca41e0b7efb2676dd32bae872949" dependencies = [ "itoa", + "memchr", "ryu", "serde", ] [[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", ] @@ -2127,32 +2149,54 @@ dependencies = [ [[package]] name = "serde_with" -version = "3.11.0" +version = "1.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e28bdad6db2b8340e449f7108f020b3b092e8583a9e3fb82713e1d4e71fe817" +checksum = "678b5a069e50bf00ecd22d0cd8ddf7c236f68581b03db652061ed5eb13a312ff" dependencies = [ - "base64", + "serde", + "serde_with_macros 1.5.2", +] + +[[package]] +name = "serde_with" +version = "3.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6b6f7f2fcb69f747921f79f3926bd1e203fce4fef62c268dd3abfb6d86029aa" +dependencies = [ + "base64 0.22.1", "chrono", "hex", "indexmap 1.9.3", - "indexmap 2.6.0", + "indexmap 2.7.1", "serde", "serde_derive", "serde_json", - "serde_with_macros", + "serde_with_macros 3.12.0", "time", ] [[package]] name = "serde_with_macros" -version = "3.11.0" +version = "1.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d846214a9854ef724f3da161b426242d8de7c1fc7de2f89bb1efcb154dca79d" +checksum = "e182d6ec6f05393cc0e5ed1bf81ad6db3a8feedf8ee515ecdd369809bcce8082" dependencies = [ - "darling", + "darling 0.13.4", "proc-macro2", "quote", - "syn 2.0.66", + "syn 1.0.109", +] + +[[package]] +name = "serde_with_macros" +version = "3.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d00caa5193a3c8362ac2b73be6b9e768aa5a4b2f721d8f4b339600c3cb51f8e" +dependencies = [ + "darling 0.20.10", + "proc-macro2", + "quote", + "syn 2.0.98", ] [[package]] @@ -2161,7 +2205,7 @@ version = "0.9.34+deprecated" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a8b1a1a2ebf674015cc02edccce75287f1a0130d394307b36743c2f5d504b47" dependencies = [ - "indexmap 2.6.0", + "indexmap 2.7.1", "itoa", "ryu", "serde", @@ -2190,7 +2234,7 @@ checksum = "5d69265a08751de7844521fd15003ae0a888e035773ba05695c5c759a6f89eef" dependencies = [ "proc-macro2", "quote", - "syn 2.0.66", + "syn 2.0.98", ] [[package]] @@ -2212,9 +2256,10 @@ checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" [[package]] name = "single_use_seals" -version = "0.11.0-beta.9" +version = "0.12.0-beta.5" dependencies = [ - "amplify_derive", + "serde", + "strict_encoding", ] [[package]] @@ -2228,43 +2273,64 @@ dependencies = [ [[package]] name = "smallvec" -version = "1.13.2" +version = "1.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" +checksum = "7fcf8323ef1faaee30a44a340193b1ac6814fd9b7b4e88e9d4519a3e4abe1cfd" [[package]] name = "socket2" -version = "0.5.6" +version = "0.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05ffd9c0a93b7543e062e759284fcf5f5e3b098501104bfbdde4d404db792871" +checksum = "c970269d99b64e60ec3bd6ad27270092a5394c4e309314b18ae3fe575695fbe8" dependencies = [ "libc", "windows-sys 0.52.0", ] [[package]] -name = "socks" -version = "0.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0c3dbbd9ae980613c6dd8e28a9407b50509d3803b57624d5dfe8315218cd58b" +name = "sonic-api" +version = "0.12.0-beta.5" dependencies = [ - "byteorder", - "libc", - "winapi", + "aluvm", + "amplify", + "baid64", + "chrono", + "commit_verify", + "getrandom 0.2.15", + "serde", + "sonic-callreq", + "strict_encoding", + "strict_types", + "ultrasonic", + "wasm-bindgen", +] + +[[package]] +name = "sonic-callreq" +version = "0.12.0-beta.5" +dependencies = [ + "amplify", + "baid64", + "chrono", + "fluent-uri", + "indexmap 2.7.1", + "serde", + "strict_encoding", + "strict_types", + "ultrasonic", ] [[package]] -name = "spin" -version = "0.9.8" +name = "stable_deref_trait" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" +checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" [[package]] name = "strict_encoding" -version = "2.7.0" +version = "2.8.1" dependencies = [ "amplify", - "half", "serde", "strict_encoding_derive", "wasm-bindgen", @@ -2272,10 +2338,10 @@ dependencies = [ [[package]] name = "strict_encoding_derive" -version = "2.7.0" +version = "2.8.1" dependencies = [ "amplify_syn", - "heck 0.5.0", + "heck", "proc-macro2", "quote", "syn 1.0.109", @@ -2283,13 +2349,11 @@ dependencies = [ [[package]] name = "strict_types" -version = "2.7.2" +version = "2.8.2" dependencies = [ "amplify", - "ascii-armor", "baid64", - "half", - "indexmap 2.6.0", + "indexmap 2.7.1", "serde", "serde_json", "serde_yaml", @@ -2316,33 +2380,39 @@ version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" +[[package]] +name = "strsim" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" + [[package]] name = "strum" -version = "0.26.2" +version = "0.26.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d8cec3501a5194c432b2b7976db6b7d10ec95c253208b45f83f7136aa985e29" +checksum = "8fec0f0aef304996cf250b31b5a10dee7980c85da9d759361292b8bca5a18f06" dependencies = [ "strum_macros", ] [[package]] name = "strum_macros" -version = "0.26.2" +version = "0.26.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6cf59daf282c0a494ba14fd21610a0325f9f90ec9d1231dea26bcb1d696c946" +checksum = "4c6bee85a5a24955dc440386795aa378cd9cf82acd5f764469152d2270e581be" dependencies = [ - "heck 0.4.1", + "heck", "proc-macro2", "quote", "rustversion", - "syn 2.0.66", + "syn 2.0.98", ] [[package]] name = "subtle" -version = "2.5.0" +version = "2.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" [[package]] name = "syn" @@ -2357,9 +2427,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.66" +version = "2.0.98" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c42f3f41a2de00b01c0aaad383c5a45241efc8b2d1eda5661812fda5f3cdcff5" +checksum = "36147f1a48ae0ec2b5b3bc5b537d267457555a10dc06f3dbc8cb11ba3006d3b1" dependencies = [ "proc-macro2", "quote", @@ -2368,50 +2438,63 @@ dependencies = [ [[package]] name = "sync_wrapper" -version = "1.0.1" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7065abeca94b6a8a577f9bd45aa0867a2238b74e8eb67cf10d492bc39351394" +checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" dependencies = [ "futures-core", ] +[[package]] +name = "synstructure" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.98", +] + [[package]] name = "tempfile" -version = "3.10.1" +version = "3.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85b77fafb263dd9d05cbeac119526425676db3784113aa9295c88498cbf8bff1" +checksum = "38c246215d7d24f48ae091a2902398798e05d978b24315d6efbc00ede9a8bb91" dependencies = [ "cfg-if", "fastrand", + "getrandom 0.3.1", + "once_cell", "rustix", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] name = "thiserror" -version = "1.0.59" +version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0126ad08bff79f29fc3ae6a55cc72352056dfff61e3ff8bb7129476d44b23aa" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.59" +version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1cd413b5d558b4c5bf3680e324a6fa5014e7b7c067a51e69dbdf47eb7148b66" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.66", + "syn 2.0.98", ] [[package]] name = "time" -version = "0.3.36" +version = "0.3.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5dfd88e563464686c916c7e46e623e520ddc6d79fa6641390f2e3fa86e83e885" +checksum = "35e7868883861bd0e56d9ac6efcaaca0d6d5d82a2a7ec8209ff492c07cf37b21" dependencies = [ "deranged", "itoa", @@ -2430,34 +2513,29 @@ checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" [[package]] name = "time-macros" -version = "0.2.18" +version = "0.2.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f252a68540fde3a3877aeea552b832b40ab9a69e318efd078774a01ddee1ccf" +checksum = "2834e6017e3e5e4b9834939793b282bc03b37a3336245fa820e35e233e2a85de" dependencies = [ "num-conv", "time-core", ] [[package]] -name = "tinyvec" -version = "1.6.0" +name = "tinystr" +version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" +checksum = "9117f5d4db391c1cf6927e7bea3db74b9a1c1add8f7eda9ffd5364f40f57b82f" dependencies = [ - "tinyvec_macros", + "displaydoc", + "zerovec", ] -[[package]] -name = "tinyvec_macros" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" - [[package]] name = "tokio" -version = "1.37.0" +version = "1.43.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1adbebffeca75fcfd058afa480fb6c0b81e165a0323f9c9d39c9697e37c46787" +checksum = "3d61fa4ffa3de412bfea335c6ecff681de2b609ba3c77ef3e00e521813a9ed9e" dependencies = [ "backtrace", "bytes", @@ -2465,7 +2543,7 @@ dependencies = [ "mio", "pin-project-lite", "socket2", - "windows-sys 0.48.0", + "windows-sys 0.52.0", ] [[package]] @@ -2492,9 +2570,9 @@ dependencies = [ [[package]] name = "toml" -version = "0.8.19" +version = "0.8.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1ed1f98e3fdc28d6d910e6737ae6ab1a93bf1985935a1193e68f93eeb68d24e" +checksum = "cd87a5cdd6ffab733b2f74bc4fd7ee5fff6634124999ac278c35fc78c6120148" dependencies = [ "serde", "serde_spanned", @@ -2513,11 +2591,11 @@ dependencies = [ [[package]] name = "toml_edit" -version = "0.22.20" +version = "0.22.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "583c44c02ad26b0c3f3066fe629275e50627026c51ac2e595cca4c230ce1ce1d" +checksum = "17b4795ff5edd201c7cd6dca065ae59972ce77d1b80fa0a84d94950ece7d1474" dependencies = [ - "indexmap 2.6.0", + "indexmap 2.7.1", "serde", "serde_spanned", "toml_datetime", @@ -2526,14 +2604,14 @@ dependencies = [ [[package]] name = "tower" -version = "0.4.13" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" +checksum = "d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9" dependencies = [ "futures-core", "futures-util", - "pin-project", "pin-project-lite", + "sync_wrapper", "tokio", "tower-layer", "tower-service", @@ -2541,21 +2619,21 @@ dependencies = [ [[package]] name = "tower-layer" -version = "0.3.2" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c20c8dbed6283a09604c3e69b4b7eeb54e298b8a600d4d5ecb5ad39de609f1d0" +checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" [[package]] name = "tower-service" -version = "0.3.2" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" +checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" [[package]] name = "tracing" -version = "0.1.40" +version = "0.1.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" +checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" dependencies = [ "pin-project-lite", "tracing-core", @@ -2563,9 +2641,9 @@ dependencies = [ [[package]] name = "tracing-core" -version = "0.1.32" +version = "0.1.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" +checksum = "e672c95779cf947c5311f83787af4fa8fffd12fb27e4993211a84bdfd9610f9c" dependencies = [ "once_cell", ] @@ -2583,25 +2661,24 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" [[package]] -name = "unicode-bidi" -version = "0.3.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08f95100a766bf4f8f28f90d77e0a5461bbdb219042e7679bebe79004fed8d75" +name = "ultrasonic" +version = "0.12.0-beta.5" +dependencies = [ + "amplify", + "baid64", + "commit_verify", + "getrandom 0.2.15", + "serde", + "strict_encoding", + "wasm-bindgen", + "zk-aluvm", +] [[package]] name = "unicode-ident" -version = "1.0.12" +version = "1.0.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" - -[[package]] -name = "unicode-normalization" -version = "0.1.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a56d1686db2308d901306f92a263857ef59ea39678a5458e7cb17f01415101f5" -dependencies = [ - "tinyvec", -] +checksum = "a210d160f08b701c8721ba1c726c11662f877ea6b7094007e1ca9a1041945034" [[package]] name = "unsafe-libyaml" @@ -2615,36 +2692,29 @@ version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" -[[package]] -name = "ureq" -version = "2.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b74fc6b57825be3373f7054754755f03ac3a8f5d70015ccad699ba2029956f4a" -dependencies = [ - "base64", - "flate2", - "log", - "once_cell", - "rustls", - "rustls-pki-types", - "serde", - "serde_json", - "socks", - "url", - "webpki-roots", -] - [[package]] name = "url" -version = "2.5.0" +version = "2.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31e6302e3bb753d46e83516cae55ae196fc0c309407cf11ab35cc51a4c2a4633" +checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" dependencies = [ "form_urlencoded", "idna", "percent-encoding", ] +[[package]] +name = "utf16_iter" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8232dd3cdaed5356e0f716d285e4b40b932ac434100fe9b7e0e8e935b9e6246" + +[[package]] +name = "utf8_iter" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" + [[package]] name = "vcpkg" version = "0.2.15" @@ -2653,13 +2723,15 @@ checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" [[package]] name = "version_check" -version = "0.9.4" +version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" [[package]] name = "vesper-lang" -version = "0.1.0" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd2b7e3e27aeb0524204e58042f6e4531a720745d1b1a3978d3a084f1885f63d" dependencies = [ "amplify", "strict_encoding", @@ -2680,48 +2752,59 @@ version = "0.11.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" +[[package]] +name = "wasi" +version = "0.13.3+wasi-0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26816d2e1a4a36a2940b96c5296ce403917633dff8f3440e9b236ed6f6bacad2" +dependencies = [ + "wit-bindgen-rt", +] + [[package]] name = "wasm-bindgen" -version = "0.2.92" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4be2531df63900aeb2bca0daaaddec08491ee64ceecbee5076636a3b026795a8" +checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" dependencies = [ "cfg-if", + "once_cell", + "rustversion", "wasm-bindgen-macro", ] [[package]] name = "wasm-bindgen-backend" -version = "0.2.92" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "614d787b966d3989fa7bb98a654e369c762374fd3213d212cfc0251257e747da" +checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" dependencies = [ "bumpalo", "log", - "once_cell", "proc-macro2", "quote", - "syn 2.0.66", + "syn 2.0.98", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-futures" -version = "0.4.42" +version = "0.4.50" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76bc14366121efc8dbb487ab05bcc9d346b3b5ec0eaa76e46594cabbe51762c0" +checksum = "555d470ec0bc3bb57890405e5d4322cc9ea83cebb085523ced7be4144dac1e61" dependencies = [ "cfg-if", "js-sys", + "once_cell", "wasm-bindgen", "web-sys", ] [[package]] name = "wasm-bindgen-macro" -version = "0.2.92" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1f8823de937b71b9460c0c34e25f3da88250760bec0ebac694b49997550d726" +checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -2729,28 +2812,31 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.92" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" +checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" dependencies = [ "proc-macro2", "quote", - "syn 2.0.66", + "syn 2.0.98", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.92" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af190c94f2773fdb3729c55b007a722abb5384da03bc0986df4c289bf5567e96" +checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" +dependencies = [ + "unicode-ident", +] [[package]] name = "web-sys" -version = "0.3.69" +version = "0.3.77" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77afa9a11836342370f4817622a2f0f418b134426d91a82dfb48f532d2ec13ef" +checksum = "33b6dd2ef9186f1f2072e409e99cd22a975331a6b3591b12c764e0e55c60d5d2" dependencies = [ "js-sys", "wasm-bindgen", @@ -2758,9 +2844,9 @@ dependencies = [ [[package]] name = "webpki-roots" -version = "0.26.1" +version = "0.26.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3de34ae270483955a94f4b21bdaaeb83d508bb84a01435f393818edb0012009" +checksum = "2210b291f7ea53617fbafcc4939f10914214ec15aace5ba62293a668f322c5c9" dependencies = [ "rustls-pki-types", ] @@ -2805,7 +2891,7 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" dependencies = [ - "windows-targets 0.52.6", + "windows-targets", ] [[package]] @@ -2816,7 +2902,7 @@ checksum = "e400001bb720a623c1c69032f8e3e4cf09984deec740f007dd2b03ec864804b0" dependencies = [ "windows-result", "windows-strings", - "windows-targets 0.52.6", + "windows-targets", ] [[package]] @@ -2825,7 +2911,7 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1d1043d8214f791817bab27572aaa8af63732e11bf84aa21a45a78d6c317ae0e" dependencies = [ - "windows-targets 0.52.6", + "windows-targets", ] [[package]] @@ -2835,16 +2921,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4cd9b125c486025df0eabcb585e62173c6c9eddcec5d117d3b6e8c30e2ee4d10" dependencies = [ "windows-result", - "windows-targets 0.52.6", -] - -[[package]] -name = "windows-sys" -version = "0.48.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" -dependencies = [ - "windows-targets 0.48.5", + "windows-targets", ] [[package]] @@ -2853,22 +2930,16 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" dependencies = [ - "windows-targets 0.52.6", + "windows-targets", ] [[package]] -name = "windows-targets" -version = "0.48.5" +name = "windows-sys" +version = "0.59.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" dependencies = [ - "windows_aarch64_gnullvm 0.48.5", - "windows_aarch64_msvc 0.48.5", - "windows_i686_gnu 0.48.5", - "windows_i686_msvc 0.48.5", - "windows_x86_64_gnu 0.48.5", - "windows_x86_64_gnullvm 0.48.5", - "windows_x86_64_msvc 0.48.5", + "windows-targets", ] [[package]] @@ -2877,46 +2948,28 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" dependencies = [ - "windows_aarch64_gnullvm 0.52.6", - "windows_aarch64_msvc 0.52.6", - "windows_i686_gnu 0.52.6", + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", "windows_i686_gnullvm", - "windows_i686_msvc 0.52.6", - "windows_x86_64_gnu 0.52.6", - "windows_x86_64_gnullvm 0.52.6", - "windows_x86_64_msvc 0.52.6", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", ] -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" - [[package]] name = "windows_aarch64_gnullvm" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" -[[package]] -name = "windows_aarch64_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" - [[package]] name = "windows_aarch64_msvc" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" -[[package]] -name = "windows_i686_gnu" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" - [[package]] name = "windows_i686_gnu" version = "0.52.6" @@ -2931,77 +2984,160 @@ checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" [[package]] name = "windows_i686_msvc" -version = "0.48.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" [[package]] -name = "windows_i686_msvc" +name = "windows_x86_64_gnu" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" [[package]] -name = "windows_x86_64_gnu" -version = "0.48.5" +name = "windows_x86_64_gnullvm" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" [[package]] -name = "windows_x86_64_gnu" +name = "windows_x86_64_msvc" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" [[package]] -name = "windows_x86_64_gnullvm" -version = "0.48.5" +name = "winnow" +version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" +checksum = "59690dea168f2198d1a3b0cac23b8063efcd11012f10ae4698f284808c8ef603" +dependencies = [ + "memchr", +] [[package]] -name = "windows_x86_64_gnullvm" -version = "0.52.6" +name = "wit-bindgen-rt" +version = "0.33.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" +checksum = "3268f3d866458b787f390cf61f4bbb563b922d091359f9608842999eaee3943c" +dependencies = [ + "bitflags", +] [[package]] -name = "windows_x86_64_msvc" -version = "0.48.5" +name = "write16" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" +checksum = "d1890f4022759daae28ed4fe62859b1236caebfc61ede2f63ed4e695f3f6d936" [[package]] -name = "windows_x86_64_msvc" -version = "0.52.6" +name = "writeable" +version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" +checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" [[package]] -name = "winnow" -version = "0.6.18" +name = "yoke" +version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68a9bda4691f099d435ad181000724da8e5899daa10713c2d432552b9ccd3a6f" +checksum = "120e6aef9aa629e3d4f52dc8cc43a015c7724194c97dfaf45180d2daf2b77f40" dependencies = [ - "memchr", + "serde", + "stable_deref_trait", + "yoke-derive", + "zerofrom", +] + +[[package]] +name = "yoke-derive" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.98", + "synstructure", +] + +[[package]] +name = "zerocopy" +version = "0.7.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" +dependencies = [ + "byteorder", + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.7.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.98", +] + +[[package]] +name = "zerofrom" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cff3ee08c995dee1859d998dea82f7374f2826091dd9cd47def953cae446cd2e" +dependencies = [ + "zerofrom-derive", +] + +[[package]] +name = "zerofrom-derive" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "595eed982f7d355beb85837f651fa22e90b3c044842dc7f2c2842c086f295808" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.98", + "synstructure", ] [[package]] name = "zeroize" -version = "1.8.0" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" + +[[package]] +name = "zerovec" +version = "0.10.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "63381fa6624bf92130a6b87c0d07380116f80b565c42cf0d754136f0238359ef" +checksum = "aa2b893d79df23bfb12d5461018d408ea19dfafe76c2c7ef6d4eba614f8ff079" dependencies = [ - "zeroize_derive", + "yoke", + "zerofrom", + "zerovec-derive", ] [[package]] -name = "zeroize_derive" -version = "1.4.2" +name = "zerovec-derive" +version = "0.10.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" +checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.66", + "syn 2.0.98", +] + +[[package]] +name = "zk-aluvm" +version = "0.12.0-beta.5" +dependencies = [ + "aluvm", + "amplify", + "getrandom 0.2.15", + "serde", + "strict_encoding", + "wasm-bindgen", ] diff --git a/Cargo.toml b/Cargo.toml index 7140ef0..25bfa3e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -14,7 +14,6 @@ license = "Apache-2.0" description = "RGB tests" [dependencies] -bitcoin_hashes = "0.14.0" file-format = { version = "0.25.0", features = ["reader"] } once_cell = "1.19.0" rand = "0.8.5" @@ -46,16 +45,12 @@ bp-wallet = { path = "./bp-wallet", features = [ ] } ## rgb rgb-runtime = { path = "./rgb", features = [ - "electrum_blocking", - "esplora_blocking", + # "electrum_blocking", + # "esplora_blocking", "fs", "serde", ] } -rgb-psbt = { path = "./rgb/psbt" } -## rgb-interfaces -rgb-interfaces = { path = "./rgb-interfaces" } -## rgb-schemata -rgb-schemata = { path = "./rgb-schemata" } +rgb-psbt = { path = "./rgb/psbt", features = ["bp"] } ## rgb-std rgb-std = { path = "./rgb-std", features = ["fs"] } ## rust-amplify @@ -67,16 +62,15 @@ strict_types = { path = "./strict-types" } [patch.crates-io] # patching all RGB-related deps, to measure code coverage +## rust-amplify +amplify = { path = "./rust-amplify" } ## amplify-derive amplify_derive = { path = "./amplify-derive" } amplify_syn = { path = "./amplify-derive/syn" } ## amplify-nonasync nonasync = { path = "./amplify-nonasync" } ## amplify-num -amplify_apfloat = { path = "./amplify-num/apfloat" } amplify_num = { path = "./amplify-num/num" } -## ascii-armor -ascii-armor = { path = "./ascii-armor" } ## baid64 baid64 = { path = "./rust-baid64" } ## bp-core @@ -105,21 +99,19 @@ rgb-runtime = { path = "./rgb" } rgb-psbt = { path = "./rgb/psbt" } ## rgb-core rgb-core = { path = "./rgb-core" } -## rgb-interfaces -rgb-interfaces = { path = "./rgb-interfaces" } -## rgb-schemata -rgb-schemata = { path = "./rgb-schemata" } ## rgb-std rgb-std = { path = "./rgb-std" } rgb-invoice = { path = "./rgb-std/invoice" } ## rust-aluvm -aluvm = { path = "./rust-aluvm" } -## rust-amplify -amplify = { path = "./rust-amplify" } +aluvm = { path = "./aluvm" } +zk-aluvm = { path = "./zk-aluvm" } +## SONIC +ultrasonic = { path = "./ultrasonic" } +hypersonic = { path = "./sonic" } +sonic-api = { path = "./sonic/api" } +sonic-callreq = { path = "./sonic/callreq" } ## strict-encoding strict_encoding = { path = "./strict-encoding/rust" } strict_encoding_derive = { path = "./strict-encoding/rust/derive" } ## strict-types strict_types = { path = "./strict-types" } -## vesper -vesper-lang = { path = "./vesper" } diff --git a/aluvm b/aluvm new file mode 160000 index 0000000..0a59555 --- /dev/null +++ b/aluvm @@ -0,0 +1 @@ +Subproject commit 0a5955595de41b58e390b8d3028bd49e091a410d diff --git a/amplify-nonasync b/amplify-nonasync index 1a5ecbf..9f4f586 160000 --- a/amplify-nonasync +++ b/amplify-nonasync @@ -1 +1 @@ -Subproject commit 1a5ecbf8d9eb8616cf0c091ceee6ff2fcc941780 +Subproject commit 9f4f5861d0fe314c2928a3e0f516f69c7377c2d3 diff --git a/amplify-num b/amplify-num index be035c1..98cda24 160000 --- a/amplify-num +++ b/amplify-num @@ -1 +1 @@ -Subproject commit be035c1ed260313217bd799bd47cbc9bdfdf27ec +Subproject commit 98cda24f2ed2d19ffaba743f59f9ad34464bb492 diff --git a/ascii-armor b/ascii-armor deleted file mode 160000 index 3d8b4cb..0000000 --- a/ascii-armor +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 3d8b4cb5a20c6ec5ec41fae4d88f3f0004917072 diff --git a/bp-core b/bp-core index a928721..f26f459 160000 --- a/bp-core +++ b/bp-core @@ -1 +1 @@ -Subproject commit a9287214102c70be45f05dec1aba3decb62d3173 +Subproject commit f26f45921fdf6083e09620dc05b6e990dc639c42 diff --git a/bp-electrum-client b/bp-electrum-client index a660268..c820723 160000 --- a/bp-electrum-client +++ b/bp-electrum-client @@ -1 +1 @@ -Subproject commit a66026874b948479b14aa5f01629c677ae005abc +Subproject commit c820723a453c40c50db876cd9b6db1897e0e94b6 diff --git a/bp-esplora-client b/bp-esplora-client index 87e487e..a205ade 160000 --- a/bp-esplora-client +++ b/bp-esplora-client @@ -1 +1 @@ -Subproject commit 87e487e1aa8547833253f951929769a646e9387f +Subproject commit a205adef04e6a0a7094a6e395f5a65bb857d9f2d diff --git a/bp-std b/bp-std index f81848a..1e8eb90 160000 --- a/bp-std +++ b/bp-std @@ -1 +1 @@ -Subproject commit f81848a0751e073c92881c2d6c9c06c87e7a58bd +Subproject commit 1e8eb9008221e429e67f1caa6ffe9ffb54bde5e4 diff --git a/bp-wallet b/bp-wallet index 429c853..54102a7 160000 --- a/bp-wallet +++ b/bp-wallet @@ -1 +1 @@ -Subproject commit 429c853ad424d0d4e08b6b496b35fe8a4b64a321 +Subproject commit 54102a7413da2227bcbb049998b5cbefc894ca02 diff --git a/client_side_validation b/client_side_validation index 7215fb5..76b3cde 160000 --- a/client_side_validation +++ b/client_side_validation @@ -1 +1 @@ -Subproject commit 7215fb50a7ef56f090a051dffe23a3c318bb8351 +Subproject commit 76b3cdec2f82b5c9cbed32a9b80124b8602f397e diff --git a/rgb b/rgb index 55a814a..5bd42bf 160000 --- a/rgb +++ b/rgb @@ -1 +1 @@ -Subproject commit 55a814a6ff37677934e764790e4e0b31a5d0f18b +Subproject commit 5bd42bfefd2614b353505baaf95041640ac2ff82 diff --git a/rgb-core b/rgb-core index 52592c6..6603689 160000 --- a/rgb-core +++ b/rgb-core @@ -1 +1 @@ -Subproject commit 52592c62f9f0ba32b3deab69725f2fd6cd6784c4 +Subproject commit 66036890a42604014e4388538eef943283171581 diff --git a/rgb-interfaces b/rgb-interfaces deleted file mode 160000 index 70b5528..0000000 --- a/rgb-interfaces +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 70b5528cb2b93dae57796373fd9ef81506cae352 diff --git a/rgb-schemata b/rgb-schemata deleted file mode 160000 index 7a66a9b..0000000 --- a/rgb-schemata +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 7a66a9b02a3a36d3f121cbc5833fe876caf9f1f2 diff --git a/rgb-std b/rgb-std index b374468..088f179 160000 --- a/rgb-std +++ b/rgb-std @@ -1 +1 @@ -Subproject commit b3744689e7ff2603b7093afdea09db50d032c5ca +Subproject commit 088f1795df9a3d3c905b6628cea7e5c31988ae4e diff --git a/rust-aluvm b/rust-aluvm deleted file mode 160000 index b671b88..0000000 --- a/rust-aluvm +++ /dev/null @@ -1 +0,0 @@ -Subproject commit b671b8803c0b843881c017c759d7c0dc1ef816ea diff --git a/rust-amplify b/rust-amplify index d01b9f5..cc510c3 160000 --- a/rust-amplify +++ b/rust-amplify @@ -1 +1 @@ -Subproject commit d01b9f52c23e839c6620f68d1bf9099152178f6d +Subproject commit cc510c350e2fcc2d1f7bf7de47a59e7f4a7520a2 diff --git a/rust-baid64 b/rust-baid64 index 983854a..7e6a7c3 160000 --- a/rust-baid64 +++ b/rust-baid64 @@ -1 +1 @@ -Subproject commit 983854a1b9be7c2cd7d98b00ab4df3e633be393a +Subproject commit 7e6a7c36013b30df597c85e6c3f3464d928e4563 diff --git a/sonic b/sonic new file mode 160000 index 0000000..4af3e1b --- /dev/null +++ b/sonic @@ -0,0 +1 @@ +Subproject commit 4af3e1bcbe3aed862ce9e422f373650f3c817930 diff --git a/strict-encoding b/strict-encoding index b11845c..f7be0a7 160000 --- a/strict-encoding +++ b/strict-encoding @@ -1 +1 @@ -Subproject commit b11845c2d811d87c69a597b6602914141ca31227 +Subproject commit f7be0a7a046fe97289bda5f0b13bd57d7108b61e diff --git a/strict-types b/strict-types index b353f5d..302acf4 160000 --- a/strict-types +++ b/strict-types @@ -1 +1 @@ -Subproject commit b353f5dbc0076dae918ac14175d347a3cc1aad0c +Subproject commit 302acf4b1c4a5b128e9af6a3433c94a1b0774073 diff --git a/tests/.gitignore b/tests/.gitignore new file mode 100644 index 0000000..d53c04e --- /dev/null +++ b/tests/.gitignore @@ -0,0 +1 @@ +/test-data diff --git a/tests/fixtures/CollectibleFungibleAsset.issuer b/tests/fixtures/CollectibleFungibleAsset.issuer new file mode 100644 index 0000000..1e6789e Binary files /dev/null and b/tests/fixtures/CollectibleFungibleAsset.issuer differ diff --git a/tests/fixtures/NonInflatableAsset.issuer b/tests/fixtures/NonInflatableAsset.issuer new file mode 100644 index 0000000..824809f Binary files /dev/null and b/tests/fixtures/NonInflatableAsset.issuer differ diff --git a/tests/fixtures/attack_bundles_pubWitness_data_input_sequence.yaml b/tests/fixtures/attack_bundles_pubWitness_data_input_sequence.yaml deleted file mode 100644 index e47d027..0000000 --- a/tests/fixtures/attack_bundles_pubWitness_data_input_sequence.yaml +++ /dev/null @@ -1,1138 +0,0 @@ -version: v2 -transfer: true -terminals: - 3bb2645029b3de98be6c3ed5ce3332b8591f59c693146a007b75db5cfdb7c7b8: - chain: bitcoin - data: e1c963ea4a2d4e21f870c713a76d0397a0cc197aece1f53a66ae9febf122bb50 -genesis: - ffv: 0 - schemaId: rgb:sch:RDYhMTR!9gv8Y2GLv9UNBEK1hcrCmdLDFk9Qd5fnO8k#brave-dinner-banana - flags: null - timestamp: 1728925859 - issuer: ssi:anonymous - testnet: true - altLayers1: [] - assetTags: - 4000: 603a2b302aac8d1cd7c8adc3acd72f31ce652128f96218fa5b519fd5e9930f6d - metadata: {} - globals: - 2000: - - 074e494154434b520e4e4941206173736574206e616d650002 - 2001: - - 09004e4941207465726d7300 - 2010: - - 9a02000000000000 - assignments: - 4000: - type: fungible - items: - - seal: - chain: bitcoin - data: - method: opretFirst - txid: 22f0538e189f32922e55daf6fa0b7120bc01de8520a9a4c80655fdaf70272ac0 - vout: 1 - blinding: 7704601239148887312 - state: - value: 666 - blinding: 7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e - tag: 603a2b302aac8d1cd7c8adc3acd72f31ce652128f96218fa5b519fd5e9930f6d - lock: null - valencies: [] - validator: null -extensions: [] -bundles: -- pubWitness: - chain: bitcoin - data: !tx - version: 2 - inputs: - - prevOutput: a5c3085efe8dfdba0fa0e11d81bf90cdcac27c0af496c4de1a2fd9659948ffce:0 - sigScript: '' - sequence: 1 - witness: [] - outputs: - - value: 99999200 - scriptPubkey: 001430d944c2d49db5c315c49e13aab8cad8b9415cac - - value: 0 - scriptPubkey: 6a20669e87f4fe2acf39e58ef94c4a2f81791b7848acac344cd8a2e562f4777acc7f - lockTime: 0 - anchoredBundles: !opret - mpcProof: - pos: 1 - cofactor: 1 - path: - - 0d4042fb3c309aa40bff3159cee3a0ca87c4efc804a5347aa1a363d7244a88f7 - - e56d0e3dbadefb489899917dbc2e1dbf0c49c3ff155e178ef52feab2f351fc7c - - 4edc7f8808488b46c10bedf910818a9afbe2512c1f08a436a7b3db244f22ac85 - dbcProof: null - bundle: - closeMethod: opretFirst - inputMap: - 0: 9b50df314989fe006013a96d2ded4b508e5f32ef2b29e7245abfb3d9a35888e3 - knownTransitions: - 9b50df314989fe006013a96d2ded4b508e5f32ef2b29e7245abfb3d9a35888e3: - ffv: 0 - contractId: rgb:JgunSMvZ-VCH4cfz-qW1qNyp-VO2a9f7-UYT3vN1-mjO$Ebg - nonce: 18446744073709551615 - transitionType: 10000 - metadata: {} - globals: {} - inputs: - - prevOut: - op: fb58c747eec9c44a05ec907ec9d14e0e72572f75db0a3f9aa47f0673702e760e - ty: 4000 - no: 0 - assignments: - 4000: - type: fungible - items: - - seal: - chain: bitcoin - data: - method: opretFirst - txid: null - vout: 0 - blinding: 10251942175724995735 - state: - value: 616 - blinding: 361c123b494b218e332794a2390dc6d5cc7c332f64cf8764b6dfb3e04e56c9fc - tag: 603a2b302aac8d1cd7c8adc3acd72f31ce652128f96218fa5b519fd5e9930f6d - lock: null - - seal: - chain: bitcoin - data: 108b3912eb0b836427f235bafe449f3153c2aae08887b948a3d8529f17b19b95 - state: - value: 50 - blinding: 48626c4335335cf04b56e9dc4570b7a8b2024b4f19aef719c79eca9e3027b482 - tag: 603a2b302aac8d1cd7c8adc3acd72f31ce652128f96218fa5b519fd5e9930f6d - lock: null - valencies: [] - validator: null - witness: null -- pubWitness: - chain: bitcoin - data: !tx - version: 2 - inputs: - - prevOutput: 22f0538e189f32922e55daf6fa0b7120bc01de8520a9a4c80655fdaf70272ac0:1 - sigScript: '' - sequence: 0 - witness: [] - outputs: - - value: 99999600 - scriptPubkey: 00141d66111f9daca8769c3ab2b0fe14354b6198b29c - - value: 0 - scriptPubkey: 6a20a02ab7dd75b9911b540419440ebe8f5be0742f76fd9fdaf5e69ebb30f38d3f11 - lockTime: 0 - anchoredBundles: !opret - mpcProof: - pos: 1 - cofactor: 1 - path: - - 0ae6caac7df078206a7af28b0a885098f743d49b92cdb3485558b804492a5be5 - - 843d661f6822486889697a7446a6a9bd1e123921c6dafdde687140cf863a9403 - - 040c8d2b550cc8f3bd210535dbf482f91e7fe62989168c1ed87eebf2b4f35be3 - dbcProof: null - bundle: - closeMethod: opretFirst - inputMap: - 0: fb58c747eec9c44a05ec907ec9d14e0e72572f75db0a3f9aa47f0673702e760e - knownTransitions: - fb58c747eec9c44a05ec907ec9d14e0e72572f75db0a3f9aa47f0673702e760e: - ffv: 0 - contractId: rgb:JgunSMvZ-VCH4cfz-qW1qNyp-VO2a9f7-UYT3vN1-mjO$Ebg - nonce: 18446744073709551615 - transitionType: 65535 - metadata: {} - globals: {} - inputs: - - prevOut: - op: 260ba748cbd95421f871fcea5b5a8dca954ed9af5fed4613def3759a33bf11b8 - ty: 4000 - no: 0 - assignments: - 4000: - type: fungible - items: - - seal: - chain: bitcoin - data: - method: opretFirst - txid: null - vout: 0 - blinding: 7687739675014878388 - state: - value: 666 - blinding: 7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e - tag: 603a2b302aac8d1cd7c8adc3acd72f31ce652128f96218fa5b519fd5e9930f6d - lock: null - valencies: [] - validator: null - witness: null -- pubWitness: - chain: bitcoin - data: !tx - version: 2 - inputs: - - prevOutput: d077ea7e3a55a215893a18e82cb03fda0f50619893e4aee0ba70b014e6d63248:0 - sigScript: '' - sequence: 0 - witness: [] - outputs: - - value: 99998800 - scriptPubkey: 00146ab6fe162c087a01a717d2b6d4bbef87829cec24 - - value: 0 - scriptPubkey: 6a2088b706bf16e225b5d438f48c8c1abc544e807bb7fb99e6fc8ca460d4de62d1b0 - lockTime: 0 - anchoredBundles: !opret - mpcProof: - pos: 1 - cofactor: 1 - path: - - 91246094600e4cae70d42147330754f25ef710118c7bc3aa963b1a8900125b83 - - 58bb69c807310413032dd30a245738b48f1a5cb8645f55b8f089489ae16b0533 - - 500d82630b8bb4a1bcb8973500acae7114dc0d5ef77b748a60b4d93aa9375ca1 - dbcProof: null - bundle: - closeMethod: opretFirst - inputMap: - 0: c04da8609a2a8ddf7e0e9847f4ebd6758b1091bceeda10094b24352c97840ea2 - knownTransitions: - c04da8609a2a8ddf7e0e9847f4ebd6758b1091bceeda10094b24352c97840ea2: - ffv: 0 - contractId: rgb:JgunSMvZ-VCH4cfz-qW1qNyp-VO2a9f7-UYT3vN1-mjO$Ebg - nonce: 18446744073709551615 - transitionType: 10000 - metadata: {} - globals: {} - inputs: - - prevOut: - op: 9b50df314989fe006013a96d2ded4b508e5f32ef2b29e7245abfb3d9a35888e3 - ty: 4000 - no: 0 - assignments: - 4000: - type: fungible - items: - - seal: - chain: bitcoin - data: - method: opretFirst - txid: null - vout: 0 - blinding: 9888072140771099372 - state: - value: 539 - blinding: ae89403cecbdb782ddba50b592d9590bb664bb3d4dc9f7772f7c6611f4755345 - tag: 603a2b302aac8d1cd7c8adc3acd72f31ce652128f96218fa5b519fd5e9930f6d - lock: null - - seal: - chain: bitcoin - data: e1c963ea4a2d4e21f870c713a76d0397a0cc197aece1f53a66ae9febf122bb50 - state: - value: 77 - blinding: 8792d1fe5c8d6a0b556d43eca6346dc8d0c654d8c64e30294735ac5b2a17b7f8 - tag: 603a2b302aac8d1cd7c8adc3acd72f31ce652128f96218fa5b519fd5e9930f6d - lock: null - valencies: [] - validator: null - witness: null -schema: - ffv: 0 - flags: null - name: NonInflatableAsset - timestamp: 1713343888 - developer: ssi:LZS1ux-gjD9nXPF-OcetUUkW-6r3uSCS6-aQhs9W5f-8JE7w - metaTypes: {} - globalTypes: - 2000: - reserved: null - semId: d7fcbee31ef0a85d5f973bda1b0b8c9e7efbcbc5572577382cacd3bdb4218a01 - maxItems: 1 - 2001: - reserved: null - semId: 5b8bc7543832054a1d22be94226be7538b133a26881cba4613027878e05c6cf7 - maxItems: 1 - 2010: - reserved: null - semId: 888c5865633af13b95b7cd1a8d8af2dac1dc140b977251d9d4daf3c7511c8e84 - maxItems: 1 - ownedTypes: - 4000: !fungible unsigned64Bit - valencyTypes: [] - genesis: - metadata: [] - globals: - 2000: once - 2001: once - 2010: once - assignments: - 4000: onceOrMore - valencies: [] - validator: - lib: abf099d28bed50df5e065715327f3a9b329f777cb0b9fefff634c193a03cb626 - pos: 9 - extensions: {} - transitions: - 10000: - metadata: [] - globals: {} - inputs: - 4000: onceOrMore - assignments: - 4000: onceOrMore - valencies: [] - validator: - lib: abf099d28bed50df5e065715327f3a9b329f777cb0b9fefff634c193a03cb626 - pos: 0 - reserved: null -ifaces: - ? version: v1 - name: RGB20Fixed - inherits: - - rgb:ifc:Vk9c4$Ny-Fv0J6tg-pDF05CE-312oCWh-fENNuia-GYbEu18#adios-alert-never - - rgb:ifc:13N6PRwT-T68!FGY-lBwX2cm-qesgJ11-j0nQkM1-WSCJFj4#ariel-gizmo-evita - - rgb:ifc:naFrAfgG-Kfu$A!c-3L!bC$4-s1LWJQV-4Iv!62u-4B3ab8Y#mailbox-dialog-iron - - rgb:ifc:w3Lk9Mt3-gKt$n5y-TYpVGg0-IDpK0p9-sHQ!hb6-m2Qr3a0#unicorn-reward-ladder - timestamp: 1711405444 - metadata: {} - globalState: - issuedSupply: - semId: 888c5865633af13b95b7cd1a8d8af2dac1dc140b977251d9d4daf3c7511c8e84 - required: true - multiple: false - spec: - semId: d7fcbee31ef0a85d5f973bda1b0b8c9e7efbcbc5572577382cacd3bdb4218a01 - required: true - multiple: false - terms: - semId: 5b8bc7543832054a1d22be94226be7538b133a26881cba4613027878e05c6cf7 - required: true - multiple: false - assignments: - assetOwner: - ownedState: amount - public: false - required: true - multiple: true - valencies: {} - genesis: - modifier: abstract - metadata: [] - globals: - issuedSupply: once - spec: once - terms: once - assignments: - assetOwner: onceOrMore - valencies: [] - errors: - - issuedMismatch - transitions: - transfer: - modifier: abstract - optional: false - metadata: [] - globals: {} - inputs: - assetOwner: onceOrMore - assignments: - assetOwner: onceOrMore - valencies: [] - errors: - - nonEqualAmounts - defaultAssignment: assetOwner - extensions: {} - defaultOperation: transfer - errors: - issuedMismatch: supply specified as a global parameter doesn't match the issued supply allocated to the asset owners - nonEqualAmounts: the sum of spent assets doesn't equal to the sum of assets in outputs - developer: ssi:LZS1ux-gjD9nXPF-OcetUUkW-6r3uSCS6-aQhs9W5f-8JE7w - : version: v1 - schemaId: rgb:sch:RDYhMTR!9gv8Y2GLv9UNBEK1hcrCmdLDFk9Qd5fnO8k#brave-dinner-banana - ifaceId: rgb:ifc:$iUnO9aO-1xhqUd6-1Jm5S5!-wM3ngby-5GVEylQ-ZTAMYDk#tornado-pioneer-bucket - timestamp: 1713343888 - metadata: [] - globalState: - - id: 2000 - name: spec - reserved: null - - id: 2001 - name: terms - reserved: null - - id: 2010 - name: issuedSupply - reserved: null - assignments: - - id: 4000 - name: assetOwner - reserved: null - valencies: [] - transitions: - - id: 10000 - name: transfer - reserved: null - extensions: [] - errors: - - id: 0 - name: nonEqualAmounts - reserved: null - - id: 1 - name: issuedMismatch - reserved: null - developer: ssi:LZS1ux-gjD9nXPF-OcetUUkW-6r3uSCS6-aQhs9W5f-8JE7w -supplements: [] -types: - 0af65fd62581de85cbd14e23e2db9a92bbef8b7974ffe1b50c4c74db8f86e751: !List - - 5f5e26e5c5053c1b4544515bc6a0653da02a0791fb31116d71a4fad916e15355 - - min: 0 - max: 7 - 18cb946f1293cf180e9d78dcc65bc59b472ffffeadfbf58db198cc8328f64b01: !Tuple - - 560d96f7a47924b2c3df040e6463398fd65fd591652c294342bfa5f939155154 - 1cabbfc3d826c0bfd1e9770a889efacc8b6716ad014a3eec10b6591530229042: !Primitive 64 - 1cb0758e14c2008c0f008ce6d2d41e9e1937e1cd0f9914c59a7e29e1ce7ba0bb: !Tuple - - ccc272928f793803d91f5dad8d51cc986b4332380f9224f7c7c1514d768ebb90 - 2a5baaac5089ff098d150b482cfed8bcd01a91c0d7b45d32216ed576ab71ebdd: !Array - - 1cabbfc3d826c0bfd1e9770a889efacc8b6716ad014a3eec10b6591530229042 - - 32 - 2fd8f27a172712903e6a3e96f0f85c0480b4211a17acd13059fc51d4a4bbde2c: !Union - ? name: none - tag: 0 - : d83fbee02f0de5b46cf80fe11ef7fdf061c78d975d31ade9eea2bc4099339e6c - ? name: some - tag: 1 - : b070d38ff6d20c5ae5d80715ca31541d5a52bbdecbd3529d38e6ddb672200997 - 3cd1a29dccad9b917b26305f89a8a4fb2118302a4e73c5ac0a780de6ab005e73: !Enum - - name: excl - tag: 33 - - name: hash - tag: 35 - - name: dollar - tag: 36 - - name: amp - tag: 38 - - name: plus - tag: 43 - - name: dash - tag: 45 - - name: dot - tag: 46 - - name: zero - tag: 48 - - name: one - tag: 49 - - name: two - tag: 50 - - name: three - tag: 51 - - name: four - tag: 52 - - name: five - tag: 53 - - name: six - tag: 54 - - name: seven - tag: 55 - - name: eight - tag: 56 - - name: nine - tag: 57 - - name: caret - tag: 94 - - name: lodash - tag: 95 - - name: a - tag: 97 - - name: b - tag: 98 - - name: c - tag: 99 - - name: d - tag: 100 - - name: e - tag: 101 - - name: f - tag: 102 - - name: g - tag: 103 - - name: h - tag: 104 - - name: i - tag: 105 - - name: j - tag: 106 - - name: k - tag: 107 - - name: l - tag: 108 - - name: m - tag: 109 - - name: n - tag: 110 - - name: o - tag: 111 - - name: p - tag: 112 - - name: q - tag: 113 - - name: r - tag: 114 - - name: s - tag: 115 - - name: t - tag: 116 - - name: u - tag: 117 - - name: v - tag: 118 - - name: w - tag: 119 - - name: x - tag: 120 - - name: y - tag: 121 - - name: z - tag: 122 - 3f2b72b7c4af1a630cb6d3ff088baf351093ee465b9e7d472a610082e449d7e4: !Tuple - - 63aa2314e8b147c8b284dfb39a9e10d19caad5faea848e3cb9849d9167d6344a - 43aa7fc5f6f5644fe5a2ae5e1aa99042cdeb879442e34c723ff5827fb133de8a: !Struct - - name: type - ty: b10ddefe8020add8a0ca08292150abb13c514d76de5168c1c97105a27e676660 - - name: digest - ty: 2a5baaac5089ff098d150b482cfed8bcd01a91c0d7b45d32216ed576ab71ebdd - 45b780258601c526b23b5b4861460a9050e13f35fbbe8305a8001157e4013888: !Union - ? name: none - tag: 0 - : d83fbee02f0de5b46cf80fe11ef7fdf061c78d975d31ade9eea2bc4099339e6c - ? name: some - tag: 1 - : caff8faeb38a00a04e3621538f8e61d75a85a465cb0a0e48c3593e7eaa6c5fc7 - 48be23172ae884459ae78334a0063f09fa0e317bea8b233ce782a38875e796b8: !Enum - - name: space - tag: 32 - - name: excl - tag: 33 - - name: quotes - tag: 34 - - name: hash - tag: 35 - - name: dollar - tag: 36 - - name: percent - tag: 37 - - name: ampersand - tag: 38 - - name: apostrophe - tag: 39 - - name: bracketL - tag: 40 - - name: bracketR - tag: 41 - - name: asterisk - tag: 42 - - name: plus - tag: 43 - - name: comma - tag: 44 - - name: minus - tag: 45 - - name: dot - tag: 46 - - name: slash - tag: 47 - - name: zero - tag: 48 - - name: one - tag: 49 - - name: two - tag: 50 - - name: three - tag: 51 - - name: four - tag: 52 - - name: five - tag: 53 - - name: six - tag: 54 - - name: seven - tag: 55 - - name: eight - tag: 56 - - name: nine - tag: 57 - - name: colon - tag: 58 - - name: semiColon - tag: 59 - - name: less - tag: 60 - - name: equal - tag: 61 - - name: greater - tag: 62 - - name: question - tag: 63 - - name: at - tag: 64 - - name: _A - tag: 65 - - name: _B - tag: 66 - - name: _C - tag: 67 - - name: _D - tag: 68 - - name: _E - tag: 69 - - name: _F - tag: 70 - - name: _G - tag: 71 - - name: _H - tag: 72 - - name: _I - tag: 73 - - name: _J - tag: 74 - - name: _K - tag: 75 - - name: _L - tag: 76 - - name: _M - tag: 77 - - name: _N - tag: 78 - - name: _O - tag: 79 - - name: _P - tag: 80 - - name: _Q - tag: 81 - - name: _R - tag: 82 - - name: _S - tag: 83 - - name: _T - tag: 84 - - name: _U - tag: 85 - - name: _V - tag: 86 - - name: _W - tag: 87 - - name: _X - tag: 88 - - name: _Y - tag: 89 - - name: _Z - tag: 90 - - name: sqBracketL - tag: 91 - - name: backSlash - tag: 92 - - name: sqBracketR - tag: 93 - - name: caret - tag: 94 - - name: lodash - tag: 95 - - name: backtick - tag: 96 - - name: a - tag: 97 - - name: b - tag: 98 - - name: c - tag: 99 - - name: d - tag: 100 - - name: e - tag: 101 - - name: f - tag: 102 - - name: g - tag: 103 - - name: h - tag: 104 - - name: i - tag: 105 - - name: j - tag: 106 - - name: k - tag: 107 - - name: l - tag: 108 - - name: m - tag: 109 - - name: n - tag: 110 - - name: o - tag: 111 - - name: p - tag: 112 - - name: q - tag: 113 - - name: r - tag: 114 - - name: s - tag: 115 - - name: t - tag: 116 - - name: u - tag: 117 - - name: v - tag: 118 - - name: w - tag: 119 - - name: x - tag: 120 - - name: y - tag: 121 - - name: z - tag: 122 - - name: cBracketL - tag: 123 - - name: pipe - tag: 124 - - name: cBracketR - tag: 125 - - name: tilde - tag: 126 - 560d96f7a47924b2c3df040e6463398fd65fd591652c294342bfa5f939155154: !List - - fba958721a3d335406b368c36f5a82790960cce239febcafe189ba9839d5da78 - - min: 0 - max: 65535 - 5b772c8eb15fd74700c79241f60f8fda37e736b3fd462ab017ce4d454efa81aa: !Tuple - - 5e5ec8924f73cd72c4225c96ab47796658ef1b729ca306e260bca42b25891d0f - 5b8bc7543832054a1d22be94226be7538b133a26881cba4613027878e05c6cf7: !Struct - - name: text - ty: 18cb946f1293cf180e9d78dcc65bc59b472ffffeadfbf58db198cc8328f64b01 - - name: media - ty: e087a83496338799afc48a9211683a427d2bd33e2ea7ebb8a8b880ea4ab4eb81 - 5ca149585de534ee91b3e3a030b7efd4cdb79abea9152f101f3759b4c7210e1f: !Primitive 8 - 5d03c4178da98e7e3f3af343e3997d74201d11f42732cfbea2b04b8e3ff15f22: !Enum - - name: indivisible - tag: 0 - - name: deci - tag: 1 - - name: centi - tag: 2 - - name: milli - tag: 3 - - name: deciMilli - tag: 4 - - name: centiMilli - tag: 5 - - name: micro - tag: 6 - - name: deciMicro - tag: 7 - - name: centiMicro - tag: 8 - - name: nano - tag: 9 - - name: deciNano - tag: 10 - - name: centiNano - tag: 11 - - name: pico - tag: 12 - - name: deciPico - tag: 13 - - name: centiPico - tag: 14 - - name: femto - tag: 15 - - name: deciFemto - tag: 16 - - name: centiFemto - tag: 17 - - name: atto - tag: 18 - 5e5ec8924f73cd72c4225c96ab47796658ef1b729ca306e260bca42b25891d0f: !Tuple - - 822380f475f0edb4b5dc517991de7390ada2dbb3752c4c066851aa01630296c2 - - 0af65fd62581de85cbd14e23e2db9a92bbef8b7974ffe1b50c4c74db8f86e751 - 5f5e26e5c5053c1b4544515bc6a0653da02a0791fb31116d71a4fad916e15355: !Enum - - name: zero - tag: 48 - - name: one - tag: 49 - - name: two - tag: 50 - - name: three - tag: 51 - - name: four - tag: 52 - - name: five - tag: 53 - - name: six - tag: 54 - - name: seven - tag: 55 - - name: eight - tag: 56 - - name: nine - tag: 57 - - name: _A - tag: 65 - - name: _B - tag: 66 - - name: _C - tag: 67 - - name: _D - tag: 68 - - name: _E - tag: 69 - - name: _F - tag: 70 - - name: _G - tag: 71 - - name: _H - tag: 72 - - name: _I - tag: 73 - - name: _J - tag: 74 - - name: _K - tag: 75 - - name: _L - tag: 76 - - name: _M - tag: 77 - - name: _N - tag: 78 - - name: _O - tag: 79 - - name: _P - tag: 80 - - name: _Q - tag: 81 - - name: _R - tag: 82 - - name: _S - tag: 83 - - name: _T - tag: 84 - - name: _U - tag: 85 - - name: _V - tag: 86 - - name: _W - tag: 87 - - name: _X - tag: 88 - - name: _Y - tag: 89 - - name: _Z - tag: 90 - - name: a - tag: 97 - - name: b - tag: 98 - - name: c - tag: 99 - - name: d - tag: 100 - - name: e - tag: 101 - - name: f - tag: 102 - - name: g - tag: 103 - - name: h - tag: 104 - - name: i - tag: 105 - - name: j - tag: 106 - - name: k - tag: 107 - - name: l - tag: 108 - - name: m - tag: 109 - - name: n - tag: 110 - - name: o - tag: 111 - - name: p - tag: 112 - - name: q - tag: 113 - - name: r - tag: 114 - - name: s - tag: 115 - - name: t - tag: 116 - - name: u - tag: 117 - - name: v - tag: 118 - - name: w - tag: 119 - - name: x - tag: 120 - - name: y - tag: 121 - - name: z - tag: 122 - 63aa2314e8b147c8b284dfb39a9e10d19caad5faea848e3cb9849d9167d6344a: !List - - fba958721a3d335406b368c36f5a82790960cce239febcafe189ba9839d5da78 - - min: 1 - max: 255 - 805ec5bc5312c84190445da16aa1c08a09e300e8323acfae6a23420a29ad003d: !Tuple - - c43a7d9eb9b3027973c98f5dd6e1ac04f5cbd34240c0bebc0a0fb808140094d4 - 822380f475f0edb4b5dc517991de7390ada2dbb3752c4c066851aa01630296c2: !Enum - - name: _A - tag: 65 - - name: _B - tag: 66 - - name: _C - tag: 67 - - name: _D - tag: 68 - - name: _E - tag: 69 - - name: _F - tag: 70 - - name: _G - tag: 71 - - name: _H - tag: 72 - - name: _I - tag: 73 - - name: _J - tag: 74 - - name: _K - tag: 75 - - name: _L - tag: 76 - - name: _M - tag: 77 - - name: _N - tag: 78 - - name: _O - tag: 79 - - name: _P - tag: 80 - - name: _Q - tag: 81 - - name: _R - tag: 82 - - name: _S - tag: 83 - - name: _T - tag: 84 - - name: _U - tag: 85 - - name: _V - tag: 86 - - name: _W - tag: 87 - - name: _X - tag: 88 - - name: _Y - tag: 89 - - name: _Z - tag: 90 - - name: a - tag: 97 - - name: b - tag: 98 - - name: c - tag: 99 - - name: d - tag: 100 - - name: e - tag: 101 - - name: f - tag: 102 - - name: g - tag: 103 - - name: h - tag: 104 - - name: i - tag: 105 - - name: j - tag: 106 - - name: k - tag: 107 - - name: l - tag: 108 - - name: m - tag: 109 - - name: n - tag: 110 - - name: o - tag: 111 - - name: p - tag: 112 - - name: q - tag: 113 - - name: r - tag: 114 - - name: s - tag: 115 - - name: t - tag: 116 - - name: u - tag: 117 - - name: v - tag: 118 - - name: w - tag: 119 - - name: x - tag: 120 - - name: y - tag: 121 - - name: z - tag: 122 - 888c5865633af13b95b7cd1a8d8af2dac1dc140b977251d9d4daf3c7511c8e84: !Tuple - - 5ca149585de534ee91b3e3a030b7efd4cdb79abea9152f101f3759b4c7210e1f - b070d38ff6d20c5ae5d80715ca31541d5a52bbdecbd3529d38e6ddb672200997: !Tuple - - 1cb0758e14c2008c0f008ce6d2d41e9e1937e1cd0f9914c59a7e29e1ce7ba0bb - b10ddefe8020add8a0ca08292150abb13c514d76de5168c1c97105a27e676660: !Struct - - name: type - ty: 1cb0758e14c2008c0f008ce6d2d41e9e1937e1cd0f9914c59a7e29e1ce7ba0bb - - name: subtype - ty: 2fd8f27a172712903e6a3e96f0f85c0480b4211a17acd13059fc51d4a4bbde2c - - name: charset - ty: 2fd8f27a172712903e6a3e96f0f85c0480b4211a17acd13059fc51d4a4bbde2c - bf8fcbe9c5395731a6b4cd61fb00dfe7a5d629365339c55aeae087a3b90aaa46: !List - - 3cd1a29dccad9b917b26305f89a8a4fb2118302a4e73c5ac0a780de6ab005e73 - - min: 0 - max: 63 - c43a7d9eb9b3027973c98f5dd6e1ac04f5cbd34240c0bebc0a0fb808140094d4: !Tuple - - 48be23172ae884459ae78334a0063f09fa0e317bea8b233ce782a38875e796b8 - - f5ad172144ccd2dd62ece74ff0fb14641d936a80c1a0c93ebf97727184897cbc - caff8faeb38a00a04e3621538f8e61d75a85a465cb0a0e48c3593e7eaa6c5fc7: !Tuple - - 3f2b72b7c4af1a630cb6d3ff088baf351093ee465b9e7d472a610082e449d7e4 - ccc272928f793803d91f5dad8d51cc986b4332380f9224f7c7c1514d768ebb90: !Tuple - - f9170804ddae0479f8d5af74ab3bd202e6ea4172d9a9b93707151adb7fc40ca1 - - bf8fcbe9c5395731a6b4cd61fb00dfe7a5d629365339c55aeae087a3b90aaa46 - d7fcbee31ef0a85d5f973bda1b0b8c9e7efbcbc5572577382cacd3bdb4218a01: !Struct - - name: ticker - ty: 5b772c8eb15fd74700c79241f60f8fda37e736b3fd462ab017ce4d454efa81aa - - name: name - ty: 805ec5bc5312c84190445da16aa1c08a09e300e8323acfae6a23420a29ad003d - - name: details - ty: 45b780258601c526b23b5b4861460a9050e13f35fbbe8305a8001157e4013888 - - name: precision - ty: 5d03c4178da98e7e3f3af343e3997d74201d11f42732cfbea2b04b8e3ff15f22 - d83fbee02f0de5b46cf80fe11ef7fdf061c78d975d31ade9eea2bc4099339e6c: !Primitive 0 - dc1e2f52567f725fd730ad84867f0da4c9ba9af0813311dfe4ef3e3c4a612548: !Tuple - - 43aa7fc5f6f5644fe5a2ae5e1aa99042cdeb879442e34c723ff5827fb133de8a - e087a83496338799afc48a9211683a427d2bd33e2ea7ebb8a8b880ea4ab4eb81: !Union - ? name: none - tag: 0 - : d83fbee02f0de5b46cf80fe11ef7fdf061c78d975d31ade9eea2bc4099339e6c - ? name: some - tag: 1 - : dc1e2f52567f725fd730ad84867f0da4c9ba9af0813311dfe4ef3e3c4a612548 - f5ad172144ccd2dd62ece74ff0fb14641d936a80c1a0c93ebf97727184897cbc: !List - - 48be23172ae884459ae78334a0063f09fa0e317bea8b233ce782a38875e796b8 - - min: 0 - max: 39 - f9170804ddae0479f8d5af74ab3bd202e6ea4172d9a9b93707151adb7fc40ca1: !Enum - - name: a - tag: 97 - - name: b - tag: 98 - - name: c - tag: 99 - - name: d - tag: 100 - - name: e - tag: 101 - - name: f - tag: 102 - - name: g - tag: 103 - - name: h - tag: 104 - - name: i - tag: 105 - - name: j - tag: 106 - - name: k - tag: 107 - - name: l - tag: 108 - - name: m - tag: 109 - - name: n - tag: 110 - - name: o - tag: 111 - - name: p - tag: 112 - - name: q - tag: 113 - - name: r - tag: 114 - - name: s - tag: 115 - - name: t - tag: 116 - - name: u - tag: 117 - - name: v - tag: 118 - - name: w - tag: 119 - - name: x - tag: 120 - - name: y - tag: 121 - - name: z - tag: 122 - fba958721a3d335406b368c36f5a82790960cce239febcafe189ba9839d5da78: UnicodeChar -scripts: -- isae: - - ALU - - BPDIGEST - - RGB - code: - - 11 - - 0 - - 0 - - 0 - - 208 - - 160 - - 15 - - 1 - - 7 - - 11 - - 0 - - 1 - - 0 - - 11 - - 8 - - 0 - - 0 - - 11 - - 1 - - 2 - - 0 - - 200 - - 218 - - 7 - - 1 - - 57 - - 48 - - 0 - - 209 - - 160 - - 15 - - 1 - - 7 - data: - - 0 - - 1 - - 0 - - 0 - libs: [] -attachments: {} -signatures: {} diff --git a/tests/fixtures/attack_chain.yaml b/tests/fixtures/attack_chain.yaml deleted file mode 100644 index 21e9889..0000000 --- a/tests/fixtures/attack_chain.yaml +++ /dev/null @@ -1,1138 +0,0 @@ -version: v2 -transfer: true -terminals: - 3bb2645029b3de98be6c3ed5ce3332b8591f59c693146a007b75db5cfdb7c7b8: - chain: liquid - data: e1c963ea4a2d4e21f870c713a76d0397a0cc197aece1f53a66ae9febf122bb50 -genesis: - ffv: 0 - schemaId: rgb:sch:RDYhMTR!9gv8Y2GLv9UNBEK1hcrCmdLDFk9Qd5fnO8k#brave-dinner-banana - flags: null - timestamp: 1728925859 - issuer: ssi:anonymous - testnet: true - altLayers1: [] - assetTags: - 4000: 603a2b302aac8d1cd7c8adc3acd72f31ce652128f96218fa5b519fd5e9930f6d - metadata: {} - globals: - 2000: - - 074e494154434b520e4e4941206173736574206e616d650002 - 2001: - - 09004e4941207465726d7300 - 2010: - - 9a02000000000000 - assignments: - 4000: - type: fungible - items: - - seal: - chain: liquid - data: - method: opretFirst - txid: 22f0538e189f32922e55daf6fa0b7120bc01de8520a9a4c80655fdaf70272ac0 - vout: 1 - blinding: 7704601239148887312 - state: - value: 666 - blinding: 7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e - tag: 603a2b302aac8d1cd7c8adc3acd72f31ce652128f96218fa5b519fd5e9930f6d - lock: null - valencies: [] - validator: null -extensions: [] -bundles: -- pubWitness: - chain: liquid - data: !tx - version: 2 - inputs: - - prevOutput: a5c3085efe8dfdba0fa0e11d81bf90cdcac27c0af496c4de1a2fd9659948ffce:0 - sigScript: '' - sequence: 0 - witness: [] - outputs: - - value: 99999200 - scriptPubkey: 001430d944c2d49db5c315c49e13aab8cad8b9415cac - - value: 0 - scriptPubkey: 6a20669e87f4fe2acf39e58ef94c4a2f81791b7848acac344cd8a2e562f4777acc7f - lockTime: 0 - anchoredBundles: !opret - mpcProof: - pos: 1 - cofactor: 1 - path: - - 0d4042fb3c309aa40bff3159cee3a0ca87c4efc804a5347aa1a363d7244a88f7 - - e56d0e3dbadefb489899917dbc2e1dbf0c49c3ff155e178ef52feab2f351fc7c - - 4edc7f8808488b46c10bedf910818a9afbe2512c1f08a436a7b3db244f22ac85 - dbcProof: null - bundle: - closeMethod: opretFirst - inputMap: - 0: 9b50df314989fe006013a96d2ded4b508e5f32ef2b29e7245abfb3d9a35888e3 - knownTransitions: - 9b50df314989fe006013a96d2ded4b508e5f32ef2b29e7245abfb3d9a35888e3: - ffv: 0 - contractId: rgb:JgunSMvZ-VCH4cfz-qW1qNyp-VO2a9f7-UYT3vN1-mjO$Ebg - nonce: 18446744073709551615 - transitionType: 10000 - metadata: {} - globals: {} - inputs: - - prevOut: - op: fb58c747eec9c44a05ec907ec9d14e0e72572f75db0a3f9aa47f0673702e760e - ty: 4000 - no: 0 - assignments: - 4000: - type: fungible - items: - - seal: - chain: liquid - data: - method: opretFirst - txid: null - vout: 0 - blinding: 10251942175724995735 - state: - value: 616 - blinding: 361c123b494b218e332794a2390dc6d5cc7c332f64cf8764b6dfb3e04e56c9fc - tag: 603a2b302aac8d1cd7c8adc3acd72f31ce652128f96218fa5b519fd5e9930f6d - lock: null - - seal: - chain: liquid - data: 108b3912eb0b836427f235bafe449f3153c2aae08887b948a3d8529f17b19b95 - state: - value: 50 - blinding: 48626c4335335cf04b56e9dc4570b7a8b2024b4f19aef719c79eca9e3027b482 - tag: 603a2b302aac8d1cd7c8adc3acd72f31ce652128f96218fa5b519fd5e9930f6d - lock: null - valencies: [] - validator: null - witness: null -- pubWitness: - chain: liquid - data: !tx - version: 2 - inputs: - - prevOutput: 22f0538e189f32922e55daf6fa0b7120bc01de8520a9a4c80655fdaf70272ac0:1 - sigScript: '' - sequence: 0 - witness: [] - outputs: - - value: 99999600 - scriptPubkey: 00141d66111f9daca8769c3ab2b0fe14354b6198b29c - - value: 0 - scriptPubkey: 6a20a02ab7dd75b9911b540419440ebe8f5be0742f76fd9fdaf5e69ebb30f38d3f11 - lockTime: 0 - anchoredBundles: !opret - mpcProof: - pos: 1 - cofactor: 1 - path: - - 0ae6caac7df078206a7af28b0a885098f743d49b92cdb3485558b804492a5be5 - - 843d661f6822486889697a7446a6a9bd1e123921c6dafdde687140cf863a9403 - - 040c8d2b550cc8f3bd210535dbf482f91e7fe62989168c1ed87eebf2b4f35be3 - dbcProof: null - bundle: - closeMethod: opretFirst - inputMap: - 0: fb58c747eec9c44a05ec907ec9d14e0e72572f75db0a3f9aa47f0673702e760e - knownTransitions: - fb58c747eec9c44a05ec907ec9d14e0e72572f75db0a3f9aa47f0673702e760e: - ffv: 0 - contractId: rgb:JgunSMvZ-VCH4cfz-qW1qNyp-VO2a9f7-UYT3vN1-mjO$Ebg - nonce: 18446744073709551615 - transitionType: 65535 - metadata: {} - globals: {} - inputs: - - prevOut: - op: 260ba748cbd95421f871fcea5b5a8dca954ed9af5fed4613def3759a33bf11b8 - ty: 4000 - no: 0 - assignments: - 4000: - type: fungible - items: - - seal: - chain: liquid - data: - method: opretFirst - txid: null - vout: 0 - blinding: 7687739675014878388 - state: - value: 666 - blinding: 7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e - tag: 603a2b302aac8d1cd7c8adc3acd72f31ce652128f96218fa5b519fd5e9930f6d - lock: null - valencies: [] - validator: null - witness: null -- pubWitness: - chain: liquid - data: !tx - version: 2 - inputs: - - prevOutput: d077ea7e3a55a215893a18e82cb03fda0f50619893e4aee0ba70b014e6d63248:0 - sigScript: '' - sequence: 0 - witness: [] - outputs: - - value: 99998800 - scriptPubkey: 00146ab6fe162c087a01a717d2b6d4bbef87829cec24 - - value: 0 - scriptPubkey: 6a2088b706bf16e225b5d438f48c8c1abc544e807bb7fb99e6fc8ca460d4de62d1b0 - lockTime: 0 - anchoredBundles: !opret - mpcProof: - pos: 1 - cofactor: 1 - path: - - 91246094600e4cae70d42147330754f25ef710118c7bc3aa963b1a8900125b83 - - 58bb69c807310413032dd30a245738b48f1a5cb8645f55b8f089489ae16b0533 - - 500d82630b8bb4a1bcb8973500acae7114dc0d5ef77b748a60b4d93aa9375ca1 - dbcProof: null - bundle: - closeMethod: opretFirst - inputMap: - 0: c04da8609a2a8ddf7e0e9847f4ebd6758b1091bceeda10094b24352c97840ea2 - knownTransitions: - c04da8609a2a8ddf7e0e9847f4ebd6758b1091bceeda10094b24352c97840ea2: - ffv: 0 - contractId: rgb:JgunSMvZ-VCH4cfz-qW1qNyp-VO2a9f7-UYT3vN1-mjO$Ebg - nonce: 18446744073709551615 - transitionType: 10000 - metadata: {} - globals: {} - inputs: - - prevOut: - op: 9b50df314989fe006013a96d2ded4b508e5f32ef2b29e7245abfb3d9a35888e3 - ty: 4000 - no: 0 - assignments: - 4000: - type: fungible - items: - - seal: - chain: liquid - data: - method: opretFirst - txid: null - vout: 0 - blinding: 9888072140771099372 - state: - value: 539 - blinding: ae89403cecbdb782ddba50b592d9590bb664bb3d4dc9f7772f7c6611f4755345 - tag: 603a2b302aac8d1cd7c8adc3acd72f31ce652128f96218fa5b519fd5e9930f6d - lock: null - - seal: - chain: liquid - data: e1c963ea4a2d4e21f870c713a76d0397a0cc197aece1f53a66ae9febf122bb50 - state: - value: 77 - blinding: 8792d1fe5c8d6a0b556d43eca6346dc8d0c654d8c64e30294735ac5b2a17b7f8 - tag: 603a2b302aac8d1cd7c8adc3acd72f31ce652128f96218fa5b519fd5e9930f6d - lock: null - valencies: [] - validator: null - witness: null -schema: - ffv: 0 - flags: null - name: NonInflatableAsset - timestamp: 1713343888 - developer: ssi:LZS1ux-gjD9nXPF-OcetUUkW-6r3uSCS6-aQhs9W5f-8JE7w - metaTypes: {} - globalTypes: - 2000: - reserved: null - semId: d7fcbee31ef0a85d5f973bda1b0b8c9e7efbcbc5572577382cacd3bdb4218a01 - maxItems: 1 - 2001: - reserved: null - semId: 5b8bc7543832054a1d22be94226be7538b133a26881cba4613027878e05c6cf7 - maxItems: 1 - 2010: - reserved: null - semId: 888c5865633af13b95b7cd1a8d8af2dac1dc140b977251d9d4daf3c7511c8e84 - maxItems: 1 - ownedTypes: - 4000: !fungible unsigned64Bit - valencyTypes: [] - genesis: - metadata: [] - globals: - 2000: once - 2001: once - 2010: once - assignments: - 4000: onceOrMore - valencies: [] - validator: - lib: abf099d28bed50df5e065715327f3a9b329f777cb0b9fefff634c193a03cb626 - pos: 9 - extensions: {} - transitions: - 10000: - metadata: [] - globals: {} - inputs: - 4000: onceOrMore - assignments: - 4000: onceOrMore - valencies: [] - validator: - lib: abf099d28bed50df5e065715327f3a9b329f777cb0b9fefff634c193a03cb626 - pos: 0 - reserved: null -ifaces: - ? version: v1 - name: RGB20Fixed - inherits: - - rgb:ifc:Vk9c4$Ny-Fv0J6tg-pDF05CE-312oCWh-fENNuia-GYbEu18#adios-alert-never - - rgb:ifc:13N6PRwT-T68!FGY-lBwX2cm-qesgJ11-j0nQkM1-WSCJFj4#ariel-gizmo-evita - - rgb:ifc:naFrAfgG-Kfu$A!c-3L!bC$4-s1LWJQV-4Iv!62u-4B3ab8Y#mailbox-dialog-iron - - rgb:ifc:w3Lk9Mt3-gKt$n5y-TYpVGg0-IDpK0p9-sHQ!hb6-m2Qr3a0#unicorn-reward-ladder - timestamp: 1711405444 - metadata: {} - globalState: - issuedSupply: - semId: 888c5865633af13b95b7cd1a8d8af2dac1dc140b977251d9d4daf3c7511c8e84 - required: true - multiple: false - spec: - semId: d7fcbee31ef0a85d5f973bda1b0b8c9e7efbcbc5572577382cacd3bdb4218a01 - required: true - multiple: false - terms: - semId: 5b8bc7543832054a1d22be94226be7538b133a26881cba4613027878e05c6cf7 - required: true - multiple: false - assignments: - assetOwner: - ownedState: amount - public: false - required: true - multiple: true - valencies: {} - genesis: - modifier: abstract - metadata: [] - globals: - issuedSupply: once - spec: once - terms: once - assignments: - assetOwner: onceOrMore - valencies: [] - errors: - - issuedMismatch - transitions: - transfer: - modifier: abstract - optional: false - metadata: [] - globals: {} - inputs: - assetOwner: onceOrMore - assignments: - assetOwner: onceOrMore - valencies: [] - errors: - - nonEqualAmounts - defaultAssignment: assetOwner - extensions: {} - defaultOperation: transfer - errors: - issuedMismatch: supply specified as a global parameter doesn't match the issued supply allocated to the asset owners - nonEqualAmounts: the sum of spent assets doesn't equal to the sum of assets in outputs - developer: ssi:LZS1ux-gjD9nXPF-OcetUUkW-6r3uSCS6-aQhs9W5f-8JE7w - : version: v1 - schemaId: rgb:sch:RDYhMTR!9gv8Y2GLv9UNBEK1hcrCmdLDFk9Qd5fnO8k#brave-dinner-banana - ifaceId: rgb:ifc:$iUnO9aO-1xhqUd6-1Jm5S5!-wM3ngby-5GVEylQ-ZTAMYDk#tornado-pioneer-bucket - timestamp: 1713343888 - metadata: [] - globalState: - - id: 2000 - name: spec - reserved: null - - id: 2001 - name: terms - reserved: null - - id: 2010 - name: issuedSupply - reserved: null - assignments: - - id: 4000 - name: assetOwner - reserved: null - valencies: [] - transitions: - - id: 10000 - name: transfer - reserved: null - extensions: [] - errors: - - id: 0 - name: nonEqualAmounts - reserved: null - - id: 1 - name: issuedMismatch - reserved: null - developer: ssi:LZS1ux-gjD9nXPF-OcetUUkW-6r3uSCS6-aQhs9W5f-8JE7w -supplements: [] -types: - 0af65fd62581de85cbd14e23e2db9a92bbef8b7974ffe1b50c4c74db8f86e751: !List - - 5f5e26e5c5053c1b4544515bc6a0653da02a0791fb31116d71a4fad916e15355 - - min: 0 - max: 7 - 18cb946f1293cf180e9d78dcc65bc59b472ffffeadfbf58db198cc8328f64b01: !Tuple - - 560d96f7a47924b2c3df040e6463398fd65fd591652c294342bfa5f939155154 - 1cabbfc3d826c0bfd1e9770a889efacc8b6716ad014a3eec10b6591530229042: !Primitive 64 - 1cb0758e14c2008c0f008ce6d2d41e9e1937e1cd0f9914c59a7e29e1ce7ba0bb: !Tuple - - ccc272928f793803d91f5dad8d51cc986b4332380f9224f7c7c1514d768ebb90 - 2a5baaac5089ff098d150b482cfed8bcd01a91c0d7b45d32216ed576ab71ebdd: !Array - - 1cabbfc3d826c0bfd1e9770a889efacc8b6716ad014a3eec10b6591530229042 - - 32 - 2fd8f27a172712903e6a3e96f0f85c0480b4211a17acd13059fc51d4a4bbde2c: !Union - ? name: none - tag: 0 - : d83fbee02f0de5b46cf80fe11ef7fdf061c78d975d31ade9eea2bc4099339e6c - ? name: some - tag: 1 - : b070d38ff6d20c5ae5d80715ca31541d5a52bbdecbd3529d38e6ddb672200997 - 3cd1a29dccad9b917b26305f89a8a4fb2118302a4e73c5ac0a780de6ab005e73: !Enum - - name: excl - tag: 33 - - name: hash - tag: 35 - - name: dollar - tag: 36 - - name: amp - tag: 38 - - name: plus - tag: 43 - - name: dash - tag: 45 - - name: dot - tag: 46 - - name: zero - tag: 48 - - name: one - tag: 49 - - name: two - tag: 50 - - name: three - tag: 51 - - name: four - tag: 52 - - name: five - tag: 53 - - name: six - tag: 54 - - name: seven - tag: 55 - - name: eight - tag: 56 - - name: nine - tag: 57 - - name: caret - tag: 94 - - name: lodash - tag: 95 - - name: a - tag: 97 - - name: b - tag: 98 - - name: c - tag: 99 - - name: d - tag: 100 - - name: e - tag: 101 - - name: f - tag: 102 - - name: g - tag: 103 - - name: h - tag: 104 - - name: i - tag: 105 - - name: j - tag: 106 - - name: k - tag: 107 - - name: l - tag: 108 - - name: m - tag: 109 - - name: n - tag: 110 - - name: o - tag: 111 - - name: p - tag: 112 - - name: q - tag: 113 - - name: r - tag: 114 - - name: s - tag: 115 - - name: t - tag: 116 - - name: u - tag: 117 - - name: v - tag: 118 - - name: w - tag: 119 - - name: x - tag: 120 - - name: y - tag: 121 - - name: z - tag: 122 - 3f2b72b7c4af1a630cb6d3ff088baf351093ee465b9e7d472a610082e449d7e4: !Tuple - - 63aa2314e8b147c8b284dfb39a9e10d19caad5faea848e3cb9849d9167d6344a - 43aa7fc5f6f5644fe5a2ae5e1aa99042cdeb879442e34c723ff5827fb133de8a: !Struct - - name: type - ty: b10ddefe8020add8a0ca08292150abb13c514d76de5168c1c97105a27e676660 - - name: digest - ty: 2a5baaac5089ff098d150b482cfed8bcd01a91c0d7b45d32216ed576ab71ebdd - 45b780258601c526b23b5b4861460a9050e13f35fbbe8305a8001157e4013888: !Union - ? name: none - tag: 0 - : d83fbee02f0de5b46cf80fe11ef7fdf061c78d975d31ade9eea2bc4099339e6c - ? name: some - tag: 1 - : caff8faeb38a00a04e3621538f8e61d75a85a465cb0a0e48c3593e7eaa6c5fc7 - 48be23172ae884459ae78334a0063f09fa0e317bea8b233ce782a38875e796b8: !Enum - - name: space - tag: 32 - - name: excl - tag: 33 - - name: quotes - tag: 34 - - name: hash - tag: 35 - - name: dollar - tag: 36 - - name: percent - tag: 37 - - name: ampersand - tag: 38 - - name: apostrophe - tag: 39 - - name: bracketL - tag: 40 - - name: bracketR - tag: 41 - - name: asterisk - tag: 42 - - name: plus - tag: 43 - - name: comma - tag: 44 - - name: minus - tag: 45 - - name: dot - tag: 46 - - name: slash - tag: 47 - - name: zero - tag: 48 - - name: one - tag: 49 - - name: two - tag: 50 - - name: three - tag: 51 - - name: four - tag: 52 - - name: five - tag: 53 - - name: six - tag: 54 - - name: seven - tag: 55 - - name: eight - tag: 56 - - name: nine - tag: 57 - - name: colon - tag: 58 - - name: semiColon - tag: 59 - - name: less - tag: 60 - - name: equal - tag: 61 - - name: greater - tag: 62 - - name: question - tag: 63 - - name: at - tag: 64 - - name: _A - tag: 65 - - name: _B - tag: 66 - - name: _C - tag: 67 - - name: _D - tag: 68 - - name: _E - tag: 69 - - name: _F - tag: 70 - - name: _G - tag: 71 - - name: _H - tag: 72 - - name: _I - tag: 73 - - name: _J - tag: 74 - - name: _K - tag: 75 - - name: _L - tag: 76 - - name: _M - tag: 77 - - name: _N - tag: 78 - - name: _O - tag: 79 - - name: _P - tag: 80 - - name: _Q - tag: 81 - - name: _R - tag: 82 - - name: _S - tag: 83 - - name: _T - tag: 84 - - name: _U - tag: 85 - - name: _V - tag: 86 - - name: _W - tag: 87 - - name: _X - tag: 88 - - name: _Y - tag: 89 - - name: _Z - tag: 90 - - name: sqBracketL - tag: 91 - - name: backSlash - tag: 92 - - name: sqBracketR - tag: 93 - - name: caret - tag: 94 - - name: lodash - tag: 95 - - name: backtick - tag: 96 - - name: a - tag: 97 - - name: b - tag: 98 - - name: c - tag: 99 - - name: d - tag: 100 - - name: e - tag: 101 - - name: f - tag: 102 - - name: g - tag: 103 - - name: h - tag: 104 - - name: i - tag: 105 - - name: j - tag: 106 - - name: k - tag: 107 - - name: l - tag: 108 - - name: m - tag: 109 - - name: n - tag: 110 - - name: o - tag: 111 - - name: p - tag: 112 - - name: q - tag: 113 - - name: r - tag: 114 - - name: s - tag: 115 - - name: t - tag: 116 - - name: u - tag: 117 - - name: v - tag: 118 - - name: w - tag: 119 - - name: x - tag: 120 - - name: y - tag: 121 - - name: z - tag: 122 - - name: cBracketL - tag: 123 - - name: pipe - tag: 124 - - name: cBracketR - tag: 125 - - name: tilde - tag: 126 - 560d96f7a47924b2c3df040e6463398fd65fd591652c294342bfa5f939155154: !List - - fba958721a3d335406b368c36f5a82790960cce239febcafe189ba9839d5da78 - - min: 0 - max: 65535 - 5b772c8eb15fd74700c79241f60f8fda37e736b3fd462ab017ce4d454efa81aa: !Tuple - - 5e5ec8924f73cd72c4225c96ab47796658ef1b729ca306e260bca42b25891d0f - 5b8bc7543832054a1d22be94226be7538b133a26881cba4613027878e05c6cf7: !Struct - - name: text - ty: 18cb946f1293cf180e9d78dcc65bc59b472ffffeadfbf58db198cc8328f64b01 - - name: media - ty: e087a83496338799afc48a9211683a427d2bd33e2ea7ebb8a8b880ea4ab4eb81 - 5ca149585de534ee91b3e3a030b7efd4cdb79abea9152f101f3759b4c7210e1f: !Primitive 8 - 5d03c4178da98e7e3f3af343e3997d74201d11f42732cfbea2b04b8e3ff15f22: !Enum - - name: indivisible - tag: 0 - - name: deci - tag: 1 - - name: centi - tag: 2 - - name: milli - tag: 3 - - name: deciMilli - tag: 4 - - name: centiMilli - tag: 5 - - name: micro - tag: 6 - - name: deciMicro - tag: 7 - - name: centiMicro - tag: 8 - - name: nano - tag: 9 - - name: deciNano - tag: 10 - - name: centiNano - tag: 11 - - name: pico - tag: 12 - - name: deciPico - tag: 13 - - name: centiPico - tag: 14 - - name: femto - tag: 15 - - name: deciFemto - tag: 16 - - name: centiFemto - tag: 17 - - name: atto - tag: 18 - 5e5ec8924f73cd72c4225c96ab47796658ef1b729ca306e260bca42b25891d0f: !Tuple - - 822380f475f0edb4b5dc517991de7390ada2dbb3752c4c066851aa01630296c2 - - 0af65fd62581de85cbd14e23e2db9a92bbef8b7974ffe1b50c4c74db8f86e751 - 5f5e26e5c5053c1b4544515bc6a0653da02a0791fb31116d71a4fad916e15355: !Enum - - name: zero - tag: 48 - - name: one - tag: 49 - - name: two - tag: 50 - - name: three - tag: 51 - - name: four - tag: 52 - - name: five - tag: 53 - - name: six - tag: 54 - - name: seven - tag: 55 - - name: eight - tag: 56 - - name: nine - tag: 57 - - name: _A - tag: 65 - - name: _B - tag: 66 - - name: _C - tag: 67 - - name: _D - tag: 68 - - name: _E - tag: 69 - - name: _F - tag: 70 - - name: _G - tag: 71 - - name: _H - tag: 72 - - name: _I - tag: 73 - - name: _J - tag: 74 - - name: _K - tag: 75 - - name: _L - tag: 76 - - name: _M - tag: 77 - - name: _N - tag: 78 - - name: _O - tag: 79 - - name: _P - tag: 80 - - name: _Q - tag: 81 - - name: _R - tag: 82 - - name: _S - tag: 83 - - name: _T - tag: 84 - - name: _U - tag: 85 - - name: _V - tag: 86 - - name: _W - tag: 87 - - name: _X - tag: 88 - - name: _Y - tag: 89 - - name: _Z - tag: 90 - - name: a - tag: 97 - - name: b - tag: 98 - - name: c - tag: 99 - - name: d - tag: 100 - - name: e - tag: 101 - - name: f - tag: 102 - - name: g - tag: 103 - - name: h - tag: 104 - - name: i - tag: 105 - - name: j - tag: 106 - - name: k - tag: 107 - - name: l - tag: 108 - - name: m - tag: 109 - - name: n - tag: 110 - - name: o - tag: 111 - - name: p - tag: 112 - - name: q - tag: 113 - - name: r - tag: 114 - - name: s - tag: 115 - - name: t - tag: 116 - - name: u - tag: 117 - - name: v - tag: 118 - - name: w - tag: 119 - - name: x - tag: 120 - - name: y - tag: 121 - - name: z - tag: 122 - 63aa2314e8b147c8b284dfb39a9e10d19caad5faea848e3cb9849d9167d6344a: !List - - fba958721a3d335406b368c36f5a82790960cce239febcafe189ba9839d5da78 - - min: 1 - max: 255 - 805ec5bc5312c84190445da16aa1c08a09e300e8323acfae6a23420a29ad003d: !Tuple - - c43a7d9eb9b3027973c98f5dd6e1ac04f5cbd34240c0bebc0a0fb808140094d4 - 822380f475f0edb4b5dc517991de7390ada2dbb3752c4c066851aa01630296c2: !Enum - - name: _A - tag: 65 - - name: _B - tag: 66 - - name: _C - tag: 67 - - name: _D - tag: 68 - - name: _E - tag: 69 - - name: _F - tag: 70 - - name: _G - tag: 71 - - name: _H - tag: 72 - - name: _I - tag: 73 - - name: _J - tag: 74 - - name: _K - tag: 75 - - name: _L - tag: 76 - - name: _M - tag: 77 - - name: _N - tag: 78 - - name: _O - tag: 79 - - name: _P - tag: 80 - - name: _Q - tag: 81 - - name: _R - tag: 82 - - name: _S - tag: 83 - - name: _T - tag: 84 - - name: _U - tag: 85 - - name: _V - tag: 86 - - name: _W - tag: 87 - - name: _X - tag: 88 - - name: _Y - tag: 89 - - name: _Z - tag: 90 - - name: a - tag: 97 - - name: b - tag: 98 - - name: c - tag: 99 - - name: d - tag: 100 - - name: e - tag: 101 - - name: f - tag: 102 - - name: g - tag: 103 - - name: h - tag: 104 - - name: i - tag: 105 - - name: j - tag: 106 - - name: k - tag: 107 - - name: l - tag: 108 - - name: m - tag: 109 - - name: n - tag: 110 - - name: o - tag: 111 - - name: p - tag: 112 - - name: q - tag: 113 - - name: r - tag: 114 - - name: s - tag: 115 - - name: t - tag: 116 - - name: u - tag: 117 - - name: v - tag: 118 - - name: w - tag: 119 - - name: x - tag: 120 - - name: y - tag: 121 - - name: z - tag: 122 - 888c5865633af13b95b7cd1a8d8af2dac1dc140b977251d9d4daf3c7511c8e84: !Tuple - - 5ca149585de534ee91b3e3a030b7efd4cdb79abea9152f101f3759b4c7210e1f - b070d38ff6d20c5ae5d80715ca31541d5a52bbdecbd3529d38e6ddb672200997: !Tuple - - 1cb0758e14c2008c0f008ce6d2d41e9e1937e1cd0f9914c59a7e29e1ce7ba0bb - b10ddefe8020add8a0ca08292150abb13c514d76de5168c1c97105a27e676660: !Struct - - name: type - ty: 1cb0758e14c2008c0f008ce6d2d41e9e1937e1cd0f9914c59a7e29e1ce7ba0bb - - name: subtype - ty: 2fd8f27a172712903e6a3e96f0f85c0480b4211a17acd13059fc51d4a4bbde2c - - name: charset - ty: 2fd8f27a172712903e6a3e96f0f85c0480b4211a17acd13059fc51d4a4bbde2c - bf8fcbe9c5395731a6b4cd61fb00dfe7a5d629365339c55aeae087a3b90aaa46: !List - - 3cd1a29dccad9b917b26305f89a8a4fb2118302a4e73c5ac0a780de6ab005e73 - - min: 0 - max: 63 - c43a7d9eb9b3027973c98f5dd6e1ac04f5cbd34240c0bebc0a0fb808140094d4: !Tuple - - 48be23172ae884459ae78334a0063f09fa0e317bea8b233ce782a38875e796b8 - - f5ad172144ccd2dd62ece74ff0fb14641d936a80c1a0c93ebf97727184897cbc - caff8faeb38a00a04e3621538f8e61d75a85a465cb0a0e48c3593e7eaa6c5fc7: !Tuple - - 3f2b72b7c4af1a630cb6d3ff088baf351093ee465b9e7d472a610082e449d7e4 - ccc272928f793803d91f5dad8d51cc986b4332380f9224f7c7c1514d768ebb90: !Tuple - - f9170804ddae0479f8d5af74ab3bd202e6ea4172d9a9b93707151adb7fc40ca1 - - bf8fcbe9c5395731a6b4cd61fb00dfe7a5d629365339c55aeae087a3b90aaa46 - d7fcbee31ef0a85d5f973bda1b0b8c9e7efbcbc5572577382cacd3bdb4218a01: !Struct - - name: ticker - ty: 5b772c8eb15fd74700c79241f60f8fda37e736b3fd462ab017ce4d454efa81aa - - name: name - ty: 805ec5bc5312c84190445da16aa1c08a09e300e8323acfae6a23420a29ad003d - - name: details - ty: 45b780258601c526b23b5b4861460a9050e13f35fbbe8305a8001157e4013888 - - name: precision - ty: 5d03c4178da98e7e3f3af343e3997d74201d11f42732cfbea2b04b8e3ff15f22 - d83fbee02f0de5b46cf80fe11ef7fdf061c78d975d31ade9eea2bc4099339e6c: !Primitive 0 - dc1e2f52567f725fd730ad84867f0da4c9ba9af0813311dfe4ef3e3c4a612548: !Tuple - - 43aa7fc5f6f5644fe5a2ae5e1aa99042cdeb879442e34c723ff5827fb133de8a - e087a83496338799afc48a9211683a427d2bd33e2ea7ebb8a8b880ea4ab4eb81: !Union - ? name: none - tag: 0 - : d83fbee02f0de5b46cf80fe11ef7fdf061c78d975d31ade9eea2bc4099339e6c - ? name: some - tag: 1 - : dc1e2f52567f725fd730ad84867f0da4c9ba9af0813311dfe4ef3e3c4a612548 - f5ad172144ccd2dd62ece74ff0fb14641d936a80c1a0c93ebf97727184897cbc: !List - - 48be23172ae884459ae78334a0063f09fa0e317bea8b233ce782a38875e796b8 - - min: 0 - max: 39 - f9170804ddae0479f8d5af74ab3bd202e6ea4172d9a9b93707151adb7fc40ca1: !Enum - - name: a - tag: 97 - - name: b - tag: 98 - - name: c - tag: 99 - - name: d - tag: 100 - - name: e - tag: 101 - - name: f - tag: 102 - - name: g - tag: 103 - - name: h - tag: 104 - - name: i - tag: 105 - - name: j - tag: 106 - - name: k - tag: 107 - - name: l - tag: 108 - - name: m - tag: 109 - - name: n - tag: 110 - - name: o - tag: 111 - - name: p - tag: 112 - - name: q - tag: 113 - - name: r - tag: 114 - - name: s - tag: 115 - - name: t - tag: 116 - - name: u - tag: 117 - - name: v - tag: 118 - - name: w - tag: 119 - - name: x - tag: 120 - - name: y - tag: 121 - - name: z - tag: 122 - fba958721a3d335406b368c36f5a82790960cce239febcafe189ba9839d5da78: UnicodeChar -scripts: -- isae: - - ALU - - BPDIGEST - - RGB - code: - - 11 - - 0 - - 0 - - 0 - - 208 - - 160 - - 15 - - 1 - - 7 - - 11 - - 0 - - 1 - - 0 - - 11 - - 8 - - 0 - - 0 - - 11 - - 1 - - 2 - - 0 - - 200 - - 218 - - 7 - - 1 - - 57 - - 48 - - 0 - - 209 - - 160 - - 15 - - 1 - - 7 - data: - - 0 - - 1 - - 0 - - 0 - libs: [] -attachments: {} -signatures: {} diff --git a/tests/fixtures/attack_genesis_schema_id.yaml b/tests/fixtures/attack_genesis_schema_id.yaml deleted file mode 100644 index 94cc24c..0000000 --- a/tests/fixtures/attack_genesis_schema_id.yaml +++ /dev/null @@ -1,1149 +0,0 @@ -version: v2 -transfer: true -terminals: {} -genesis: - ffv: 0 - schemaId: rgb:sch:cJjPZfUpkOqIWhpCTqYJtFYzLfz$AB3JNxIEOJZYn28#circus-version-silence - flags: null - timestamp: 1728926035 - issuer: ssi:anonymous - testnet: true - altLayers1: [] - assetTags: - 4000: 182bcffc792b3b0b5ea98515b0babbf1650db23f30e508eb8637000d8ad590db - metadata: {} - globals: - 2000: - - 074e494154434b520e4e4941206173736574206e616d650002 - 2001: - - 09004e4941207465726d7300 - 2010: - - 9a02000000000000 - assignments: - 4000: - type: fungible - items: - - seal: - chain: bitcoin - data: - method: opretFirst - txid: 39f4d1888d1d994a2649397d34bfcaf8a9f7de2d6369dd1d42e0c61a26b4384b - vout: 1 - blinding: 7943510731595037200 - state: - value: 666 - blinding: 7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e - tag: 182bcffc792b3b0b5ea98515b0babbf1650db23f30e508eb8637000d8ad590db - lock: null - valencies: [] - validator: null -extensions: [] -bundles: -- pubWitness: - chain: bitcoin - data: !tx - version: 2 - inputs: - - prevOutput: c269055b7750a234087c11acd7a408172cb84d8fc6af0ded42d8a8cbea6712e9:1 - sigScript: '' - sequence: 0 - witness: [] - outputs: - - value: 9000 - scriptPubkey: 0014a39902b742ace887eeef8b91463f30893f777a12 - - value: 99981200 - scriptPubkey: 0014ceb732c6400f984d3258c202811ef439234ff028 - - value: 0 - scriptPubkey: 6a20efce72c00a4dafa508d223854191b9bc534505d7b40841136ea57454bcd8f62e - lockTime: 0 - anchoredBundles: !opret - mpcProof: - pos: 4 - cofactor: 1 - path: - - 59fb64885c9d21d566c630261ebaf61e6fdfb90fd755734580e2853606e04468 - - 972bd31741970dcfdcb1fd6e1e0cb86b43a95cdf9be16e26b20f7efb55b8815a - - 59c4bea42d613b9b4d9190c70713db38fcb1213e1384390305c9f41b105e7ad7 - dbcProof: null - bundle: - closeMethod: opretFirst - inputMap: - 0: 93ff8f77c5f41ebdfb417b9f30a603e2b48a0db75d5a0e520495954e564f62f6 - knownTransitions: - 93ff8f77c5f41ebdfb417b9f30a603e2b48a0db75d5a0e520495954e564f62f6: - ffv: 0 - contractId: rgb:P9y8fj2n-Hjyhxbb-FSv9Jb6-xVz3qn$-laXX8N6-hzNhlHQ - nonce: 18446744073709551615 - transitionType: 10000 - metadata: {} - globals: {} - inputs: - - prevOut: - op: 76fc3455d84d793361211daa2a85be764b9bebc559dd2958833bf6ab153fa9a3 - ty: 4000 - no: 0 - assignments: - 4000: - type: fungible - items: - - seal: - chain: bitcoin - data: - method: opretFirst - txid: null - vout: 0 - blinding: 10355153668244730300 - state: - value: 50 - blinding: 6ba480e64c69b4e53fe7c76e5c79bb79e8d1a442ba405e9b568612b0014dc452 - tag: 182bcffc792b3b0b5ea98515b0babbf1650db23f30e508eb8637000d8ad590db - lock: null - - seal: - chain: bitcoin - data: - method: opretFirst - txid: null - vout: 1 - blinding: 4411272172758969930 - state: - value: 616 - blinding: 12d9fd983214c9993e96b7102204c30495acda3bc43e1fe327f86bce7d30ba2c - tag: 182bcffc792b3b0b5ea98515b0babbf1650db23f30e508eb8637000d8ad590db - lock: null - valencies: [] - validator: null - witness: null -- pubWitness: - chain: bitcoin - data: !tx - version: 2 - inputs: - - prevOutput: d84c37b6c6616184c454c815d970505bed9b3a3723a4445dd1289dc708bc80b3:1 - sigScript: '' - sequence: 0 - witness: [] - outputs: - - value: 9000 - scriptPubkey: 0014a39902b742ace887eeef8b91463f30893f777a12 - - value: 99971800 - scriptPubkey: 0014b63cbe65e66aaec213d9e25a2ff8cd4e4f3c47d0 - - value: 0 - scriptPubkey: 6a2036831c40589897909e67d439cba95004d53280635e2ca66b6e53da52551f957c - lockTime: 0 - anchoredBundles: !opret - mpcProof: - pos: 4 - cofactor: 1 - path: - - ade25d6370736e013b7148b4e223030112c4dff704d992e0a8d92073df669c2f - - f478b2c344da010822be93fb7405c56c0b95867ce56582a6c4f647b678fba56e - - 9461109d34187938798bf29433c2b3f11f08ed7f7c8831fcceeab43874f11689 - dbcProof: null - bundle: - closeMethod: opretFirst - inputMap: - 0: 295cbd02dbfeddee5c9691cfcc2b5c59b284c8130ad1c9e2cfb867b45dc24dec - knownTransitions: - 295cbd02dbfeddee5c9691cfcc2b5c59b284c8130ad1c9e2cfb867b45dc24dec: - ffv: 0 - contractId: rgb:P9y8fj2n-Hjyhxbb-FSv9Jb6-xVz3qn$-laXX8N6-hzNhlHQ - nonce: 18446744073709551615 - transitionType: 10000 - metadata: {} - globals: {} - inputs: - - prevOut: - op: 93ff8f77c5f41ebdfb417b9f30a603e2b48a0db75d5a0e520495954e564f62f6 - ty: 4000 - no: 1 - assignments: - 4000: - type: fungible - items: - - seal: - chain: bitcoin - data: - method: opretFirst - txid: null - vout: 0 - blinding: 5517491780835545414 - state: - value: 77 - blinding: ab9ad5d441db401474f2f15c2d7940cec37d8b1c962dc20752256f95fdfd1634 - tag: 182bcffc792b3b0b5ea98515b0babbf1650db23f30e508eb8637000d8ad590db - lock: null - - seal: - chain: bitcoin - data: - method: opretFirst - txid: null - vout: 1 - blinding: 17151752316201612509 - state: - value: 539 - blinding: 673f27c3f0398984c9a3c5b3f48b82348cde2c05dd58fe1795a55ac54f69e539 - tag: 182bcffc792b3b0b5ea98515b0babbf1650db23f30e508eb8637000d8ad590db - lock: null - valencies: [] - validator: null - witness: null -- pubWitness: - chain: bitcoin - data: !tx - version: 2 - inputs: - - prevOutput: 39f4d1888d1d994a2649397d34bfcaf8a9f7de2d6369dd1d42e0c61a26b4384b:1 - sigScript: '' - sequence: 0 - witness: [] - outputs: - - value: 9000 - scriptPubkey: 0014a39902b742ace887eeef8b91463f30893f777a12 - - value: 99990600 - scriptPubkey: 00147c22e5543af0a3dca1c89ae5ffbf6cadd03a1bb3 - - value: 0 - scriptPubkey: 6a209f6aed701fb9da0762a238d96e0b203220a609a9afaba47ea71ba96e08065458 - lockTime: 0 - anchoredBundles: !opret - mpcProof: - pos: 4 - cofactor: 1 - path: - - 09a4be7f9ba65f3e4588a93061fe429c8e257de6cb5194a82c1e4dc5d6ff48fd - - cdc9e7844302abff47462927f67cfc6b350a5023dcceb1798eeea250dcce7052 - - 6ef2b8c22960c49c7be94ea27b5909ac60dbbd69fe057d5475795a35802bf24a - dbcProof: null - bundle: - closeMethod: opretFirst - inputMap: - 0: 76fc3455d84d793361211daa2a85be764b9bebc559dd2958833bf6ab153fa9a3 - knownTransitions: - 76fc3455d84d793361211daa2a85be764b9bebc559dd2958833bf6ab153fa9a3: - ffv: 0 - contractId: rgb:P9y8fj2n-Hjyhxbb-FSv9Jb6-xVz3qn$-laXX8N6-hzNhlHQ - nonce: 18446744073709551615 - transitionType: 65535 - metadata: {} - globals: {} - inputs: - - prevOut: - op: 3fdcbc7e3da71e3ca1c5b6c54aff496fac55cf7aa7fe56975fc37a8733619474 - ty: 4000 - no: 0 - assignments: - 4000: - type: fungible - items: - - seal: - chain: bitcoin - data: - method: opretFirst - txid: null - vout: 1 - blinding: 16141698382146724670 - state: - value: 666 - blinding: 7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e - tag: 182bcffc792b3b0b5ea98515b0babbf1650db23f30e508eb8637000d8ad590db - lock: null - valencies: [] - validator: null - witness: null -schema: - ffv: 0 - flags: null - name: NonInflatableAsset - timestamp: 1713343888 - developer: ssi:LZS1ux-gjD9nXPF-OcetUUkW-6r3uSCS6-aQhs9W5f-8JE7w - metaTypes: {} - globalTypes: - 2000: - reserved: null - semId: d7fcbee31ef0a85d5f973bda1b0b8c9e7efbcbc5572577382cacd3bdb4218a01 - maxItems: 1 - 2001: - reserved: null - semId: 5b8bc7543832054a1d22be94226be7538b133a26881cba4613027878e05c6cf7 - maxItems: 1 - 2010: - reserved: null - semId: 888c5865633af13b95b7cd1a8d8af2dac1dc140b977251d9d4daf3c7511c8e84 - maxItems: 1 - ownedTypes: - 4000: !fungible unsigned64Bit - valencyTypes: [] - genesis: - metadata: [] - globals: - 2000: once - 2001: once - 2010: once - assignments: - 4000: onceOrMore - valencies: [] - validator: - lib: abf099d28bed50df5e065715327f3a9b329f777cb0b9fefff634c193a03cb626 - pos: 9 - extensions: {} - transitions: - 10000: - metadata: [] - globals: {} - inputs: - 4000: onceOrMore - assignments: - 4000: onceOrMore - valencies: [] - validator: - lib: abf099d28bed50df5e065715327f3a9b329f777cb0b9fefff634c193a03cb626 - pos: 0 - reserved: null -ifaces: - ? version: v1 - name: RGB20Fixed - inherits: - - rgb:ifc:Vk9c4$Ny-Fv0J6tg-pDF05CE-312oCWh-fENNuia-GYbEu18#adios-alert-never - - rgb:ifc:13N6PRwT-T68!FGY-lBwX2cm-qesgJ11-j0nQkM1-WSCJFj4#ariel-gizmo-evita - - rgb:ifc:naFrAfgG-Kfu$A!c-3L!bC$4-s1LWJQV-4Iv!62u-4B3ab8Y#mailbox-dialog-iron - - rgb:ifc:w3Lk9Mt3-gKt$n5y-TYpVGg0-IDpK0p9-sHQ!hb6-m2Qr3a0#unicorn-reward-ladder - timestamp: 1711405444 - metadata: {} - globalState: - issuedSupply: - semId: 888c5865633af13b95b7cd1a8d8af2dac1dc140b977251d9d4daf3c7511c8e84 - required: true - multiple: false - spec: - semId: d7fcbee31ef0a85d5f973bda1b0b8c9e7efbcbc5572577382cacd3bdb4218a01 - required: true - multiple: false - terms: - semId: 5b8bc7543832054a1d22be94226be7538b133a26881cba4613027878e05c6cf7 - required: true - multiple: false - assignments: - assetOwner: - ownedState: amount - public: false - required: true - multiple: true - valencies: {} - genesis: - modifier: abstract - metadata: [] - globals: - issuedSupply: once - spec: once - terms: once - assignments: - assetOwner: onceOrMore - valencies: [] - errors: - - issuedMismatch - transitions: - transfer: - modifier: abstract - optional: false - metadata: [] - globals: {} - inputs: - assetOwner: onceOrMore - assignments: - assetOwner: onceOrMore - valencies: [] - errors: - - nonEqualAmounts - defaultAssignment: assetOwner - extensions: {} - defaultOperation: transfer - errors: - issuedMismatch: supply specified as a global parameter doesn't match the issued supply allocated to the asset owners - nonEqualAmounts: the sum of spent assets doesn't equal to the sum of assets in outputs - developer: ssi:LZS1ux-gjD9nXPF-OcetUUkW-6r3uSCS6-aQhs9W5f-8JE7w - : version: v1 - schemaId: rgb:sch:RDYhMTR!9gv8Y2GLv9UNBEK1hcrCmdLDFk9Qd5fnO8k#brave-dinner-banana - ifaceId: rgb:ifc:$iUnO9aO-1xhqUd6-1Jm5S5!-wM3ngby-5GVEylQ-ZTAMYDk#tornado-pioneer-bucket - timestamp: 1713343888 - metadata: [] - globalState: - - id: 2000 - name: spec - reserved: null - - id: 2001 - name: terms - reserved: null - - id: 2010 - name: issuedSupply - reserved: null - assignments: - - id: 4000 - name: assetOwner - reserved: null - valencies: [] - transitions: - - id: 10000 - name: transfer - reserved: null - extensions: [] - errors: - - id: 0 - name: nonEqualAmounts - reserved: null - - id: 1 - name: issuedMismatch - reserved: null - developer: ssi:LZS1ux-gjD9nXPF-OcetUUkW-6r3uSCS6-aQhs9W5f-8JE7w -supplements: [] -types: - 0af65fd62581de85cbd14e23e2db9a92bbef8b7974ffe1b50c4c74db8f86e751: !List - - 5f5e26e5c5053c1b4544515bc6a0653da02a0791fb31116d71a4fad916e15355 - - min: 0 - max: 7 - 18cb946f1293cf180e9d78dcc65bc59b472ffffeadfbf58db198cc8328f64b01: !Tuple - - 560d96f7a47924b2c3df040e6463398fd65fd591652c294342bfa5f939155154 - 1cabbfc3d826c0bfd1e9770a889efacc8b6716ad014a3eec10b6591530229042: !Primitive 64 - 1cb0758e14c2008c0f008ce6d2d41e9e1937e1cd0f9914c59a7e29e1ce7ba0bb: !Tuple - - ccc272928f793803d91f5dad8d51cc986b4332380f9224f7c7c1514d768ebb90 - 2a5baaac5089ff098d150b482cfed8bcd01a91c0d7b45d32216ed576ab71ebdd: !Array - - 1cabbfc3d826c0bfd1e9770a889efacc8b6716ad014a3eec10b6591530229042 - - 32 - 2fd8f27a172712903e6a3e96f0f85c0480b4211a17acd13059fc51d4a4bbde2c: !Union - ? name: none - tag: 0 - : d83fbee02f0de5b46cf80fe11ef7fdf061c78d975d31ade9eea2bc4099339e6c - ? name: some - tag: 1 - : b070d38ff6d20c5ae5d80715ca31541d5a52bbdecbd3529d38e6ddb672200997 - 3cd1a29dccad9b917b26305f89a8a4fb2118302a4e73c5ac0a780de6ab005e73: !Enum - - name: excl - tag: 33 - - name: hash - tag: 35 - - name: dollar - tag: 36 - - name: amp - tag: 38 - - name: plus - tag: 43 - - name: dash - tag: 45 - - name: dot - tag: 46 - - name: zero - tag: 48 - - name: one - tag: 49 - - name: two - tag: 50 - - name: three - tag: 51 - - name: four - tag: 52 - - name: five - tag: 53 - - name: six - tag: 54 - - name: seven - tag: 55 - - name: eight - tag: 56 - - name: nine - tag: 57 - - name: caret - tag: 94 - - name: lodash - tag: 95 - - name: a - tag: 97 - - name: b - tag: 98 - - name: c - tag: 99 - - name: d - tag: 100 - - name: e - tag: 101 - - name: f - tag: 102 - - name: g - tag: 103 - - name: h - tag: 104 - - name: i - tag: 105 - - name: j - tag: 106 - - name: k - tag: 107 - - name: l - tag: 108 - - name: m - tag: 109 - - name: n - tag: 110 - - name: o - tag: 111 - - name: p - tag: 112 - - name: q - tag: 113 - - name: r - tag: 114 - - name: s - tag: 115 - - name: t - tag: 116 - - name: u - tag: 117 - - name: v - tag: 118 - - name: w - tag: 119 - - name: x - tag: 120 - - name: y - tag: 121 - - name: z - tag: 122 - 3f2b72b7c4af1a630cb6d3ff088baf351093ee465b9e7d472a610082e449d7e4: !Tuple - - 63aa2314e8b147c8b284dfb39a9e10d19caad5faea848e3cb9849d9167d6344a - 43aa7fc5f6f5644fe5a2ae5e1aa99042cdeb879442e34c723ff5827fb133de8a: !Struct - - name: type - ty: b10ddefe8020add8a0ca08292150abb13c514d76de5168c1c97105a27e676660 - - name: digest - ty: 2a5baaac5089ff098d150b482cfed8bcd01a91c0d7b45d32216ed576ab71ebdd - 45b780258601c526b23b5b4861460a9050e13f35fbbe8305a8001157e4013888: !Union - ? name: none - tag: 0 - : d83fbee02f0de5b46cf80fe11ef7fdf061c78d975d31ade9eea2bc4099339e6c - ? name: some - tag: 1 - : caff8faeb38a00a04e3621538f8e61d75a85a465cb0a0e48c3593e7eaa6c5fc7 - 48be23172ae884459ae78334a0063f09fa0e317bea8b233ce782a38875e796b8: !Enum - - name: space - tag: 32 - - name: excl - tag: 33 - - name: quotes - tag: 34 - - name: hash - tag: 35 - - name: dollar - tag: 36 - - name: percent - tag: 37 - - name: ampersand - tag: 38 - - name: apostrophe - tag: 39 - - name: bracketL - tag: 40 - - name: bracketR - tag: 41 - - name: asterisk - tag: 42 - - name: plus - tag: 43 - - name: comma - tag: 44 - - name: minus - tag: 45 - - name: dot - tag: 46 - - name: slash - tag: 47 - - name: zero - tag: 48 - - name: one - tag: 49 - - name: two - tag: 50 - - name: three - tag: 51 - - name: four - tag: 52 - - name: five - tag: 53 - - name: six - tag: 54 - - name: seven - tag: 55 - - name: eight - tag: 56 - - name: nine - tag: 57 - - name: colon - tag: 58 - - name: semiColon - tag: 59 - - name: less - tag: 60 - - name: equal - tag: 61 - - name: greater - tag: 62 - - name: question - tag: 63 - - name: at - tag: 64 - - name: _A - tag: 65 - - name: _B - tag: 66 - - name: _C - tag: 67 - - name: _D - tag: 68 - - name: _E - tag: 69 - - name: _F - tag: 70 - - name: _G - tag: 71 - - name: _H - tag: 72 - - name: _I - tag: 73 - - name: _J - tag: 74 - - name: _K - tag: 75 - - name: _L - tag: 76 - - name: _M - tag: 77 - - name: _N - tag: 78 - - name: _O - tag: 79 - - name: _P - tag: 80 - - name: _Q - tag: 81 - - name: _R - tag: 82 - - name: _S - tag: 83 - - name: _T - tag: 84 - - name: _U - tag: 85 - - name: _V - tag: 86 - - name: _W - tag: 87 - - name: _X - tag: 88 - - name: _Y - tag: 89 - - name: _Z - tag: 90 - - name: sqBracketL - tag: 91 - - name: backSlash - tag: 92 - - name: sqBracketR - tag: 93 - - name: caret - tag: 94 - - name: lodash - tag: 95 - - name: backtick - tag: 96 - - name: a - tag: 97 - - name: b - tag: 98 - - name: c - tag: 99 - - name: d - tag: 100 - - name: e - tag: 101 - - name: f - tag: 102 - - name: g - tag: 103 - - name: h - tag: 104 - - name: i - tag: 105 - - name: j - tag: 106 - - name: k - tag: 107 - - name: l - tag: 108 - - name: m - tag: 109 - - name: n - tag: 110 - - name: o - tag: 111 - - name: p - tag: 112 - - name: q - tag: 113 - - name: r - tag: 114 - - name: s - tag: 115 - - name: t - tag: 116 - - name: u - tag: 117 - - name: v - tag: 118 - - name: w - tag: 119 - - name: x - tag: 120 - - name: y - tag: 121 - - name: z - tag: 122 - - name: cBracketL - tag: 123 - - name: pipe - tag: 124 - - name: cBracketR - tag: 125 - - name: tilde - tag: 126 - 560d96f7a47924b2c3df040e6463398fd65fd591652c294342bfa5f939155154: !List - - fba958721a3d335406b368c36f5a82790960cce239febcafe189ba9839d5da78 - - min: 0 - max: 65535 - 5b772c8eb15fd74700c79241f60f8fda37e736b3fd462ab017ce4d454efa81aa: !Tuple - - 5e5ec8924f73cd72c4225c96ab47796658ef1b729ca306e260bca42b25891d0f - 5b8bc7543832054a1d22be94226be7538b133a26881cba4613027878e05c6cf7: !Struct - - name: text - ty: 18cb946f1293cf180e9d78dcc65bc59b472ffffeadfbf58db198cc8328f64b01 - - name: media - ty: e087a83496338799afc48a9211683a427d2bd33e2ea7ebb8a8b880ea4ab4eb81 - 5ca149585de534ee91b3e3a030b7efd4cdb79abea9152f101f3759b4c7210e1f: !Primitive 8 - 5d03c4178da98e7e3f3af343e3997d74201d11f42732cfbea2b04b8e3ff15f22: !Enum - - name: indivisible - tag: 0 - - name: deci - tag: 1 - - name: centi - tag: 2 - - name: milli - tag: 3 - - name: deciMilli - tag: 4 - - name: centiMilli - tag: 5 - - name: micro - tag: 6 - - name: deciMicro - tag: 7 - - name: centiMicro - tag: 8 - - name: nano - tag: 9 - - name: deciNano - tag: 10 - - name: centiNano - tag: 11 - - name: pico - tag: 12 - - name: deciPico - tag: 13 - - name: centiPico - tag: 14 - - name: femto - tag: 15 - - name: deciFemto - tag: 16 - - name: centiFemto - tag: 17 - - name: atto - tag: 18 - 5e5ec8924f73cd72c4225c96ab47796658ef1b729ca306e260bca42b25891d0f: !Tuple - - 822380f475f0edb4b5dc517991de7390ada2dbb3752c4c066851aa01630296c2 - - 0af65fd62581de85cbd14e23e2db9a92bbef8b7974ffe1b50c4c74db8f86e751 - 5f5e26e5c5053c1b4544515bc6a0653da02a0791fb31116d71a4fad916e15355: !Enum - - name: zero - tag: 48 - - name: one - tag: 49 - - name: two - tag: 50 - - name: three - tag: 51 - - name: four - tag: 52 - - name: five - tag: 53 - - name: six - tag: 54 - - name: seven - tag: 55 - - name: eight - tag: 56 - - name: nine - tag: 57 - - name: _A - tag: 65 - - name: _B - tag: 66 - - name: _C - tag: 67 - - name: _D - tag: 68 - - name: _E - tag: 69 - - name: _F - tag: 70 - - name: _G - tag: 71 - - name: _H - tag: 72 - - name: _I - tag: 73 - - name: _J - tag: 74 - - name: _K - tag: 75 - - name: _L - tag: 76 - - name: _M - tag: 77 - - name: _N - tag: 78 - - name: _O - tag: 79 - - name: _P - tag: 80 - - name: _Q - tag: 81 - - name: _R - tag: 82 - - name: _S - tag: 83 - - name: _T - tag: 84 - - name: _U - tag: 85 - - name: _V - tag: 86 - - name: _W - tag: 87 - - name: _X - tag: 88 - - name: _Y - tag: 89 - - name: _Z - tag: 90 - - name: a - tag: 97 - - name: b - tag: 98 - - name: c - tag: 99 - - name: d - tag: 100 - - name: e - tag: 101 - - name: f - tag: 102 - - name: g - tag: 103 - - name: h - tag: 104 - - name: i - tag: 105 - - name: j - tag: 106 - - name: k - tag: 107 - - name: l - tag: 108 - - name: m - tag: 109 - - name: n - tag: 110 - - name: o - tag: 111 - - name: p - tag: 112 - - name: q - tag: 113 - - name: r - tag: 114 - - name: s - tag: 115 - - name: t - tag: 116 - - name: u - tag: 117 - - name: v - tag: 118 - - name: w - tag: 119 - - name: x - tag: 120 - - name: y - tag: 121 - - name: z - tag: 122 - 63aa2314e8b147c8b284dfb39a9e10d19caad5faea848e3cb9849d9167d6344a: !List - - fba958721a3d335406b368c36f5a82790960cce239febcafe189ba9839d5da78 - - min: 1 - max: 255 - 805ec5bc5312c84190445da16aa1c08a09e300e8323acfae6a23420a29ad003d: !Tuple - - c43a7d9eb9b3027973c98f5dd6e1ac04f5cbd34240c0bebc0a0fb808140094d4 - 822380f475f0edb4b5dc517991de7390ada2dbb3752c4c066851aa01630296c2: !Enum - - name: _A - tag: 65 - - name: _B - tag: 66 - - name: _C - tag: 67 - - name: _D - tag: 68 - - name: _E - tag: 69 - - name: _F - tag: 70 - - name: _G - tag: 71 - - name: _H - tag: 72 - - name: _I - tag: 73 - - name: _J - tag: 74 - - name: _K - tag: 75 - - name: _L - tag: 76 - - name: _M - tag: 77 - - name: _N - tag: 78 - - name: _O - tag: 79 - - name: _P - tag: 80 - - name: _Q - tag: 81 - - name: _R - tag: 82 - - name: _S - tag: 83 - - name: _T - tag: 84 - - name: _U - tag: 85 - - name: _V - tag: 86 - - name: _W - tag: 87 - - name: _X - tag: 88 - - name: _Y - tag: 89 - - name: _Z - tag: 90 - - name: a - tag: 97 - - name: b - tag: 98 - - name: c - tag: 99 - - name: d - tag: 100 - - name: e - tag: 101 - - name: f - tag: 102 - - name: g - tag: 103 - - name: h - tag: 104 - - name: i - tag: 105 - - name: j - tag: 106 - - name: k - tag: 107 - - name: l - tag: 108 - - name: m - tag: 109 - - name: n - tag: 110 - - name: o - tag: 111 - - name: p - tag: 112 - - name: q - tag: 113 - - name: r - tag: 114 - - name: s - tag: 115 - - name: t - tag: 116 - - name: u - tag: 117 - - name: v - tag: 118 - - name: w - tag: 119 - - name: x - tag: 120 - - name: y - tag: 121 - - name: z - tag: 122 - 888c5865633af13b95b7cd1a8d8af2dac1dc140b977251d9d4daf3c7511c8e84: !Tuple - - 5ca149585de534ee91b3e3a030b7efd4cdb79abea9152f101f3759b4c7210e1f - b070d38ff6d20c5ae5d80715ca31541d5a52bbdecbd3529d38e6ddb672200997: !Tuple - - 1cb0758e14c2008c0f008ce6d2d41e9e1937e1cd0f9914c59a7e29e1ce7ba0bb - b10ddefe8020add8a0ca08292150abb13c514d76de5168c1c97105a27e676660: !Struct - - name: type - ty: 1cb0758e14c2008c0f008ce6d2d41e9e1937e1cd0f9914c59a7e29e1ce7ba0bb - - name: subtype - ty: 2fd8f27a172712903e6a3e96f0f85c0480b4211a17acd13059fc51d4a4bbde2c - - name: charset - ty: 2fd8f27a172712903e6a3e96f0f85c0480b4211a17acd13059fc51d4a4bbde2c - bf8fcbe9c5395731a6b4cd61fb00dfe7a5d629365339c55aeae087a3b90aaa46: !List - - 3cd1a29dccad9b917b26305f89a8a4fb2118302a4e73c5ac0a780de6ab005e73 - - min: 0 - max: 63 - c43a7d9eb9b3027973c98f5dd6e1ac04f5cbd34240c0bebc0a0fb808140094d4: !Tuple - - 48be23172ae884459ae78334a0063f09fa0e317bea8b233ce782a38875e796b8 - - f5ad172144ccd2dd62ece74ff0fb14641d936a80c1a0c93ebf97727184897cbc - caff8faeb38a00a04e3621538f8e61d75a85a465cb0a0e48c3593e7eaa6c5fc7: !Tuple - - 3f2b72b7c4af1a630cb6d3ff088baf351093ee465b9e7d472a610082e449d7e4 - ccc272928f793803d91f5dad8d51cc986b4332380f9224f7c7c1514d768ebb90: !Tuple - - f9170804ddae0479f8d5af74ab3bd202e6ea4172d9a9b93707151adb7fc40ca1 - - bf8fcbe9c5395731a6b4cd61fb00dfe7a5d629365339c55aeae087a3b90aaa46 - d7fcbee31ef0a85d5f973bda1b0b8c9e7efbcbc5572577382cacd3bdb4218a01: !Struct - - name: ticker - ty: 5b772c8eb15fd74700c79241f60f8fda37e736b3fd462ab017ce4d454efa81aa - - name: name - ty: 805ec5bc5312c84190445da16aa1c08a09e300e8323acfae6a23420a29ad003d - - name: details - ty: 45b780258601c526b23b5b4861460a9050e13f35fbbe8305a8001157e4013888 - - name: precision - ty: 5d03c4178da98e7e3f3af343e3997d74201d11f42732cfbea2b04b8e3ff15f22 - d83fbee02f0de5b46cf80fe11ef7fdf061c78d975d31ade9eea2bc4099339e6c: !Primitive 0 - dc1e2f52567f725fd730ad84867f0da4c9ba9af0813311dfe4ef3e3c4a612548: !Tuple - - 43aa7fc5f6f5644fe5a2ae5e1aa99042cdeb879442e34c723ff5827fb133de8a - e087a83496338799afc48a9211683a427d2bd33e2ea7ebb8a8b880ea4ab4eb81: !Union - ? name: none - tag: 0 - : d83fbee02f0de5b46cf80fe11ef7fdf061c78d975d31ade9eea2bc4099339e6c - ? name: some - tag: 1 - : dc1e2f52567f725fd730ad84867f0da4c9ba9af0813311dfe4ef3e3c4a612548 - f5ad172144ccd2dd62ece74ff0fb14641d936a80c1a0c93ebf97727184897cbc: !List - - 48be23172ae884459ae78334a0063f09fa0e317bea8b233ce782a38875e796b8 - - min: 0 - max: 39 - f9170804ddae0479f8d5af74ab3bd202e6ea4172d9a9b93707151adb7fc40ca1: !Enum - - name: a - tag: 97 - - name: b - tag: 98 - - name: c - tag: 99 - - name: d - tag: 100 - - name: e - tag: 101 - - name: f - tag: 102 - - name: g - tag: 103 - - name: h - tag: 104 - - name: i - tag: 105 - - name: j - tag: 106 - - name: k - tag: 107 - - name: l - tag: 108 - - name: m - tag: 109 - - name: n - tag: 110 - - name: o - tag: 111 - - name: p - tag: 112 - - name: q - tag: 113 - - name: r - tag: 114 - - name: s - tag: 115 - - name: t - tag: 116 - - name: u - tag: 117 - - name: v - tag: 118 - - name: w - tag: 119 - - name: x - tag: 120 - - name: y - tag: 121 - - name: z - tag: 122 - fba958721a3d335406b368c36f5a82790960cce239febcafe189ba9839d5da78: UnicodeChar -scripts: -- isae: - - ALU - - BPDIGEST - - RGB - code: - - 11 - - 0 - - 0 - - 0 - - 208 - - 160 - - 15 - - 1 - - 7 - - 11 - - 0 - - 1 - - 0 - - 11 - - 8 - - 0 - - 0 - - 11 - - 1 - - 2 - - 0 - - 200 - - 218 - - 7 - - 1 - - 57 - - 48 - - 0 - - 209 - - 160 - - 15 - - 1 - - 7 - data: - - 0 - - 1 - - 0 - - 0 - libs: [] -attachments: {} -signatures: {} diff --git a/tests/fixtures/attack_genesis_testnet.yaml b/tests/fixtures/attack_genesis_testnet.yaml deleted file mode 100644 index caf0a80..0000000 --- a/tests/fixtures/attack_genesis_testnet.yaml +++ /dev/null @@ -1,1149 +0,0 @@ -version: v2 -transfer: true -terminals: {} -genesis: - ffv: 0 - schemaId: rgb:sch:RDYhMTR!9gv8Y2GLv9UNBEK1hcrCmdLDFk9Qd5fnO8k#brave-dinner-banana - flags: null - timestamp: 1728926035 - issuer: ssi:anonymous - testnet: false - altLayers1: [] - assetTags: - 4000: 182bcffc792b3b0b5ea98515b0babbf1650db23f30e508eb8637000d8ad590db - metadata: {} - globals: - 2000: - - 074e494154434b520e4e4941206173736574206e616d650002 - 2001: - - 09004e4941207465726d7300 - 2010: - - 9a02000000000000 - assignments: - 4000: - type: fungible - items: - - seal: - chain: bitcoin - data: - method: opretFirst - txid: 39f4d1888d1d994a2649397d34bfcaf8a9f7de2d6369dd1d42e0c61a26b4384b - vout: 1 - blinding: 7943510731595037200 - state: - value: 666 - blinding: 7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e - tag: 182bcffc792b3b0b5ea98515b0babbf1650db23f30e508eb8637000d8ad590db - lock: null - valencies: [] - validator: null -extensions: [] -bundles: -- pubWitness: - chain: bitcoin - data: !tx - version: 2 - inputs: - - prevOutput: c269055b7750a234087c11acd7a408172cb84d8fc6af0ded42d8a8cbea6712e9:1 - sigScript: '' - sequence: 0 - witness: [] - outputs: - - value: 9000 - scriptPubkey: 0014a39902b742ace887eeef8b91463f30893f777a12 - - value: 99981200 - scriptPubkey: 0014ceb732c6400f984d3258c202811ef439234ff028 - - value: 0 - scriptPubkey: 6a20efce72c00a4dafa508d223854191b9bc534505d7b40841136ea57454bcd8f62e - lockTime: 0 - anchoredBundles: !opret - mpcProof: - pos: 4 - cofactor: 1 - path: - - 59fb64885c9d21d566c630261ebaf61e6fdfb90fd755734580e2853606e04468 - - 972bd31741970dcfdcb1fd6e1e0cb86b43a95cdf9be16e26b20f7efb55b8815a - - 59c4bea42d613b9b4d9190c70713db38fcb1213e1384390305c9f41b105e7ad7 - dbcProof: null - bundle: - closeMethod: opretFirst - inputMap: - 0: 93ff8f77c5f41ebdfb417b9f30a603e2b48a0db75d5a0e520495954e564f62f6 - knownTransitions: - 93ff8f77c5f41ebdfb417b9f30a603e2b48a0db75d5a0e520495954e564f62f6: - ffv: 0 - contractId: rgb:P9y8fj2n-Hjyhxbb-FSv9Jb6-xVz3qn$-laXX8N6-hzNhlHQ - nonce: 18446744073709551615 - transitionType: 10000 - metadata: {} - globals: {} - inputs: - - prevOut: - op: 76fc3455d84d793361211daa2a85be764b9bebc559dd2958833bf6ab153fa9a3 - ty: 4000 - no: 0 - assignments: - 4000: - type: fungible - items: - - seal: - chain: bitcoin - data: - method: opretFirst - txid: null - vout: 0 - blinding: 10355153668244730300 - state: - value: 50 - blinding: 6ba480e64c69b4e53fe7c76e5c79bb79e8d1a442ba405e9b568612b0014dc452 - tag: 182bcffc792b3b0b5ea98515b0babbf1650db23f30e508eb8637000d8ad590db - lock: null - - seal: - chain: bitcoin - data: - method: opretFirst - txid: null - vout: 1 - blinding: 4411272172758969930 - state: - value: 616 - blinding: 12d9fd983214c9993e96b7102204c30495acda3bc43e1fe327f86bce7d30ba2c - tag: 182bcffc792b3b0b5ea98515b0babbf1650db23f30e508eb8637000d8ad590db - lock: null - valencies: [] - validator: null - witness: null -- pubWitness: - chain: bitcoin - data: !tx - version: 2 - inputs: - - prevOutput: d84c37b6c6616184c454c815d970505bed9b3a3723a4445dd1289dc708bc80b3:1 - sigScript: '' - sequence: 0 - witness: [] - outputs: - - value: 9000 - scriptPubkey: 0014a39902b742ace887eeef8b91463f30893f777a12 - - value: 99971800 - scriptPubkey: 0014b63cbe65e66aaec213d9e25a2ff8cd4e4f3c47d0 - - value: 0 - scriptPubkey: 6a2036831c40589897909e67d439cba95004d53280635e2ca66b6e53da52551f957c - lockTime: 0 - anchoredBundles: !opret - mpcProof: - pos: 4 - cofactor: 1 - path: - - ade25d6370736e013b7148b4e223030112c4dff704d992e0a8d92073df669c2f - - f478b2c344da010822be93fb7405c56c0b95867ce56582a6c4f647b678fba56e - - 9461109d34187938798bf29433c2b3f11f08ed7f7c8831fcceeab43874f11689 - dbcProof: null - bundle: - closeMethod: opretFirst - inputMap: - 0: 295cbd02dbfeddee5c9691cfcc2b5c59b284c8130ad1c9e2cfb867b45dc24dec - knownTransitions: - 295cbd02dbfeddee5c9691cfcc2b5c59b284c8130ad1c9e2cfb867b45dc24dec: - ffv: 0 - contractId: rgb:P9y8fj2n-Hjyhxbb-FSv9Jb6-xVz3qn$-laXX8N6-hzNhlHQ - nonce: 18446744073709551615 - transitionType: 10000 - metadata: {} - globals: {} - inputs: - - prevOut: - op: 93ff8f77c5f41ebdfb417b9f30a603e2b48a0db75d5a0e520495954e564f62f6 - ty: 4000 - no: 1 - assignments: - 4000: - type: fungible - items: - - seal: - chain: bitcoin - data: - method: opretFirst - txid: null - vout: 0 - blinding: 5517491780835545414 - state: - value: 77 - blinding: ab9ad5d441db401474f2f15c2d7940cec37d8b1c962dc20752256f95fdfd1634 - tag: 182bcffc792b3b0b5ea98515b0babbf1650db23f30e508eb8637000d8ad590db - lock: null - - seal: - chain: bitcoin - data: - method: opretFirst - txid: null - vout: 1 - blinding: 17151752316201612509 - state: - value: 539 - blinding: 673f27c3f0398984c9a3c5b3f48b82348cde2c05dd58fe1795a55ac54f69e539 - tag: 182bcffc792b3b0b5ea98515b0babbf1650db23f30e508eb8637000d8ad590db - lock: null - valencies: [] - validator: null - witness: null -- pubWitness: - chain: bitcoin - data: !tx - version: 2 - inputs: - - prevOutput: 39f4d1888d1d994a2649397d34bfcaf8a9f7de2d6369dd1d42e0c61a26b4384b:1 - sigScript: '' - sequence: 0 - witness: [] - outputs: - - value: 9000 - scriptPubkey: 0014a39902b742ace887eeef8b91463f30893f777a12 - - value: 99990600 - scriptPubkey: 00147c22e5543af0a3dca1c89ae5ffbf6cadd03a1bb3 - - value: 0 - scriptPubkey: 6a209f6aed701fb9da0762a238d96e0b203220a609a9afaba47ea71ba96e08065458 - lockTime: 0 - anchoredBundles: !opret - mpcProof: - pos: 4 - cofactor: 1 - path: - - 09a4be7f9ba65f3e4588a93061fe429c8e257de6cb5194a82c1e4dc5d6ff48fd - - cdc9e7844302abff47462927f67cfc6b350a5023dcceb1798eeea250dcce7052 - - 6ef2b8c22960c49c7be94ea27b5909ac60dbbd69fe057d5475795a35802bf24a - dbcProof: null - bundle: - closeMethod: opretFirst - inputMap: - 0: 76fc3455d84d793361211daa2a85be764b9bebc559dd2958833bf6ab153fa9a3 - knownTransitions: - 76fc3455d84d793361211daa2a85be764b9bebc559dd2958833bf6ab153fa9a3: - ffv: 0 - contractId: rgb:P9y8fj2n-Hjyhxbb-FSv9Jb6-xVz3qn$-laXX8N6-hzNhlHQ - nonce: 18446744073709551615 - transitionType: 65535 - metadata: {} - globals: {} - inputs: - - prevOut: - op: 3fdcbc7e3da71e3ca1c5b6c54aff496fac55cf7aa7fe56975fc37a8733619474 - ty: 4000 - no: 0 - assignments: - 4000: - type: fungible - items: - - seal: - chain: bitcoin - data: - method: opretFirst - txid: null - vout: 1 - blinding: 16141698382146724670 - state: - value: 666 - blinding: 7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e - tag: 182bcffc792b3b0b5ea98515b0babbf1650db23f30e508eb8637000d8ad590db - lock: null - valencies: [] - validator: null - witness: null -schema: - ffv: 0 - flags: null - name: NonInflatableAsset - timestamp: 1713343888 - developer: ssi:LZS1ux-gjD9nXPF-OcetUUkW-6r3uSCS6-aQhs9W5f-8JE7w - metaTypes: {} - globalTypes: - 2000: - reserved: null - semId: d7fcbee31ef0a85d5f973bda1b0b8c9e7efbcbc5572577382cacd3bdb4218a01 - maxItems: 1 - 2001: - reserved: null - semId: 5b8bc7543832054a1d22be94226be7538b133a26881cba4613027878e05c6cf7 - maxItems: 1 - 2010: - reserved: null - semId: 888c5865633af13b95b7cd1a8d8af2dac1dc140b977251d9d4daf3c7511c8e84 - maxItems: 1 - ownedTypes: - 4000: !fungible unsigned64Bit - valencyTypes: [] - genesis: - metadata: [] - globals: - 2000: once - 2001: once - 2010: once - assignments: - 4000: onceOrMore - valencies: [] - validator: - lib: abf099d28bed50df5e065715327f3a9b329f777cb0b9fefff634c193a03cb626 - pos: 9 - extensions: {} - transitions: - 10000: - metadata: [] - globals: {} - inputs: - 4000: onceOrMore - assignments: - 4000: onceOrMore - valencies: [] - validator: - lib: abf099d28bed50df5e065715327f3a9b329f777cb0b9fefff634c193a03cb626 - pos: 0 - reserved: null -ifaces: - ? version: v1 - name: RGB20Fixed - inherits: - - rgb:ifc:Vk9c4$Ny-Fv0J6tg-pDF05CE-312oCWh-fENNuia-GYbEu18#adios-alert-never - - rgb:ifc:13N6PRwT-T68!FGY-lBwX2cm-qesgJ11-j0nQkM1-WSCJFj4#ariel-gizmo-evita - - rgb:ifc:naFrAfgG-Kfu$A!c-3L!bC$4-s1LWJQV-4Iv!62u-4B3ab8Y#mailbox-dialog-iron - - rgb:ifc:w3Lk9Mt3-gKt$n5y-TYpVGg0-IDpK0p9-sHQ!hb6-m2Qr3a0#unicorn-reward-ladder - timestamp: 1711405444 - metadata: {} - globalState: - issuedSupply: - semId: 888c5865633af13b95b7cd1a8d8af2dac1dc140b977251d9d4daf3c7511c8e84 - required: true - multiple: false - spec: - semId: d7fcbee31ef0a85d5f973bda1b0b8c9e7efbcbc5572577382cacd3bdb4218a01 - required: true - multiple: false - terms: - semId: 5b8bc7543832054a1d22be94226be7538b133a26881cba4613027878e05c6cf7 - required: true - multiple: false - assignments: - assetOwner: - ownedState: amount - public: false - required: true - multiple: true - valencies: {} - genesis: - modifier: abstract - metadata: [] - globals: - issuedSupply: once - spec: once - terms: once - assignments: - assetOwner: onceOrMore - valencies: [] - errors: - - issuedMismatch - transitions: - transfer: - modifier: abstract - optional: false - metadata: [] - globals: {} - inputs: - assetOwner: onceOrMore - assignments: - assetOwner: onceOrMore - valencies: [] - errors: - - nonEqualAmounts - defaultAssignment: assetOwner - extensions: {} - defaultOperation: transfer - errors: - issuedMismatch: supply specified as a global parameter doesn't match the issued supply allocated to the asset owners - nonEqualAmounts: the sum of spent assets doesn't equal to the sum of assets in outputs - developer: ssi:LZS1ux-gjD9nXPF-OcetUUkW-6r3uSCS6-aQhs9W5f-8JE7w - : version: v1 - schemaId: rgb:sch:RDYhMTR!9gv8Y2GLv9UNBEK1hcrCmdLDFk9Qd5fnO8k#brave-dinner-banana - ifaceId: rgb:ifc:$iUnO9aO-1xhqUd6-1Jm5S5!-wM3ngby-5GVEylQ-ZTAMYDk#tornado-pioneer-bucket - timestamp: 1713343888 - metadata: [] - globalState: - - id: 2000 - name: spec - reserved: null - - id: 2001 - name: terms - reserved: null - - id: 2010 - name: issuedSupply - reserved: null - assignments: - - id: 4000 - name: assetOwner - reserved: null - valencies: [] - transitions: - - id: 10000 - name: transfer - reserved: null - extensions: [] - errors: - - id: 0 - name: nonEqualAmounts - reserved: null - - id: 1 - name: issuedMismatch - reserved: null - developer: ssi:LZS1ux-gjD9nXPF-OcetUUkW-6r3uSCS6-aQhs9W5f-8JE7w -supplements: [] -types: - 0af65fd62581de85cbd14e23e2db9a92bbef8b7974ffe1b50c4c74db8f86e751: !List - - 5f5e26e5c5053c1b4544515bc6a0653da02a0791fb31116d71a4fad916e15355 - - min: 0 - max: 7 - 18cb946f1293cf180e9d78dcc65bc59b472ffffeadfbf58db198cc8328f64b01: !Tuple - - 560d96f7a47924b2c3df040e6463398fd65fd591652c294342bfa5f939155154 - 1cabbfc3d826c0bfd1e9770a889efacc8b6716ad014a3eec10b6591530229042: !Primitive 64 - 1cb0758e14c2008c0f008ce6d2d41e9e1937e1cd0f9914c59a7e29e1ce7ba0bb: !Tuple - - ccc272928f793803d91f5dad8d51cc986b4332380f9224f7c7c1514d768ebb90 - 2a5baaac5089ff098d150b482cfed8bcd01a91c0d7b45d32216ed576ab71ebdd: !Array - - 1cabbfc3d826c0bfd1e9770a889efacc8b6716ad014a3eec10b6591530229042 - - 32 - 2fd8f27a172712903e6a3e96f0f85c0480b4211a17acd13059fc51d4a4bbde2c: !Union - ? name: none - tag: 0 - : d83fbee02f0de5b46cf80fe11ef7fdf061c78d975d31ade9eea2bc4099339e6c - ? name: some - tag: 1 - : b070d38ff6d20c5ae5d80715ca31541d5a52bbdecbd3529d38e6ddb672200997 - 3cd1a29dccad9b917b26305f89a8a4fb2118302a4e73c5ac0a780de6ab005e73: !Enum - - name: excl - tag: 33 - - name: hash - tag: 35 - - name: dollar - tag: 36 - - name: amp - tag: 38 - - name: plus - tag: 43 - - name: dash - tag: 45 - - name: dot - tag: 46 - - name: zero - tag: 48 - - name: one - tag: 49 - - name: two - tag: 50 - - name: three - tag: 51 - - name: four - tag: 52 - - name: five - tag: 53 - - name: six - tag: 54 - - name: seven - tag: 55 - - name: eight - tag: 56 - - name: nine - tag: 57 - - name: caret - tag: 94 - - name: lodash - tag: 95 - - name: a - tag: 97 - - name: b - tag: 98 - - name: c - tag: 99 - - name: d - tag: 100 - - name: e - tag: 101 - - name: f - tag: 102 - - name: g - tag: 103 - - name: h - tag: 104 - - name: i - tag: 105 - - name: j - tag: 106 - - name: k - tag: 107 - - name: l - tag: 108 - - name: m - tag: 109 - - name: n - tag: 110 - - name: o - tag: 111 - - name: p - tag: 112 - - name: q - tag: 113 - - name: r - tag: 114 - - name: s - tag: 115 - - name: t - tag: 116 - - name: u - tag: 117 - - name: v - tag: 118 - - name: w - tag: 119 - - name: x - tag: 120 - - name: y - tag: 121 - - name: z - tag: 122 - 3f2b72b7c4af1a630cb6d3ff088baf351093ee465b9e7d472a610082e449d7e4: !Tuple - - 63aa2314e8b147c8b284dfb39a9e10d19caad5faea848e3cb9849d9167d6344a - 43aa7fc5f6f5644fe5a2ae5e1aa99042cdeb879442e34c723ff5827fb133de8a: !Struct - - name: type - ty: b10ddefe8020add8a0ca08292150abb13c514d76de5168c1c97105a27e676660 - - name: digest - ty: 2a5baaac5089ff098d150b482cfed8bcd01a91c0d7b45d32216ed576ab71ebdd - 45b780258601c526b23b5b4861460a9050e13f35fbbe8305a8001157e4013888: !Union - ? name: none - tag: 0 - : d83fbee02f0de5b46cf80fe11ef7fdf061c78d975d31ade9eea2bc4099339e6c - ? name: some - tag: 1 - : caff8faeb38a00a04e3621538f8e61d75a85a465cb0a0e48c3593e7eaa6c5fc7 - 48be23172ae884459ae78334a0063f09fa0e317bea8b233ce782a38875e796b8: !Enum - - name: space - tag: 32 - - name: excl - tag: 33 - - name: quotes - tag: 34 - - name: hash - tag: 35 - - name: dollar - tag: 36 - - name: percent - tag: 37 - - name: ampersand - tag: 38 - - name: apostrophe - tag: 39 - - name: bracketL - tag: 40 - - name: bracketR - tag: 41 - - name: asterisk - tag: 42 - - name: plus - tag: 43 - - name: comma - tag: 44 - - name: minus - tag: 45 - - name: dot - tag: 46 - - name: slash - tag: 47 - - name: zero - tag: 48 - - name: one - tag: 49 - - name: two - tag: 50 - - name: three - tag: 51 - - name: four - tag: 52 - - name: five - tag: 53 - - name: six - tag: 54 - - name: seven - tag: 55 - - name: eight - tag: 56 - - name: nine - tag: 57 - - name: colon - tag: 58 - - name: semiColon - tag: 59 - - name: less - tag: 60 - - name: equal - tag: 61 - - name: greater - tag: 62 - - name: question - tag: 63 - - name: at - tag: 64 - - name: _A - tag: 65 - - name: _B - tag: 66 - - name: _C - tag: 67 - - name: _D - tag: 68 - - name: _E - tag: 69 - - name: _F - tag: 70 - - name: _G - tag: 71 - - name: _H - tag: 72 - - name: _I - tag: 73 - - name: _J - tag: 74 - - name: _K - tag: 75 - - name: _L - tag: 76 - - name: _M - tag: 77 - - name: _N - tag: 78 - - name: _O - tag: 79 - - name: _P - tag: 80 - - name: _Q - tag: 81 - - name: _R - tag: 82 - - name: _S - tag: 83 - - name: _T - tag: 84 - - name: _U - tag: 85 - - name: _V - tag: 86 - - name: _W - tag: 87 - - name: _X - tag: 88 - - name: _Y - tag: 89 - - name: _Z - tag: 90 - - name: sqBracketL - tag: 91 - - name: backSlash - tag: 92 - - name: sqBracketR - tag: 93 - - name: caret - tag: 94 - - name: lodash - tag: 95 - - name: backtick - tag: 96 - - name: a - tag: 97 - - name: b - tag: 98 - - name: c - tag: 99 - - name: d - tag: 100 - - name: e - tag: 101 - - name: f - tag: 102 - - name: g - tag: 103 - - name: h - tag: 104 - - name: i - tag: 105 - - name: j - tag: 106 - - name: k - tag: 107 - - name: l - tag: 108 - - name: m - tag: 109 - - name: n - tag: 110 - - name: o - tag: 111 - - name: p - tag: 112 - - name: q - tag: 113 - - name: r - tag: 114 - - name: s - tag: 115 - - name: t - tag: 116 - - name: u - tag: 117 - - name: v - tag: 118 - - name: w - tag: 119 - - name: x - tag: 120 - - name: y - tag: 121 - - name: z - tag: 122 - - name: cBracketL - tag: 123 - - name: pipe - tag: 124 - - name: cBracketR - tag: 125 - - name: tilde - tag: 126 - 560d96f7a47924b2c3df040e6463398fd65fd591652c294342bfa5f939155154: !List - - fba958721a3d335406b368c36f5a82790960cce239febcafe189ba9839d5da78 - - min: 0 - max: 65535 - 5b772c8eb15fd74700c79241f60f8fda37e736b3fd462ab017ce4d454efa81aa: !Tuple - - 5e5ec8924f73cd72c4225c96ab47796658ef1b729ca306e260bca42b25891d0f - 5b8bc7543832054a1d22be94226be7538b133a26881cba4613027878e05c6cf7: !Struct - - name: text - ty: 18cb946f1293cf180e9d78dcc65bc59b472ffffeadfbf58db198cc8328f64b01 - - name: media - ty: e087a83496338799afc48a9211683a427d2bd33e2ea7ebb8a8b880ea4ab4eb81 - 5ca149585de534ee91b3e3a030b7efd4cdb79abea9152f101f3759b4c7210e1f: !Primitive 8 - 5d03c4178da98e7e3f3af343e3997d74201d11f42732cfbea2b04b8e3ff15f22: !Enum - - name: indivisible - tag: 0 - - name: deci - tag: 1 - - name: centi - tag: 2 - - name: milli - tag: 3 - - name: deciMilli - tag: 4 - - name: centiMilli - tag: 5 - - name: micro - tag: 6 - - name: deciMicro - tag: 7 - - name: centiMicro - tag: 8 - - name: nano - tag: 9 - - name: deciNano - tag: 10 - - name: centiNano - tag: 11 - - name: pico - tag: 12 - - name: deciPico - tag: 13 - - name: centiPico - tag: 14 - - name: femto - tag: 15 - - name: deciFemto - tag: 16 - - name: centiFemto - tag: 17 - - name: atto - tag: 18 - 5e5ec8924f73cd72c4225c96ab47796658ef1b729ca306e260bca42b25891d0f: !Tuple - - 822380f475f0edb4b5dc517991de7390ada2dbb3752c4c066851aa01630296c2 - - 0af65fd62581de85cbd14e23e2db9a92bbef8b7974ffe1b50c4c74db8f86e751 - 5f5e26e5c5053c1b4544515bc6a0653da02a0791fb31116d71a4fad916e15355: !Enum - - name: zero - tag: 48 - - name: one - tag: 49 - - name: two - tag: 50 - - name: three - tag: 51 - - name: four - tag: 52 - - name: five - tag: 53 - - name: six - tag: 54 - - name: seven - tag: 55 - - name: eight - tag: 56 - - name: nine - tag: 57 - - name: _A - tag: 65 - - name: _B - tag: 66 - - name: _C - tag: 67 - - name: _D - tag: 68 - - name: _E - tag: 69 - - name: _F - tag: 70 - - name: _G - tag: 71 - - name: _H - tag: 72 - - name: _I - tag: 73 - - name: _J - tag: 74 - - name: _K - tag: 75 - - name: _L - tag: 76 - - name: _M - tag: 77 - - name: _N - tag: 78 - - name: _O - tag: 79 - - name: _P - tag: 80 - - name: _Q - tag: 81 - - name: _R - tag: 82 - - name: _S - tag: 83 - - name: _T - tag: 84 - - name: _U - tag: 85 - - name: _V - tag: 86 - - name: _W - tag: 87 - - name: _X - tag: 88 - - name: _Y - tag: 89 - - name: _Z - tag: 90 - - name: a - tag: 97 - - name: b - tag: 98 - - name: c - tag: 99 - - name: d - tag: 100 - - name: e - tag: 101 - - name: f - tag: 102 - - name: g - tag: 103 - - name: h - tag: 104 - - name: i - tag: 105 - - name: j - tag: 106 - - name: k - tag: 107 - - name: l - tag: 108 - - name: m - tag: 109 - - name: n - tag: 110 - - name: o - tag: 111 - - name: p - tag: 112 - - name: q - tag: 113 - - name: r - tag: 114 - - name: s - tag: 115 - - name: t - tag: 116 - - name: u - tag: 117 - - name: v - tag: 118 - - name: w - tag: 119 - - name: x - tag: 120 - - name: y - tag: 121 - - name: z - tag: 122 - 63aa2314e8b147c8b284dfb39a9e10d19caad5faea848e3cb9849d9167d6344a: !List - - fba958721a3d335406b368c36f5a82790960cce239febcafe189ba9839d5da78 - - min: 1 - max: 255 - 805ec5bc5312c84190445da16aa1c08a09e300e8323acfae6a23420a29ad003d: !Tuple - - c43a7d9eb9b3027973c98f5dd6e1ac04f5cbd34240c0bebc0a0fb808140094d4 - 822380f475f0edb4b5dc517991de7390ada2dbb3752c4c066851aa01630296c2: !Enum - - name: _A - tag: 65 - - name: _B - tag: 66 - - name: _C - tag: 67 - - name: _D - tag: 68 - - name: _E - tag: 69 - - name: _F - tag: 70 - - name: _G - tag: 71 - - name: _H - tag: 72 - - name: _I - tag: 73 - - name: _J - tag: 74 - - name: _K - tag: 75 - - name: _L - tag: 76 - - name: _M - tag: 77 - - name: _N - tag: 78 - - name: _O - tag: 79 - - name: _P - tag: 80 - - name: _Q - tag: 81 - - name: _R - tag: 82 - - name: _S - tag: 83 - - name: _T - tag: 84 - - name: _U - tag: 85 - - name: _V - tag: 86 - - name: _W - tag: 87 - - name: _X - tag: 88 - - name: _Y - tag: 89 - - name: _Z - tag: 90 - - name: a - tag: 97 - - name: b - tag: 98 - - name: c - tag: 99 - - name: d - tag: 100 - - name: e - tag: 101 - - name: f - tag: 102 - - name: g - tag: 103 - - name: h - tag: 104 - - name: i - tag: 105 - - name: j - tag: 106 - - name: k - tag: 107 - - name: l - tag: 108 - - name: m - tag: 109 - - name: n - tag: 110 - - name: o - tag: 111 - - name: p - tag: 112 - - name: q - tag: 113 - - name: r - tag: 114 - - name: s - tag: 115 - - name: t - tag: 116 - - name: u - tag: 117 - - name: v - tag: 118 - - name: w - tag: 119 - - name: x - tag: 120 - - name: y - tag: 121 - - name: z - tag: 122 - 888c5865633af13b95b7cd1a8d8af2dac1dc140b977251d9d4daf3c7511c8e84: !Tuple - - 5ca149585de534ee91b3e3a030b7efd4cdb79abea9152f101f3759b4c7210e1f - b070d38ff6d20c5ae5d80715ca31541d5a52bbdecbd3529d38e6ddb672200997: !Tuple - - 1cb0758e14c2008c0f008ce6d2d41e9e1937e1cd0f9914c59a7e29e1ce7ba0bb - b10ddefe8020add8a0ca08292150abb13c514d76de5168c1c97105a27e676660: !Struct - - name: type - ty: 1cb0758e14c2008c0f008ce6d2d41e9e1937e1cd0f9914c59a7e29e1ce7ba0bb - - name: subtype - ty: 2fd8f27a172712903e6a3e96f0f85c0480b4211a17acd13059fc51d4a4bbde2c - - name: charset - ty: 2fd8f27a172712903e6a3e96f0f85c0480b4211a17acd13059fc51d4a4bbde2c - bf8fcbe9c5395731a6b4cd61fb00dfe7a5d629365339c55aeae087a3b90aaa46: !List - - 3cd1a29dccad9b917b26305f89a8a4fb2118302a4e73c5ac0a780de6ab005e73 - - min: 0 - max: 63 - c43a7d9eb9b3027973c98f5dd6e1ac04f5cbd34240c0bebc0a0fb808140094d4: !Tuple - - 48be23172ae884459ae78334a0063f09fa0e317bea8b233ce782a38875e796b8 - - f5ad172144ccd2dd62ece74ff0fb14641d936a80c1a0c93ebf97727184897cbc - caff8faeb38a00a04e3621538f8e61d75a85a465cb0a0e48c3593e7eaa6c5fc7: !Tuple - - 3f2b72b7c4af1a630cb6d3ff088baf351093ee465b9e7d472a610082e449d7e4 - ccc272928f793803d91f5dad8d51cc986b4332380f9224f7c7c1514d768ebb90: !Tuple - - f9170804ddae0479f8d5af74ab3bd202e6ea4172d9a9b93707151adb7fc40ca1 - - bf8fcbe9c5395731a6b4cd61fb00dfe7a5d629365339c55aeae087a3b90aaa46 - d7fcbee31ef0a85d5f973bda1b0b8c9e7efbcbc5572577382cacd3bdb4218a01: !Struct - - name: ticker - ty: 5b772c8eb15fd74700c79241f60f8fda37e736b3fd462ab017ce4d454efa81aa - - name: name - ty: 805ec5bc5312c84190445da16aa1c08a09e300e8323acfae6a23420a29ad003d - - name: details - ty: 45b780258601c526b23b5b4861460a9050e13f35fbbe8305a8001157e4013888 - - name: precision - ty: 5d03c4178da98e7e3f3af343e3997d74201d11f42732cfbea2b04b8e3ff15f22 - d83fbee02f0de5b46cf80fe11ef7fdf061c78d975d31ade9eea2bc4099339e6c: !Primitive 0 - dc1e2f52567f725fd730ad84867f0da4c9ba9af0813311dfe4ef3e3c4a612548: !Tuple - - 43aa7fc5f6f5644fe5a2ae5e1aa99042cdeb879442e34c723ff5827fb133de8a - e087a83496338799afc48a9211683a427d2bd33e2ea7ebb8a8b880ea4ab4eb81: !Union - ? name: none - tag: 0 - : d83fbee02f0de5b46cf80fe11ef7fdf061c78d975d31ade9eea2bc4099339e6c - ? name: some - tag: 1 - : dc1e2f52567f725fd730ad84867f0da4c9ba9af0813311dfe4ef3e3c4a612548 - f5ad172144ccd2dd62ece74ff0fb14641d936a80c1a0c93ebf97727184897cbc: !List - - 48be23172ae884459ae78334a0063f09fa0e317bea8b233ce782a38875e796b8 - - min: 0 - max: 39 - f9170804ddae0479f8d5af74ab3bd202e6ea4172d9a9b93707151adb7fc40ca1: !Enum - - name: a - tag: 97 - - name: b - tag: 98 - - name: c - tag: 99 - - name: d - tag: 100 - - name: e - tag: 101 - - name: f - tag: 102 - - name: g - tag: 103 - - name: h - tag: 104 - - name: i - tag: 105 - - name: j - tag: 106 - - name: k - tag: 107 - - name: l - tag: 108 - - name: m - tag: 109 - - name: n - tag: 110 - - name: o - tag: 111 - - name: p - tag: 112 - - name: q - tag: 113 - - name: r - tag: 114 - - name: s - tag: 115 - - name: t - tag: 116 - - name: u - tag: 117 - - name: v - tag: 118 - - name: w - tag: 119 - - name: x - tag: 120 - - name: y - tag: 121 - - name: z - tag: 122 - fba958721a3d335406b368c36f5a82790960cce239febcafe189ba9839d5da78: UnicodeChar -scripts: -- isae: - - ALU - - BPDIGEST - - RGB - code: - - 11 - - 0 - - 0 - - 0 - - 208 - - 160 - - 15 - - 1 - - 7 - - 11 - - 0 - - 1 - - 0 - - 11 - - 8 - - 0 - - 0 - - 11 - - 1 - - 2 - - 0 - - 200 - - 218 - - 7 - - 1 - - 57 - - 48 - - 0 - - 209 - - 160 - - 15 - - 1 - - 7 - data: - - 0 - - 1 - - 0 - - 0 - libs: [] -attachments: {} -signatures: {} diff --git a/tests/fixtures/attack_resolver_error.yaml b/tests/fixtures/attack_resolver_error.yaml deleted file mode 100644 index 00f696b..0000000 --- a/tests/fixtures/attack_resolver_error.yaml +++ /dev/null @@ -1,1127 +0,0 @@ -version: v2 -transfer: true -terminals: - 3bb2645029b3de98be6c3ed5ce3332b8591f59c693146a007b75db5cfdb7c7b8: - chain: bitcoin - data: e1c963ea4a2d4e21f870c713a76d0397a0cc197aece1f53a66ae9febf122bb50 -genesis: - ffv: 0 - schemaId: rgb:sch:RDYhMTR!9gv8Y2GLv9UNBEK1hcrCmdLDFk9Qd5fnO8k#brave-dinner-banana - flags: null - timestamp: 1728925859 - issuer: ssi:anonymous - testnet: true - altLayers1: [] - assetTags: - 4000: 603a2b302aac8d1cd7c8adc3acd72f31ce652128f96218fa5b519fd5e9930f6d - metadata: {} - globals: - 2000: - - 074e494154434b520e4e4941206173736574206e616d650002 - 2001: - - 09004e4941207465726d7300 - 2010: - - 9a02000000000000 - assignments: - 4000: - type: fungible - items: - - seal: - chain: bitcoin - data: - method: opretFirst - txid: 22f0538e189f32922e55daf6fa0b7120bc01de8520a9a4c80655fdaf70272ac0 - vout: 1 - blinding: 7704601239148887312 - state: - value: 666 - blinding: 7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e - tag: 603a2b302aac8d1cd7c8adc3acd72f31ce652128f96218fa5b519fd5e9930f6d - lock: null - valencies: [] - validator: null -extensions: [] -bundles: -- pubWitness: - chain: bitcoin - data: !txid - d077ea7e3a55a215893a18e82cb03fda0f50619893e4aee0ba70b014e6d63248 - anchoredBundles: !opret - mpcProof: - pos: 1 - cofactor: 1 - path: - - 0d4042fb3c309aa40bff3159cee3a0ca87c4efc804a5347aa1a363d7244a88f7 - - e56d0e3dbadefb489899917dbc2e1dbf0c49c3ff155e178ef52feab2f351fc7c - - 4edc7f8808488b46c10bedf910818a9afbe2512c1f08a436a7b3db244f22ac85 - dbcProof: null - bundle: - closeMethod: opretFirst - inputMap: - 0: 9b50df314989fe006013a96d2ded4b508e5f32ef2b29e7245abfb3d9a35888e3 - knownTransitions: - 9b50df314989fe006013a96d2ded4b508e5f32ef2b29e7245abfb3d9a35888e3: - ffv: 0 - contractId: rgb:JgunSMvZ-VCH4cfz-qW1qNyp-VO2a9f7-UYT3vN1-mjO$Ebg - nonce: 18446744073709551615 - transitionType: 10000 - metadata: {} - globals: {} - inputs: - - prevOut: - op: fb58c747eec9c44a05ec907ec9d14e0e72572f75db0a3f9aa47f0673702e760e - ty: 4000 - no: 0 - assignments: - 4000: - type: fungible - items: - - seal: - chain: bitcoin - data: - method: opretFirst - txid: null - vout: 0 - blinding: 10251942175724995735 - state: - value: 616 - blinding: 361c123b494b218e332794a2390dc6d5cc7c332f64cf8764b6dfb3e04e56c9fc - tag: 603a2b302aac8d1cd7c8adc3acd72f31ce652128f96218fa5b519fd5e9930f6d - lock: null - - seal: - chain: bitcoin - data: 108b3912eb0b836427f235bafe449f3153c2aae08887b948a3d8529f17b19b95 - state: - value: 50 - blinding: 48626c4335335cf04b56e9dc4570b7a8b2024b4f19aef719c79eca9e3027b482 - tag: 603a2b302aac8d1cd7c8adc3acd72f31ce652128f96218fa5b519fd5e9930f6d - lock: null - valencies: [] - validator: null - witness: null -- pubWitness: - chain: bitcoin - data: !tx - version: 2 - inputs: - - prevOutput: 22f0538e189f32922e55daf6fa0b7120bc01de8520a9a4c80655fdaf70272ac0:1 - sigScript: '' - sequence: 0 - witness: [] - outputs: - - value: 99999600 - scriptPubkey: 00141d66111f9daca8769c3ab2b0fe14354b6198b29c - - value: 0 - scriptPubkey: 6a20a02ab7dd75b9911b540419440ebe8f5be0742f76fd9fdaf5e69ebb30f38d3f11 - lockTime: 0 - anchoredBundles: !opret - mpcProof: - pos: 1 - cofactor: 1 - path: - - 0ae6caac7df078206a7af28b0a885098f743d49b92cdb3485558b804492a5be5 - - 843d661f6822486889697a7446a6a9bd1e123921c6dafdde687140cf863a9403 - - 040c8d2b550cc8f3bd210535dbf482f91e7fe62989168c1ed87eebf2b4f35be3 - dbcProof: null - bundle: - closeMethod: opretFirst - inputMap: - 0: fb58c747eec9c44a05ec907ec9d14e0e72572f75db0a3f9aa47f0673702e760e - knownTransitions: - fb58c747eec9c44a05ec907ec9d14e0e72572f75db0a3f9aa47f0673702e760e: - ffv: 0 - contractId: rgb:JgunSMvZ-VCH4cfz-qW1qNyp-VO2a9f7-UYT3vN1-mjO$Ebg - nonce: 18446744073709551615 - transitionType: 65535 - metadata: {} - globals: {} - inputs: - - prevOut: - op: 260ba748cbd95421f871fcea5b5a8dca954ed9af5fed4613def3759a33bf11b8 - ty: 4000 - no: 0 - assignments: - 4000: - type: fungible - items: - - seal: - chain: bitcoin - data: - method: opretFirst - txid: null - vout: 0 - blinding: 7687739675014878388 - state: - value: 666 - blinding: 7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e - tag: 603a2b302aac8d1cd7c8adc3acd72f31ce652128f96218fa5b519fd5e9930f6d - lock: null - valencies: [] - validator: null - witness: null -- pubWitness: - chain: bitcoin - data: !tx - version: 2 - inputs: - - prevOutput: d077ea7e3a55a215893a18e82cb03fda0f50619893e4aee0ba70b014e6d63248:0 - sigScript: '' - sequence: 0 - witness: [] - outputs: - - value: 99998800 - scriptPubkey: 00146ab6fe162c087a01a717d2b6d4bbef87829cec24 - - value: 0 - scriptPubkey: 6a2088b706bf16e225b5d438f48c8c1abc544e807bb7fb99e6fc8ca460d4de62d1b0 - lockTime: 0 - anchoredBundles: !opret - mpcProof: - pos: 1 - cofactor: 1 - path: - - 91246094600e4cae70d42147330754f25ef710118c7bc3aa963b1a8900125b83 - - 58bb69c807310413032dd30a245738b48f1a5cb8645f55b8f089489ae16b0533 - - 500d82630b8bb4a1bcb8973500acae7114dc0d5ef77b748a60b4d93aa9375ca1 - dbcProof: null - bundle: - closeMethod: opretFirst - inputMap: - 0: c04da8609a2a8ddf7e0e9847f4ebd6758b1091bceeda10094b24352c97840ea2 - knownTransitions: - c04da8609a2a8ddf7e0e9847f4ebd6758b1091bceeda10094b24352c97840ea2: - ffv: 0 - contractId: rgb:JgunSMvZ-VCH4cfz-qW1qNyp-VO2a9f7-UYT3vN1-mjO$Ebg - nonce: 18446744073709551615 - transitionType: 10000 - metadata: {} - globals: {} - inputs: - - prevOut: - op: 9b50df314989fe006013a96d2ded4b508e5f32ef2b29e7245abfb3d9a35888e3 - ty: 4000 - no: 0 - assignments: - 4000: - type: fungible - items: - - seal: - chain: bitcoin - data: - method: opretFirst - txid: null - vout: 0 - blinding: 9888072140771099372 - state: - value: 539 - blinding: ae89403cecbdb782ddba50b592d9590bb664bb3d4dc9f7772f7c6611f4755345 - tag: 603a2b302aac8d1cd7c8adc3acd72f31ce652128f96218fa5b519fd5e9930f6d - lock: null - - seal: - chain: bitcoin - data: e1c963ea4a2d4e21f870c713a76d0397a0cc197aece1f53a66ae9febf122bb50 - state: - value: 77 - blinding: 8792d1fe5c8d6a0b556d43eca6346dc8d0c654d8c64e30294735ac5b2a17b7f8 - tag: 603a2b302aac8d1cd7c8adc3acd72f31ce652128f96218fa5b519fd5e9930f6d - lock: null - valencies: [] - validator: null - witness: null -schema: - ffv: 0 - flags: null - name: NonInflatableAsset - timestamp: 1713343888 - developer: ssi:LZS1ux-gjD9nXPF-OcetUUkW-6r3uSCS6-aQhs9W5f-8JE7w - metaTypes: {} - globalTypes: - 2000: - reserved: null - semId: d7fcbee31ef0a85d5f973bda1b0b8c9e7efbcbc5572577382cacd3bdb4218a01 - maxItems: 1 - 2001: - reserved: null - semId: 5b8bc7543832054a1d22be94226be7538b133a26881cba4613027878e05c6cf7 - maxItems: 1 - 2010: - reserved: null - semId: 888c5865633af13b95b7cd1a8d8af2dac1dc140b977251d9d4daf3c7511c8e84 - maxItems: 1 - ownedTypes: - 4000: !fungible unsigned64Bit - valencyTypes: [] - genesis: - metadata: [] - globals: - 2000: once - 2001: once - 2010: once - assignments: - 4000: onceOrMore - valencies: [] - validator: - lib: abf099d28bed50df5e065715327f3a9b329f777cb0b9fefff634c193a03cb626 - pos: 9 - extensions: {} - transitions: - 10000: - metadata: [] - globals: {} - inputs: - 4000: onceOrMore - assignments: - 4000: onceOrMore - valencies: [] - validator: - lib: abf099d28bed50df5e065715327f3a9b329f777cb0b9fefff634c193a03cb626 - pos: 0 - reserved: null -ifaces: - ? version: v1 - name: RGB20Fixed - inherits: - - rgb:ifc:Vk9c4$Ny-Fv0J6tg-pDF05CE-312oCWh-fENNuia-GYbEu18#adios-alert-never - - rgb:ifc:13N6PRwT-T68!FGY-lBwX2cm-qesgJ11-j0nQkM1-WSCJFj4#ariel-gizmo-evita - - rgb:ifc:naFrAfgG-Kfu$A!c-3L!bC$4-s1LWJQV-4Iv!62u-4B3ab8Y#mailbox-dialog-iron - - rgb:ifc:w3Lk9Mt3-gKt$n5y-TYpVGg0-IDpK0p9-sHQ!hb6-m2Qr3a0#unicorn-reward-ladder - timestamp: 1711405444 - metadata: {} - globalState: - issuedSupply: - semId: 888c5865633af13b95b7cd1a8d8af2dac1dc140b977251d9d4daf3c7511c8e84 - required: true - multiple: false - spec: - semId: d7fcbee31ef0a85d5f973bda1b0b8c9e7efbcbc5572577382cacd3bdb4218a01 - required: true - multiple: false - terms: - semId: 5b8bc7543832054a1d22be94226be7538b133a26881cba4613027878e05c6cf7 - required: true - multiple: false - assignments: - assetOwner: - ownedState: amount - public: false - required: true - multiple: true - valencies: {} - genesis: - modifier: abstract - metadata: [] - globals: - issuedSupply: once - spec: once - terms: once - assignments: - assetOwner: onceOrMore - valencies: [] - errors: - - issuedMismatch - transitions: - transfer: - modifier: abstract - optional: false - metadata: [] - globals: {} - inputs: - assetOwner: onceOrMore - assignments: - assetOwner: onceOrMore - valencies: [] - errors: - - nonEqualAmounts - defaultAssignment: assetOwner - extensions: {} - defaultOperation: transfer - errors: - issuedMismatch: supply specified as a global parameter doesn't match the issued supply allocated to the asset owners - nonEqualAmounts: the sum of spent assets doesn't equal to the sum of assets in outputs - developer: ssi:LZS1ux-gjD9nXPF-OcetUUkW-6r3uSCS6-aQhs9W5f-8JE7w - : version: v1 - schemaId: rgb:sch:RDYhMTR!9gv8Y2GLv9UNBEK1hcrCmdLDFk9Qd5fnO8k#brave-dinner-banana - ifaceId: rgb:ifc:$iUnO9aO-1xhqUd6-1Jm5S5!-wM3ngby-5GVEylQ-ZTAMYDk#tornado-pioneer-bucket - timestamp: 1713343888 - metadata: [] - globalState: - - id: 2000 - name: spec - reserved: null - - id: 2001 - name: terms - reserved: null - - id: 2010 - name: issuedSupply - reserved: null - assignments: - - id: 4000 - name: assetOwner - reserved: null - valencies: [] - transitions: - - id: 10000 - name: transfer - reserved: null - extensions: [] - errors: - - id: 0 - name: nonEqualAmounts - reserved: null - - id: 1 - name: issuedMismatch - reserved: null - developer: ssi:LZS1ux-gjD9nXPF-OcetUUkW-6r3uSCS6-aQhs9W5f-8JE7w -supplements: [] -types: - 0af65fd62581de85cbd14e23e2db9a92bbef8b7974ffe1b50c4c74db8f86e751: !List - - 5f5e26e5c5053c1b4544515bc6a0653da02a0791fb31116d71a4fad916e15355 - - min: 0 - max: 7 - 18cb946f1293cf180e9d78dcc65bc59b472ffffeadfbf58db198cc8328f64b01: !Tuple - - 560d96f7a47924b2c3df040e6463398fd65fd591652c294342bfa5f939155154 - 1cabbfc3d826c0bfd1e9770a889efacc8b6716ad014a3eec10b6591530229042: !Primitive 64 - 1cb0758e14c2008c0f008ce6d2d41e9e1937e1cd0f9914c59a7e29e1ce7ba0bb: !Tuple - - ccc272928f793803d91f5dad8d51cc986b4332380f9224f7c7c1514d768ebb90 - 2a5baaac5089ff098d150b482cfed8bcd01a91c0d7b45d32216ed576ab71ebdd: !Array - - 1cabbfc3d826c0bfd1e9770a889efacc8b6716ad014a3eec10b6591530229042 - - 32 - 2fd8f27a172712903e6a3e96f0f85c0480b4211a17acd13059fc51d4a4bbde2c: !Union - ? name: none - tag: 0 - : d83fbee02f0de5b46cf80fe11ef7fdf061c78d975d31ade9eea2bc4099339e6c - ? name: some - tag: 1 - : b070d38ff6d20c5ae5d80715ca31541d5a52bbdecbd3529d38e6ddb672200997 - 3cd1a29dccad9b917b26305f89a8a4fb2118302a4e73c5ac0a780de6ab005e73: !Enum - - name: excl - tag: 33 - - name: hash - tag: 35 - - name: dollar - tag: 36 - - name: amp - tag: 38 - - name: plus - tag: 43 - - name: dash - tag: 45 - - name: dot - tag: 46 - - name: zero - tag: 48 - - name: one - tag: 49 - - name: two - tag: 50 - - name: three - tag: 51 - - name: four - tag: 52 - - name: five - tag: 53 - - name: six - tag: 54 - - name: seven - tag: 55 - - name: eight - tag: 56 - - name: nine - tag: 57 - - name: caret - tag: 94 - - name: lodash - tag: 95 - - name: a - tag: 97 - - name: b - tag: 98 - - name: c - tag: 99 - - name: d - tag: 100 - - name: e - tag: 101 - - name: f - tag: 102 - - name: g - tag: 103 - - name: h - tag: 104 - - name: i - tag: 105 - - name: j - tag: 106 - - name: k - tag: 107 - - name: l - tag: 108 - - name: m - tag: 109 - - name: n - tag: 110 - - name: o - tag: 111 - - name: p - tag: 112 - - name: q - tag: 113 - - name: r - tag: 114 - - name: s - tag: 115 - - name: t - tag: 116 - - name: u - tag: 117 - - name: v - tag: 118 - - name: w - tag: 119 - - name: x - tag: 120 - - name: y - tag: 121 - - name: z - tag: 122 - 3f2b72b7c4af1a630cb6d3ff088baf351093ee465b9e7d472a610082e449d7e4: !Tuple - - 63aa2314e8b147c8b284dfb39a9e10d19caad5faea848e3cb9849d9167d6344a - 43aa7fc5f6f5644fe5a2ae5e1aa99042cdeb879442e34c723ff5827fb133de8a: !Struct - - name: type - ty: b10ddefe8020add8a0ca08292150abb13c514d76de5168c1c97105a27e676660 - - name: digest - ty: 2a5baaac5089ff098d150b482cfed8bcd01a91c0d7b45d32216ed576ab71ebdd - 45b780258601c526b23b5b4861460a9050e13f35fbbe8305a8001157e4013888: !Union - ? name: none - tag: 0 - : d83fbee02f0de5b46cf80fe11ef7fdf061c78d975d31ade9eea2bc4099339e6c - ? name: some - tag: 1 - : caff8faeb38a00a04e3621538f8e61d75a85a465cb0a0e48c3593e7eaa6c5fc7 - 48be23172ae884459ae78334a0063f09fa0e317bea8b233ce782a38875e796b8: !Enum - - name: space - tag: 32 - - name: excl - tag: 33 - - name: quotes - tag: 34 - - name: hash - tag: 35 - - name: dollar - tag: 36 - - name: percent - tag: 37 - - name: ampersand - tag: 38 - - name: apostrophe - tag: 39 - - name: bracketL - tag: 40 - - name: bracketR - tag: 41 - - name: asterisk - tag: 42 - - name: plus - tag: 43 - - name: comma - tag: 44 - - name: minus - tag: 45 - - name: dot - tag: 46 - - name: slash - tag: 47 - - name: zero - tag: 48 - - name: one - tag: 49 - - name: two - tag: 50 - - name: three - tag: 51 - - name: four - tag: 52 - - name: five - tag: 53 - - name: six - tag: 54 - - name: seven - tag: 55 - - name: eight - tag: 56 - - name: nine - tag: 57 - - name: colon - tag: 58 - - name: semiColon - tag: 59 - - name: less - tag: 60 - - name: equal - tag: 61 - - name: greater - tag: 62 - - name: question - tag: 63 - - name: at - tag: 64 - - name: _A - tag: 65 - - name: _B - tag: 66 - - name: _C - tag: 67 - - name: _D - tag: 68 - - name: _E - tag: 69 - - name: _F - tag: 70 - - name: _G - tag: 71 - - name: _H - tag: 72 - - name: _I - tag: 73 - - name: _J - tag: 74 - - name: _K - tag: 75 - - name: _L - tag: 76 - - name: _M - tag: 77 - - name: _N - tag: 78 - - name: _O - tag: 79 - - name: _P - tag: 80 - - name: _Q - tag: 81 - - name: _R - tag: 82 - - name: _S - tag: 83 - - name: _T - tag: 84 - - name: _U - tag: 85 - - name: _V - tag: 86 - - name: _W - tag: 87 - - name: _X - tag: 88 - - name: _Y - tag: 89 - - name: _Z - tag: 90 - - name: sqBracketL - tag: 91 - - name: backSlash - tag: 92 - - name: sqBracketR - tag: 93 - - name: caret - tag: 94 - - name: lodash - tag: 95 - - name: backtick - tag: 96 - - name: a - tag: 97 - - name: b - tag: 98 - - name: c - tag: 99 - - name: d - tag: 100 - - name: e - tag: 101 - - name: f - tag: 102 - - name: g - tag: 103 - - name: h - tag: 104 - - name: i - tag: 105 - - name: j - tag: 106 - - name: k - tag: 107 - - name: l - tag: 108 - - name: m - tag: 109 - - name: n - tag: 110 - - name: o - tag: 111 - - name: p - tag: 112 - - name: q - tag: 113 - - name: r - tag: 114 - - name: s - tag: 115 - - name: t - tag: 116 - - name: u - tag: 117 - - name: v - tag: 118 - - name: w - tag: 119 - - name: x - tag: 120 - - name: y - tag: 121 - - name: z - tag: 122 - - name: cBracketL - tag: 123 - - name: pipe - tag: 124 - - name: cBracketR - tag: 125 - - name: tilde - tag: 126 - 560d96f7a47924b2c3df040e6463398fd65fd591652c294342bfa5f939155154: !List - - fba958721a3d335406b368c36f5a82790960cce239febcafe189ba9839d5da78 - - min: 0 - max: 65535 - 5b772c8eb15fd74700c79241f60f8fda37e736b3fd462ab017ce4d454efa81aa: !Tuple - - 5e5ec8924f73cd72c4225c96ab47796658ef1b729ca306e260bca42b25891d0f - 5b8bc7543832054a1d22be94226be7538b133a26881cba4613027878e05c6cf7: !Struct - - name: text - ty: 18cb946f1293cf180e9d78dcc65bc59b472ffffeadfbf58db198cc8328f64b01 - - name: media - ty: e087a83496338799afc48a9211683a427d2bd33e2ea7ebb8a8b880ea4ab4eb81 - 5ca149585de534ee91b3e3a030b7efd4cdb79abea9152f101f3759b4c7210e1f: !Primitive 8 - 5d03c4178da98e7e3f3af343e3997d74201d11f42732cfbea2b04b8e3ff15f22: !Enum - - name: indivisible - tag: 0 - - name: deci - tag: 1 - - name: centi - tag: 2 - - name: milli - tag: 3 - - name: deciMilli - tag: 4 - - name: centiMilli - tag: 5 - - name: micro - tag: 6 - - name: deciMicro - tag: 7 - - name: centiMicro - tag: 8 - - name: nano - tag: 9 - - name: deciNano - tag: 10 - - name: centiNano - tag: 11 - - name: pico - tag: 12 - - name: deciPico - tag: 13 - - name: centiPico - tag: 14 - - name: femto - tag: 15 - - name: deciFemto - tag: 16 - - name: centiFemto - tag: 17 - - name: atto - tag: 18 - 5e5ec8924f73cd72c4225c96ab47796658ef1b729ca306e260bca42b25891d0f: !Tuple - - 822380f475f0edb4b5dc517991de7390ada2dbb3752c4c066851aa01630296c2 - - 0af65fd62581de85cbd14e23e2db9a92bbef8b7974ffe1b50c4c74db8f86e751 - 5f5e26e5c5053c1b4544515bc6a0653da02a0791fb31116d71a4fad916e15355: !Enum - - name: zero - tag: 48 - - name: one - tag: 49 - - name: two - tag: 50 - - name: three - tag: 51 - - name: four - tag: 52 - - name: five - tag: 53 - - name: six - tag: 54 - - name: seven - tag: 55 - - name: eight - tag: 56 - - name: nine - tag: 57 - - name: _A - tag: 65 - - name: _B - tag: 66 - - name: _C - tag: 67 - - name: _D - tag: 68 - - name: _E - tag: 69 - - name: _F - tag: 70 - - name: _G - tag: 71 - - name: _H - tag: 72 - - name: _I - tag: 73 - - name: _J - tag: 74 - - name: _K - tag: 75 - - name: _L - tag: 76 - - name: _M - tag: 77 - - name: _N - tag: 78 - - name: _O - tag: 79 - - name: _P - tag: 80 - - name: _Q - tag: 81 - - name: _R - tag: 82 - - name: _S - tag: 83 - - name: _T - tag: 84 - - name: _U - tag: 85 - - name: _V - tag: 86 - - name: _W - tag: 87 - - name: _X - tag: 88 - - name: _Y - tag: 89 - - name: _Z - tag: 90 - - name: a - tag: 97 - - name: b - tag: 98 - - name: c - tag: 99 - - name: d - tag: 100 - - name: e - tag: 101 - - name: f - tag: 102 - - name: g - tag: 103 - - name: h - tag: 104 - - name: i - tag: 105 - - name: j - tag: 106 - - name: k - tag: 107 - - name: l - tag: 108 - - name: m - tag: 109 - - name: n - tag: 110 - - name: o - tag: 111 - - name: p - tag: 112 - - name: q - tag: 113 - - name: r - tag: 114 - - name: s - tag: 115 - - name: t - tag: 116 - - name: u - tag: 117 - - name: v - tag: 118 - - name: w - tag: 119 - - name: x - tag: 120 - - name: y - tag: 121 - - name: z - tag: 122 - 63aa2314e8b147c8b284dfb39a9e10d19caad5faea848e3cb9849d9167d6344a: !List - - fba958721a3d335406b368c36f5a82790960cce239febcafe189ba9839d5da78 - - min: 1 - max: 255 - 805ec5bc5312c84190445da16aa1c08a09e300e8323acfae6a23420a29ad003d: !Tuple - - c43a7d9eb9b3027973c98f5dd6e1ac04f5cbd34240c0bebc0a0fb808140094d4 - 822380f475f0edb4b5dc517991de7390ada2dbb3752c4c066851aa01630296c2: !Enum - - name: _A - tag: 65 - - name: _B - tag: 66 - - name: _C - tag: 67 - - name: _D - tag: 68 - - name: _E - tag: 69 - - name: _F - tag: 70 - - name: _G - tag: 71 - - name: _H - tag: 72 - - name: _I - tag: 73 - - name: _J - tag: 74 - - name: _K - tag: 75 - - name: _L - tag: 76 - - name: _M - tag: 77 - - name: _N - tag: 78 - - name: _O - tag: 79 - - name: _P - tag: 80 - - name: _Q - tag: 81 - - name: _R - tag: 82 - - name: _S - tag: 83 - - name: _T - tag: 84 - - name: _U - tag: 85 - - name: _V - tag: 86 - - name: _W - tag: 87 - - name: _X - tag: 88 - - name: _Y - tag: 89 - - name: _Z - tag: 90 - - name: a - tag: 97 - - name: b - tag: 98 - - name: c - tag: 99 - - name: d - tag: 100 - - name: e - tag: 101 - - name: f - tag: 102 - - name: g - tag: 103 - - name: h - tag: 104 - - name: i - tag: 105 - - name: j - tag: 106 - - name: k - tag: 107 - - name: l - tag: 108 - - name: m - tag: 109 - - name: n - tag: 110 - - name: o - tag: 111 - - name: p - tag: 112 - - name: q - tag: 113 - - name: r - tag: 114 - - name: s - tag: 115 - - name: t - tag: 116 - - name: u - tag: 117 - - name: v - tag: 118 - - name: w - tag: 119 - - name: x - tag: 120 - - name: y - tag: 121 - - name: z - tag: 122 - 888c5865633af13b95b7cd1a8d8af2dac1dc140b977251d9d4daf3c7511c8e84: !Tuple - - 5ca149585de534ee91b3e3a030b7efd4cdb79abea9152f101f3759b4c7210e1f - b070d38ff6d20c5ae5d80715ca31541d5a52bbdecbd3529d38e6ddb672200997: !Tuple - - 1cb0758e14c2008c0f008ce6d2d41e9e1937e1cd0f9914c59a7e29e1ce7ba0bb - b10ddefe8020add8a0ca08292150abb13c514d76de5168c1c97105a27e676660: !Struct - - name: type - ty: 1cb0758e14c2008c0f008ce6d2d41e9e1937e1cd0f9914c59a7e29e1ce7ba0bb - - name: subtype - ty: 2fd8f27a172712903e6a3e96f0f85c0480b4211a17acd13059fc51d4a4bbde2c - - name: charset - ty: 2fd8f27a172712903e6a3e96f0f85c0480b4211a17acd13059fc51d4a4bbde2c - bf8fcbe9c5395731a6b4cd61fb00dfe7a5d629365339c55aeae087a3b90aaa46: !List - - 3cd1a29dccad9b917b26305f89a8a4fb2118302a4e73c5ac0a780de6ab005e73 - - min: 0 - max: 63 - c43a7d9eb9b3027973c98f5dd6e1ac04f5cbd34240c0bebc0a0fb808140094d4: !Tuple - - 48be23172ae884459ae78334a0063f09fa0e317bea8b233ce782a38875e796b8 - - f5ad172144ccd2dd62ece74ff0fb14641d936a80c1a0c93ebf97727184897cbc - caff8faeb38a00a04e3621538f8e61d75a85a465cb0a0e48c3593e7eaa6c5fc7: !Tuple - - 3f2b72b7c4af1a630cb6d3ff088baf351093ee465b9e7d472a610082e449d7e4 - ccc272928f793803d91f5dad8d51cc986b4332380f9224f7c7c1514d768ebb90: !Tuple - - f9170804ddae0479f8d5af74ab3bd202e6ea4172d9a9b93707151adb7fc40ca1 - - bf8fcbe9c5395731a6b4cd61fb00dfe7a5d629365339c55aeae087a3b90aaa46 - d7fcbee31ef0a85d5f973bda1b0b8c9e7efbcbc5572577382cacd3bdb4218a01: !Struct - - name: ticker - ty: 5b772c8eb15fd74700c79241f60f8fda37e736b3fd462ab017ce4d454efa81aa - - name: name - ty: 805ec5bc5312c84190445da16aa1c08a09e300e8323acfae6a23420a29ad003d - - name: details - ty: 45b780258601c526b23b5b4861460a9050e13f35fbbe8305a8001157e4013888 - - name: precision - ty: 5d03c4178da98e7e3f3af343e3997d74201d11f42732cfbea2b04b8e3ff15f22 - d83fbee02f0de5b46cf80fe11ef7fdf061c78d975d31ade9eea2bc4099339e6c: !Primitive 0 - dc1e2f52567f725fd730ad84867f0da4c9ba9af0813311dfe4ef3e3c4a612548: !Tuple - - 43aa7fc5f6f5644fe5a2ae5e1aa99042cdeb879442e34c723ff5827fb133de8a - e087a83496338799afc48a9211683a427d2bd33e2ea7ebb8a8b880ea4ab4eb81: !Union - ? name: none - tag: 0 - : d83fbee02f0de5b46cf80fe11ef7fdf061c78d975d31ade9eea2bc4099339e6c - ? name: some - tag: 1 - : dc1e2f52567f725fd730ad84867f0da4c9ba9af0813311dfe4ef3e3c4a612548 - f5ad172144ccd2dd62ece74ff0fb14641d936a80c1a0c93ebf97727184897cbc: !List - - 48be23172ae884459ae78334a0063f09fa0e317bea8b233ce782a38875e796b8 - - min: 0 - max: 39 - f9170804ddae0479f8d5af74ab3bd202e6ea4172d9a9b93707151adb7fc40ca1: !Enum - - name: a - tag: 97 - - name: b - tag: 98 - - name: c - tag: 99 - - name: d - tag: 100 - - name: e - tag: 101 - - name: f - tag: 102 - - name: g - tag: 103 - - name: h - tag: 104 - - name: i - tag: 105 - - name: j - tag: 106 - - name: k - tag: 107 - - name: l - tag: 108 - - name: m - tag: 109 - - name: n - tag: 110 - - name: o - tag: 111 - - name: p - tag: 112 - - name: q - tag: 113 - - name: r - tag: 114 - - name: s - tag: 115 - - name: t - tag: 116 - - name: u - tag: 117 - - name: v - tag: 118 - - name: w - tag: 119 - - name: x - tag: 120 - - name: y - tag: 121 - - name: z - tag: 122 - fba958721a3d335406b368c36f5a82790960cce239febcafe189ba9839d5da78: UnicodeChar -scripts: -- isae: - - ALU - - BPDIGEST - - RGB - code: - - 11 - - 0 - - 0 - - 0 - - 208 - - 160 - - 15 - - 1 - - 7 - - 11 - - 0 - - 1 - - 0 - - 11 - - 8 - - 0 - - 0 - - 11 - - 1 - - 2 - - 0 - - 200 - - 218 - - 7 - - 1 - - 57 - - 48 - - 0 - - 209 - - 160 - - 15 - - 1 - - 7 - data: - - 0 - - 1 - - 0 - - 0 - libs: [] -attachments: {} -signatures: {} diff --git a/tests/fixtures/bc_0bc3024ce6404cd7aea387debde687d9e8731228e16b04b4eefda7283069f1c3.yaml b/tests/fixtures/bc_0bc3024ce6404cd7aea387debde687d9e8731228e16b04b4eefda7283069f1c3.yaml deleted file mode 100644 index 4e1fb30..0000000 --- a/tests/fixtures/bc_0bc3024ce6404cd7aea387debde687d9e8731228e16b04b4eefda7283069f1c3.yaml +++ /dev/null @@ -1,16 +0,0 @@ -version: 2 -inputs: -- prevOutput: d84c37b6c6616184c454c815d970505bed9b3a3723a4445dd1289dc708bc80b3:1 - sigScript: '' - sequence: 0 - witness: - - 3044022031154900dd3db440c9d286fc6714ce73a63d3b70131fa61372dc830d63d8feb8022061376e25cc7e8850d0070d982092ecd1e715404b2185428a0950b24a410f98be01 - - 027884e03cdcf5f3ce603ff95bfa16d527d3078c7b48e31695a3d4ef6e552b175d -outputs: -- value: 9000 - scriptPubkey: 0014a39902b742ace887eeef8b91463f30893f777a12 -- value: 99971800 - scriptPubkey: 0014b63cbe65e66aaec213d9e25a2ff8cd4e4f3c47d0 -- value: 0 - scriptPubkey: 6a2036831c40589897909e67d439cba95004d53280635e2ca66b6e53da52551f957c -lockTime: 0 diff --git a/tests/fixtures/bc_3652d9fea802cb051f671455cbd7472e3bce2c440a4e54fa4321107037dfaff0.yaml b/tests/fixtures/bc_3652d9fea802cb051f671455cbd7472e3bce2c440a4e54fa4321107037dfaff0.yaml deleted file mode 100644 index e924c61..0000000 --- a/tests/fixtures/bc_3652d9fea802cb051f671455cbd7472e3bce2c440a4e54fa4321107037dfaff0.yaml +++ /dev/null @@ -1,14 +0,0 @@ -version: 2 -inputs: -- prevOutput: d077ea7e3a55a215893a18e82cb03fda0f50619893e4aee0ba70b014e6d63248:0 - sigScript: '' - sequence: 0 - witness: - - 3045022100980c27acde83d1583762873f8bb8b11ead3eb72831e0bb12b9f17b9445fc63fd0220528bb1fbe5ad8b0e7ab272e4648003f3ab235e24421e97d46adff70d280316c401 - - 02d40f2a8d89f52a92d1b2f1b1047bff2e00f6847dd4243a8adea0253cc3b94591 -outputs: -- value: 99998800 - scriptPubkey: 00146ab6fe162c087a01a717d2b6d4bbef87829cec24 -- value: 0 - scriptPubkey: 6a2088b706bf16e225b5d438f48c8c1abc544e807bb7fb99e6fc8ca460d4de62d1b0 -lockTime: 0 diff --git a/tests/fixtures/bc_a5c3085efe8dfdba0fa0e11d81bf90cdcac27c0af496c4de1a2fd9659948ffce.yaml b/tests/fixtures/bc_a5c3085efe8dfdba0fa0e11d81bf90cdcac27c0af496c4de1a2fd9659948ffce.yaml deleted file mode 100644 index ca5ff5c..0000000 --- a/tests/fixtures/bc_a5c3085efe8dfdba0fa0e11d81bf90cdcac27c0af496c4de1a2fd9659948ffce.yaml +++ /dev/null @@ -1,14 +0,0 @@ -version: 2 -inputs: -- prevOutput: 22f0538e189f32922e55daf6fa0b7120bc01de8520a9a4c80655fdaf70272ac0:1 - sigScript: '' - sequence: 0 - witness: - - 3044022017ded71ced861ea4e548ce9deeb69a556717911a644fb88369d12269cd25281302200cc72396108b905e8235362a953387f2195d51ea0376b0870cbfe90cbada9a9e01 - - 029376e491db9dde1d42ed68100e1bf069cf89a735d9175738f4238f9d617ed834 -outputs: -- value: 99999600 - scriptPubkey: 00141d66111f9daca8769c3ab2b0fe14354b6198b29c -- value: 0 - scriptPubkey: 6a20a02ab7dd75b9911b540419440ebe8f5be0742f76fd9fdaf5e69ebb30f38d3f11 -lockTime: 0 diff --git a/tests/fixtures/bc_c269055b7750a234087c11acd7a408172cb84d8fc6af0ded42d8a8cbea6712e9.yaml b/tests/fixtures/bc_c269055b7750a234087c11acd7a408172cb84d8fc6af0ded42d8a8cbea6712e9.yaml deleted file mode 100644 index 6ad6bc7..0000000 --- a/tests/fixtures/bc_c269055b7750a234087c11acd7a408172cb84d8fc6af0ded42d8a8cbea6712e9.yaml +++ /dev/null @@ -1,16 +0,0 @@ -version: 2 -inputs: -- prevOutput: 39f4d1888d1d994a2649397d34bfcaf8a9f7de2d6369dd1d42e0c61a26b4384b:1 - sigScript: '' - sequence: 0 - witness: - - 3044022040589e75b92bd9a9cb725edbbb06d7fe5ee24432f94f758e36dd929841e3701d02206c83c8d7673ee10c9deef90aaad3b71587484cda6ade3eae51e44f32430cb0db01 - - 023b7da09b05da276d729b004663767db536967bc782d14b3d87baba73f1e7de94 -outputs: -- value: 9000 - scriptPubkey: 0014a39902b742ace887eeef8b91463f30893f777a12 -- value: 99990600 - scriptPubkey: 00147c22e5543af0a3dca1c89ae5ffbf6cadd03a1bb3 -- value: 0 - scriptPubkey: 6a209f6aed701fb9da0762a238d96e0b203220a609a9afaba47ea71ba96e08065458 -lockTime: 0 diff --git a/tests/fixtures/bc_d077ea7e3a55a215893a18e82cb03fda0f50619893e4aee0ba70b014e6d63248.yaml b/tests/fixtures/bc_d077ea7e3a55a215893a18e82cb03fda0f50619893e4aee0ba70b014e6d63248.yaml deleted file mode 100644 index 9d770ae..0000000 --- a/tests/fixtures/bc_d077ea7e3a55a215893a18e82cb03fda0f50619893e4aee0ba70b014e6d63248.yaml +++ /dev/null @@ -1,14 +0,0 @@ -version: 2 -inputs: -- prevOutput: a5c3085efe8dfdba0fa0e11d81bf90cdcac27c0af496c4de1a2fd9659948ffce:0 - sigScript: '' - sequence: 0 - witness: - - 30450221008ed3d3ce756c894485a9bf761add8cd58dfe5a3ee844226b8d09db9760e32a800220678c467e6923976550ce485ebbac7861dcfa2193c18d687c8b25863ad6331f7b01 - - 030508210e85f58443ad57f66f75dacc76ab84fca7879f10a7325eeeef942e3e84 -outputs: -- value: 99999200 - scriptPubkey: 001430d944c2d49db5c315c49e13aab8cad8b9415cac -- value: 0 - scriptPubkey: 6a20669e87f4fe2acf39e58ef94c4a2f81791b7848acac344cd8a2e562f4777acc7f -lockTime: 0 diff --git a/tests/fixtures/bc_d84c37b6c6616184c454c815d970505bed9b3a3723a4445dd1289dc708bc80b3.yaml b/tests/fixtures/bc_d84c37b6c6616184c454c815d970505bed9b3a3723a4445dd1289dc708bc80b3.yaml deleted file mode 100644 index bed65f8..0000000 --- a/tests/fixtures/bc_d84c37b6c6616184c454c815d970505bed9b3a3723a4445dd1289dc708bc80b3.yaml +++ /dev/null @@ -1,16 +0,0 @@ -version: 2 -inputs: -- prevOutput: c269055b7750a234087c11acd7a408172cb84d8fc6af0ded42d8a8cbea6712e9:1 - sigScript: '' - sequence: 0 - witness: - - 3044022073070da9946fab45dbc02010cacc6e3e89c0539e1741c8abadb1e9aaa7831b190220561c8270ce63fe44af34624a0aa93f6c1fa28cec14f39d92c16e205fe6e1778401 - - 020e8dd627ba520d0c209b7859c1e7cbe4d01bd609d0a28dbcd9be2583692786a0 -outputs: -- value: 9000 - scriptPubkey: 0014a39902b742ace887eeef8b91463f30893f777a12 -- value: 99981200 - scriptPubkey: 0014ceb732c6400f984d3258c202811ef439234ff028 -- value: 0 - scriptPubkey: 6a20efce72c00a4dafa508d223854191b9bc534505d7b40841136ea57454bcd8f62e -lockTime: 0 diff --git a/tests/fixtures/consignment_A.yaml b/tests/fixtures/consignment_A.yaml deleted file mode 100644 index bbda5fe..0000000 --- a/tests/fixtures/consignment_A.yaml +++ /dev/null @@ -1,1138 +0,0 @@ -version: v2 -transfer: true -terminals: - 3bb2645029b3de98be6c3ed5ce3332b8591f59c693146a007b75db5cfdb7c7b8: - chain: bitcoin - data: e1c963ea4a2d4e21f870c713a76d0397a0cc197aece1f53a66ae9febf122bb50 -genesis: - ffv: 0 - schemaId: rgb:sch:RDYhMTR!9gv8Y2GLv9UNBEK1hcrCmdLDFk9Qd5fnO8k#brave-dinner-banana - flags: null - timestamp: 1728925859 - issuer: ssi:anonymous - testnet: true - altLayers1: [] - assetTags: - 4000: 603a2b302aac8d1cd7c8adc3acd72f31ce652128f96218fa5b519fd5e9930f6d - metadata: {} - globals: - 2000: - - 074e494154434b520e4e4941206173736574206e616d650002 - 2001: - - 09004e4941207465726d7300 - 2010: - - 9a02000000000000 - assignments: - 4000: - type: fungible - items: - - seal: - chain: bitcoin - data: - method: opretFirst - txid: 22f0538e189f32922e55daf6fa0b7120bc01de8520a9a4c80655fdaf70272ac0 - vout: 1 - blinding: 7704601239148887312 - state: - value: 666 - blinding: 7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e - tag: 603a2b302aac8d1cd7c8adc3acd72f31ce652128f96218fa5b519fd5e9930f6d - lock: null - valencies: [] - validator: null -extensions: [] -bundles: -- pubWitness: - chain: bitcoin - data: !tx - version: 2 - inputs: - - prevOutput: a5c3085efe8dfdba0fa0e11d81bf90cdcac27c0af496c4de1a2fd9659948ffce:0 - sigScript: '' - sequence: 0 - witness: [] - outputs: - - value: 99999200 - scriptPubkey: 001430d944c2d49db5c315c49e13aab8cad8b9415cac - - value: 0 - scriptPubkey: 6a20669e87f4fe2acf39e58ef94c4a2f81791b7848acac344cd8a2e562f4777acc7f - lockTime: 0 - anchoredBundles: !opret - mpcProof: - pos: 1 - cofactor: 1 - path: - - 0d4042fb3c309aa40bff3159cee3a0ca87c4efc804a5347aa1a363d7244a88f7 - - e56d0e3dbadefb489899917dbc2e1dbf0c49c3ff155e178ef52feab2f351fc7c - - 4edc7f8808488b46c10bedf910818a9afbe2512c1f08a436a7b3db244f22ac85 - dbcProof: null - bundle: - closeMethod: opretFirst - inputMap: - 0: 9b50df314989fe006013a96d2ded4b508e5f32ef2b29e7245abfb3d9a35888e3 - knownTransitions: - 9b50df314989fe006013a96d2ded4b508e5f32ef2b29e7245abfb3d9a35888e3: - ffv: 0 - contractId: rgb:JgunSMvZ-VCH4cfz-qW1qNyp-VO2a9f7-UYT3vN1-mjO$Ebg - nonce: 18446744073709551615 - transitionType: 10000 - metadata: {} - globals: {} - inputs: - - prevOut: - op: fb58c747eec9c44a05ec907ec9d14e0e72572f75db0a3f9aa47f0673702e760e - ty: 4000 - no: 0 - assignments: - 4000: - type: fungible - items: - - seal: - chain: bitcoin - data: - method: opretFirst - txid: null - vout: 0 - blinding: 10251942175724995735 - state: - value: 616 - blinding: 361c123b494b218e332794a2390dc6d5cc7c332f64cf8764b6dfb3e04e56c9fc - tag: 603a2b302aac8d1cd7c8adc3acd72f31ce652128f96218fa5b519fd5e9930f6d - lock: null - - seal: - chain: bitcoin - data: 108b3912eb0b836427f235bafe449f3153c2aae08887b948a3d8529f17b19b95 - state: - value: 50 - blinding: 48626c4335335cf04b56e9dc4570b7a8b2024b4f19aef719c79eca9e3027b482 - tag: 603a2b302aac8d1cd7c8adc3acd72f31ce652128f96218fa5b519fd5e9930f6d - lock: null - valencies: [] - validator: null - witness: null -- pubWitness: - chain: bitcoin - data: !tx - version: 2 - inputs: - - prevOutput: 22f0538e189f32922e55daf6fa0b7120bc01de8520a9a4c80655fdaf70272ac0:1 - sigScript: '' - sequence: 0 - witness: [] - outputs: - - value: 99999600 - scriptPubkey: 00141d66111f9daca8769c3ab2b0fe14354b6198b29c - - value: 0 - scriptPubkey: 6a20a02ab7dd75b9911b540419440ebe8f5be0742f76fd9fdaf5e69ebb30f38d3f11 - lockTime: 0 - anchoredBundles: !opret - mpcProof: - pos: 1 - cofactor: 1 - path: - - 0ae6caac7df078206a7af28b0a885098f743d49b92cdb3485558b804492a5be5 - - 843d661f6822486889697a7446a6a9bd1e123921c6dafdde687140cf863a9403 - - 040c8d2b550cc8f3bd210535dbf482f91e7fe62989168c1ed87eebf2b4f35be3 - dbcProof: null - bundle: - closeMethod: opretFirst - inputMap: - 0: fb58c747eec9c44a05ec907ec9d14e0e72572f75db0a3f9aa47f0673702e760e - knownTransitions: - fb58c747eec9c44a05ec907ec9d14e0e72572f75db0a3f9aa47f0673702e760e: - ffv: 0 - contractId: rgb:JgunSMvZ-VCH4cfz-qW1qNyp-VO2a9f7-UYT3vN1-mjO$Ebg - nonce: 18446744073709551615 - transitionType: 65535 - metadata: {} - globals: {} - inputs: - - prevOut: - op: 260ba748cbd95421f871fcea5b5a8dca954ed9af5fed4613def3759a33bf11b8 - ty: 4000 - no: 0 - assignments: - 4000: - type: fungible - items: - - seal: - chain: bitcoin - data: - method: opretFirst - txid: null - vout: 0 - blinding: 7687739675014878388 - state: - value: 666 - blinding: 7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e - tag: 603a2b302aac8d1cd7c8adc3acd72f31ce652128f96218fa5b519fd5e9930f6d - lock: null - valencies: [] - validator: null - witness: null -- pubWitness: - chain: bitcoin - data: !tx - version: 2 - inputs: - - prevOutput: d077ea7e3a55a215893a18e82cb03fda0f50619893e4aee0ba70b014e6d63248:0 - sigScript: '' - sequence: 0 - witness: [] - outputs: - - value: 99998800 - scriptPubkey: 00146ab6fe162c087a01a717d2b6d4bbef87829cec24 - - value: 0 - scriptPubkey: 6a2088b706bf16e225b5d438f48c8c1abc544e807bb7fb99e6fc8ca460d4de62d1b0 - lockTime: 0 - anchoredBundles: !opret - mpcProof: - pos: 1 - cofactor: 1 - path: - - 91246094600e4cae70d42147330754f25ef710118c7bc3aa963b1a8900125b83 - - 58bb69c807310413032dd30a245738b48f1a5cb8645f55b8f089489ae16b0533 - - 500d82630b8bb4a1bcb8973500acae7114dc0d5ef77b748a60b4d93aa9375ca1 - dbcProof: null - bundle: - closeMethod: opretFirst - inputMap: - 0: c04da8609a2a8ddf7e0e9847f4ebd6758b1091bceeda10094b24352c97840ea2 - knownTransitions: - c04da8609a2a8ddf7e0e9847f4ebd6758b1091bceeda10094b24352c97840ea2: - ffv: 0 - contractId: rgb:JgunSMvZ-VCH4cfz-qW1qNyp-VO2a9f7-UYT3vN1-mjO$Ebg - nonce: 18446744073709551615 - transitionType: 10000 - metadata: {} - globals: {} - inputs: - - prevOut: - op: 9b50df314989fe006013a96d2ded4b508e5f32ef2b29e7245abfb3d9a35888e3 - ty: 4000 - no: 0 - assignments: - 4000: - type: fungible - items: - - seal: - chain: bitcoin - data: - method: opretFirst - txid: null - vout: 0 - blinding: 9888072140771099372 - state: - value: 539 - blinding: ae89403cecbdb782ddba50b592d9590bb664bb3d4dc9f7772f7c6611f4755345 - tag: 603a2b302aac8d1cd7c8adc3acd72f31ce652128f96218fa5b519fd5e9930f6d - lock: null - - seal: - chain: bitcoin - data: e1c963ea4a2d4e21f870c713a76d0397a0cc197aece1f53a66ae9febf122bb50 - state: - value: 77 - blinding: 8792d1fe5c8d6a0b556d43eca6346dc8d0c654d8c64e30294735ac5b2a17b7f8 - tag: 603a2b302aac8d1cd7c8adc3acd72f31ce652128f96218fa5b519fd5e9930f6d - lock: null - valencies: [] - validator: null - witness: null -schema: - ffv: 0 - flags: null - name: NonInflatableAsset - timestamp: 1713343888 - developer: ssi:LZS1ux-gjD9nXPF-OcetUUkW-6r3uSCS6-aQhs9W5f-8JE7w - metaTypes: {} - globalTypes: - 2000: - reserved: null - semId: d7fcbee31ef0a85d5f973bda1b0b8c9e7efbcbc5572577382cacd3bdb4218a01 - maxItems: 1 - 2001: - reserved: null - semId: 5b8bc7543832054a1d22be94226be7538b133a26881cba4613027878e05c6cf7 - maxItems: 1 - 2010: - reserved: null - semId: 888c5865633af13b95b7cd1a8d8af2dac1dc140b977251d9d4daf3c7511c8e84 - maxItems: 1 - ownedTypes: - 4000: !fungible unsigned64Bit - valencyTypes: [] - genesis: - metadata: [] - globals: - 2000: once - 2001: once - 2010: once - assignments: - 4000: onceOrMore - valencies: [] - validator: - lib: abf099d28bed50df5e065715327f3a9b329f777cb0b9fefff634c193a03cb626 - pos: 9 - extensions: {} - transitions: - 10000: - metadata: [] - globals: {} - inputs: - 4000: onceOrMore - assignments: - 4000: onceOrMore - valencies: [] - validator: - lib: abf099d28bed50df5e065715327f3a9b329f777cb0b9fefff634c193a03cb626 - pos: 0 - reserved: null -ifaces: - ? version: v1 - name: RGB20Fixed - inherits: - - rgb:ifc:Vk9c4$Ny-Fv0J6tg-pDF05CE-312oCWh-fENNuia-GYbEu18#adios-alert-never - - rgb:ifc:13N6PRwT-T68!FGY-lBwX2cm-qesgJ11-j0nQkM1-WSCJFj4#ariel-gizmo-evita - - rgb:ifc:naFrAfgG-Kfu$A!c-3L!bC$4-s1LWJQV-4Iv!62u-4B3ab8Y#mailbox-dialog-iron - - rgb:ifc:w3Lk9Mt3-gKt$n5y-TYpVGg0-IDpK0p9-sHQ!hb6-m2Qr3a0#unicorn-reward-ladder - timestamp: 1711405444 - metadata: {} - globalState: - issuedSupply: - semId: 888c5865633af13b95b7cd1a8d8af2dac1dc140b977251d9d4daf3c7511c8e84 - required: true - multiple: false - spec: - semId: d7fcbee31ef0a85d5f973bda1b0b8c9e7efbcbc5572577382cacd3bdb4218a01 - required: true - multiple: false - terms: - semId: 5b8bc7543832054a1d22be94226be7538b133a26881cba4613027878e05c6cf7 - required: true - multiple: false - assignments: - assetOwner: - ownedState: amount - public: false - required: true - multiple: true - valencies: {} - genesis: - modifier: abstract - metadata: [] - globals: - issuedSupply: once - spec: once - terms: once - assignments: - assetOwner: onceOrMore - valencies: [] - errors: - - issuedMismatch - transitions: - transfer: - modifier: abstract - optional: false - metadata: [] - globals: {} - inputs: - assetOwner: onceOrMore - assignments: - assetOwner: onceOrMore - valencies: [] - errors: - - nonEqualAmounts - defaultAssignment: assetOwner - extensions: {} - defaultOperation: transfer - errors: - issuedMismatch: supply specified as a global parameter doesn't match the issued supply allocated to the asset owners - nonEqualAmounts: the sum of spent assets doesn't equal to the sum of assets in outputs - developer: ssi:LZS1ux-gjD9nXPF-OcetUUkW-6r3uSCS6-aQhs9W5f-8JE7w - : version: v1 - schemaId: rgb:sch:RDYhMTR!9gv8Y2GLv9UNBEK1hcrCmdLDFk9Qd5fnO8k#brave-dinner-banana - ifaceId: rgb:ifc:$iUnO9aO-1xhqUd6-1Jm5S5!-wM3ngby-5GVEylQ-ZTAMYDk#tornado-pioneer-bucket - timestamp: 1713343888 - metadata: [] - globalState: - - id: 2000 - name: spec - reserved: null - - id: 2001 - name: terms - reserved: null - - id: 2010 - name: issuedSupply - reserved: null - assignments: - - id: 4000 - name: assetOwner - reserved: null - valencies: [] - transitions: - - id: 10000 - name: transfer - reserved: null - extensions: [] - errors: - - id: 0 - name: nonEqualAmounts - reserved: null - - id: 1 - name: issuedMismatch - reserved: null - developer: ssi:LZS1ux-gjD9nXPF-OcetUUkW-6r3uSCS6-aQhs9W5f-8JE7w -supplements: [] -types: - 0af65fd62581de85cbd14e23e2db9a92bbef8b7974ffe1b50c4c74db8f86e751: !List - - 5f5e26e5c5053c1b4544515bc6a0653da02a0791fb31116d71a4fad916e15355 - - min: 0 - max: 7 - 18cb946f1293cf180e9d78dcc65bc59b472ffffeadfbf58db198cc8328f64b01: !Tuple - - 560d96f7a47924b2c3df040e6463398fd65fd591652c294342bfa5f939155154 - 1cabbfc3d826c0bfd1e9770a889efacc8b6716ad014a3eec10b6591530229042: !Primitive 64 - 1cb0758e14c2008c0f008ce6d2d41e9e1937e1cd0f9914c59a7e29e1ce7ba0bb: !Tuple - - ccc272928f793803d91f5dad8d51cc986b4332380f9224f7c7c1514d768ebb90 - 2a5baaac5089ff098d150b482cfed8bcd01a91c0d7b45d32216ed576ab71ebdd: !Array - - 1cabbfc3d826c0bfd1e9770a889efacc8b6716ad014a3eec10b6591530229042 - - 32 - 2fd8f27a172712903e6a3e96f0f85c0480b4211a17acd13059fc51d4a4bbde2c: !Union - ? name: none - tag: 0 - : d83fbee02f0de5b46cf80fe11ef7fdf061c78d975d31ade9eea2bc4099339e6c - ? name: some - tag: 1 - : b070d38ff6d20c5ae5d80715ca31541d5a52bbdecbd3529d38e6ddb672200997 - 3cd1a29dccad9b917b26305f89a8a4fb2118302a4e73c5ac0a780de6ab005e73: !Enum - - name: excl - tag: 33 - - name: hash - tag: 35 - - name: dollar - tag: 36 - - name: amp - tag: 38 - - name: plus - tag: 43 - - name: dash - tag: 45 - - name: dot - tag: 46 - - name: zero - tag: 48 - - name: one - tag: 49 - - name: two - tag: 50 - - name: three - tag: 51 - - name: four - tag: 52 - - name: five - tag: 53 - - name: six - tag: 54 - - name: seven - tag: 55 - - name: eight - tag: 56 - - name: nine - tag: 57 - - name: caret - tag: 94 - - name: lodash - tag: 95 - - name: a - tag: 97 - - name: b - tag: 98 - - name: c - tag: 99 - - name: d - tag: 100 - - name: e - tag: 101 - - name: f - tag: 102 - - name: g - tag: 103 - - name: h - tag: 104 - - name: i - tag: 105 - - name: j - tag: 106 - - name: k - tag: 107 - - name: l - tag: 108 - - name: m - tag: 109 - - name: n - tag: 110 - - name: o - tag: 111 - - name: p - tag: 112 - - name: q - tag: 113 - - name: r - tag: 114 - - name: s - tag: 115 - - name: t - tag: 116 - - name: u - tag: 117 - - name: v - tag: 118 - - name: w - tag: 119 - - name: x - tag: 120 - - name: y - tag: 121 - - name: z - tag: 122 - 3f2b72b7c4af1a630cb6d3ff088baf351093ee465b9e7d472a610082e449d7e4: !Tuple - - 63aa2314e8b147c8b284dfb39a9e10d19caad5faea848e3cb9849d9167d6344a - 43aa7fc5f6f5644fe5a2ae5e1aa99042cdeb879442e34c723ff5827fb133de8a: !Struct - - name: type - ty: b10ddefe8020add8a0ca08292150abb13c514d76de5168c1c97105a27e676660 - - name: digest - ty: 2a5baaac5089ff098d150b482cfed8bcd01a91c0d7b45d32216ed576ab71ebdd - 45b780258601c526b23b5b4861460a9050e13f35fbbe8305a8001157e4013888: !Union - ? name: none - tag: 0 - : d83fbee02f0de5b46cf80fe11ef7fdf061c78d975d31ade9eea2bc4099339e6c - ? name: some - tag: 1 - : caff8faeb38a00a04e3621538f8e61d75a85a465cb0a0e48c3593e7eaa6c5fc7 - 48be23172ae884459ae78334a0063f09fa0e317bea8b233ce782a38875e796b8: !Enum - - name: space - tag: 32 - - name: excl - tag: 33 - - name: quotes - tag: 34 - - name: hash - tag: 35 - - name: dollar - tag: 36 - - name: percent - tag: 37 - - name: ampersand - tag: 38 - - name: apostrophe - tag: 39 - - name: bracketL - tag: 40 - - name: bracketR - tag: 41 - - name: asterisk - tag: 42 - - name: plus - tag: 43 - - name: comma - tag: 44 - - name: minus - tag: 45 - - name: dot - tag: 46 - - name: slash - tag: 47 - - name: zero - tag: 48 - - name: one - tag: 49 - - name: two - tag: 50 - - name: three - tag: 51 - - name: four - tag: 52 - - name: five - tag: 53 - - name: six - tag: 54 - - name: seven - tag: 55 - - name: eight - tag: 56 - - name: nine - tag: 57 - - name: colon - tag: 58 - - name: semiColon - tag: 59 - - name: less - tag: 60 - - name: equal - tag: 61 - - name: greater - tag: 62 - - name: question - tag: 63 - - name: at - tag: 64 - - name: _A - tag: 65 - - name: _B - tag: 66 - - name: _C - tag: 67 - - name: _D - tag: 68 - - name: _E - tag: 69 - - name: _F - tag: 70 - - name: _G - tag: 71 - - name: _H - tag: 72 - - name: _I - tag: 73 - - name: _J - tag: 74 - - name: _K - tag: 75 - - name: _L - tag: 76 - - name: _M - tag: 77 - - name: _N - tag: 78 - - name: _O - tag: 79 - - name: _P - tag: 80 - - name: _Q - tag: 81 - - name: _R - tag: 82 - - name: _S - tag: 83 - - name: _T - tag: 84 - - name: _U - tag: 85 - - name: _V - tag: 86 - - name: _W - tag: 87 - - name: _X - tag: 88 - - name: _Y - tag: 89 - - name: _Z - tag: 90 - - name: sqBracketL - tag: 91 - - name: backSlash - tag: 92 - - name: sqBracketR - tag: 93 - - name: caret - tag: 94 - - name: lodash - tag: 95 - - name: backtick - tag: 96 - - name: a - tag: 97 - - name: b - tag: 98 - - name: c - tag: 99 - - name: d - tag: 100 - - name: e - tag: 101 - - name: f - tag: 102 - - name: g - tag: 103 - - name: h - tag: 104 - - name: i - tag: 105 - - name: j - tag: 106 - - name: k - tag: 107 - - name: l - tag: 108 - - name: m - tag: 109 - - name: n - tag: 110 - - name: o - tag: 111 - - name: p - tag: 112 - - name: q - tag: 113 - - name: r - tag: 114 - - name: s - tag: 115 - - name: t - tag: 116 - - name: u - tag: 117 - - name: v - tag: 118 - - name: w - tag: 119 - - name: x - tag: 120 - - name: y - tag: 121 - - name: z - tag: 122 - - name: cBracketL - tag: 123 - - name: pipe - tag: 124 - - name: cBracketR - tag: 125 - - name: tilde - tag: 126 - 560d96f7a47924b2c3df040e6463398fd65fd591652c294342bfa5f939155154: !List - - fba958721a3d335406b368c36f5a82790960cce239febcafe189ba9839d5da78 - - min: 0 - max: 65535 - 5b772c8eb15fd74700c79241f60f8fda37e736b3fd462ab017ce4d454efa81aa: !Tuple - - 5e5ec8924f73cd72c4225c96ab47796658ef1b729ca306e260bca42b25891d0f - 5b8bc7543832054a1d22be94226be7538b133a26881cba4613027878e05c6cf7: !Struct - - name: text - ty: 18cb946f1293cf180e9d78dcc65bc59b472ffffeadfbf58db198cc8328f64b01 - - name: media - ty: e087a83496338799afc48a9211683a427d2bd33e2ea7ebb8a8b880ea4ab4eb81 - 5ca149585de534ee91b3e3a030b7efd4cdb79abea9152f101f3759b4c7210e1f: !Primitive 8 - 5d03c4178da98e7e3f3af343e3997d74201d11f42732cfbea2b04b8e3ff15f22: !Enum - - name: indivisible - tag: 0 - - name: deci - tag: 1 - - name: centi - tag: 2 - - name: milli - tag: 3 - - name: deciMilli - tag: 4 - - name: centiMilli - tag: 5 - - name: micro - tag: 6 - - name: deciMicro - tag: 7 - - name: centiMicro - tag: 8 - - name: nano - tag: 9 - - name: deciNano - tag: 10 - - name: centiNano - tag: 11 - - name: pico - tag: 12 - - name: deciPico - tag: 13 - - name: centiPico - tag: 14 - - name: femto - tag: 15 - - name: deciFemto - tag: 16 - - name: centiFemto - tag: 17 - - name: atto - tag: 18 - 5e5ec8924f73cd72c4225c96ab47796658ef1b729ca306e260bca42b25891d0f: !Tuple - - 822380f475f0edb4b5dc517991de7390ada2dbb3752c4c066851aa01630296c2 - - 0af65fd62581de85cbd14e23e2db9a92bbef8b7974ffe1b50c4c74db8f86e751 - 5f5e26e5c5053c1b4544515bc6a0653da02a0791fb31116d71a4fad916e15355: !Enum - - name: zero - tag: 48 - - name: one - tag: 49 - - name: two - tag: 50 - - name: three - tag: 51 - - name: four - tag: 52 - - name: five - tag: 53 - - name: six - tag: 54 - - name: seven - tag: 55 - - name: eight - tag: 56 - - name: nine - tag: 57 - - name: _A - tag: 65 - - name: _B - tag: 66 - - name: _C - tag: 67 - - name: _D - tag: 68 - - name: _E - tag: 69 - - name: _F - tag: 70 - - name: _G - tag: 71 - - name: _H - tag: 72 - - name: _I - tag: 73 - - name: _J - tag: 74 - - name: _K - tag: 75 - - name: _L - tag: 76 - - name: _M - tag: 77 - - name: _N - tag: 78 - - name: _O - tag: 79 - - name: _P - tag: 80 - - name: _Q - tag: 81 - - name: _R - tag: 82 - - name: _S - tag: 83 - - name: _T - tag: 84 - - name: _U - tag: 85 - - name: _V - tag: 86 - - name: _W - tag: 87 - - name: _X - tag: 88 - - name: _Y - tag: 89 - - name: _Z - tag: 90 - - name: a - tag: 97 - - name: b - tag: 98 - - name: c - tag: 99 - - name: d - tag: 100 - - name: e - tag: 101 - - name: f - tag: 102 - - name: g - tag: 103 - - name: h - tag: 104 - - name: i - tag: 105 - - name: j - tag: 106 - - name: k - tag: 107 - - name: l - tag: 108 - - name: m - tag: 109 - - name: n - tag: 110 - - name: o - tag: 111 - - name: p - tag: 112 - - name: q - tag: 113 - - name: r - tag: 114 - - name: s - tag: 115 - - name: t - tag: 116 - - name: u - tag: 117 - - name: v - tag: 118 - - name: w - tag: 119 - - name: x - tag: 120 - - name: y - tag: 121 - - name: z - tag: 122 - 63aa2314e8b147c8b284dfb39a9e10d19caad5faea848e3cb9849d9167d6344a: !List - - fba958721a3d335406b368c36f5a82790960cce239febcafe189ba9839d5da78 - - min: 1 - max: 255 - 805ec5bc5312c84190445da16aa1c08a09e300e8323acfae6a23420a29ad003d: !Tuple - - c43a7d9eb9b3027973c98f5dd6e1ac04f5cbd34240c0bebc0a0fb808140094d4 - 822380f475f0edb4b5dc517991de7390ada2dbb3752c4c066851aa01630296c2: !Enum - - name: _A - tag: 65 - - name: _B - tag: 66 - - name: _C - tag: 67 - - name: _D - tag: 68 - - name: _E - tag: 69 - - name: _F - tag: 70 - - name: _G - tag: 71 - - name: _H - tag: 72 - - name: _I - tag: 73 - - name: _J - tag: 74 - - name: _K - tag: 75 - - name: _L - tag: 76 - - name: _M - tag: 77 - - name: _N - tag: 78 - - name: _O - tag: 79 - - name: _P - tag: 80 - - name: _Q - tag: 81 - - name: _R - tag: 82 - - name: _S - tag: 83 - - name: _T - tag: 84 - - name: _U - tag: 85 - - name: _V - tag: 86 - - name: _W - tag: 87 - - name: _X - tag: 88 - - name: _Y - tag: 89 - - name: _Z - tag: 90 - - name: a - tag: 97 - - name: b - tag: 98 - - name: c - tag: 99 - - name: d - tag: 100 - - name: e - tag: 101 - - name: f - tag: 102 - - name: g - tag: 103 - - name: h - tag: 104 - - name: i - tag: 105 - - name: j - tag: 106 - - name: k - tag: 107 - - name: l - tag: 108 - - name: m - tag: 109 - - name: n - tag: 110 - - name: o - tag: 111 - - name: p - tag: 112 - - name: q - tag: 113 - - name: r - tag: 114 - - name: s - tag: 115 - - name: t - tag: 116 - - name: u - tag: 117 - - name: v - tag: 118 - - name: w - tag: 119 - - name: x - tag: 120 - - name: y - tag: 121 - - name: z - tag: 122 - 888c5865633af13b95b7cd1a8d8af2dac1dc140b977251d9d4daf3c7511c8e84: !Tuple - - 5ca149585de534ee91b3e3a030b7efd4cdb79abea9152f101f3759b4c7210e1f - b070d38ff6d20c5ae5d80715ca31541d5a52bbdecbd3529d38e6ddb672200997: !Tuple - - 1cb0758e14c2008c0f008ce6d2d41e9e1937e1cd0f9914c59a7e29e1ce7ba0bb - b10ddefe8020add8a0ca08292150abb13c514d76de5168c1c97105a27e676660: !Struct - - name: type - ty: 1cb0758e14c2008c0f008ce6d2d41e9e1937e1cd0f9914c59a7e29e1ce7ba0bb - - name: subtype - ty: 2fd8f27a172712903e6a3e96f0f85c0480b4211a17acd13059fc51d4a4bbde2c - - name: charset - ty: 2fd8f27a172712903e6a3e96f0f85c0480b4211a17acd13059fc51d4a4bbde2c - bf8fcbe9c5395731a6b4cd61fb00dfe7a5d629365339c55aeae087a3b90aaa46: !List - - 3cd1a29dccad9b917b26305f89a8a4fb2118302a4e73c5ac0a780de6ab005e73 - - min: 0 - max: 63 - c43a7d9eb9b3027973c98f5dd6e1ac04f5cbd34240c0bebc0a0fb808140094d4: !Tuple - - 48be23172ae884459ae78334a0063f09fa0e317bea8b233ce782a38875e796b8 - - f5ad172144ccd2dd62ece74ff0fb14641d936a80c1a0c93ebf97727184897cbc - caff8faeb38a00a04e3621538f8e61d75a85a465cb0a0e48c3593e7eaa6c5fc7: !Tuple - - 3f2b72b7c4af1a630cb6d3ff088baf351093ee465b9e7d472a610082e449d7e4 - ccc272928f793803d91f5dad8d51cc986b4332380f9224f7c7c1514d768ebb90: !Tuple - - f9170804ddae0479f8d5af74ab3bd202e6ea4172d9a9b93707151adb7fc40ca1 - - bf8fcbe9c5395731a6b4cd61fb00dfe7a5d629365339c55aeae087a3b90aaa46 - d7fcbee31ef0a85d5f973bda1b0b8c9e7efbcbc5572577382cacd3bdb4218a01: !Struct - - name: ticker - ty: 5b772c8eb15fd74700c79241f60f8fda37e736b3fd462ab017ce4d454efa81aa - - name: name - ty: 805ec5bc5312c84190445da16aa1c08a09e300e8323acfae6a23420a29ad003d - - name: details - ty: 45b780258601c526b23b5b4861460a9050e13f35fbbe8305a8001157e4013888 - - name: precision - ty: 5d03c4178da98e7e3f3af343e3997d74201d11f42732cfbea2b04b8e3ff15f22 - d83fbee02f0de5b46cf80fe11ef7fdf061c78d975d31ade9eea2bc4099339e6c: !Primitive 0 - dc1e2f52567f725fd730ad84867f0da4c9ba9af0813311dfe4ef3e3c4a612548: !Tuple - - 43aa7fc5f6f5644fe5a2ae5e1aa99042cdeb879442e34c723ff5827fb133de8a - e087a83496338799afc48a9211683a427d2bd33e2ea7ebb8a8b880ea4ab4eb81: !Union - ? name: none - tag: 0 - : d83fbee02f0de5b46cf80fe11ef7fdf061c78d975d31ade9eea2bc4099339e6c - ? name: some - tag: 1 - : dc1e2f52567f725fd730ad84867f0da4c9ba9af0813311dfe4ef3e3c4a612548 - f5ad172144ccd2dd62ece74ff0fb14641d936a80c1a0c93ebf97727184897cbc: !List - - 48be23172ae884459ae78334a0063f09fa0e317bea8b233ce782a38875e796b8 - - min: 0 - max: 39 - f9170804ddae0479f8d5af74ab3bd202e6ea4172d9a9b93707151adb7fc40ca1: !Enum - - name: a - tag: 97 - - name: b - tag: 98 - - name: c - tag: 99 - - name: d - tag: 100 - - name: e - tag: 101 - - name: f - tag: 102 - - name: g - tag: 103 - - name: h - tag: 104 - - name: i - tag: 105 - - name: j - tag: 106 - - name: k - tag: 107 - - name: l - tag: 108 - - name: m - tag: 109 - - name: n - tag: 110 - - name: o - tag: 111 - - name: p - tag: 112 - - name: q - tag: 113 - - name: r - tag: 114 - - name: s - tag: 115 - - name: t - tag: 116 - - name: u - tag: 117 - - name: v - tag: 118 - - name: w - tag: 119 - - name: x - tag: 120 - - name: y - tag: 121 - - name: z - tag: 122 - fba958721a3d335406b368c36f5a82790960cce239febcafe189ba9839d5da78: UnicodeChar -scripts: -- isae: - - ALU - - BPDIGEST - - RGB - code: - - 11 - - 0 - - 0 - - 0 - - 208 - - 160 - - 15 - - 1 - - 7 - - 11 - - 0 - - 1 - - 0 - - 11 - - 8 - - 0 - - 0 - - 11 - - 1 - - 2 - - 0 - - 200 - - 218 - - 7 - - 1 - - 57 - - 48 - - 0 - - 209 - - 160 - - 15 - - 1 - - 7 - data: - - 0 - - 1 - - 0 - - 0 - libs: [] -attachments: {} -signatures: {} diff --git a/tests/fixtures/consignment_B.yaml b/tests/fixtures/consignment_B.yaml deleted file mode 100644 index bd61796..0000000 --- a/tests/fixtures/consignment_B.yaml +++ /dev/null @@ -1,1149 +0,0 @@ -version: v2 -transfer: true -terminals: {} -genesis: - ffv: 0 - schemaId: rgb:sch:RDYhMTR!9gv8Y2GLv9UNBEK1hcrCmdLDFk9Qd5fnO8k#brave-dinner-banana - flags: null - timestamp: 1728926035 - issuer: ssi:anonymous - testnet: true - altLayers1: [] - assetTags: - 4000: 182bcffc792b3b0b5ea98515b0babbf1650db23f30e508eb8637000d8ad590db - metadata: {} - globals: - 2000: - - 074e494154434b520e4e4941206173736574206e616d650002 - 2001: - - 09004e4941207465726d7300 - 2010: - - 9a02000000000000 - assignments: - 4000: - type: fungible - items: - - seal: - chain: bitcoin - data: - method: opretFirst - txid: 39f4d1888d1d994a2649397d34bfcaf8a9f7de2d6369dd1d42e0c61a26b4384b - vout: 1 - blinding: 7943510731595037200 - state: - value: 666 - blinding: 7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e - tag: 182bcffc792b3b0b5ea98515b0babbf1650db23f30e508eb8637000d8ad590db - lock: null - valencies: [] - validator: null -extensions: [] -bundles: -- pubWitness: - chain: bitcoin - data: !tx - version: 2 - inputs: - - prevOutput: c269055b7750a234087c11acd7a408172cb84d8fc6af0ded42d8a8cbea6712e9:1 - sigScript: '' - sequence: 0 - witness: [] - outputs: - - value: 9000 - scriptPubkey: 0014a39902b742ace887eeef8b91463f30893f777a12 - - value: 99981200 - scriptPubkey: 0014ceb732c6400f984d3258c202811ef439234ff028 - - value: 0 - scriptPubkey: 6a20efce72c00a4dafa508d223854191b9bc534505d7b40841136ea57454bcd8f62e - lockTime: 0 - anchoredBundles: !opret - mpcProof: - pos: 4 - cofactor: 1 - path: - - 59fb64885c9d21d566c630261ebaf61e6fdfb90fd755734580e2853606e04468 - - 972bd31741970dcfdcb1fd6e1e0cb86b43a95cdf9be16e26b20f7efb55b8815a - - 59c4bea42d613b9b4d9190c70713db38fcb1213e1384390305c9f41b105e7ad7 - dbcProof: null - bundle: - closeMethod: opretFirst - inputMap: - 0: 93ff8f77c5f41ebdfb417b9f30a603e2b48a0db75d5a0e520495954e564f62f6 - knownTransitions: - 93ff8f77c5f41ebdfb417b9f30a603e2b48a0db75d5a0e520495954e564f62f6: - ffv: 0 - contractId: rgb:P9y8fj2n-Hjyhxbb-FSv9Jb6-xVz3qn$-laXX8N6-hzNhlHQ - nonce: 18446744073709551615 - transitionType: 10000 - metadata: {} - globals: {} - inputs: - - prevOut: - op: 76fc3455d84d793361211daa2a85be764b9bebc559dd2958833bf6ab153fa9a3 - ty: 4000 - no: 0 - assignments: - 4000: - type: fungible - items: - - seal: - chain: bitcoin - data: - method: opretFirst - txid: null - vout: 0 - blinding: 10355153668244730300 - state: - value: 50 - blinding: 6ba480e64c69b4e53fe7c76e5c79bb79e8d1a442ba405e9b568612b0014dc452 - tag: 182bcffc792b3b0b5ea98515b0babbf1650db23f30e508eb8637000d8ad590db - lock: null - - seal: - chain: bitcoin - data: - method: opretFirst - txid: null - vout: 1 - blinding: 4411272172758969930 - state: - value: 616 - blinding: 12d9fd983214c9993e96b7102204c30495acda3bc43e1fe327f86bce7d30ba2c - tag: 182bcffc792b3b0b5ea98515b0babbf1650db23f30e508eb8637000d8ad590db - lock: null - valencies: [] - validator: null - witness: null -- pubWitness: - chain: bitcoin - data: !tx - version: 2 - inputs: - - prevOutput: d84c37b6c6616184c454c815d970505bed9b3a3723a4445dd1289dc708bc80b3:1 - sigScript: '' - sequence: 0 - witness: [] - outputs: - - value: 9000 - scriptPubkey: 0014a39902b742ace887eeef8b91463f30893f777a12 - - value: 99971800 - scriptPubkey: 0014b63cbe65e66aaec213d9e25a2ff8cd4e4f3c47d0 - - value: 0 - scriptPubkey: 6a2036831c40589897909e67d439cba95004d53280635e2ca66b6e53da52551f957c - lockTime: 0 - anchoredBundles: !opret - mpcProof: - pos: 4 - cofactor: 1 - path: - - ade25d6370736e013b7148b4e223030112c4dff704d992e0a8d92073df669c2f - - f478b2c344da010822be93fb7405c56c0b95867ce56582a6c4f647b678fba56e - - 9461109d34187938798bf29433c2b3f11f08ed7f7c8831fcceeab43874f11689 - dbcProof: null - bundle: - closeMethod: opretFirst - inputMap: - 0: 295cbd02dbfeddee5c9691cfcc2b5c59b284c8130ad1c9e2cfb867b45dc24dec - knownTransitions: - 295cbd02dbfeddee5c9691cfcc2b5c59b284c8130ad1c9e2cfb867b45dc24dec: - ffv: 0 - contractId: rgb:P9y8fj2n-Hjyhxbb-FSv9Jb6-xVz3qn$-laXX8N6-hzNhlHQ - nonce: 18446744073709551615 - transitionType: 10000 - metadata: {} - globals: {} - inputs: - - prevOut: - op: 93ff8f77c5f41ebdfb417b9f30a603e2b48a0db75d5a0e520495954e564f62f6 - ty: 4000 - no: 1 - assignments: - 4000: - type: fungible - items: - - seal: - chain: bitcoin - data: - method: opretFirst - txid: null - vout: 0 - blinding: 5517491780835545414 - state: - value: 77 - blinding: ab9ad5d441db401474f2f15c2d7940cec37d8b1c962dc20752256f95fdfd1634 - tag: 182bcffc792b3b0b5ea98515b0babbf1650db23f30e508eb8637000d8ad590db - lock: null - - seal: - chain: bitcoin - data: - method: opretFirst - txid: null - vout: 1 - blinding: 17151752316201612509 - state: - value: 539 - blinding: 673f27c3f0398984c9a3c5b3f48b82348cde2c05dd58fe1795a55ac54f69e539 - tag: 182bcffc792b3b0b5ea98515b0babbf1650db23f30e508eb8637000d8ad590db - lock: null - valencies: [] - validator: null - witness: null -- pubWitness: - chain: bitcoin - data: !tx - version: 2 - inputs: - - prevOutput: 39f4d1888d1d994a2649397d34bfcaf8a9f7de2d6369dd1d42e0c61a26b4384b:1 - sigScript: '' - sequence: 0 - witness: [] - outputs: - - value: 9000 - scriptPubkey: 0014a39902b742ace887eeef8b91463f30893f777a12 - - value: 99990600 - scriptPubkey: 00147c22e5543af0a3dca1c89ae5ffbf6cadd03a1bb3 - - value: 0 - scriptPubkey: 6a209f6aed701fb9da0762a238d96e0b203220a609a9afaba47ea71ba96e08065458 - lockTime: 0 - anchoredBundles: !opret - mpcProof: - pos: 4 - cofactor: 1 - path: - - 09a4be7f9ba65f3e4588a93061fe429c8e257de6cb5194a82c1e4dc5d6ff48fd - - cdc9e7844302abff47462927f67cfc6b350a5023dcceb1798eeea250dcce7052 - - 6ef2b8c22960c49c7be94ea27b5909ac60dbbd69fe057d5475795a35802bf24a - dbcProof: null - bundle: - closeMethod: opretFirst - inputMap: - 0: 76fc3455d84d793361211daa2a85be764b9bebc559dd2958833bf6ab153fa9a3 - knownTransitions: - 76fc3455d84d793361211daa2a85be764b9bebc559dd2958833bf6ab153fa9a3: - ffv: 0 - contractId: rgb:P9y8fj2n-Hjyhxbb-FSv9Jb6-xVz3qn$-laXX8N6-hzNhlHQ - nonce: 18446744073709551615 - transitionType: 65535 - metadata: {} - globals: {} - inputs: - - prevOut: - op: 3fdcbc7e3da71e3ca1c5b6c54aff496fac55cf7aa7fe56975fc37a8733619474 - ty: 4000 - no: 0 - assignments: - 4000: - type: fungible - items: - - seal: - chain: bitcoin - data: - method: opretFirst - txid: null - vout: 1 - blinding: 16141698382146724670 - state: - value: 666 - blinding: 7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e - tag: 182bcffc792b3b0b5ea98515b0babbf1650db23f30e508eb8637000d8ad590db - lock: null - valencies: [] - validator: null - witness: null -schema: - ffv: 0 - flags: null - name: NonInflatableAsset - timestamp: 1713343888 - developer: ssi:LZS1ux-gjD9nXPF-OcetUUkW-6r3uSCS6-aQhs9W5f-8JE7w - metaTypes: {} - globalTypes: - 2000: - reserved: null - semId: d7fcbee31ef0a85d5f973bda1b0b8c9e7efbcbc5572577382cacd3bdb4218a01 - maxItems: 1 - 2001: - reserved: null - semId: 5b8bc7543832054a1d22be94226be7538b133a26881cba4613027878e05c6cf7 - maxItems: 1 - 2010: - reserved: null - semId: 888c5865633af13b95b7cd1a8d8af2dac1dc140b977251d9d4daf3c7511c8e84 - maxItems: 1 - ownedTypes: - 4000: !fungible unsigned64Bit - valencyTypes: [] - genesis: - metadata: [] - globals: - 2000: once - 2001: once - 2010: once - assignments: - 4000: onceOrMore - valencies: [] - validator: - lib: abf099d28bed50df5e065715327f3a9b329f777cb0b9fefff634c193a03cb626 - pos: 9 - extensions: {} - transitions: - 10000: - metadata: [] - globals: {} - inputs: - 4000: onceOrMore - assignments: - 4000: onceOrMore - valencies: [] - validator: - lib: abf099d28bed50df5e065715327f3a9b329f777cb0b9fefff634c193a03cb626 - pos: 0 - reserved: null -ifaces: - ? version: v1 - name: RGB20Fixed - inherits: - - rgb:ifc:Vk9c4$Ny-Fv0J6tg-pDF05CE-312oCWh-fENNuia-GYbEu18#adios-alert-never - - rgb:ifc:13N6PRwT-T68!FGY-lBwX2cm-qesgJ11-j0nQkM1-WSCJFj4#ariel-gizmo-evita - - rgb:ifc:naFrAfgG-Kfu$A!c-3L!bC$4-s1LWJQV-4Iv!62u-4B3ab8Y#mailbox-dialog-iron - - rgb:ifc:w3Lk9Mt3-gKt$n5y-TYpVGg0-IDpK0p9-sHQ!hb6-m2Qr3a0#unicorn-reward-ladder - timestamp: 1711405444 - metadata: {} - globalState: - issuedSupply: - semId: 888c5865633af13b95b7cd1a8d8af2dac1dc140b977251d9d4daf3c7511c8e84 - required: true - multiple: false - spec: - semId: d7fcbee31ef0a85d5f973bda1b0b8c9e7efbcbc5572577382cacd3bdb4218a01 - required: true - multiple: false - terms: - semId: 5b8bc7543832054a1d22be94226be7538b133a26881cba4613027878e05c6cf7 - required: true - multiple: false - assignments: - assetOwner: - ownedState: amount - public: false - required: true - multiple: true - valencies: {} - genesis: - modifier: abstract - metadata: [] - globals: - issuedSupply: once - spec: once - terms: once - assignments: - assetOwner: onceOrMore - valencies: [] - errors: - - issuedMismatch - transitions: - transfer: - modifier: abstract - optional: false - metadata: [] - globals: {} - inputs: - assetOwner: onceOrMore - assignments: - assetOwner: onceOrMore - valencies: [] - errors: - - nonEqualAmounts - defaultAssignment: assetOwner - extensions: {} - defaultOperation: transfer - errors: - issuedMismatch: supply specified as a global parameter doesn't match the issued supply allocated to the asset owners - nonEqualAmounts: the sum of spent assets doesn't equal to the sum of assets in outputs - developer: ssi:LZS1ux-gjD9nXPF-OcetUUkW-6r3uSCS6-aQhs9W5f-8JE7w - : version: v1 - schemaId: rgb:sch:RDYhMTR!9gv8Y2GLv9UNBEK1hcrCmdLDFk9Qd5fnO8k#brave-dinner-banana - ifaceId: rgb:ifc:$iUnO9aO-1xhqUd6-1Jm5S5!-wM3ngby-5GVEylQ-ZTAMYDk#tornado-pioneer-bucket - timestamp: 1713343888 - metadata: [] - globalState: - - id: 2000 - name: spec - reserved: null - - id: 2001 - name: terms - reserved: null - - id: 2010 - name: issuedSupply - reserved: null - assignments: - - id: 4000 - name: assetOwner - reserved: null - valencies: [] - transitions: - - id: 10000 - name: transfer - reserved: null - extensions: [] - errors: - - id: 0 - name: nonEqualAmounts - reserved: null - - id: 1 - name: issuedMismatch - reserved: null - developer: ssi:LZS1ux-gjD9nXPF-OcetUUkW-6r3uSCS6-aQhs9W5f-8JE7w -supplements: [] -types: - 0af65fd62581de85cbd14e23e2db9a92bbef8b7974ffe1b50c4c74db8f86e751: !List - - 5f5e26e5c5053c1b4544515bc6a0653da02a0791fb31116d71a4fad916e15355 - - min: 0 - max: 7 - 18cb946f1293cf180e9d78dcc65bc59b472ffffeadfbf58db198cc8328f64b01: !Tuple - - 560d96f7a47924b2c3df040e6463398fd65fd591652c294342bfa5f939155154 - 1cabbfc3d826c0bfd1e9770a889efacc8b6716ad014a3eec10b6591530229042: !Primitive 64 - 1cb0758e14c2008c0f008ce6d2d41e9e1937e1cd0f9914c59a7e29e1ce7ba0bb: !Tuple - - ccc272928f793803d91f5dad8d51cc986b4332380f9224f7c7c1514d768ebb90 - 2a5baaac5089ff098d150b482cfed8bcd01a91c0d7b45d32216ed576ab71ebdd: !Array - - 1cabbfc3d826c0bfd1e9770a889efacc8b6716ad014a3eec10b6591530229042 - - 32 - 2fd8f27a172712903e6a3e96f0f85c0480b4211a17acd13059fc51d4a4bbde2c: !Union - ? name: none - tag: 0 - : d83fbee02f0de5b46cf80fe11ef7fdf061c78d975d31ade9eea2bc4099339e6c - ? name: some - tag: 1 - : b070d38ff6d20c5ae5d80715ca31541d5a52bbdecbd3529d38e6ddb672200997 - 3cd1a29dccad9b917b26305f89a8a4fb2118302a4e73c5ac0a780de6ab005e73: !Enum - - name: excl - tag: 33 - - name: hash - tag: 35 - - name: dollar - tag: 36 - - name: amp - tag: 38 - - name: plus - tag: 43 - - name: dash - tag: 45 - - name: dot - tag: 46 - - name: zero - tag: 48 - - name: one - tag: 49 - - name: two - tag: 50 - - name: three - tag: 51 - - name: four - tag: 52 - - name: five - tag: 53 - - name: six - tag: 54 - - name: seven - tag: 55 - - name: eight - tag: 56 - - name: nine - tag: 57 - - name: caret - tag: 94 - - name: lodash - tag: 95 - - name: a - tag: 97 - - name: b - tag: 98 - - name: c - tag: 99 - - name: d - tag: 100 - - name: e - tag: 101 - - name: f - tag: 102 - - name: g - tag: 103 - - name: h - tag: 104 - - name: i - tag: 105 - - name: j - tag: 106 - - name: k - tag: 107 - - name: l - tag: 108 - - name: m - tag: 109 - - name: n - tag: 110 - - name: o - tag: 111 - - name: p - tag: 112 - - name: q - tag: 113 - - name: r - tag: 114 - - name: s - tag: 115 - - name: t - tag: 116 - - name: u - tag: 117 - - name: v - tag: 118 - - name: w - tag: 119 - - name: x - tag: 120 - - name: y - tag: 121 - - name: z - tag: 122 - 3f2b72b7c4af1a630cb6d3ff088baf351093ee465b9e7d472a610082e449d7e4: !Tuple - - 63aa2314e8b147c8b284dfb39a9e10d19caad5faea848e3cb9849d9167d6344a - 43aa7fc5f6f5644fe5a2ae5e1aa99042cdeb879442e34c723ff5827fb133de8a: !Struct - - name: type - ty: b10ddefe8020add8a0ca08292150abb13c514d76de5168c1c97105a27e676660 - - name: digest - ty: 2a5baaac5089ff098d150b482cfed8bcd01a91c0d7b45d32216ed576ab71ebdd - 45b780258601c526b23b5b4861460a9050e13f35fbbe8305a8001157e4013888: !Union - ? name: none - tag: 0 - : d83fbee02f0de5b46cf80fe11ef7fdf061c78d975d31ade9eea2bc4099339e6c - ? name: some - tag: 1 - : caff8faeb38a00a04e3621538f8e61d75a85a465cb0a0e48c3593e7eaa6c5fc7 - 48be23172ae884459ae78334a0063f09fa0e317bea8b233ce782a38875e796b8: !Enum - - name: space - tag: 32 - - name: excl - tag: 33 - - name: quotes - tag: 34 - - name: hash - tag: 35 - - name: dollar - tag: 36 - - name: percent - tag: 37 - - name: ampersand - tag: 38 - - name: apostrophe - tag: 39 - - name: bracketL - tag: 40 - - name: bracketR - tag: 41 - - name: asterisk - tag: 42 - - name: plus - tag: 43 - - name: comma - tag: 44 - - name: minus - tag: 45 - - name: dot - tag: 46 - - name: slash - tag: 47 - - name: zero - tag: 48 - - name: one - tag: 49 - - name: two - tag: 50 - - name: three - tag: 51 - - name: four - tag: 52 - - name: five - tag: 53 - - name: six - tag: 54 - - name: seven - tag: 55 - - name: eight - tag: 56 - - name: nine - tag: 57 - - name: colon - tag: 58 - - name: semiColon - tag: 59 - - name: less - tag: 60 - - name: equal - tag: 61 - - name: greater - tag: 62 - - name: question - tag: 63 - - name: at - tag: 64 - - name: _A - tag: 65 - - name: _B - tag: 66 - - name: _C - tag: 67 - - name: _D - tag: 68 - - name: _E - tag: 69 - - name: _F - tag: 70 - - name: _G - tag: 71 - - name: _H - tag: 72 - - name: _I - tag: 73 - - name: _J - tag: 74 - - name: _K - tag: 75 - - name: _L - tag: 76 - - name: _M - tag: 77 - - name: _N - tag: 78 - - name: _O - tag: 79 - - name: _P - tag: 80 - - name: _Q - tag: 81 - - name: _R - tag: 82 - - name: _S - tag: 83 - - name: _T - tag: 84 - - name: _U - tag: 85 - - name: _V - tag: 86 - - name: _W - tag: 87 - - name: _X - tag: 88 - - name: _Y - tag: 89 - - name: _Z - tag: 90 - - name: sqBracketL - tag: 91 - - name: backSlash - tag: 92 - - name: sqBracketR - tag: 93 - - name: caret - tag: 94 - - name: lodash - tag: 95 - - name: backtick - tag: 96 - - name: a - tag: 97 - - name: b - tag: 98 - - name: c - tag: 99 - - name: d - tag: 100 - - name: e - tag: 101 - - name: f - tag: 102 - - name: g - tag: 103 - - name: h - tag: 104 - - name: i - tag: 105 - - name: j - tag: 106 - - name: k - tag: 107 - - name: l - tag: 108 - - name: m - tag: 109 - - name: n - tag: 110 - - name: o - tag: 111 - - name: p - tag: 112 - - name: q - tag: 113 - - name: r - tag: 114 - - name: s - tag: 115 - - name: t - tag: 116 - - name: u - tag: 117 - - name: v - tag: 118 - - name: w - tag: 119 - - name: x - tag: 120 - - name: y - tag: 121 - - name: z - tag: 122 - - name: cBracketL - tag: 123 - - name: pipe - tag: 124 - - name: cBracketR - tag: 125 - - name: tilde - tag: 126 - 560d96f7a47924b2c3df040e6463398fd65fd591652c294342bfa5f939155154: !List - - fba958721a3d335406b368c36f5a82790960cce239febcafe189ba9839d5da78 - - min: 0 - max: 65535 - 5b772c8eb15fd74700c79241f60f8fda37e736b3fd462ab017ce4d454efa81aa: !Tuple - - 5e5ec8924f73cd72c4225c96ab47796658ef1b729ca306e260bca42b25891d0f - 5b8bc7543832054a1d22be94226be7538b133a26881cba4613027878e05c6cf7: !Struct - - name: text - ty: 18cb946f1293cf180e9d78dcc65bc59b472ffffeadfbf58db198cc8328f64b01 - - name: media - ty: e087a83496338799afc48a9211683a427d2bd33e2ea7ebb8a8b880ea4ab4eb81 - 5ca149585de534ee91b3e3a030b7efd4cdb79abea9152f101f3759b4c7210e1f: !Primitive 8 - 5d03c4178da98e7e3f3af343e3997d74201d11f42732cfbea2b04b8e3ff15f22: !Enum - - name: indivisible - tag: 0 - - name: deci - tag: 1 - - name: centi - tag: 2 - - name: milli - tag: 3 - - name: deciMilli - tag: 4 - - name: centiMilli - tag: 5 - - name: micro - tag: 6 - - name: deciMicro - tag: 7 - - name: centiMicro - tag: 8 - - name: nano - tag: 9 - - name: deciNano - tag: 10 - - name: centiNano - tag: 11 - - name: pico - tag: 12 - - name: deciPico - tag: 13 - - name: centiPico - tag: 14 - - name: femto - tag: 15 - - name: deciFemto - tag: 16 - - name: centiFemto - tag: 17 - - name: atto - tag: 18 - 5e5ec8924f73cd72c4225c96ab47796658ef1b729ca306e260bca42b25891d0f: !Tuple - - 822380f475f0edb4b5dc517991de7390ada2dbb3752c4c066851aa01630296c2 - - 0af65fd62581de85cbd14e23e2db9a92bbef8b7974ffe1b50c4c74db8f86e751 - 5f5e26e5c5053c1b4544515bc6a0653da02a0791fb31116d71a4fad916e15355: !Enum - - name: zero - tag: 48 - - name: one - tag: 49 - - name: two - tag: 50 - - name: three - tag: 51 - - name: four - tag: 52 - - name: five - tag: 53 - - name: six - tag: 54 - - name: seven - tag: 55 - - name: eight - tag: 56 - - name: nine - tag: 57 - - name: _A - tag: 65 - - name: _B - tag: 66 - - name: _C - tag: 67 - - name: _D - tag: 68 - - name: _E - tag: 69 - - name: _F - tag: 70 - - name: _G - tag: 71 - - name: _H - tag: 72 - - name: _I - tag: 73 - - name: _J - tag: 74 - - name: _K - tag: 75 - - name: _L - tag: 76 - - name: _M - tag: 77 - - name: _N - tag: 78 - - name: _O - tag: 79 - - name: _P - tag: 80 - - name: _Q - tag: 81 - - name: _R - tag: 82 - - name: _S - tag: 83 - - name: _T - tag: 84 - - name: _U - tag: 85 - - name: _V - tag: 86 - - name: _W - tag: 87 - - name: _X - tag: 88 - - name: _Y - tag: 89 - - name: _Z - tag: 90 - - name: a - tag: 97 - - name: b - tag: 98 - - name: c - tag: 99 - - name: d - tag: 100 - - name: e - tag: 101 - - name: f - tag: 102 - - name: g - tag: 103 - - name: h - tag: 104 - - name: i - tag: 105 - - name: j - tag: 106 - - name: k - tag: 107 - - name: l - tag: 108 - - name: m - tag: 109 - - name: n - tag: 110 - - name: o - tag: 111 - - name: p - tag: 112 - - name: q - tag: 113 - - name: r - tag: 114 - - name: s - tag: 115 - - name: t - tag: 116 - - name: u - tag: 117 - - name: v - tag: 118 - - name: w - tag: 119 - - name: x - tag: 120 - - name: y - tag: 121 - - name: z - tag: 122 - 63aa2314e8b147c8b284dfb39a9e10d19caad5faea848e3cb9849d9167d6344a: !List - - fba958721a3d335406b368c36f5a82790960cce239febcafe189ba9839d5da78 - - min: 1 - max: 255 - 805ec5bc5312c84190445da16aa1c08a09e300e8323acfae6a23420a29ad003d: !Tuple - - c43a7d9eb9b3027973c98f5dd6e1ac04f5cbd34240c0bebc0a0fb808140094d4 - 822380f475f0edb4b5dc517991de7390ada2dbb3752c4c066851aa01630296c2: !Enum - - name: _A - tag: 65 - - name: _B - tag: 66 - - name: _C - tag: 67 - - name: _D - tag: 68 - - name: _E - tag: 69 - - name: _F - tag: 70 - - name: _G - tag: 71 - - name: _H - tag: 72 - - name: _I - tag: 73 - - name: _J - tag: 74 - - name: _K - tag: 75 - - name: _L - tag: 76 - - name: _M - tag: 77 - - name: _N - tag: 78 - - name: _O - tag: 79 - - name: _P - tag: 80 - - name: _Q - tag: 81 - - name: _R - tag: 82 - - name: _S - tag: 83 - - name: _T - tag: 84 - - name: _U - tag: 85 - - name: _V - tag: 86 - - name: _W - tag: 87 - - name: _X - tag: 88 - - name: _Y - tag: 89 - - name: _Z - tag: 90 - - name: a - tag: 97 - - name: b - tag: 98 - - name: c - tag: 99 - - name: d - tag: 100 - - name: e - tag: 101 - - name: f - tag: 102 - - name: g - tag: 103 - - name: h - tag: 104 - - name: i - tag: 105 - - name: j - tag: 106 - - name: k - tag: 107 - - name: l - tag: 108 - - name: m - tag: 109 - - name: n - tag: 110 - - name: o - tag: 111 - - name: p - tag: 112 - - name: q - tag: 113 - - name: r - tag: 114 - - name: s - tag: 115 - - name: t - tag: 116 - - name: u - tag: 117 - - name: v - tag: 118 - - name: w - tag: 119 - - name: x - tag: 120 - - name: y - tag: 121 - - name: z - tag: 122 - 888c5865633af13b95b7cd1a8d8af2dac1dc140b977251d9d4daf3c7511c8e84: !Tuple - - 5ca149585de534ee91b3e3a030b7efd4cdb79abea9152f101f3759b4c7210e1f - b070d38ff6d20c5ae5d80715ca31541d5a52bbdecbd3529d38e6ddb672200997: !Tuple - - 1cb0758e14c2008c0f008ce6d2d41e9e1937e1cd0f9914c59a7e29e1ce7ba0bb - b10ddefe8020add8a0ca08292150abb13c514d76de5168c1c97105a27e676660: !Struct - - name: type - ty: 1cb0758e14c2008c0f008ce6d2d41e9e1937e1cd0f9914c59a7e29e1ce7ba0bb - - name: subtype - ty: 2fd8f27a172712903e6a3e96f0f85c0480b4211a17acd13059fc51d4a4bbde2c - - name: charset - ty: 2fd8f27a172712903e6a3e96f0f85c0480b4211a17acd13059fc51d4a4bbde2c - bf8fcbe9c5395731a6b4cd61fb00dfe7a5d629365339c55aeae087a3b90aaa46: !List - - 3cd1a29dccad9b917b26305f89a8a4fb2118302a4e73c5ac0a780de6ab005e73 - - min: 0 - max: 63 - c43a7d9eb9b3027973c98f5dd6e1ac04f5cbd34240c0bebc0a0fb808140094d4: !Tuple - - 48be23172ae884459ae78334a0063f09fa0e317bea8b233ce782a38875e796b8 - - f5ad172144ccd2dd62ece74ff0fb14641d936a80c1a0c93ebf97727184897cbc - caff8faeb38a00a04e3621538f8e61d75a85a465cb0a0e48c3593e7eaa6c5fc7: !Tuple - - 3f2b72b7c4af1a630cb6d3ff088baf351093ee465b9e7d472a610082e449d7e4 - ccc272928f793803d91f5dad8d51cc986b4332380f9224f7c7c1514d768ebb90: !Tuple - - f9170804ddae0479f8d5af74ab3bd202e6ea4172d9a9b93707151adb7fc40ca1 - - bf8fcbe9c5395731a6b4cd61fb00dfe7a5d629365339c55aeae087a3b90aaa46 - d7fcbee31ef0a85d5f973bda1b0b8c9e7efbcbc5572577382cacd3bdb4218a01: !Struct - - name: ticker - ty: 5b772c8eb15fd74700c79241f60f8fda37e736b3fd462ab017ce4d454efa81aa - - name: name - ty: 805ec5bc5312c84190445da16aa1c08a09e300e8323acfae6a23420a29ad003d - - name: details - ty: 45b780258601c526b23b5b4861460a9050e13f35fbbe8305a8001157e4013888 - - name: precision - ty: 5d03c4178da98e7e3f3af343e3997d74201d11f42732cfbea2b04b8e3ff15f22 - d83fbee02f0de5b46cf80fe11ef7fdf061c78d975d31ade9eea2bc4099339e6c: !Primitive 0 - dc1e2f52567f725fd730ad84867f0da4c9ba9af0813311dfe4ef3e3c4a612548: !Tuple - - 43aa7fc5f6f5644fe5a2ae5e1aa99042cdeb879442e34c723ff5827fb133de8a - e087a83496338799afc48a9211683a427d2bd33e2ea7ebb8a8b880ea4ab4eb81: !Union - ? name: none - tag: 0 - : d83fbee02f0de5b46cf80fe11ef7fdf061c78d975d31ade9eea2bc4099339e6c - ? name: some - tag: 1 - : dc1e2f52567f725fd730ad84867f0da4c9ba9af0813311dfe4ef3e3c4a612548 - f5ad172144ccd2dd62ece74ff0fb14641d936a80c1a0c93ebf97727184897cbc: !List - - 48be23172ae884459ae78334a0063f09fa0e317bea8b233ce782a38875e796b8 - - min: 0 - max: 39 - f9170804ddae0479f8d5af74ab3bd202e6ea4172d9a9b93707151adb7fc40ca1: !Enum - - name: a - tag: 97 - - name: b - tag: 98 - - name: c - tag: 99 - - name: d - tag: 100 - - name: e - tag: 101 - - name: f - tag: 102 - - name: g - tag: 103 - - name: h - tag: 104 - - name: i - tag: 105 - - name: j - tag: 106 - - name: k - tag: 107 - - name: l - tag: 108 - - name: m - tag: 109 - - name: n - tag: 110 - - name: o - tag: 111 - - name: p - tag: 112 - - name: q - tag: 113 - - name: r - tag: 114 - - name: s - tag: 115 - - name: t - tag: 116 - - name: u - tag: 117 - - name: v - tag: 118 - - name: w - tag: 119 - - name: x - tag: 120 - - name: y - tag: 121 - - name: z - tag: 122 - fba958721a3d335406b368c36f5a82790960cce239febcafe189ba9839d5da78: UnicodeChar -scripts: -- isae: - - ALU - - BPDIGEST - - RGB - code: - - 11 - - 0 - - 0 - - 0 - - 208 - - 160 - - 15 - - 1 - - 7 - - 11 - - 0 - - 1 - - 0 - - 11 - - 8 - - 0 - - 0 - - 11 - - 1 - - 2 - - 0 - - 200 - - 218 - - 7 - - 1 - - 57 - - 48 - - 0 - - 209 - - 160 - - 15 - - 1 - - 7 - data: - - 0 - - 1 - - 0 - - 0 - libs: [] -attachments: {} -signatures: {} diff --git a/tests/fixtures/rgb_logo.jpeg b/tests/fixtures/rgb_logo.jpeg deleted file mode 100644 index 00b3c3e..0000000 Binary files a/tests/fixtures/rgb_logo.jpeg and /dev/null differ diff --git a/tests/issuance.rs b/tests/issuance.rs deleted file mode 100644 index 16a7bdf..0000000 --- a/tests/issuance.rs +++ /dev/null @@ -1,268 +0,0 @@ -pub mod utils; - -use rstest_reuse::{self, *}; -use utils::*; - -const MEDIA_FPATH: &str = "tests/fixtures/rgb_logo.jpeg"; - -#[template] -#[rstest] -#[case(DescriptorType::Wpkh, CloseMethod::OpretFirst)] -#[case(DescriptorType::Wpkh, CloseMethod::TapretFirst)] -#[case(DescriptorType::Tr, CloseMethod::OpretFirst)] -#[case(DescriptorType::Tr, CloseMethod::TapretFirst)] -fn descriptor_and_close_method( - #[case] wallet_desc: DescriptorType, - #[case] close_method: CloseMethod, -) { -} - -#[apply(descriptor_and_close_method)] -fn issue_nia(wallet_desc: DescriptorType, close_method: CloseMethod) { - println!("wallet_desc {wallet_desc:?} close_method {close_method:?}"); - - initialize(); - - let mut wallet = get_wallet(&wallet_desc); - - let issued_supply = 999; - let ticker = "TCKR"; - let name = "asset name"; - let precision = 2; - let details = Some("some details"); - let terms_text = "Ricardian contract"; - let terms_media_fpath = Some(MEDIA_FPATH); - let asset_info = AssetInfo::nia( - ticker, - name, - precision, - details, - terms_text, - terms_media_fpath, - vec![issued_supply], - ); - let (contract_id, iface_type_name) = wallet.issue_with_info(asset_info, close_method, vec![]); - - let contract = wallet.contract_iface_class::(contract_id); - let spec = contract.spec(); - assert_eq!(spec.ticker.to_string(), ticker.to_string()); - assert_eq!(spec.name.to_string(), name.to_string()); - assert_eq!(spec.precision.decimals(), precision); - let terms = contract.contract_terms(); - assert_eq!(terms.text.to_string(), terms_text.to_string()); - let terms_media = terms.media.unwrap(); - assert_eq!(terms_media.ty.to_string(), "image/jpeg"); - assert_eq!( - terms_media.digest.to_string(), - "02d2cc5d7883885bb7472e4fe96a07344b1d7cf794cb06943e1cdb5c57754d8a" - ); - assert_eq!(contract.total_issued_supply().value(), issued_supply); - - let allocations = wallet.contract_fungible_allocations(contract_id, &iface_type_name, false); - assert_eq!(allocations.len(), 1); - let allocation = allocations[0]; - assert_eq!(allocation.seal.method(), close_method); - assert_eq!(allocation.state, Amount::from(issued_supply)); -} - -#[apply(descriptor_and_close_method)] -fn issue_uda(wallet_desc: DescriptorType, close_method: CloseMethod) { - println!("wallet_desc {wallet_desc:?} close_method {close_method:?}"); - - initialize(); - - let mut wallet = get_wallet(&wallet_desc); - - let ticker = "TCKR"; - let name = "asset name"; - let details = Some("some details"); - let terms_text = "Ricardian contract"; - let terms_media_fpath = Some(MEDIA_FPATH); - let data = vec![1u8, 3u8, 9u8]; - let preview_ty = "image/jpeg"; - let token_data_preview = EmbeddedMedia { - ty: MediaType::with(preview_ty), - data: Confined::try_from(data.clone()).unwrap(), - }; - let proof = vec![2u8, 4u8, 6u8, 10u8]; - let token_data_reserves = ProofOfReserves { - utxo: Outpoint::from_str(FAKE_TXID).unwrap(), - proof: Confined::try_from(proof.clone()).unwrap(), - }; - let token_data_ticker = "TDTCKR"; - let token_data_name = "token data name"; - let token_data_details = "token data details"; - let token_data_attachment = attachment_from_fpath(MEDIA_FPATH); - let mut token_data_attachments = BTreeMap::new(); - for (idx, attachment_fpath) in ["README.md", "Cargo.toml"].iter().enumerate() { - token_data_attachments.insert(idx as u8, attachment_from_fpath(attachment_fpath)); - } - let token_data = uda_token_data( - token_data_ticker, - token_data_name, - token_data_details, - token_data_preview.clone(), - token_data_attachment.clone(), - token_data_attachments.clone(), - token_data_reserves.clone(), - ); - let asset_info = AssetInfo::uda( - ticker, - name, - details, - terms_text, - terms_media_fpath, - token_data, - ); - let (contract_id, iface_type_name) = wallet.issue_with_info(asset_info, close_method, vec![]); - - let contract = wallet.contract_iface_class::(contract_id); - let spec = contract.spec(); - assert_eq!(spec.ticker.to_string(), ticker.to_string()); - assert_eq!(spec.name.to_string(), name.to_string()); - assert_eq!(spec.precision.decimals(), 0); - let terms = contract.contract_terms(); - assert_eq!(terms.text.to_string(), terms_text.to_string()); - let terms_media = terms.media.unwrap(); - assert_eq!(terms_media.ty.to_string(), "image/jpeg"); - assert_eq!( - terms_media.digest.to_string(), - "02d2cc5d7883885bb7472e4fe96a07344b1d7cf794cb06943e1cdb5c57754d8a" - ); - let token_data = contract.token_data(); - assert_eq!(token_data.index, TokenIndex::from(0)); - assert_eq!(token_data.ticker.unwrap().to_string(), token_data_ticker); - assert_eq!(token_data.name.unwrap().to_string(), token_data_name); - assert_eq!(token_data.details.unwrap().to_string(), token_data_details); - assert_eq!(token_data.preview.unwrap(), token_data_preview); - assert_eq!(token_data.media.unwrap(), token_data_attachment); - assert_eq!( - token_data.attachments.to_unconfined(), - token_data_attachments - ); - assert_eq!(token_data.reserves.unwrap(), token_data_reserves); - - let allocations = wallet.contract_data_allocations(contract_id, &iface_type_name); - assert_eq!(allocations.len(), 1); - let allocation = &allocations[0]; - assert_eq!(allocation.seal.method(), close_method); - assert_eq!(allocation.state.to_string(), "000000000100000000000000"); -} - -#[apply(descriptor_and_close_method)] -fn issue_cfa(wallet_desc: DescriptorType, close_method: CloseMethod) { - println!("wallet_desc {wallet_desc:?} close_method {close_method:?}"); - - initialize(); - - let mut wallet = get_wallet(&wallet_desc); - - let issued_supply = 999; - let name = "asset name"; - let precision = 2; - let details = Some("some details"); - let terms_text = "Ricardian contract"; - let terms_media_fpath = Some(MEDIA_FPATH); - let asset_info = AssetInfo::cfa( - name, - precision, - details, - terms_text, - terms_media_fpath, - vec![issued_supply], - ); - let (contract_id, iface_type_name) = wallet.issue_with_info(asset_info, close_method, vec![]); - - let contract = wallet.contract_iface_class::(contract_id); - assert_eq!(contract.name().to_string(), name.to_string()); - assert_eq!( - contract.details().map(|d| d.to_string()), - details.map(|d| d.to_string()) - ); - assert_eq!(contract.precision().decimals(), precision); - let terms = contract.contract_terms(); - assert_eq!(terms.text.to_string(), terms_text.to_string()); - let terms_media = terms.media.unwrap(); - assert_eq!(terms_media.ty.to_string(), "image/jpeg"); - assert_eq!( - terms_media.digest.to_string(), - "02d2cc5d7883885bb7472e4fe96a07344b1d7cf794cb06943e1cdb5c57754d8a" - ); - assert_eq!(contract.total_issued_supply().value(), issued_supply); - - let allocations = wallet.contract_fungible_allocations(contract_id, &iface_type_name, false); - assert_eq!(allocations.len(), 1); - let allocation = allocations[0]; - assert_eq!(allocation.seal.method(), close_method); - assert_eq!(allocation.state, Amount::from(issued_supply)); -} - -#[apply(descriptor_and_close_method)] -fn issue_nia_multiple_utxos(wallet_desc: DescriptorType, close_method: CloseMethod) { - println!("wallet_desc {wallet_desc:?} close_method {close_method:?}"); - - initialize(); - - let mut wallet = get_wallet(&wallet_desc); - - let amounts = vec![222, 444, 333]; - let outpoints: Vec<_> = (0..amounts.len()) - .map(|_| Some(wallet.get_utxo(None))) - .collect(); - let asset_info = AssetInfo::default_nia(amounts.clone()); - let (contract_id, iface_type_name) = - wallet.issue_with_info(asset_info, close_method, outpoints.clone()); - - let contract = wallet.contract_iface_class::(contract_id); - assert_eq!( - contract.total_issued_supply().value(), - amounts.iter().sum::() - ); - - let allocations = wallet.contract_fungible_allocations(contract_id, &iface_type_name, false); - assert_eq!(allocations.len(), amounts.len()); - for (amt, outpoint) in amounts.iter().zip(outpoints.into_iter()) { - assert!(allocations.iter().any(|a| a.state == Amount::from(*amt) - && a.seal - == XChain::Bitcoin(ExplicitSeal { - method: close_method, - txid: outpoint.unwrap().txid, - vout: outpoint.unwrap().vout - }))) - } -} - -#[apply(descriptor_and_close_method)] -fn issue_cfa_multiple_utxos(wallet_desc: DescriptorType, close_method: CloseMethod) { - println!("wallet_desc {wallet_desc:?} close_method {close_method:?}"); - - initialize(); - - let mut wallet = get_wallet(&wallet_desc); - - let amounts = vec![222, 444, 333]; - let outpoints: Vec<_> = (0..amounts.len()) - .map(|_| Some(wallet.get_utxo(None))) - .collect(); - let asset_info = AssetInfo::default_cfa(amounts.clone()); - let (contract_id, iface_type_name) = - wallet.issue_with_info(asset_info, close_method, outpoints.clone()); - - let contract = wallet.contract_iface_class::(contract_id); - assert_eq!( - contract.total_issued_supply().value(), - amounts.iter().sum::() - ); - - let allocations = wallet.contract_fungible_allocations(contract_id, &iface_type_name, false); - assert_eq!(allocations.len(), amounts.len()); - for (amt, outpoint) in amounts.iter().zip(outpoints.into_iter()) { - assert!(allocations.iter().any(|a| a.state == Amount::from(*amt) - && a.seal - == XChain::Bitcoin(ExplicitSeal { - method: close_method, - txid: outpoint.unwrap().txid, - vout: outpoint.unwrap().vout - }))) - } -} diff --git a/tests/stress.rs b/tests/stress.rs deleted file mode 100644 index e266758..0000000 --- a/tests/stress.rs +++ /dev/null @@ -1,96 +0,0 @@ -pub mod utils; - -use utils::*; - -type TT = TransferType; -type DT = DescriptorType; - -#[rstest] -// blinded -#[case(TT::Blinded, DT::Wpkh, DT::Wpkh)] -#[case(TT::Blinded, DT::Wpkh, DT::Tr)] -#[case(TT::Blinded, DT::Tr, DT::Tr)] -// witness -#[case(TT::Witness, DT::Wpkh, DT::Wpkh)] -#[case(TT::Witness, DT::Wpkh, DT::Tr)] -#[case(TT::Witness, DT::Tr, DT::Tr)] -#[ignore = "run a single case if desired"] -fn back_and_forth( - #[case] transfer_type: TransferType, - #[case] wlt_1_desc: DescriptorType, - #[case] wlt_2_desc: DescriptorType, -) { - println!("transfer_type {transfer_type:?} wlt_1_desc {wlt_1_desc:?} wlt_2_desc {wlt_2_desc:?}"); - - initialize(); - - let stress_tests_dir = PathBuf::from(TEST_DATA_DIR).join(STRESS_DATA_DIR); - std::fs::create_dir_all(&stress_tests_dir).unwrap(); - let fname = OffsetDateTime::unix_timestamp(OffsetDateTime::now_utc()).to_string(); - let mut fpath = stress_tests_dir.join(fname); - fpath.set_extension("csv"); - println!("report path: {}", fpath.to_string_lossy()); - let report = Report { report_path: fpath }; - report.write_header(&[ - "wlt_1_pay", - "wlt_2_validate", - "wlt_2_accept", - "wlt_2_pay", - "wlt_1_validate", - "wlt_1_accept", - "send_1_tot", - "send_2_tot", - ]); - - let mut wlt_1 = get_wallet(&wlt_1_desc); - let mut wlt_2 = get_wallet(&wlt_2_desc); - - let issued_supply = u64::MAX; - - let (contract_id, iface_type_name) = wlt_1.issue_nia(issued_supply, wlt_1.close_method(), None); - - let loops = match std::env::var("LOOPS") { - Ok(val) if u16::from_str(&val).is_ok() => u16::from_str(&val).unwrap(), - Err(VarError::NotPresent) => 50, - _ => { - panic!("invalid loops value: must be a u16 number") - } - }; - - let sats_base = 3000; - let mut sats_send = sats_base * loops as u64; - let now = Instant::now(); - for i in 1..=loops { - println!("loop {i}/{loops}"); - sats_send -= DEFAULT_FEE_ABS * 2; - let wlt_1_send_start = Instant::now(); - wlt_1.send( - &mut wlt_2, - transfer_type, - contract_id, - &iface_type_name, - issued_supply - i as u64, - sats_send, - Some(&report), - ); - let wlt_1_send_duration = wlt_1_send_start.elapsed(); - sats_send -= DEFAULT_FEE_ABS * 2; - let wlt_2_send_start = Instant::now(); - wlt_2.send( - &mut wlt_1, - transfer_type, - contract_id, - &iface_type_name, - issued_supply - i as u64 - 1, - sats_send, - Some(&report), - ); - let wlt_2_send_duration = wlt_2_send_start.elapsed(); - - report.write_duration(wlt_1_send_duration); - report.write_duration(wlt_2_send_duration); - report.end_line(); - } - let elapsed = now.elapsed(); - println!("elapsed: {:.2?}", elapsed); -} diff --git a/tests/transfers.rs b/tests/transfers.rs index 776b31d..60e3916 100644 --- a/tests/transfers.rs +++ b/tests/transfers.rs @@ -1,6 +1,10 @@ -pub mod utils; +mod utils; -use utils::*; +use rstest::rstest; + +use crate::utils::chain::initialize; +use crate::utils::runtime::TestRuntime; +use crate::utils::{AssetSchema, DescriptorType, TransferType}; type TT = TransferType; type DT = DescriptorType; @@ -33,25 +37,25 @@ type AS = AssetSchema; #[case(TT::Blinded, DT::Tr, DT::Wpkh, AS::Cfa, AS::Nia)] #[case(TT::Blinded, DT::Tr, DT::Tr, AS::Cfa, AS::Nia)] // blinded: cfa - uda -#[case(TT::Blinded, DT::Wpkh, DT::Wpkh, AS::Cfa, AS::Uda)] -#[case(TT::Blinded, DT::Wpkh, DT::Tr, AS::Cfa, AS::Uda)] -#[case(TT::Blinded, DT::Tr, DT::Wpkh, AS::Cfa, AS::Uda)] -#[case(TT::Blinded, DT::Tr, DT::Tr, AS::Cfa, AS::Uda)] +// #[case(TT::Blinded, DT::Wpkh, DT::Wpkh, AS::Cfa, AS::Uda)] +// #[case(TT::Blinded, DT::Wpkh, DT::Tr, AS::Cfa, AS::Uda)] +// #[case(TT::Blinded, DT::Tr, DT::Wpkh, AS::Cfa, AS::Uda)] +// #[case(TT::Blinded, DT::Tr, DT::Tr, AS::Cfa, AS::Uda)] // blinded: uda - uda -#[case(TT::Blinded, DT::Wpkh, DT::Wpkh, AS::Uda, AS::Uda)] -#[case(TT::Blinded, DT::Wpkh, DT::Tr, AS::Uda, AS::Uda)] -#[case(TT::Blinded, DT::Tr, DT::Wpkh, AS::Uda, AS::Uda)] -#[case(TT::Blinded, DT::Tr, DT::Tr, AS::Uda, AS::Uda)] +// #[case(TT::Blinded, DT::Wpkh, DT::Wpkh, AS::Uda, AS::Uda)] +// #[case(TT::Blinded, DT::Wpkh, DT::Tr, AS::Uda, AS::Uda)] +// #[case(TT::Blinded, DT::Tr, DT::Wpkh, AS::Uda, AS::Uda)] +// #[case(TT::Blinded, DT::Tr, DT::Tr, AS::Uda, AS::Uda)] // blinded: uda - nia -#[case(TT::Blinded, DT::Wpkh, DT::Wpkh, AS::Uda, AS::Nia)] -#[case(TT::Blinded, DT::Wpkh, DT::Tr, AS::Uda, AS::Nia)] -#[case(TT::Blinded, DT::Tr, DT::Wpkh, AS::Uda, AS::Nia)] -#[case(TT::Blinded, DT::Tr, DT::Tr, AS::Uda, AS::Nia)] +// #[case(TT::Blinded, DT::Wpkh, DT::Wpkh, AS::Uda, AS::Nia)] +// #[case(TT::Blinded, DT::Wpkh, DT::Tr, AS::Uda, AS::Nia)] +// #[case(TT::Blinded, DT::Tr, DT::Wpkh, AS::Uda, AS::Nia)] +// #[case(TT::Blinded, DT::Tr, DT::Tr, AS::Uda, AS::Nia)] // blinded: uda - cfa -#[case(TT::Blinded, DT::Wpkh, DT::Wpkh, AS::Uda, AS::Cfa)] -#[case(TT::Blinded, DT::Wpkh, DT::Tr, AS::Uda, AS::Cfa)] -#[case(TT::Blinded, DT::Tr, DT::Wpkh, AS::Uda, AS::Cfa)] -#[case(TT::Blinded, DT::Tr, DT::Tr, AS::Uda, AS::Cfa)] +// #[case(TT::Blinded, DT::Wpkh, DT::Wpkh, AS::Uda, AS::Cfa)] +// #[case(TT::Blinded, DT::Wpkh, DT::Tr, AS::Uda, AS::Cfa)] +// #[case(TT::Blinded, DT::Tr, DT::Wpkh, AS::Uda, AS::Cfa)] +// #[case(TT::Blinded, DT::Tr, DT::Tr, AS::Uda, AS::Cfa)] // witness: nia - nia #[case(TT::Witness, DT::Wpkh, DT::Wpkh, AS::Nia, AS::Nia)] #[case(TT::Witness, DT::Wpkh, DT::Tr, AS::Nia, AS::Nia)] @@ -78,25 +82,25 @@ type AS = AssetSchema; #[case(TT::Witness, DT::Tr, DT::Wpkh, AS::Cfa, AS::Nia)] #[case(TT::Witness, DT::Tr, DT::Tr, AS::Cfa, AS::Nia)] // witness: cfa - uda -#[case(TT::Witness, DT::Wpkh, DT::Wpkh, AS::Cfa, AS::Uda)] -#[case(TT::Witness, DT::Wpkh, DT::Tr, AS::Cfa, AS::Uda)] -#[case(TT::Witness, DT::Tr, DT::Wpkh, AS::Cfa, AS::Uda)] -#[case(TT::Witness, DT::Tr, DT::Tr, AS::Cfa, AS::Uda)] +// #[case(TT::Witness, DT::Wpkh, DT::Wpkh, AS::Cfa, AS::Uda)] +// #[case(TT::Witness, DT::Wpkh, DT::Tr, AS::Cfa, AS::Uda)] +// #[case(TT::Witness, DT::Tr, DT::Wpkh, AS::Cfa, AS::Uda)] +// #[case(TT::Witness, DT::Tr, DT::Tr, AS::Cfa, AS::Uda)] // witness: uda - uda -#[case(TT::Witness, DT::Wpkh, DT::Wpkh, AS::Uda, AS::Uda)] -#[case(TT::Witness, DT::Wpkh, DT::Tr, AS::Uda, AS::Uda)] -#[case(TT::Witness, DT::Tr, DT::Wpkh, AS::Uda, AS::Uda)] -#[case(TT::Witness, DT::Tr, DT::Tr, AS::Uda, AS::Uda)] +// #[case(TT::Witness, DT::Wpkh, DT::Wpkh, AS::Uda, AS::Uda)] +// #[case(TT::Witness, DT::Wpkh, DT::Tr, AS::Uda, AS::Uda)] +// #[case(TT::Witness, DT::Tr, DT::Wpkh, AS::Uda, AS::Uda)] +// #[case(TT::Witness, DT::Tr, DT::Tr, AS::Uda, AS::Uda)] // witness: uda - nia -#[case(TT::Witness, DT::Wpkh, DT::Wpkh, AS::Uda, AS::Nia)] -#[case(TT::Witness, DT::Wpkh, DT::Tr, AS::Uda, AS::Nia)] -#[case(TT::Witness, DT::Tr, DT::Wpkh, AS::Uda, AS::Nia)] -#[case(TT::Witness, DT::Tr, DT::Tr, AS::Uda, AS::Nia)] +// #[case(TT::Witness, DT::Wpkh, DT::Wpkh, AS::Uda, AS::Nia)] +// #[case(TT::Witness, DT::Wpkh, DT::Tr, AS::Uda, AS::Nia)] +// #[case(TT::Witness, DT::Tr, DT::Wpkh, AS::Uda, AS::Nia)] +// #[case(TT::Witness, DT::Tr, DT::Tr, AS::Uda, AS::Nia)] // witness: uda - cfa -#[case(TT::Witness, DT::Wpkh, DT::Wpkh, AS::Uda, AS::Cfa)] -#[case(TT::Witness, DT::Wpkh, DT::Tr, AS::Uda, AS::Cfa)] -#[case(TT::Witness, DT::Tr, DT::Wpkh, AS::Uda, AS::Cfa)] -#[case(TT::Witness, DT::Tr, DT::Tr, AS::Uda, AS::Cfa)] +// #[case(TT::Witness, DT::Wpkh, DT::Wpkh, AS::Uda, AS::Cfa)] +// #[case(TT::Witness, DT::Wpkh, DT::Tr, AS::Uda, AS::Cfa)] +// #[case(TT::Witness, DT::Tr, DT::Wpkh, AS::Uda, AS::Cfa)] +// #[case(TT::Witness, DT::Tr, DT::Tr, AS::Uda, AS::Cfa)] fn transfer_loop( #[case] transfer_type: TransferType, #[case] wlt_1_desc: DescriptorType, @@ -106,251 +110,111 @@ fn transfer_loop( ) { println!( "transfer_type {transfer_type:?} wlt_1_desc {wlt_1_desc:?} wlt_2_desc {wlt_2_desc:?} \ - asset_schema_1 {asset_schema_1:?} asset_schema_2 {asset_schema_2:?}" + asset_schema_1 {asset_schema_1:?} asset_schema_2 {asset_schema_2:?}" ); initialize(); - let mut wlt_1 = get_wallet(&wlt_1_desc); - let mut wlt_2 = get_wallet(&wlt_2_desc); + let mut wlt_1 = TestRuntime::new(&wlt_1_desc); + let mut wlt_2 = TestRuntime::new(&wlt_2_desc); let issued_supply_1 = 999; let issued_supply_2 = 666; + let wout = transfer_type == TT::Witness; let mut sats = 9000; // wlt_1 issues 2 assets on the same UTXO let utxo = wlt_1.get_utxo(None); - let (contract_id_1, iface_type_name_1) = match asset_schema_1 { - AssetSchema::Nia => wlt_1.issue_nia(issued_supply_1, wlt_1.close_method(), Some(&utxo)), - AssetSchema::Uda => wlt_1.issue_uda(wlt_1.close_method(), Some(&utxo)), - AssetSchema::Cfa => wlt_1.issue_cfa(issued_supply_1, wlt_1.close_method(), Some(&utxo)), + let contract_id_1 = match asset_schema_1 { + AssetSchema::Nia => wlt_1.issue_nia("Nia 1", issued_supply_1, utxo), + AssetSchema::Uda => todo!(), // wlt_1.issue_uda(utxo), + AssetSchema::Cfa => wlt_1.issue_cfa("Cfa 1", issued_supply_1, utxo), }; - let (contract_id_2, iface_type_name_2) = match asset_schema_2 { - AssetSchema::Nia => wlt_1.issue_nia(issued_supply_2, wlt_1.close_method(), Some(&utxo)), - AssetSchema::Uda => wlt_1.issue_uda(wlt_1.close_method(), Some(&utxo)), - AssetSchema::Cfa => wlt_1.issue_cfa(issued_supply_2, wlt_1.close_method(), Some(&utxo)), + let contract_id_2 = match asset_schema_2 { + AssetSchema::Nia => wlt_1.issue_nia("Nia 2", issued_supply_2, utxo), + AssetSchema::Uda => todo!(), // wlt_1.issue_uda(utxo), + AssetSchema::Cfa => wlt_1.issue_cfa("Cfa 2", issued_supply_2, utxo), }; - wlt_1.check_allocations( - contract_id_1, - &iface_type_name_1, - asset_schema_1, - vec![issued_supply_1], - true, - ); - wlt_1.check_allocations( - contract_id_2, - &iface_type_name_2, - asset_schema_2, - vec![issued_supply_2], - true, - ); + wlt_1.check_allocations(contract_id_1, asset_schema_1, vec![issued_supply_1], true); + wlt_1.check_allocations(contract_id_2, asset_schema_2, vec![issued_supply_2], true); // wlt_1 spends asset 1, moving the other with a blank transition - let amount_1 = if asset_schema_1 == AssetSchema::Uda { - 1 - } else { - 99 - }; - wlt_1.send( - &mut wlt_2, - transfer_type, - contract_id_1, - &iface_type_name_1, - amount_1, - sats, - None, - ); - wlt_1.check_allocations( - contract_id_1, - &iface_type_name_1, - asset_schema_1, - vec![issued_supply_1 - amount_1], - false, - ); - wlt_1.check_allocations( - contract_id_2, - &iface_type_name_2, - asset_schema_2, - vec![issued_supply_2], - true, - ); - wlt_2.check_allocations( - contract_id_1, - &iface_type_name_1, - asset_schema_1, - vec![amount_1], - true, - ); + let amount_1 = if asset_schema_1 == AssetSchema::Uda { 1 } else { 99 }; + wlt_1.send(&mut wlt_2, wout, contract_id_1, amount_1, sats, None); + wlt_1.check_allocations(contract_id_1, asset_schema_1, vec![issued_supply_1 - amount_1], false); + wlt_1.check_allocations(contract_id_2, asset_schema_2, vec![issued_supply_2], true); + wlt_2.check_allocations(contract_id_1, asset_schema_1, vec![amount_1], true); // wlt_1 spends asset 1 change (only if possible) let amount_2 = 33; if asset_schema_1 != AssetSchema::Uda { - wlt_1.send( - &mut wlt_2, - transfer_type, - contract_id_1, - &iface_type_name_1, - amount_2, - sats, - None, - ); + wlt_1.send(&mut wlt_2, wout, contract_id_1, amount_2, sats, None); wlt_1.check_allocations( contract_id_1, - &iface_type_name_1, asset_schema_1, vec![issued_supply_1 - amount_1 - amount_2], false, ); - wlt_1.check_allocations( - contract_id_2, - &iface_type_name_2, - asset_schema_2, - vec![issued_supply_2], - true, - ); - wlt_2.check_allocations( - contract_id_1, - &iface_type_name_1, - asset_schema_1, - vec![amount_1, amount_2], - true, - ); + wlt_1.check_allocations(contract_id_2, asset_schema_2, vec![issued_supply_2], true); + wlt_2.check_allocations(contract_id_1, asset_schema_1, vec![amount_1, amount_2], true); } // wlt_1 spends asset 2 - let amount_3 = if asset_schema_2 == AssetSchema::Uda { - 1 - } else { - 22 - }; - wlt_1.send( - &mut wlt_2, - transfer_type, - contract_id_2, - &iface_type_name_2, - amount_3, - sats, - None, - ); + let amount_3 = if asset_schema_2 == AssetSchema::Uda { 1 } else { 22 }; + wlt_1.send(&mut wlt_2, wout, contract_id_2, amount_3, sats, None); wlt_1.check_allocations( contract_id_1, - &iface_type_name_1, asset_schema_1, vec![issued_supply_1 - amount_1 - amount_2], false, ); - wlt_1.check_allocations( - contract_id_2, - &iface_type_name_2, - asset_schema_2, - vec![issued_supply_2 - amount_3], - false, - ); - wlt_2.check_allocations( - contract_id_1, - &iface_type_name_1, - asset_schema_1, - vec![amount_1, amount_2], - true, - ); - wlt_2.check_allocations( - contract_id_2, - &iface_type_name_2, - asset_schema_2, - vec![amount_3], - true, - ); + wlt_1.check_allocations(contract_id_2, asset_schema_2, vec![issued_supply_2 - amount_3], false); + wlt_2.check_allocations(contract_id_1, asset_schema_1, vec![amount_1, amount_2], true); + wlt_2.check_allocations(contract_id_2, asset_schema_2, vec![amount_3], true); // wlt_2 spends received allocation(s) of asset 1 - let amount_4 = if asset_schema_1 == AssetSchema::Uda { - 1 - } else { - 111 - }; + let amount_4 = if asset_schema_1 == AssetSchema::Uda { 1 } else { 111 }; sats -= 1000; - wlt_2.send( - &mut wlt_1, - transfer_type, - contract_id_1, - &iface_type_name_1, - amount_4, - sats, - None, - ); + wlt_2.send(&mut wlt_1, wout, contract_id_1, amount_4, sats, None); wlt_1.check_allocations( contract_id_1, - &iface_type_name_1, asset_schema_1, vec![issued_supply_1 - amount_1 - amount_2, amount_4], true, ); - wlt_1.check_allocations( - contract_id_2, - &iface_type_name_2, - asset_schema_2, - vec![issued_supply_2 - amount_3], - false, - ); + wlt_1.check_allocations(contract_id_2, asset_schema_2, vec![issued_supply_2 - amount_3], false); wlt_2.check_allocations( contract_id_1, - &iface_type_name_1, asset_schema_1, vec![amount_1 + amount_2 - amount_4], false, ); - wlt_2.check_allocations( - contract_id_2, - &iface_type_name_2, - asset_schema_2, - vec![amount_3], - true, - ); + wlt_2.check_allocations(contract_id_2, asset_schema_2, vec![amount_3], true); // wlt_2 spends asset 2 - let amount_5 = if asset_schema_2 == AssetSchema::Uda { - 1 - } else { - 11 - }; + let amount_5 = if asset_schema_2 == AssetSchema::Uda { 1 } else { 11 }; sats -= 1000; - wlt_2.send( - &mut wlt_1, - transfer_type, - contract_id_2, - &iface_type_name_2, - amount_5, - sats, - None, - ); + wlt_2.send(&mut wlt_1, wout, contract_id_2, amount_5, sats, None); wlt_1.check_allocations( contract_id_1, - &iface_type_name_1, asset_schema_1, vec![issued_supply_1 - amount_1 - amount_2, amount_4], true, ); wlt_1.check_allocations( contract_id_2, - &iface_type_name_2, asset_schema_2, vec![issued_supply_2 - amount_3, amount_5], true, ); wlt_2.check_allocations( contract_id_1, - &iface_type_name_1, asset_schema_1, vec![amount_1 + amount_2 - amount_4], false, ); - wlt_2.check_allocations( - contract_id_2, - &iface_type_name_2, - asset_schema_2, - vec![amount_3 - amount_5], - false, - ); + wlt_2.check_allocations(contract_id_2, asset_schema_2, vec![amount_3 - amount_5], false); // wlt_1 spends asset 1, received back let amount_6 = if asset_schema_1 == AssetSchema::Uda { @@ -359,1504 +223,39 @@ fn transfer_loop( issued_supply_1 - amount_1 - amount_2 + amount_4 }; sats -= 1000; - wlt_1.send( - &mut wlt_2, - transfer_type, - contract_id_1, - &iface_type_name_1, - amount_6, - sats, - None, - ); - wlt_1.check_allocations( - contract_id_1, - &iface_type_name_1, - asset_schema_1, - vec![], - false, - ); + wlt_1.send(&mut wlt_2, wout, contract_id_1, amount_6, sats, None); + wlt_1.check_allocations(contract_id_1, asset_schema_1, vec![], false); wlt_1.check_allocations( contract_id_2, - &iface_type_name_2, asset_schema_2, vec![issued_supply_2 - amount_3, amount_5], true, ); wlt_2.check_allocations( contract_id_1, - &iface_type_name_1, asset_schema_1, vec![amount_1 + amount_2 - amount_4, amount_6], true, ); - wlt_2.check_allocations( - contract_id_2, - &iface_type_name_2, - asset_schema_2, - vec![amount_3 - amount_5], - false, - ); + wlt_2.check_allocations(contract_id_2, asset_schema_2, vec![amount_3 - amount_5], false); // wlt_1 spends asset 2, received back - let amount_7 = if asset_schema_2 == AssetSchema::Uda { - 1 - } else { - issued_supply_2 - amount_3 + amount_5 - }; + let amount_7 = + if asset_schema_2 == AssetSchema::Uda { 1 } else { issued_supply_2 - amount_3 + amount_5 }; sats -= 1000; - wlt_1.send( - &mut wlt_2, - transfer_type, - contract_id_2, - &iface_type_name_2, - amount_7, - sats, - None, - ); - wlt_1.check_allocations( - contract_id_1, - &iface_type_name_1, - asset_schema_1, - vec![], - false, - ); - wlt_1.check_allocations( - contract_id_2, - &iface_type_name_2, - asset_schema_2, - vec![], - false, - ); + wlt_1.send(&mut wlt_2, wout, contract_id_2, amount_7, sats, None); + wlt_1.check_allocations(contract_id_1, asset_schema_1, vec![], false); + wlt_1.check_allocations(contract_id_2, asset_schema_2, vec![], false); wlt_2.check_allocations( contract_id_1, - &iface_type_name_1, asset_schema_1, vec![amount_1 + amount_2 - amount_4, amount_6], true, ); wlt_2.check_allocations( contract_id_2, - &iface_type_name_2, asset_schema_2, vec![amount_3 - amount_5, amount_7], true, ); } - -#[test] -fn rbf_transfer() { - initialize(); - - let mut wlt_1 = get_wallet(&DescriptorType::Wpkh); - let mut wlt_2 = get_wallet(&DescriptorType::Wpkh); - - let issue_supply = 600; - let (contract_id, iface_type_name) = wlt_1.issue_nia(issue_supply, wlt_1.close_method(), None); - - stop_mining(); - let initial_height = get_height(); - - let amount = 400; - let invoice = wlt_2.invoice( - contract_id, - &iface_type_name, - amount, - wlt_2.close_method(), - InvoiceType::Witness, - ); - let (consignment, _) = wlt_1.transfer(invoice.clone(), None, Some(500), true, None); - - wlt_2.accept_transfer(consignment.clone(), None); - - // retry with higher fees, TX hasn't been mined - let mid_height = get_height(); - assert_eq!(initial_height, mid_height); - - let (consignment, tx) = wlt_1.transfer(invoice, None, Some(1000), true, None); - - let final_height = get_height(); - assert_eq!(initial_height, final_height); - - wlt_1.mine_tx(&tx.txid(), true); - wlt_2.accept_transfer(consignment.clone(), None); - wlt_1.sync_and_update_witnesses(None); - wlt_2.sync_and_update_witnesses(None); - - wlt_1.check_allocations( - contract_id, - &iface_type_name, - AssetSchema::Nia, - vec![issue_supply - amount], - false, - ); - wlt_2.check_allocations( - contract_id, - &iface_type_name, - AssetSchema::Nia, - vec![amount], - false, - ); - - wlt_2.send( - &mut wlt_1, - TransferType::Blinded, - contract_id, - &iface_type_name, - amount, - 1000, - None, - ); -} - -#[rstest] -#[ignore = "fix needed"] // https://github.com/RGB-WG/rgb-core/issues/283 -#[case(TransferType::Blinded)] -#[should_panic( - expected = "the invoice requirements can't be fulfilled using available assets or smart contract state." -)] -#[case(TransferType::Witness)] -fn same_transfer_twice_no_update_witnesses(#[case] transfer_type: TransferType) { - println!("transfer_type {transfer_type:?}"); - - initialize(); - - let mut wlt_1 = get_wallet(&DescriptorType::Wpkh); - let mut wlt_2 = get_wallet(&DescriptorType::Wpkh); - - let issue_supply = 2000; - let (contract_id, iface_type_name) = wlt_1.issue_nia(issue_supply, wlt_1.close_method(), None); - - let amount = 100; - let invoice = wlt_2.invoice( - contract_id, - &iface_type_name, - amount, - wlt_2.close_method(), - transfer_type.into(), - ); - let _ = wlt_1.transfer(invoice.clone(), None, Some(500), false, None); - - let (consignment, _) = wlt_1.transfer(invoice, None, Some(1000), true, None); - - wlt_2.accept_transfer(consignment, None); - - // with TransferType::Blinded this shows duplicated allocations - wlt_2.debug_logs(contract_id, &iface_type_name, AllocationFilter::WalletAll); - - // with TransferType::Blinded this fails because the wallet sees 2 allocations instead of 1 - // comment it in order to see the inflation bug - wlt_2.check_allocations( - contract_id, - &iface_type_name, - AssetSchema::Nia, - vec![amount], - false, - ); - - // with TransferType::Blinded this works but should fail - wlt_2.send( - &mut wlt_1, - TransferType::Blinded, - contract_id, - &iface_type_name, - amount * 2, - 1000, - None, - ); - - // with TransferType::Blinded this shows 1900+200 as owned, but we issued 2000 - wlt_1.debug_logs(contract_id, &iface_type_name, AllocationFilter::WalletAll); - - let mut wlt_3 = get_wallet(&DescriptorType::Wpkh); - - // with TransferType::Blinded this works but should fail - wlt_1.send( - &mut wlt_3, - TransferType::Blinded, - contract_id, - &iface_type_name, - issue_supply + amount, - 1000, - None, - ); - // with TransferType::Blinded this shows 2100 as owned, but we issued 2000 - wlt_3.debug_logs(contract_id, &iface_type_name, AllocationFilter::WalletAll); -} - -#[rstest] -#[ignore = "fix needed"] // https://github.com/RGB-WG/rgb-core/issues/283 -#[case(TransferType::Blinded)] -#[case(TransferType::Witness)] -fn same_transfer_twice_update_witnesses(#[case] transfer_type: TransferType) { - println!("transfer_type {transfer_type:?}"); - - initialize(); - - let mut wlt_1 = get_wallet(&DescriptorType::Wpkh); - let mut wlt_2 = get_wallet(&DescriptorType::Wpkh); - - let issue_supply = 2000; - let (contract_id, iface_type_name) = wlt_1.issue_nia(issue_supply, wlt_1.close_method(), None); - - let amount = 100; - let invoice = wlt_2.invoice( - contract_id, - &iface_type_name, - amount, - wlt_2.close_method(), - transfer_type.into(), - ); - let _ = wlt_1.transfer(invoice.clone(), None, Some(500), false, None); - - wlt_1.sync_and_update_witnesses(None); - - // with TransferType::Blinded this fails with an AbsentValidWitness error - let (consignment, tx) = wlt_1.transfer(invoice, None, Some(1000), true, None); - - wlt_1.mine_tx(&tx.txid(), false); - wlt_2.accept_transfer(consignment, None); - wlt_1.sync(); - - wlt_1.check_allocations( - contract_id, - &iface_type_name, - AssetSchema::Nia, - vec![issue_supply - amount], - false, - ); - wlt_2.check_allocations( - contract_id, - &iface_type_name, - AssetSchema::Nia, - vec![amount], - false, - ); - - wlt_2.send( - &mut wlt_1, - TransferType::Blinded, - contract_id, - &iface_type_name, - amount, - 1000, - None, - ); -} - -#[rstest] -#[ignore = "probably not a bug, but still unexpected"] -#[case(TT::Blinded)] -#[case(TT::Witness)] -fn invoice_reuse(#[case] transfer_type: TransferType) { - println!("transfer_type {transfer_type:?}"); - - initialize(); - - let mut wlt_1 = get_wallet(&DescriptorType::Wpkh); - let mut wlt_2 = get_wallet(&DescriptorType::Wpkh); - - let asset_info = AssetInfo::default_nia(vec![500, 400]); - let (contract_id, iface_type_name) = - wlt_1.issue_with_info(asset_info, wlt_1.close_method(), vec![None, None]); - - let amount = 300; - let invoice = wlt_2.invoice( - contract_id, - &iface_type_name, - amount, - wlt_2.close_method(), - transfer_type.into(), - ); - wlt_1.send_to_invoice(&mut wlt_2, invoice.clone(), Some(500), None, None); - let (consignment, _) = wlt_1.send_to_invoice(&mut wlt_2, invoice, Some(600), None, None); - - wlt_1.check_allocations( - contract_id, - &iface_type_name, - AssetSchema::Nia, - vec![200, 100], - false, - ); - wlt_2.check_allocations( - contract_id, - &iface_type_name, - AssetSchema::Nia, - vec![amount, amount], - false, - ); - - // with TransferType::Blinded this fails: bundle for 1st transfer is also included - assert_eq!(consignment.bundles.len(), 1); -} - -#[test] -fn accept_0conf() { - initialize(); - - let mut wlt_1 = get_wallet(&DescriptorType::Wpkh); - let mut wlt_2 = get_wallet(&DescriptorType::Wpkh); - - let issue_supply = 600; - let (contract_id, iface_type_name) = wlt_1.issue_nia(issue_supply, wlt_1.close_method(), None); - - let amt = 200; - let invoice = wlt_2.invoice( - contract_id, - &iface_type_name, - amt, - wlt_2.close_method(), - InvoiceType::Witness, - ); - let (consignment, tx) = wlt_1.transfer(invoice.clone(), None, None, true, None); - let txid = tx.txid(); - - wlt_2.accept_transfer(consignment.clone(), None); - - // wlt_2 sees the allocation even if TX has not been mined - wlt_2.check_allocations( - contract_id, - &iface_type_name, - AssetSchema::Nia, - vec![amt], - false, - ); - - wlt_1.sync(); - - let wlt_1_change_amt = issue_supply - amt; - - // wlt_1 needs to get tentative allocations to see its change from the unmined TX - let allocations: Vec = wlt_1 - .contract_fungible_allocations(contract_id, &iface_type_name, true) - .into_iter() - .filter(|fa| fa.seal.txid() == Some(txid)) - .collect(); - assert_eq!(allocations.len(), 1); - assert!(allocations - .iter() - .any(|fa| fa.state == Amount::from(wlt_1_change_amt))); - - // after mining, wlt_1 doesn't need to get tentative allocations to see the change - mine(false); - wlt_1.sync(); - wlt_1.check_allocations( - contract_id, - &iface_type_name, - AssetSchema::Nia, - vec![wlt_1_change_amt], - false, - ); -} - -#[rstest] -#[case(false)] -#[ignore = "fix needed"] // https://github.com/RGB-WG/rgb-std/issues/292 -#[case(true)] -fn ln_transfers(#[case] update_witnesses_before_htlc: bool) { - initialize(); - - let mut wlt_1 = get_wallet(&DescriptorType::Wpkh); - let wlt_2 = get_wallet(&DescriptorType::Wpkh); - let pre_funding_height = get_height(); - - let utxo = wlt_1.get_utxo(Some(10_000)); - let (contract_id, iface_type_name) = wlt_1.issue_nia(600, wlt_1.close_method(), Some(&utxo)); - - println!("\n1. fake commitment TX (no HTLCs)"); - let beneficiaries = vec![ - (wlt_2.get_address(), Some(2000)), - (wlt_1.get_address(), None), - ]; - let (mut psbt, _meta) = wlt_1.construct_psbt(vec![utxo], beneficiaries, None); - let coloring_info = ColoringInfo { - asset_info_map: HashMap::from([( - contract_id, - AssetColoringInfo { - iface: iface_type_name.clone(), - input_outpoints: vec![utxo], - output_map: HashMap::from([(0, 100), (1, 500)]), - static_blinding: Some(666), - }, - )]), - static_blinding: Some(666), - nonce: Some(u64::MAX - 1), - }; - let (fascia, _asset_beneficiaries) = wlt_1.color_psbt(&mut psbt, coloring_info.clone()); - wlt_1.consume_fascia(fascia.clone(), psbt.txid()); - wlt_1.debug_logs(contract_id, &iface_type_name, AllocationFilter::WalletAll); - - let htlc_vout = 2; - let htlc_rgb_amt = 200; - let htlc_btc_amt = 4000; - let htlc_derived_addr = wlt_1.get_derived_address(); - - // no problem: since there's no htlc for this commitment - wlt_1.sync_and_update_witnesses(Some(pre_funding_height)); - - println!("\n2. fake commitment TX (1 HTLC)"); - let beneficiaries = vec![ - (wlt_2.get_address(), Some(2000)), - (wlt_1.get_address(), None), - (htlc_derived_addr.addr, Some(htlc_btc_amt)), - ]; - let (mut psbt, _meta) = wlt_1.construct_psbt(vec![utxo], beneficiaries, None); - let coloring_info = ColoringInfo { - asset_info_map: HashMap::from([( - contract_id, - AssetColoringInfo { - iface: iface_type_name.clone(), - input_outpoints: vec![utxo], - output_map: HashMap::from([(0, 100), (1, 300), (htlc_vout, htlc_rgb_amt)]), - static_blinding: Some(666), - }, - )]), - static_blinding: Some(666), - nonce: Some(u64::MAX - 1), - }; - let (fascia, _asset_beneficiaries) = wlt_1.color_psbt(&mut psbt, coloring_info); - wlt_1.consume_fascia(fascia.clone(), psbt.txid()); - wlt_1.debug_logs(contract_id, &iface_type_name, AllocationFilter::WalletAll); - - if update_witnesses_before_htlc { - wlt_1.sync_and_update_witnesses(Some(pre_funding_height)); - } - - println!("\n3. fake HTLC TX"); - let witness_id = fascia.witness_id(); - let txid = witness_id.as_reduced_unsafe(); - let input_outpoint = Outpoint::new(*txid, htlc_vout); - let beneficiaries = vec![(wlt_1.get_address(), None)]; - let (mut psbt, _meta) = wlt_1.construct_psbt_offchain( - vec![(input_outpoint, htlc_btc_amt, htlc_derived_addr.terminal)], - beneficiaries, - None, - ); - let coloring_info = ColoringInfo { - asset_info_map: HashMap::from([( - contract_id, - AssetColoringInfo { - iface: iface_type_name.clone(), - input_outpoints: vec![input_outpoint], - output_map: HashMap::from([(0, htlc_rgb_amt)]), - static_blinding: Some(666), - }, - )]), - static_blinding: Some(666), - nonce: Some(u64::MAX), - }; - let (fascia, _asset_beneficiaries) = wlt_1.color_psbt(&mut psbt, coloring_info); - wlt_1.consume_fascia(fascia.clone(), psbt.txid()); - wlt_1.debug_logs(contract_id, &iface_type_name, AllocationFilter::WalletAll); - - println!("\n4. fake commitment TX (no HTLCs)"); - let beneficiaries = vec![ - (wlt_2.get_address(), Some(3000)), - (wlt_1.get_address(), None), - ]; - let (mut psbt, _meta) = wlt_1.construct_psbt(vec![utxo], beneficiaries, None); - let coloring_info = ColoringInfo { - asset_info_map: HashMap::from([( - contract_id, - AssetColoringInfo { - iface: iface_type_name.clone(), - input_outpoints: vec![utxo], - output_map: HashMap::from([(0, 100), (1, 500)]), - static_blinding: Some(666), - }, - )]), - static_blinding: Some(666), - nonce: Some(u64::MAX - 1), - }; - let (fascia, _asset_beneficiaries) = wlt_1.color_psbt(&mut psbt, coloring_info); - wlt_1.consume_fascia(fascia.clone(), psbt.txid()); - wlt_1.debug_logs(contract_id, &iface_type_name, AllocationFilter::WalletAll); - let mut old_psbt = psbt.clone(); - - println!("\n5. fake commitment TX (1 HTLC)"); - let htlc_rgb_amt = 180; - let beneficiaries = vec![ - (wlt_2.get_address(), Some(2000)), - (wlt_1.get_address(), None), - (htlc_derived_addr.addr, Some(htlc_btc_amt)), - ]; - let (mut psbt, _meta) = wlt_1.construct_psbt(vec![utxo], beneficiaries, None); - let coloring_info = ColoringInfo { - asset_info_map: HashMap::from([( - contract_id, - AssetColoringInfo { - iface: iface_type_name.clone(), - input_outpoints: vec![utxo], - output_map: HashMap::from([(0, 122), (1, 298), (htlc_vout, htlc_rgb_amt)]), - static_blinding: Some(666), - }, - )]), - static_blinding: Some(666), - nonce: Some(u64::MAX - 1), - }; - let (fascia, _asset_beneficiaries) = wlt_1.color_psbt(&mut psbt, coloring_info.clone()); - wlt_1.consume_fascia(fascia.clone(), psbt.txid()); - wlt_1.debug_logs(contract_id, &iface_type_name, AllocationFilter::WalletAll); - - if update_witnesses_before_htlc { - wlt_1.sync_and_update_witnesses(Some(pre_funding_height)); - } - - println!("\n6. fake HTLC TX"); - let witness_id = fascia.witness_id(); - let txid = witness_id.as_reduced_unsafe(); - let input_outpoint = Outpoint::new(*txid, htlc_vout); - let beneficiaries = vec![(wlt_1.get_address(), None)]; - let (mut psbt, _meta) = wlt_1.construct_psbt_offchain( - vec![(input_outpoint, htlc_btc_amt, htlc_derived_addr.terminal)], - beneficiaries, - None, - ); - let coloring_info = ColoringInfo { - asset_info_map: HashMap::from([( - contract_id, - AssetColoringInfo { - iface: iface_type_name.clone(), - input_outpoints: vec![input_outpoint], - output_map: HashMap::from([(0, htlc_rgb_amt)]), - static_blinding: Some(666), - }, - )]), - static_blinding: Some(666), - nonce: Some(u64::MAX), - }; - let (fascia, _asset_beneficiaries) = wlt_1.color_psbt(&mut psbt, coloring_info); - wlt_1.consume_fascia(fascia.clone(), psbt.txid()); - wlt_1.debug_logs(contract_id, &iface_type_name, AllocationFilter::WalletAll); - - // no problem: since the force-close tx will be updated to mined soon - wlt_1.sync_and_update_witnesses(Some(pre_funding_height)); - - println!("\n7. broadcast old PSBT"); - let tx = wlt_1.sign_finalize_extract(&mut old_psbt); - wlt_1.broadcast_tx(&tx); - wlt_1.mine_tx(&tx.txid(), false); - wlt_1.sync_and_update_witnesses(Some(pre_funding_height)); - let mut wlt_3 = get_wallet(&DescriptorType::Wpkh); - wlt_1.send( - &mut wlt_3, - TransferType::Blinded, - contract_id, - &iface_type_name, - 500, - 1000, - None, - ); -} - -#[test] -fn mainnet_wlt_receiving_test_asset() { - initialize(); - - let mut wlt_1 = get_wallet(&DescriptorType::Wpkh); - let mut wlt_2 = get_mainnet_wallet(); - - let (contract_id, iface_type_name) = wlt_1.issue_nia(700, wlt_1.close_method(), None); - - let utxo = - Outpoint::from_str("bebcfcb200a17763f6932a6d6fca9448a4b46c5b737cc3810769a7403ef79ce6:0") - .unwrap(); - let invoice = wlt_2.invoice( - contract_id, - &iface_type_name, - 150, - wlt_2.close_method(), - InvoiceType::Blinded(Some(utxo)), - ); - let (consignment, tx) = wlt_1.transfer(invoice.clone(), None, Some(500), true, None); - wlt_1.mine_tx(&tx.txid(), false); - match consignment.validate(&wlt_2.get_resolver(), wlt_2.testnet()) { - Err((status, _invalid_consignment)) => { - assert_eq!( - status.failures, - vec![Failure::NetworkMismatch(wlt_2.testnet())] - ) - } - _ => panic!("validation must fail"), - } -} - -#[test] -#[ignore = "fix needed"] // https://github.com/BP-WG/bp-wallet/issues/70 -fn sync_mainnet_wlt() { - initialize(); - - let mut wlt_1 = get_mainnet_wallet(); - - // sometimes this fails with a 'Too many requests' error when using esplora - wlt_1.sync(); -} - -#[test] -fn tapret_wlt_receiving_opret() { - initialize(); - - let mut wlt_1 = get_wallet(&DescriptorType::Tr); - let mut wlt_2 = get_wallet(&DescriptorType::Wpkh); - - let (contract_id, iface_type_name) = wlt_1.issue_nia(600, wlt_1.close_method(), None); - - println!("1st transfer"); - wlt_1.send( - &mut wlt_2, - TransferType::Blinded, - contract_id, - &iface_type_name, - 400, - 5000, - None, - ); - - println!("2nd transfer"); - let invoice = wlt_1.invoice( - contract_id, - &iface_type_name, - 100, - CloseMethod::OpretFirst, - InvoiceType::Witness, - ); - wlt_2.send_to_invoice(&mut wlt_1, invoice, None, None, None); - - println!("3rd transfer"); - wlt_1.send( - &mut wlt_2, - TransferType::Blinded, - contract_id, - &iface_type_name, - 290, - 1000, - None, - ); - - println!("4th transfer"); - wlt_2.send( - &mut wlt_1, - TransferType::Blinded, - contract_id, - &iface_type_name, - 560, - 1000, - None, - ); - - println!("5th transfer"); - wlt_1.send( - &mut wlt_2, - TransferType::Blinded, - contract_id, - &iface_type_name, - 570, - 1000, - None, - ); -} - -#[test] -fn collaborative_transfer() { - initialize(); - - let mut wlt_1 = get_wallet(&DescriptorType::Wpkh); - let mut wlt_2 = get_wallet(&DescriptorType::Wpkh); - let mut wlt_3 = get_wallet(&DescriptorType::Wpkh); - - let sats = 30_000; - - let utxo_0 = wlt_1.get_utxo(Some(sats)); - let (contract_id, iface_type_name) = wlt_1.issue_nia(600, wlt_1.close_method(), Some(&utxo_0)); - let (_, tx) = wlt_1.send( - &mut wlt_2, - TransferType::Witness, - contract_id, - &iface_type_name, - 200, - 18_000, - None, - ); - let utxo_1 = Outpoint::new(tx.txid(), 1); // change: 11_600 sat - let utxo_2 = Outpoint::new(tx.txid(), 0); // transfered: 18_000 sat - - let mut psbt = Psbt::default(); - - wlt_1.psbt_add_input(&mut psbt, utxo_1); - wlt_2.psbt_add_input(&mut psbt, utxo_2); - - psbt.construct_output_expect( - wlt_3.get_address().script_pubkey(), - Sats::from_sats(sats - 2 * DEFAULT_FEE_ABS), - ); - - let coloring_info_1 = ColoringInfo { - asset_info_map: HashMap::from([( - contract_id, - AssetColoringInfo { - iface: iface_type_name.clone(), - input_outpoints: vec![utxo_1], - output_map: HashMap::from([(0, 400)]), - static_blinding: None, - }, - )]), - static_blinding: None, - nonce: None, - }; - let coloring_info_2 = ColoringInfo { - asset_info_map: HashMap::from([( - contract_id, - AssetColoringInfo { - iface: iface_type_name.clone(), - input_outpoints: vec![utxo_2], - output_map: HashMap::from([(0, 200)]), - static_blinding: None, - }, - )]), - static_blinding: None, - nonce: None, - }; - let beneficiaries_1 = wlt_1.color_psbt_init(&mut psbt, coloring_info_1); - - let (fascia, beneficiaries_2) = wlt_2.color_psbt(&mut psbt, coloring_info_2); - - wlt_1.sign_finalize(&mut psbt); - let tx = wlt_2.sign_finalize_extract(&mut psbt); - wlt_1.broadcast_tx(&tx); - - wlt_1.consume_fascia(fascia.clone(), tx.txid()); - wlt_2.consume_fascia(fascia, tx.txid()); - - let consignments_1 = wlt_1.create_consignments(beneficiaries_1, tx.txid()); - let consignments_2 = wlt_2.create_consignments(beneficiaries_2, tx.txid()); - - println!("Send the whole asset amount back to wlt_1 to check new allocations are spendable"); - for consignment in vec![consignments_1, consignments_2].into_iter().flatten() { - wlt_3.accept_transfer(consignment, None); - } - wlt_3.send( - &mut wlt_1, - TransferType::Witness, - contract_id, - &iface_type_name, - 600, - sats - 4 * DEFAULT_FEE_ABS, - None, - ); - wlt_1.send( - &mut wlt_2, - TransferType::Witness, - contract_id, - &iface_type_name, - 600, - sats - 6 * DEFAULT_FEE_ABS, - None, - ); -} - -#[test] -fn receive_from_unbroadcasted_transfer_to_blinded() { - initialize(); - - let mut wlt_1 = get_wallet(&DescriptorType::Wpkh); - let mut wlt_2 = get_wallet(&DescriptorType::Wpkh); - let mut wlt_3 = get_wallet(&DescriptorType::Wpkh); - - let (contract_id, iface_type_name) = wlt_1.issue_nia(600, wlt_1.close_method(), None); - - let utxo = wlt_2.get_utxo(None); - mine(false); - let invoice = wlt_2.invoice( - contract_id, - &iface_type_name, - 100, - wlt_2.close_method(), - InvoiceType::Blinded(Some(utxo)), - ); - // create transfer but do not broadcast its TX - let (consignment, tx) = wlt_1.transfer(invoice.clone(), None, Some(500), false, None); - let txid = tx.txid(); - - struct OffchainResolver<'a, 'cons, const TRANSFER: bool> { - witness_id: XWitnessId, - consignment: &'cons IndexedConsignment<'cons, TRANSFER>, - fallback: &'a AnyResolver, - } - impl ResolveWitness for OffchainResolver<'_, '_, TRANSFER> { - fn resolve_pub_witness( - &self, - witness_id: XWitnessId, - ) -> Result { - self.consignment - .pub_witness(witness_id) - .and_then(|p| p.map_ref(|pw| pw.tx().cloned()).transpose()) - .ok_or(WitnessResolverError::Unknown(witness_id)) - .or_else(|_| self.fallback.resolve_pub_witness(witness_id)) - } - fn resolve_pub_witness_ord( - &self, - witness_id: XWitnessId, - ) -> Result { - if witness_id != self.witness_id { - return self.fallback.resolve_pub_witness_ord(witness_id); - } - Ok(WitnessOrd::Tentative) - } - } - - let resolver = OffchainResolver { - witness_id: XChain::Bitcoin(txid), - consignment: &IndexedConsignment::new(&consignment), - fallback: &wlt_2.get_resolver(), - }; - - // wlt_2 use custom resolver to be able to send the assets even if transfer TX sending to - // blinded UTXO has not been broadcasted - wlt_2.accept_transfer_custom_resolver(consignment.clone(), None, &resolver); - - let invoice = wlt_3.invoice( - contract_id, - &iface_type_name, - 50, - wlt_2.close_method(), - InvoiceType::Witness, - ); - let (consignment, tx) = wlt_2.transfer(invoice, Some(2000), None, true, None); - wlt_2.mine_tx(&tx.txid(), false); - - // consignment validation fails because it notices an unbroadcasted TX in the history - let res = consignment.validate(&wlt_3.get_resolver(), wlt_3.testnet()); - assert!(res.is_err()); - let validation_status = match res { - Ok(validated_consignment) => validated_consignment.validation_status().clone(), - Err((status, _consignment)) => status, - }; - assert_eq!(validation_status.failures.len(), 1); - assert!(matches!( - validation_status.failures[0], - Failure::SealNoPubWitness(_, _, _) - )); -} - -#[test] -fn check_fungible_history() { - initialize(); - - let mut wlt_1 = get_wallet(&DescriptorType::Wpkh); - let mut wlt_2 = get_wallet(&DescriptorType::Wpkh); - - let issue_supply = 600; - - let (contract_id, iface_type_name) = wlt_1.issue_nia(issue_supply, wlt_1.close_method(), None); - - wlt_1.debug_contracts(); - wlt_1.debug_history(contract_id, &iface_type_name, false); - - wlt_1.check_history_operation( - &contract_id, - &iface_type_name, - None, - OpDirection::Issued, - issue_supply, - ); - - let amt = 200; - - let (_, tx) = wlt_1.send( - &mut wlt_2, - TransferType::Witness, - contract_id, - &iface_type_name, - amt, - 1000, - None, - ); - let txid = tx.txid(); - - wlt_1.debug_history(contract_id, &iface_type_name, false); - wlt_2.debug_history(contract_id, &iface_type_name, false); - - wlt_1.check_history_operation( - &contract_id, - &iface_type_name, - Some(&txid), - OpDirection::Sent, - amt, - ); - - wlt_2.check_history_operation( - &contract_id, - &iface_type_name, - Some(&txid), - OpDirection::Received, - amt, - ); -} - -#[test] -fn send_to_oneself() { - initialize(); - - let mut wlt = get_wallet(&DescriptorType::Wpkh); - - let issue_supply = 600; - - let (contract_id, iface_type_name) = wlt.issue_nia(issue_supply, wlt.close_method(), None); - - let amt = 200; - - let invoice = wlt.invoice( - contract_id, - &iface_type_name, - amt, - wlt.close_method(), - InvoiceType::Witness, - ); - - let (consignment, tx) = wlt.transfer(invoice.clone(), None, None, true, None); - wlt.mine_tx(&tx.txid(), false); - wlt.accept_transfer(consignment, None); - wlt.sync(); - - wlt.debug_history(contract_id, &iface_type_name, false); - let history = wlt.history(contract_id, &iface_type_name); - // only issue operation is found, because self-transfers should not appear in history - assert_eq!(history.len(), 1); - - wlt.debug_logs( - contract_id, - &iface_type_name.clone(), - AllocationFilter::WalletAll, - ); - wlt.check_allocations( - contract_id, - &iface_type_name, - AssetSchema::Nia, - vec![amt, issue_supply - amt], - true, - ); -} - -#[rstest] -#[ignore = "fix needed"] // https://github.com/RGB-WG/rgb-std/issues/284 -#[case(CloseMethod::OpretFirst, CloseMethod::OpretFirst)] -#[case(CloseMethod::TapretFirst, CloseMethod::TapretFirst)] -#[ignore = "fix needed"] // https://github.com/RGB-WG/rgb-std/issues/284 -#[case(CloseMethod::OpretFirst, CloseMethod::TapretFirst)] -#[ignore = "fix needed"] // https://github.com/RGB-WG/rgb-std/issues/284 -#[case(CloseMethod::TapretFirst, CloseMethod::OpretFirst)] -fn blank_tapret_opret(#[case] close_method_0: CloseMethod, #[case] close_method_1: CloseMethod) { - println!("close_method_0 {close_method_0:?} close_method_1 {close_method_1:?}"); - - initialize(); - - let mut wlt_1 = get_wallet(&DescriptorType::Tr); - let mut wlt_2 = get_wallet(&DescriptorType::Tr); - - let utxo = wlt_1.get_utxo(None); - - let amt_0 = 200; - let (contract_id_0, iface_type_name_0) = wlt_1.issue_nia(amt_0, close_method_0, Some(&utxo)); - - // asset to be moved in blank - let amt_1 = 100; - let (contract_id_1, iface_type_name_1) = wlt_1.issue_nia(amt_1, close_method_1, Some(&utxo)); - - wlt_1.send( - &mut wlt_2, - TransferType::Blinded, - contract_id_0, - &iface_type_name_0, - amt_0, - 1000, - None, - ); - - // send opret, blank opret: pay fails with Composition(Stock("the spent UTXOs contain too many seals which can't fit the state transition input limit.")) - // send opret, blank tapret: pay fails with Composition(Stock("the spent UTXOs contain too many seals which can't fit the state transition input limit.")) - // send tapret, blank opret: pay fails with Composition(Construction(NoInputs)) - wlt_1.send( - &mut wlt_2, - TransferType::Blinded, - contract_id_1, - &iface_type_name_1, - amt_1, - 1000, - None, - ); -} - -#[rstest] -#[case(HistoryType::Linear, ReorgType::ChangeOrder)] -#[ignore = "fix needed"] -#[case(HistoryType::Linear, ReorgType::Revert)] -#[case(HistoryType::Branching, ReorgType::ChangeOrder)] -#[ignore = "fix needed"] -#[case(HistoryType::Branching, ReorgType::Revert)] -#[case(HistoryType::Merging, ReorgType::ChangeOrder)] -#[ignore = "fix needed"] -#[case(HistoryType::Merging, ReorgType::Revert)] -#[serial] -fn reorg_history(#[case] history_type: HistoryType, #[case] reorg_type: ReorgType) { - println!("history_type {history_type:?} reorg_type {reorg_type:?}"); - - initialize(); - connect_reorg_nodes(); - - let mut wlt_1 = get_wallet_custom(&DescriptorType::Wpkh, INSTANCE_2); - let mut wlt_2 = get_wallet_custom(&DescriptorType::Wpkh, INSTANCE_2); - - let (contract_id, iface_type_name) = match history_type { - HistoryType::Linear | HistoryType::Branching => { - wlt_1.issue_nia(600, wlt_1.close_method(), None) - } - HistoryType::Merging => { - let asset_info = AssetInfo::default_nia(vec![400, 200]); - wlt_1.issue_with_info(asset_info, wlt_1.close_method(), vec![None, None]) - } - }; - - let utxo_wlt_1_1 = wlt_1.get_utxo(None); - let utxo_wlt_1_2 = wlt_1.get_utxo(None); - let utxo_wlt_2_1 = wlt_2.get_utxo(None); - let utxo_wlt_2_2 = wlt_2.get_utxo(None); - mine_custom(false, INSTANCE_2, 6); - disconnect_reorg_nodes(); - - let txs = match history_type { - HistoryType::Linear => { - let amt_0 = 590; - let invoice = wlt_2.invoice( - contract_id, - &iface_type_name, - amt_0, - CloseMethod::OpretFirst, - InvoiceType::Blinded(Some(utxo_wlt_2_1)), - ); - let (_, tx_0) = wlt_1.send_to_invoice(&mut wlt_2, invoice, Some(1000), None, None); - - let amt_1 = 100; - let invoice = wlt_1.invoice( - contract_id, - &iface_type_name, - amt_1, - CloseMethod::OpretFirst, - InvoiceType::Blinded(Some(utxo_wlt_1_1)), - ); - let (_, tx_1) = wlt_2.send_to_invoice(&mut wlt_1, invoice, Some(1000), None, None); - - let amt_2 = 80; - let invoice = wlt_2.invoice( - contract_id, - &iface_type_name, - amt_2, - CloseMethod::OpretFirst, - InvoiceType::Blinded(Some(utxo_wlt_2_2)), - ); - let (_, tx_2) = wlt_1.send_to_invoice(&mut wlt_2, invoice, Some(1000), None, None); - - vec![tx_0, tx_1, tx_2] - } - HistoryType::Branching => { - let amt_0 = 600; - let invoice = wlt_2.invoice( - contract_id, - &iface_type_name, - amt_0, - CloseMethod::OpretFirst, - InvoiceType::Blinded(Some(utxo_wlt_2_1)), - ); - let (_, tx_0) = wlt_1.send_to_invoice(&mut wlt_2, invoice, Some(1000), None, None); - - let amt_1 = 200; - let invoice = wlt_1.invoice( - contract_id, - &iface_type_name, - amt_1, - CloseMethod::OpretFirst, - InvoiceType::Blinded(Some(utxo_wlt_1_1)), - ); - let (_, tx_1) = wlt_2.send_to_invoice(&mut wlt_1, invoice, Some(1000), None, None); - - let amt_2 = amt_0 - amt_1 - 1; - let invoice = wlt_1.invoice( - contract_id, - &iface_type_name, - amt_2, - CloseMethod::OpretFirst, - InvoiceType::Blinded(Some(utxo_wlt_1_2)), - ); - let (_, tx_2) = wlt_2.send_to_invoice(&mut wlt_1, invoice, Some(1000), None, None); - - vec![tx_0, tx_1, tx_2] - } - HistoryType::Merging => { - let amt_0 = 400; - let invoice = wlt_2.invoice( - contract_id, - &iface_type_name, - amt_0, - CloseMethod::OpretFirst, - InvoiceType::Blinded(Some(utxo_wlt_2_1)), - ); - let (_, tx_0) = wlt_1.send_to_invoice(&mut wlt_2, invoice, None, None, None); - - let amt_1 = 200; - let invoice = wlt_2.invoice( - contract_id, - &iface_type_name, - amt_1, - CloseMethod::OpretFirst, - InvoiceType::Blinded(Some(utxo_wlt_2_2)), - ); - let (_, tx_1) = wlt_1.send_to_invoice(&mut wlt_2, invoice, None, None, None); - - let amt_2 = amt_0 + amt_1 - 1; - let invoice = wlt_1.invoice( - contract_id, - &iface_type_name, - amt_2, - CloseMethod::OpretFirst, - InvoiceType::Blinded(Some(utxo_wlt_1_1)), - ); - let (_, tx_2) = wlt_2.send_to_invoice(&mut wlt_1, invoice, None, None, None); - - vec![tx_0, tx_1, tx_2] - } - }; - - match (history_type, reorg_type) { - (HistoryType::Linear, ReorgType::ChangeOrder) => { - broadcast_tx_and_mine(&txs[2], INSTANCE_3); - broadcast_tx_and_mine(&txs[1], INSTANCE_3); - broadcast_tx_and_mine(&txs[0], INSTANCE_3); - wlt_1.switch_to_instance(INSTANCE_3); - wlt_2.switch_to_instance(INSTANCE_3); - let wlt_1_alloc_1 = 10; - let wlt_1_alloc_2 = 20; - let wlt_2_alloc_1 = 490; - let wlt_2_alloc_2 = 80; - wlt_1.check_allocations( - contract_id, - &iface_type_name, - AssetSchema::Nia, - vec![wlt_1_alloc_1, wlt_1_alloc_2], - false, - ); - wlt_2.check_allocations( - contract_id, - &iface_type_name, - AssetSchema::Nia, - vec![wlt_2_alloc_1, wlt_2_alloc_2], - false, - ); - } - (HistoryType::Linear | HistoryType::Branching, ReorgType::Revert) => { - broadcast_tx_and_mine(&txs[1], INSTANCE_3); - broadcast_tx_and_mine(&txs[2], INSTANCE_3); - wlt_1.switch_to_instance(INSTANCE_3); - wlt_2.switch_to_instance(INSTANCE_3); - let wlt_1_alloc_1 = 600; - wlt_1.check_allocations( - contract_id, - &iface_type_name, - AssetSchema::Nia, - vec![wlt_1_alloc_1], - false, - ); - wlt_2.check_allocations( - contract_id, - &iface_type_name, - AssetSchema::Nia, - vec![], - false, - ); - } - (HistoryType::Branching, ReorgType::ChangeOrder) => { - broadcast_tx_and_mine(&txs[1], INSTANCE_3); - broadcast_tx_and_mine(&txs[2], INSTANCE_3); - broadcast_tx_and_mine(&txs[0], INSTANCE_3); - wlt_1.switch_to_instance(INSTANCE_3); - wlt_2.switch_to_instance(INSTANCE_3); - let wlt_1_alloc_1 = 200; - let wlt_1_alloc_2 = 399; - let wlt_2_alloc_1 = 1; - wlt_1.check_allocations( - contract_id, - &iface_type_name, - AssetSchema::Nia, - vec![wlt_1_alloc_1, wlt_1_alloc_2], - false, - ); - wlt_2.check_allocations( - contract_id, - &iface_type_name, - AssetSchema::Nia, - vec![wlt_2_alloc_1], - false, - ); - } - (HistoryType::Merging, ReorgType::ChangeOrder) => { - broadcast_tx_and_mine(&txs[1], INSTANCE_3); - broadcast_tx_and_mine(&txs[0], INSTANCE_3); - broadcast_tx_and_mine(&txs[2], INSTANCE_3); - wlt_1.switch_to_instance(INSTANCE_3); - wlt_2.switch_to_instance(INSTANCE_3); - let wlt_1_alloc_1 = 599; - let wlt_2_alloc_1 = 1; - wlt_1.check_allocations( - contract_id, - &iface_type_name, - AssetSchema::Nia, - vec![wlt_1_alloc_1], - false, - ); - wlt_2.check_allocations( - contract_id, - &iface_type_name, - AssetSchema::Nia, - vec![wlt_2_alloc_1], - false, - ); - } - (HistoryType::Merging, ReorgType::Revert) => { - broadcast_tx_and_mine(&txs[1], INSTANCE_3); - broadcast_tx_and_mine(&txs[2], INSTANCE_3); - wlt_1.switch_to_instance(INSTANCE_3); - wlt_2.switch_to_instance(INSTANCE_3); - let wlt_1_alloc_1 = 400; - let wlt_2_alloc_1 = 200; - wlt_1.check_allocations( - contract_id, - &iface_type_name, - AssetSchema::Nia, - vec![wlt_1_alloc_1], - false, - ); - wlt_2.check_allocations( - contract_id, - &iface_type_name, - AssetSchema::Nia, - vec![wlt_2_alloc_1], - false, - ); - } - } - - mine_custom(false, INSTANCE_3, 3); - connect_reorg_nodes(); - wlt_1.switch_to_instance(INSTANCE_2); - wlt_2.switch_to_instance(INSTANCE_2); - - let mut wlt_3 = get_wallet_custom(&DescriptorType::Wpkh, INSTANCE_2); - - match history_type { - HistoryType::Linear => { - let wlt_1_alloc_1 = 10; - let wlt_1_alloc_2 = 20; - let wlt_1_amt = wlt_1_alloc_1 + wlt_1_alloc_2; - let wlt_2_alloc_1 = 490; - let wlt_2_alloc_2 = 80; - let wlt_2_amt = wlt_2_alloc_1 + wlt_2_alloc_2; - wlt_1.check_allocations( - contract_id, - &iface_type_name, - AssetSchema::Nia, - vec![wlt_1_alloc_1, wlt_1_alloc_2], - false, - ); - wlt_2.check_allocations( - contract_id, - &iface_type_name, - AssetSchema::Nia, - vec![wlt_2_alloc_1, wlt_2_alloc_2], - false, - ); - wlt_1.send( - &mut wlt_3, - TransferType::Witness, - contract_id, - &iface_type_name, - wlt_1_amt, - 1000, - None, - ); - wlt_2.send( - &mut wlt_3, - TransferType::Witness, - contract_id, - &iface_type_name, - wlt_2_amt, - 1000, - None, - ); - wlt_3.check_allocations( - contract_id, - &iface_type_name, - AssetSchema::Nia, - vec![wlt_1_amt, wlt_2_amt], - false, - ); - } - HistoryType::Branching => { - let wlt_1_alloc_1 = 200; - let wlt_1_alloc_2 = 399; - let wlt_1_amt = wlt_1_alloc_1 + wlt_1_alloc_2; - let wlt_2_alloc_1 = 1; - let wlt_2_amt = wlt_2_alloc_1; - wlt_1.check_allocations( - contract_id, - &iface_type_name, - AssetSchema::Nia, - vec![wlt_1_alloc_1, wlt_1_alloc_2], - false, - ); - wlt_2.check_allocations( - contract_id, - &iface_type_name, - AssetSchema::Nia, - vec![wlt_2_alloc_1], - false, - ); - wlt_1.send( - &mut wlt_3, - TransferType::Witness, - contract_id, - &iface_type_name, - wlt_1_amt, - 1000, - None, - ); - wlt_2.send( - &mut wlt_3, - TransferType::Witness, - contract_id, - &iface_type_name, - wlt_2_amt, - 1000, - None, - ); - wlt_3.check_allocations( - contract_id, - &iface_type_name, - AssetSchema::Nia, - vec![wlt_1_amt, wlt_2_amt], - false, - ); - } - HistoryType::Merging => { - let wlt_1_alloc_1 = 599; - let wlt_1_amt = wlt_1_alloc_1; - let wlt_2_alloc_1 = 1; - let wlt_2_amt = wlt_2_alloc_1; - wlt_1.check_allocations( - contract_id, - &iface_type_name, - AssetSchema::Nia, - vec![wlt_1_alloc_1], - false, - ); - wlt_2.check_allocations( - contract_id, - &iface_type_name, - AssetSchema::Nia, - vec![wlt_2_alloc_1], - false, - ); - wlt_1.send( - &mut wlt_3, - TransferType::Witness, - contract_id, - &iface_type_name, - wlt_1_amt, - 1000, - None, - ); - wlt_2.send( - &mut wlt_3, - TransferType::Witness, - contract_id, - &iface_type_name, - wlt_2_amt, - 1000, - None, - ); - wlt_3.check_allocations( - contract_id, - &iface_type_name, - AssetSchema::Nia, - vec![wlt_1_amt, wlt_2_amt], - false, - ); - } - } -} - -#[rstest] -#[ignore = "fix needed"] -#[case(false)] -#[ignore = "fix needed"] -#[case(true)] -#[serial] -fn revert_genesis(#[case] with_transfers: bool) { - println!("with_transfers {with_transfers}"); - - initialize(); - // connecting before disconnecting since disconnect is not idempotent - connect_reorg_nodes(); - disconnect_reorg_nodes(); - - let mut wlt = get_wallet_custom(&DescriptorType::Wpkh, INSTANCE_2); - - let issued_supply = 600; - let utxo = wlt.get_utxo(None); - let (contract_id, iface_type_name) = - wlt.issue_nia(issued_supply, wlt.close_method(), Some(&utxo)); - wlt.check_allocations( - contract_id, - &iface_type_name, - AssetSchema::Nia, - vec![issued_supply], - false, - ); - - if with_transfers { - let mut recv_wlt = get_wallet_custom(&DescriptorType::Wpkh, INSTANCE_2); - let amt = 200; - wlt.send( - &mut recv_wlt, - TransferType::Blinded, - contract_id, - &iface_type_name, - amt, - 1000, - None, - ); - wlt.check_allocations( - contract_id, - &iface_type_name, - AssetSchema::Nia, - vec![issued_supply - amt], - false, - ); - } - - assert!(matches!( - wlt.get_witness_ord(&utxo.txid), - WitnessOrd::Mined(_) - )); - wlt.switch_to_instance(INSTANCE_3); - assert_eq!(wlt.get_witness_ord(&utxo.txid), WitnessOrd::Archived); - - // this should remove the utxo that is now archived but it doesn't - wlt.sync(); - let utxos = wlt.utxos(); - assert!(utxos.is_empty()); - - wlt.check_allocations( - contract_id, - &iface_type_name, - AssetSchema::Nia, - vec![], - false, - ); -} diff --git a/tests/utils/chain.rs b/tests/utils/chain.rs index 5b0b276..4df97d5 100644 --- a/tests/utils/chain.rs +++ b/tests/utils/chain.rs @@ -1,50 +1,40 @@ -use super::*; +use std::env::VarError; +use std::path::PathBuf; +use std::process::{Command, Stdio}; +use std::sync::{Once, OnceLock, RwLock}; +use std::time::Duration; -static INIT: Once = Once::new(); +use amplify::{s, Display}; +use bpstd::{Network, Sats, Tx, Txid}; +use bpwallet::indexers::esplora::Client as EsploraClient; +use bpwallet::AnyIndexer; +use electrum::{Client as ElectrumClient, ElectrumApi}; +use once_cell::sync::Lazy; +use time::OffsetDateTime; + +pub const ELECTRUM_1_REGTEST_URL: &str = "127.0.0.1:50001"; +pub const ELECTRUM_2_REGTEST_URL: &str = "127.0.0.1:50002"; +pub const ELECTRUM_3_REGTEST_URL: &str = "127.0.0.1:50003"; +pub const ELECTRUM_MAINNET_URL: &str = "ssl://electrum.iriswallet.com:50003"; +pub const ESPLORA_1_REGTEST_URL: &str = "http://127.0.0.1:8094/regtest/api"; +pub const ESPLORA_2_REGTEST_URL: &str = "http://127.0.0.1:8095/regtest/api"; +pub const ESPLORA_3_REGTEST_URL: &str = "http://127.0.0.1:8096/regtest/api"; +pub const ESPLORA_MAINNET_URL: &str = "https://blockstream.info/api"; +static INIT: Once = Once::new(); pub static INDEXER: OnceLock = OnceLock::new(); -#[derive(Clone, Default, PartialEq, Eq, Debug)] +pub const INSTANCE_1: u8 = 1; +pub const INSTANCE_2: u8 = 2; +pub const INSTANCE_3: u8 = 3; + +#[derive(Clone, Default, PartialEq, Eq, Debug, Display)] +#[display(lowercase)] pub enum Indexer { Electrum, #[default] Esplora, } - -impl fmt::Display for Indexer { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - write!(f, "{}", format!("{:?}", self).to_lowercase()) - } -} - -pub fn initialize() { - INIT.call_once(|| { - INDEXER.get_or_init(|| match std::env::var("INDEXER") { - Ok(val) if val.to_lowercase() == Indexer::Esplora.to_string() => Indexer::Esplora, - Ok(val) if val.to_lowercase() == Indexer::Electrum.to_string() => Indexer::Electrum, - Err(VarError::NotPresent) => Indexer::Esplora, - _ => { - panic!("invalid indexer. possible values: `esplora` (default), `electrum`") - } - }); - if std::env::var("SKIP_INIT").is_ok() { - println!("skipping services initialization"); - return; - } - let start_services_file = PathBuf::from("tests").join("start_services.sh"); - println!("starting test services..."); - let output = Command::new(start_services_file) - .env("PROFILE", INDEXER.get().unwrap().to_string()) - .output() - .expect("failed to start test services"); - if !output.status.success() { - println!("{output:?}"); - panic!("failed to start test services"); - } - (INSTANCE_1..=INSTANCE_3).for_each(_wait_indexer_sync); - }); -} - static MINER: Lazy> = Lazy::new(|| RwLock::new(Miner { no_mine_count: 0 })); #[derive(Clone, Debug)] @@ -62,12 +52,8 @@ fn _service_base_name() -> String { fn _bitcoin_cli_cmd(instance: u8, args: Vec<&str>) -> String { let compose_file = PathBuf::from("tests").join("docker-compose.yml"); - let mut bitcoin_cli = vec![ - s!("-f"), - compose_file.to_string_lossy().to_string(), - s!("exec"), - s!("-T"), - ]; + let mut bitcoin_cli = + vec![s!("-f"), compose_file.to_string_lossy().to_string(), s!("exec"), s!("-T")]; let service_name = format!("{}_{instance}", _service_base_name()); match INDEXER.get().unwrap() { Indexer::Electrum => bitcoin_cli.extend(vec![ @@ -103,17 +89,12 @@ impl Miner { } fn force_mine(&self, instance: u8, blocks: u32) -> bool { - _bitcoin_cli_cmd( - instance, - vec!["-rpcwallet=miner", "-generate", &blocks.to_string()], - ); + _bitcoin_cli_cmd(instance, vec!["-rpcwallet=miner", "-generate", &blocks.to_string()]); _wait_indexer_sync(instance); true } - fn stop_mining(&mut self) { - self.no_mine_count += 1; - } + fn stop_mining(&mut self) { self.no_mine_count += 1; } fn resume_mining(&mut self) { if self.no_mine_count > 0 { @@ -122,9 +103,7 @@ impl Miner { } } -pub fn mine(resume: bool) { - mine_custom(resume, INSTANCE_1, 1); -} +pub fn mine(resume: bool) { mine_custom(resume, INSTANCE_1, 1); } pub fn mine_custom(resume: bool, instance: u8, blocks: u32) { let t_0 = OffsetDateTime::now_utc(); @@ -144,9 +123,7 @@ pub fn mine_custom(resume: bool, instance: u8, blocks: u32) { } } -pub fn mine_but_no_resume() { - mine_but_no_resume_custom(INSTANCE_1, 1); -} +pub fn mine_but_no_resume() { mine_but_no_resume_custom(INSTANCE_1, 1); } pub fn mine_but_no_resume_custom(instance: u8, blocks: u32) { let t_0 = OffsetDateTime::now_utc(); @@ -165,9 +142,7 @@ pub fn mine_but_no_resume_custom(instance: u8, blocks: u32) { } } -pub fn stop_mining() { - MINER.write().unwrap().stop_mining() -} +pub fn stop_mining() { MINER.write().unwrap().stop_mining() } pub fn stop_mining_when_alone() { let t_0 = OffsetDateTime::now_utc(); @@ -186,9 +161,7 @@ pub fn stop_mining_when_alone() { } } -pub fn resume_mining() { - MINER.write().unwrap().resume_mining() -} +pub fn resume_mining() { MINER.write().unwrap().resume_mining() } fn _get_connection_tuple() -> Vec<(u8, String)> { let serive_base_name = _service_base_name(); @@ -222,9 +195,7 @@ pub fn disconnect_reorg_nodes() { } } -pub fn get_height() -> u32 { - get_height_custom(INSTANCE_1) -} +pub fn get_height() -> u32 { get_height_custom(INSTANCE_1) } pub fn get_height_custom(instance: u8) -> u32 { _bitcoin_cli_cmd(instance, vec!["getblockcount"]) @@ -232,6 +203,34 @@ pub fn get_height_custom(instance: u8) -> u32 { .expect("could not parse blockcount") } +pub fn initialize() { + INIT.call_once(|| { + INDEXER.get_or_init(|| match std::env::var("INDEXER") { + Ok(val) if val.to_lowercase() == Indexer::Esplora.to_string() => Indexer::Esplora, + Ok(val) if val.to_lowercase() == Indexer::Electrum.to_string() => Indexer::Electrum, + Err(VarError::NotPresent) => Indexer::Esplora, + _ => { + panic!("invalid indexer. possible values: `esplora` (default), `electrum`") + } + }); + if std::env::var("SKIP_INIT").is_ok() { + println!("skipping services initialization"); + return; + } + let start_services_file = PathBuf::from("tests").join("start_services.sh"); + println!("starting test services..."); + let output = Command::new(start_services_file) + .env("PROFILE", INDEXER.get().unwrap().to_string()) + .output() + .expect("failed to start test services"); + if !output.status.success() { + println!("{output:?}"); + panic!("failed to start test services"); + } + (INSTANCE_1..=INSTANCE_3).for_each(_wait_indexer_sync); + }); +} + pub fn indexer_url(instance: u8, network: Network) -> String { match (INDEXER.get().unwrap(), network, instance) { (Indexer::Electrum, Network::Mainnet, _) => ELECTRUM_MAINNET_URL, @@ -247,6 +246,59 @@ pub fn indexer_url(instance: u8, network: Network) -> String { .to_string() } +pub fn get_indexer(indexer_url: &str) -> AnyIndexer { + match INDEXER.get().unwrap() { + Indexer::Electrum => { + AnyIndexer::Electrum(Box::new(ElectrumClient::new(indexer_url).unwrap())) + } + Indexer::Esplora => { + AnyIndexer::Esplora(Box::new(EsploraClient::new_esplora(indexer_url).unwrap())) + } + } +} + +pub fn is_tx_mined(txid: Txid, indexer: &AnyIndexer) -> bool { + match indexer { + AnyIndexer::Electrum(indexer) => { + use electrum::Param; + let Ok(status) = indexer.raw_call("blockchain.transaction.get", vec![ + Param::String(txid.to_string()), + Param::Bool(true), + ]) else { + return false; + }; + status + .get("confirmantions") + .and_then(|confs| confs.as_u64()) + .map(|confs| confs > 0) + .unwrap_or_default() + } + AnyIndexer::Esplora(indexer) | AnyIndexer::Mempool(indexer) => { + let Ok(status) = indexer.tx_status(&txid) else { + return false; + }; + status.confirmed + } + _ => unreachable!(), + } +} + +pub fn broadcast_tx(tx: &Tx, indexer_url: &str) { + match get_indexer(indexer_url) { + AnyIndexer::Electrum(inner) => { + inner.transaction_broadcast(tx).unwrap(); + } + AnyIndexer::Esplora(inner) => { + inner.broadcast(tx).unwrap(); + } + _ => unreachable!("unsupported indexer"), + } +} + +pub fn broadcast_tx_and_mine(tx: &Tx, instance: u8) { + broadcast_tx(tx, &indexer_url(instance, Network::Regtest)); + mine_custom(false, instance, 1); +} fn _wait_indexer_sync(instance: u8) { let t_0 = OffsetDateTime::now_utc(); let blockcount = get_height_custom(instance); @@ -276,10 +328,7 @@ fn _wait_indexer_sync(instance: u8) { fn _send_to_address(address: &str, sats: Option, instance: u8) -> String { let sats = Sats::from_sats(sats.unwrap_or(100_000_000)); let btc = format!("{}.{:0>8}", sats.btc_floor(), sats.sats_rem()); - _bitcoin_cli_cmd( - instance, - vec!["-rpcwallet=miner", "sendtoaddress", address, &btc], - ) + _bitcoin_cli_cmd(instance, vec!["-rpcwallet=miner", "sendtoaddress", address, &btc]) } pub fn fund_wallet(address: String, sats: Option, instance: u8) -> String { diff --git a/tests/utils/helpers.rs b/tests/utils/helpers.rs deleted file mode 100644 index 56e6136..0000000 --- a/tests/utils/helpers.rs +++ /dev/null @@ -1,1717 +0,0 @@ -use super::*; - -pub struct TestWallet { - wallet: RgbWallet>, - descriptor: RgbDescr, - signer: Option, - wallet_dir: PathBuf, - instance: u8, -} - -enum WalletAccount { - Private(XprivAccount), - Public(XpubAccount), -} - -pub enum AllocationFilter { - Stock, - Wallet, - WalletAll, - WalletTentative, -} - -enum Filter<'w> { - NoWallet, - Wallet(&'w RgbWallet>), - WalletAll(&'w RgbWallet>), - WalletTentative(&'w RgbWallet>), -} - -impl AssignmentsFilter for Filter<'_> { - fn should_include(&self, outpoint: impl Into, id: Option) -> bool { - match self { - Filter::Wallet(wallet) => wallet - .wallet() - .filter_unspent() - .should_include(outpoint, id), - Filter::WalletTentative(wallet) => wallet - .wallet() - .filter_outpoints() - .should_include(outpoint, id), - _ => true, - } - } -} -impl Filter<'_> { - fn comment(&self, outpoint: XOutpoint) -> &'static str { - let outpoint = outpoint - .into_bp() - .into_bitcoin() - .expect("liquid is not yet supported"); - match self { - Filter::Wallet(rgb) if rgb.wallet().is_unspent(outpoint) => "", - Filter::WalletAll(rgb) | Filter::WalletTentative(rgb) - if rgb.wallet().is_unspent(outpoint) => - { - "-- unspent" - } - Filter::WalletAll(rgb) | Filter::WalletTentative(rgb) - if rgb.wallet().has_outpoint(outpoint) => - { - "-- spent" - } - _ => "-- third-party", - } - } -} - -#[derive(Debug, Copy, Clone, PartialEq, Eq)] -pub enum DescriptorType { - Wpkh, - Tr, -} - -impl fmt::Display for DescriptorType { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - write!(f, "{}", format!("{:?}", self).to_lowercase()) - } -} - -#[derive(Debug, Copy, Clone)] -pub enum HistoryType { - Linear, - Branching, - Merging, -} - -#[derive(Debug, Copy, Clone)] -pub enum ReorgType { - ChangeOrder, - Revert, -} - -#[derive(Debug, Copy, Clone)] -pub enum TransferType { - Blinded, - Witness, -} - -impl fmt::Display for TransferType { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - write!(f, "{}", format!("{:?}", self).to_lowercase()) - } -} - -pub enum InvoiceType { - Blinded(Option), - Witness, -} - -impl From for InvoiceType { - fn from(transfer_type: TransferType) -> Self { - match transfer_type { - TransferType::Blinded => InvoiceType::Blinded(None), - TransferType::Witness => InvoiceType::Witness, - } - } -} - -/// RGB asset-specific information to color a transaction -#[derive(Clone, Debug)] -pub struct AssetColoringInfo { - /// Contract iface - pub iface: TypeName, - /// Input outpoints of the assets being spent - pub input_outpoints: Vec, - /// Map of vouts and asset amounts to color the transaction outputs - pub output_map: HashMap, - /// Static blinding to keep the transaction construction deterministic - pub static_blinding: Option, -} - -/// RGB information to color a transaction -#[derive(Clone, Debug)] -pub struct ColoringInfo { - /// Asset-specific information - pub asset_info_map: HashMap, - /// Static blinding to keep the transaction construction deterministic - pub static_blinding: Option, - /// Nonce for offchain TXs ordering - pub nonce: Option, -} - -/// Map of contract ID and list of its beneficiaries -pub type AssetBeneficiariesMap = BTreeMap>>; - -#[derive(Debug, EnumIter, Copy, Clone, PartialEq)] -pub enum AssetSchema { - Nia, - Uda, - Cfa, -} - -impl fmt::Display for AssetSchema { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - write!(f, "{}", format!("{:?}", self).to_lowercase()) - } -} - -impl AssetSchema { - fn iface_type_name(&self) -> TypeName { - tn!(match self { - Self::Nia => "RGB20Fixed", - Self::Uda => "RGB21Unique", - Self::Cfa => "RGB25Base", - }) - } - - fn schema(&self) -> Schema { - match self { - Self::Nia => NonInflatableAsset::schema(), - Self::Uda => UniqueDigitalAsset::schema(), - Self::Cfa => CollectibleFungibleAsset::schema(), - } - } - - fn issue_impl(&self) -> IfaceImpl { - match self { - Self::Nia => NonInflatableAsset::issue_impl(), - Self::Uda => UniqueDigitalAsset::issue_impl(), - Self::Cfa => CollectibleFungibleAsset::issue_impl(), - } - } - - fn scripts(&self) -> Scripts { - match self { - Self::Nia => NonInflatableAsset::scripts(), - Self::Uda => UniqueDigitalAsset::scripts(), - Self::Cfa => CollectibleFungibleAsset::scripts(), - } - } - - fn types(&self) -> TypeSystem { - match self { - Self::Nia => NonInflatableAsset::types(), - Self::Uda => UniqueDigitalAsset::types(), - Self::Cfa => CollectibleFungibleAsset::types(), - } - } - - fn iface(&self) -> Iface { - match self { - Self::Nia => Rgb20::iface(&Rgb20::FIXED), - Self::Uda => Rgb21::iface(&Rgb21::NONE), - Self::Cfa => Rgb25::iface(&Rgb25::NONE), - } - } - - fn get_valid_kit(&self) -> ValidKit { - let mut kit = Kit::default(); - kit.schemata.push(self.schema()).unwrap(); - kit.ifaces.push(self.iface()).unwrap(); - kit.iimpls.push(self.issue_impl()).unwrap(); - kit.scripts.extend(self.scripts().into_values()).unwrap(); - kit.types = self.types(); - kit.validate().unwrap() - } -} - -#[derive(Debug)] -pub enum AssetInfo { - Nia { - spec: AssetSpec, - terms: ContractTerms, - issue_amounts: Vec, - }, - Uda { - spec: AssetSpec, - terms: ContractTerms, - token_data: TokenData, - }, - Cfa { - name: Name, - precision: Precision, - details: Option
, - terms: ContractTerms, - issue_amounts: Vec, - }, -} - -impl AssetInfo { - fn asset_schema(&self) -> AssetSchema { - match self { - Self::Nia { .. } => AssetSchema::Nia, - Self::Uda { .. } => AssetSchema::Uda, - Self::Cfa { .. } => AssetSchema::Cfa, - } - } - - fn iface_type_name(&self) -> TypeName { - self.asset_schema().iface_type_name() - } - - fn schema(&self) -> Schema { - self.asset_schema().schema() - } - - fn issue_impl(&self) -> IfaceImpl { - self.asset_schema().issue_impl() - } - - fn scripts(&self) -> Scripts { - self.asset_schema().scripts() - } - - fn types(&self) -> TypeSystem { - self.asset_schema().types() - } - - fn iface(&self) -> Iface { - self.asset_schema().iface() - } - - pub fn default_cfa(issue_amounts: Vec) -> Self { - AssetInfo::cfa("CFA asset name", 0, None, "CFA terms", None, issue_amounts) - } - - pub fn default_nia(issue_amounts: Vec) -> Self { - AssetInfo::nia( - "NIATCKR", - "NIA asset name", - 2, - None, - "NIA terms", - None, - issue_amounts, - ) - } - - pub fn default_uda() -> Self { - AssetInfo::uda( - "UDATCKR", - "UDA asset name", - None, - "NIA terms", - None, - uda_token_data_minimal(), - ) - } - - pub fn nia( - ticker: &str, - name: &str, - precision: u8, - details: Option<&str>, - terms_text: &str, - terms_media_fpath: Option<&str>, - issue_amounts: Vec, - ) -> Self { - let spec = AssetSpec::with( - ticker, - name, - Precision::try_from(precision).unwrap(), - details, - ) - .unwrap(); - let text = RicardianContract::from_str(terms_text).unwrap(); - let attachment = terms_media_fpath.map(attachment_from_fpath); - let terms = ContractTerms { - text, - media: attachment, - }; - Self::Nia { - spec, - terms, - issue_amounts, - } - } - - pub fn uda( - ticker: &str, - name: &str, - details: Option<&str>, - terms_text: &str, - terms_media_fpath: Option<&str>, - token_data: TokenData, - ) -> AssetInfo { - let spec = AssetSpec::with(ticker, name, Precision::try_from(0).unwrap(), details).unwrap(); - let text = RicardianContract::from_str(terms_text).unwrap(); - let attachment = terms_media_fpath.map(attachment_from_fpath); - let terms = ContractTerms { - text, - media: attachment.clone(), - }; - Self::Uda { - spec, - terms, - token_data, - } - } - - pub fn cfa( - name: &str, - precision: u8, - details: Option<&str>, - terms_text: &str, - terms_media_fpath: Option<&str>, - issue_amounts: Vec, - ) -> AssetInfo { - let text = RicardianContract::from_str(terms_text).unwrap(); - let attachment = terms_media_fpath.map(attachment_from_fpath); - let terms = ContractTerms { - text, - media: attachment, - }; - Self::Cfa { - name: Name::try_from(name.to_owned()).unwrap(), - precision: Precision::try_from(precision).unwrap(), - details: details.map(|d| Details::try_from(d.to_owned()).unwrap()), - terms, - issue_amounts, - } - } - - fn add_global_state(&self, mut builder: ContractBuilder) -> ContractBuilder { - match self { - Self::Nia { - spec, - terms, - issue_amounts, - } => builder - .add_global_state("spec", spec.clone()) - .unwrap() - .add_global_state("terms", terms.clone()) - .unwrap() - .add_global_state( - "issuedSupply", - Amount::from(issue_amounts.iter().sum::()), - ) - .unwrap(), - Self::Uda { - spec, - terms, - token_data, - } => builder - .add_global_state("spec", spec.clone()) - .unwrap() - .add_global_state("terms", terms.clone()) - .unwrap() - .add_global_state("tokens", token_data.clone()) - .unwrap(), - Self::Cfa { - name, - precision, - details, - terms, - issue_amounts: issued_supply, - } => { - builder = builder - .add_global_state("name", name.clone()) - .unwrap() - .add_global_state("precision", *precision) - .unwrap() - .add_global_state("terms", terms.clone()) - .unwrap() - .add_global_state( - "issuedSupply", - Amount::from(issued_supply.iter().sum::()), - ) - .unwrap(); - if let Some(details) = details { - builder = builder - .add_global_state("details", details.clone()) - .unwrap() - } - builder - } - } - } - - fn add_asset_owner( - &self, - mut builder: ContractBuilder, - close_method: CloseMethod, - outpoints: Vec, - ) -> ContractBuilder { - fn get_genesis_seal( - close_method: CloseMethod, - outpoint: Outpoint, - ) -> BuilderSeal> { - let blind_seal = match close_method { - CloseMethod::TapretFirst => { - BlindSeal::tapret_first_rand(outpoint.txid, outpoint.vout) - } - CloseMethod::OpretFirst => { - BlindSeal::opret_first_rand(outpoint.txid, outpoint.vout) - } - }; - let genesis_seal = GenesisSeal::from(blind_seal); - let seal: XChain> = XChain::with(Layer1::Bitcoin, genesis_seal); - BuilderSeal::from(seal) - } - - match self { - Self::Nia { issue_amounts, .. } | Self::Cfa { issue_amounts, .. } => { - for (amt, outpoint) in issue_amounts.iter().zip(outpoints.iter().cycle()) { - builder = builder - .add_fungible_state( - "assetOwner", - get_genesis_seal(close_method, *outpoint), - *amt, - ) - .unwrap(); - } - builder - } - Self::Uda { token_data, .. } => { - let fraction = OwnedFraction::from(1); - let allocation = Allocation::with(token_data.index, fraction); - builder - .add_data( - "assetOwner", - get_genesis_seal(close_method, outpoints[0]), - allocation, - ) - .unwrap() - } - } - } -} - -pub struct Report { - pub report_path: PathBuf, -} - -impl Report { - pub fn write_header(&self, fields: &[&str]) { - let mut file = std::fs::File::options() - .read(true) - .write(true) - .create_new(true) - .open(&self.report_path) - .unwrap(); - file.write_all(format!("{}\n", fields.join(";")).as_bytes()) - .unwrap(); - } - - pub fn write_duration(&self, duration: Duration) { - let mut file = OpenOptions::new() - .append(true) - .open(&self.report_path) - .unwrap(); - file.write_all(format!("{};", duration.as_millis()).as_bytes()) - .unwrap(); - } - - pub fn end_line(&self) { - let mut file = OpenOptions::new() - .append(true) - .open(&self.report_path) - .unwrap(); - file.write_all("\n".as_bytes()).unwrap(); - } -} - -fn _get_wallet( - descriptor_type: &DescriptorType, - network: Network, - wallet_dir: PathBuf, - wallet_account: WalletAccount, - instance: u8, -) -> TestWallet { - std::fs::create_dir_all(&wallet_dir).unwrap(); - println!("wallet dir: {wallet_dir:?}"); - - let xpub_account = match wallet_account { - WalletAccount::Private(ref xpriv_account) => xpriv_account.to_xpub_account(), - WalletAccount::Public(ref xpub_account) => xpub_account.clone(), - }; - const OPRET_KEYCHAINS: [Keychain; 3] = [ - Keychain::INNER, - Keychain::OUTER, - Keychain::with(RgbKeychain::Rgb as u8), - ]; - const TAPRET_KEYCHAINS: [Keychain; 4] = [ - Keychain::INNER, - Keychain::OUTER, - Keychain::with(RgbKeychain::Rgb as u8), - Keychain::with(RgbKeychain::Tapret as u8), - ]; - let keychains: &[Keychain] = match *descriptor_type { - DescriptorType::Tr => &TAPRET_KEYCHAINS[..], - DescriptorType::Wpkh => &OPRET_KEYCHAINS[..], - }; - let xpub_derivable = XpubDerivable::with(xpub_account.clone(), keychains); - - let descriptor = match descriptor_type { - DescriptorType::Wpkh => RgbDescr::Wpkh(Wpkh::from(xpub_derivable)), - DescriptorType::Tr => RgbDescr::TapretKey(TapretKey::from(xpub_derivable)), - }; - - let name = "bp_wallet_name"; - let mut bp_wallet = Wallet::new_layer1(descriptor.clone(), network); - bp_wallet.set_name(name.to_string()); - let bp_dir = wallet_dir.join(name); - let bp_wallet_provider = FsTextStore::new(bp_dir).unwrap(); - bp_wallet.make_persistent(bp_wallet_provider, true).unwrap(); - - let stock_provider = FsBinStore::new(wallet_dir.clone()).unwrap(); - let mut stock = Stock::in_memory(); - stock.make_persistent(stock_provider, true).unwrap(); - let mut wallet = RgbWallet::new(stock, bp_wallet); - - for asset_schema in AssetSchema::iter() { - let valid_kit = asset_schema.get_valid_kit(); - wallet.stock_mut().import_kit(valid_kit).unwrap(); - } - - let signer = match wallet_account { - WalletAccount::Private(xpriv_account) => Some(TestnetSigner::new(xpriv_account)), - WalletAccount::Public(_) => None, - }; - - let mut wallet = TestWallet { - wallet, - descriptor, - signer, - wallet_dir, - instance, - }; - - // TODO: remove if once found solution for esplora 'Too many requests' error - if network.is_testnet() { - wallet.sync(); - } - - wallet -} - -pub fn get_wallet(descriptor_type: &DescriptorType) -> TestWallet { - get_wallet_custom(descriptor_type, INSTANCE_1) -} - -pub fn get_wallet_custom(descriptor_type: &DescriptorType, instance: u8) -> TestWallet { - let mut seed = vec![0u8; 128]; - rand::thread_rng().fill_bytes(&mut seed); - - let xpriv_account = XprivAccount::with_seed(true, &seed).derive(h![86, 1, 0]); - - let fingerprint = xpriv_account.account_fp().to_string(); - let wallet_dir = PathBuf::from(TEST_DATA_DIR) - .join(INTEGRATION_DATA_DIR) - .join(fingerprint); - - _get_wallet( - descriptor_type, - Network::Regtest, - wallet_dir, - WalletAccount::Private(xpriv_account), - instance, - ) -} - -pub fn get_mainnet_wallet() -> TestWallet { - let xpub_account = XpubAccount::from_str( - "[c32338a7/86h/0h/0h]xpub6CmiK1xc7YwL472qm4zxeURFX8yMCSasioXujBjVMMzA3AKZr6KLQEmkzDge1Ezn2p43ZUysyx6gfajFVVnhtQ1AwbXEHrioLioXXgj2xW5" - ).unwrap(); - - let wallet_dir = PathBuf::from(TEST_DATA_DIR) - .join(INTEGRATION_DATA_DIR) - .join("mainnet"); - - _get_wallet( - &DescriptorType::Wpkh, - Network::Mainnet, - wallet_dir, - WalletAccount::Public(xpub_account), - INSTANCE_1, - ) -} - -fn get_indexer(indexer_url: &str) -> AnyIndexer { - match INDEXER.get().unwrap() { - Indexer::Electrum => { - AnyIndexer::Electrum(Box::new(ElectrumClient::new(indexer_url).unwrap())) - } - Indexer::Esplora => { - AnyIndexer::Esplora(Box::new(EsploraClient::new_esplora(indexer_url).unwrap())) - } - } -} - -fn get_resolver(indexer_url: &str) -> AnyResolver { - match INDEXER.get().unwrap() { - Indexer::Electrum => AnyResolver::electrum_blocking(indexer_url, None).unwrap(), - Indexer::Esplora => AnyResolver::esplora_blocking(indexer_url, None).unwrap(), - } -} - -fn broadcast_tx(tx: &Tx, indexer_url: &str) { - match get_indexer(indexer_url) { - AnyIndexer::Electrum(inner) => { - inner.transaction_broadcast(tx).unwrap(); - } - AnyIndexer::Esplora(inner) => { - inner.publish(tx).unwrap(); - } - _ => unreachable!("unsupported indexer"), - } -} - -pub fn broadcast_tx_and_mine(tx: &Tx, instance: u8) { - broadcast_tx(tx, &indexer_url(instance, Network::Regtest)); - mine_custom(false, instance, 1); -} - -pub fn attachment_from_fpath(fpath: &str) -> Attachment { - let file_bytes = std::fs::read(fpath).unwrap(); - let file_hash: sha256::Hash = Hash::hash(&file_bytes[..]); - let digest = file_hash.to_byte_array().into(); - let mime = FileFormat::from_file(fpath) - .unwrap() - .media_type() - .to_string(); - let media_ty: &'static str = Box::leak(mime.clone().into_boxed_str()); - let media_type = MediaType::with(media_ty); - Attachment { - ty: media_type, - digest, - } -} - -fn uda_token_data_minimal() -> TokenData { - TokenData { - index: TokenIndex::from(UDA_FIXED_INDEX), - ..Default::default() - } -} - -pub fn uda_token_data( - ticker: &str, - name: &str, - details: &str, - preview: EmbeddedMedia, - media: Attachment, - attachments: BTreeMap, - reserves: ProofOfReserves, -) -> TokenData { - let mut token_data = uda_token_data_minimal(); - token_data.preview = Some(preview); - token_data.media = Some(media); - token_data.attachments = Confined::try_from(attachments.clone()).unwrap(); - token_data.reserves = Some(reserves); - token_data.ticker = Some(Ticker::try_from(ticker.to_string()).unwrap()); - token_data.name = Some(Name::try_from(name.to_string()).unwrap()); - token_data.details = Some(Details::try_from(details.to_string()).unwrap()); - token_data -} - -impl TestWallet { - pub fn network(&self) -> Network { - self.wallet.wallet().network() - } - - pub fn testnet(&self) -> bool { - self.network().is_testnet() - } - - pub fn keychain(&self) -> RgbKeychain { - RgbKeychain::for_method(self.close_method()) - } - - pub fn get_derived_address(&self) -> DerivedAddr { - self.wallet - .wallet() - .addresses(self.keychain()) - .next() - .expect("no addresses left") - } - - pub fn get_address(&self) -> Address { - self.get_derived_address().addr - } - - pub fn get_utxo(&mut self, sats: Option) -> Outpoint { - let address = self.get_address(); - let txid = Txid::from_str(&fund_wallet(address.to_string(), sats, self.instance)).unwrap(); - self.sync(); - let mut vout = None; - let coins = self.wallet.wallet().address_coins(); - assert!(!coins.is_empty()); - for (_derived_addr, utxos) in coins { - for utxo in utxos { - if utxo.outpoint.txid == txid { - vout = Some(utxo.outpoint.vout_u32()); - } - } - } - Outpoint { - txid, - vout: Vout::from_u32(vout.unwrap()), - } - } - - pub fn change_instance(&mut self, instance: u8) { - self.instance = instance; - } - - pub fn sync_and_update_witnesses(&mut self, after_height: Option) { - self.sync(); - self.update_witnesses(after_height.unwrap_or(1)); - } - - pub fn switch_to_instance(&mut self, instance: u8) { - self.change_instance(instance); - self.sync_and_update_witnesses(None); - } - - pub fn indexer_url(&self) -> String { - indexer_url(self.instance, self.network()) - } - - fn get_indexer(&self) -> AnyIndexer { - get_indexer(&self.indexer_url()) - } - - pub fn get_resolver(&self) -> AnyResolver { - get_resolver(&self.indexer_url()) - } - - pub fn broadcast_tx(&self, tx: &Tx) { - broadcast_tx(tx, &self.indexer_url()); - } - - pub fn get_witness_ord(&self, txid: &Txid) -> WitnessOrd { - self.get_resolver() - .resolve_pub_witness_ord(XWitnessId::Bitcoin(*txid)) - .unwrap() - } - - pub fn get_tx_height(&self, txid: &Txid) -> Option { - match self.get_witness_ord(txid) { - WitnessOrd::Mined(witness_pos) => Some(witness_pos.height().get()), - _ => None, - } - } - - pub fn sync(&mut self) { - let indexer = self.get_indexer(); - self.wallet - .wallet_mut() - .update(&indexer) - .into_result() - .unwrap(); - } - - pub fn close_method(&self) -> CloseMethod { - self.wallet.wallet().seal_close_method() - } - - pub fn mine_tx(&self, txid: &Txid, resume: bool) { - let mut attempts = 10; - loop { - mine_custom(resume, self.instance, 1); - if self.get_tx_height(txid).is_some() { - break; - } - attempts -= 1; - if attempts == 0 { - panic!("TX is not getting mined"); - } - } - } - - pub fn issue_with_info( - &mut self, - asset_info: AssetInfo, - close_method: CloseMethod, - outpoints: Vec>, - ) -> (ContractId, TypeName) { - let outpoints = if outpoints.is_empty() { - vec![self.get_utxo(None)] - } else { - outpoints - .into_iter() - .map(|o| o.unwrap_or_else(|| self.get_utxo(None))) - .collect() - }; - - let mut builder = ContractBuilder::with( - Identity::default(), - asset_info.iface(), - asset_info.schema(), - asset_info.issue_impl(), - asset_info.types(), - asset_info.scripts(), - ); - - builder = asset_info.add_global_state(builder); - - builder = asset_info.add_asset_owner(builder, close_method, outpoints); - - let contract = builder.issue_contract().expect("failure issuing contract"); - let resolver = self.get_resolver(); - self.wallet - .stock_mut() - .import_contract(contract.clone(), resolver) - .unwrap(); - - (contract.contract_id(), asset_info.iface_type_name()) - } - - pub fn issue_nia( - &mut self, - issued_supply: u64, - close_method: CloseMethod, - outpoint: Option<&Outpoint>, - ) -> (ContractId, TypeName) { - let asset_info = AssetInfo::default_nia(vec![issued_supply]); - self.issue_with_info(asset_info, close_method, vec![outpoint.copied()]) - } - - pub fn issue_uda( - &mut self, - close_method: CloseMethod, - outpoint: Option<&Outpoint>, - ) -> (ContractId, TypeName) { - let asset_info = AssetInfo::default_uda(); - self.issue_with_info(asset_info, close_method, vec![outpoint.copied()]) - } - - pub fn issue_cfa( - &mut self, - issued_supply: u64, - close_method: CloseMethod, - outpoint: Option<&Outpoint>, - ) -> (ContractId, TypeName) { - let asset_info = AssetInfo::default_cfa(vec![issued_supply]); - self.issue_with_info(asset_info, close_method, vec![outpoint.copied()]) - } - - pub fn invoice( - &mut self, - contract_id: ContractId, - iface_type_name: &TypeName, - amount: u64, - close_method: CloseMethod, - invoice_type: InvoiceType, - ) -> RgbInvoice { - let network = self.wallet.wallet().network(); - let beneficiary = match invoice_type { - InvoiceType::Blinded(outpoint) => { - let outpoint = if let Some(outpoint) = outpoint { - outpoint - } else { - self.get_utxo(None) - }; - let seal = XChain::Bitcoin(GraphSeal::new_random( - close_method, - outpoint.txid, - outpoint.vout, - )); - self.wallet.stock_mut().store_secret_seal(seal).unwrap(); - Beneficiary::BlindedSeal(*seal.to_secret_seal().as_reduced_unsafe()) - } - InvoiceType::Witness => { - let address = self.get_address(); - Beneficiary::WitnessVout(Pay2Vout { - address: address.payload, - method: close_method, - }) - } - }; - - let mut builder = RgbInvoiceBuilder::new(XChainNet::bitcoin(network, beneficiary)) - .set_contract(contract_id) - .set_interface(iface_type_name.clone()); - if *iface_type_name == AssetSchema::Uda.iface_type_name() { - if amount != 1 { - panic!("UDA amount must be 1"); - } - builder = builder - .clone() - .set_allocation(UDA_FIXED_INDEX, amount) - .unwrap(); - } else { - builder = builder.clone().set_amount_raw(amount); - } - builder.finish() - } - - pub fn sign_finalize(&self, psbt: &mut Psbt) { - let _sig_count = psbt.sign(self.signer.as_ref().unwrap()).unwrap(); - psbt.finalize(&self.descriptor); - } - - pub fn sign_finalize_extract(&self, psbt: &mut Psbt) -> Tx { - self.sign_finalize(psbt); - psbt.extract().unwrap() - } - - pub fn transfer( - &mut self, - invoice: RgbInvoice, - sats: Option, - fee: Option, - broadcast: bool, - report: Option<&Report>, - ) -> (Transfer, Tx) { - self.sync(); - - let fee = Sats::from_sats(fee.unwrap_or(DEFAULT_FEE_ABS)); - let sats = Sats::from_sats(sats.unwrap_or(2000)); - let params = TransferParams::with(fee, sats); - let pay_start = Instant::now(); - let (mut psbt, _psbt_meta, consignment) = self.wallet.pay(&invoice, params).unwrap(); - let pay_duration = pay_start.elapsed(); - if let Some(report) = report { - report.write_duration(pay_duration); - } - - let mut cs_path = self.wallet_dir.join("consignments"); - std::fs::create_dir_all(&cs_path).unwrap(); - let consignment_id = consignment.consignment_id(); - cs_path.push(consignment_id.to_string()); - cs_path.set_extension("yaml"); - let mut file = std::fs::File::options() - .read(true) - .write(true) - .create_new(true) - .open(cs_path) - .unwrap(); - serde_yaml::to_writer(&mut file, &consignment).unwrap(); - - let tx = self.sign_finalize_extract(&mut psbt); - - let txid = tx.txid().to_string(); - println!("transfer txid: {txid}, consignment: {consignment_id}"); - - let mut tx_path = self.wallet_dir.join("transactions"); - std::fs::create_dir_all(&tx_path).unwrap(); - tx_path.push(&txid); - tx_path.set_extension("yaml"); - let mut file = std::fs::File::options() - .read(true) - .write(true) - .create_new(true) - .open(tx_path) - .unwrap(); - serde_yaml::to_writer(&mut file, &tx).unwrap(); - writeln!(file, "\n---\n").unwrap(); - serde_yaml::to_writer(&mut file, &psbt).unwrap(); - - if broadcast { - self.broadcast_tx(&tx); - } - - (consignment, tx) - } - - pub fn accept_transfer(&mut self, consignment: Transfer, report: Option<&Report>) { - let mut resolver = self.get_resolver(); - resolver.add_terminals(&consignment); - self.accept_transfer_custom_resolver(consignment, report, &resolver); - } - - pub fn accept_transfer_custom_resolver( - &mut self, - consignment: Transfer, - report: Option<&Report>, - resolver: &impl ResolveWitness, - ) { - self.sync(); - let validate_start = Instant::now(); - let validated_consignment = consignment - .validate(&resolver, self.testnet()) - .map_err(|(status, _)| status) - .unwrap(); - let validate_duration = validate_start.elapsed(); - if let Some(report) = report { - report.write_duration(validate_duration); - } - - let validation_status = validated_consignment.clone().into_validation_status(); - let validity = validation_status.validity(); - assert_eq!(validity, Validity::Valid); - let accept_start = Instant::now(); - self.wallet - .stock_mut() - .accept_transfer(validated_consignment.clone(), &resolver) - .unwrap(); - let accept_duration = accept_start.elapsed(); - if let Some(report) = report { - report.write_duration(accept_duration); - } - } - - pub fn contract_iface( - &self, - contract_id: ContractId, - iface_type_name: &TypeName, - ) -> ContractIface> { - self.wallet - .stock() - .contract_iface(contract_id, iface_type_name.clone()) - .unwrap() - } - - pub fn contract_iface_class( - &self, - contract_id: ContractId, - ) -> C::Wrapper> { - self.wallet - .stock() - .contract_iface_class::(contract_id) - .unwrap() - } - - pub fn contract_fungible_allocations( - &self, - contract_id: ContractId, - iface_type_name: &TypeName, - show_tentative: bool, - ) -> Vec { - let filter = if show_tentative { - Filter::WalletTentative(&self.wallet) - } else { - Filter::Wallet(&self.wallet) - }; - self.contract_iface(contract_id, iface_type_name) - .fungible(fname!("assetOwner"), filter) - .unwrap() - .collect() - } - - pub fn contract_data_allocations( - &self, - contract_id: ContractId, - iface_type_name: &TypeName, - ) -> Vec { - self.contract_iface(contract_id, iface_type_name) - .data(fname!("assetOwner"), Filter::Wallet(&self.wallet)) - .unwrap() - .collect() - } - - pub fn history(&self, contract_id: ContractId, iface_type_name: &TypeName) -> Vec { - self.wallet - .history(contract_id, iface_type_name.clone()) - .unwrap() - } - - pub fn list_contracts(&self) -> Vec { - self.wallet.stock().contracts().unwrap().collect() - } - - pub fn utxos(&self) -> Vec { - self.wallet.wallet().utxos().collect() - } - - pub fn debug_contracts(&self) { - println!("Contracts:"); - for info in self.list_contracts() { - println!("{}", info.to_string().replace("\n", "\t")); - } - } - - pub fn debug_logs( - &self, - contract_id: ContractId, - iface_type_name: &TypeName, - filter: AllocationFilter, - ) { - let filter = match filter { - AllocationFilter::WalletAll => Filter::WalletAll(&self.wallet), - AllocationFilter::WalletTentative => Filter::WalletTentative(&self.wallet), - AllocationFilter::Wallet => Filter::Wallet(&self.wallet), - AllocationFilter::Stock => Filter::NoWallet, - }; - - let contract = self.contract_iface(contract_id, iface_type_name); - - println!("Global:"); - for global in &contract.iface.global_state { - if let Ok(values) = contract.global(global.name.clone()) { - for val in values { - println!(" {} := {}", global.name, val); - } - } - } - - println!("\nOwned:"); - fn witness( - allocation: &OutputAssignment, - contract: &ContractIface>, - ) -> String { - allocation - .witness - .and_then(|w| contract.witness_info(w)) - .map(|info| format!("{} ({})", info.id, info.ord)) - .unwrap_or_else(|| s!("~")) - } - for owned in &contract.iface.assignments { - println!(" State \t{:78}\tWitness", "Seal"); - println!(" {}:", owned.name); - if let Ok(allocations) = contract.fungible(owned.name.clone(), &filter) { - for allocation in allocations { - println!( - " {: >9}\t{}\t{} {}", - allocation.state.value(), - allocation.seal, - witness(&allocation, &contract), - filter.comment(allocation.seal.to_outpoint()) - ); - } - } - if let Ok(allocations) = contract.data(owned.name.clone(), &filter) { - for allocation in allocations { - println!( - " {: >9}\t{}\t{} {}", - allocation.state, - allocation.seal, - witness(&allocation, &contract), - filter.comment(allocation.seal.to_outpoint()) - ); - } - } - if let Ok(allocations) = contract.attachments(owned.name.clone(), &filter) { - for allocation in allocations { - println!( - " {: >9}\t{}\t{} {}", - allocation.state, - allocation.seal, - witness(&allocation, &contract), - filter.comment(allocation.seal.to_outpoint()) - ); - } - } - if let Ok(allocations) = contract.rights(owned.name.clone(), &filter) { - for allocation in allocations { - println!( - " {: >9}\t{}\t{} {}", - "right", - allocation.seal, - witness(&allocation, &contract), - filter.comment(allocation.seal.to_outpoint()) - ); - } - } - } - - let bp_runtime = self.wallet.wallet(); - println!("\nHeight\t{:>12}\t{:68}", "Amount, ṩ", "Outpoint"); - for (derived_addr, utxos) in bp_runtime.address_coins() { - println!("{}\t{}", derived_addr.addr, derived_addr.terminal); - for row in utxos { - println!("{}\t{: >12}\t{:68}", row.height, row.amount, row.outpoint); - } - println!() - } - - println!("\nWallet total balance: {} ṩ", bp_runtime.balance()); - } - - pub fn debug_history( - &self, - contract_id: ContractId, - iface_type_name: &TypeName, - details: bool, - ) { - let mut history = self.history(contract_id, iface_type_name); - history.sort_by_key(|op| op.witness.map(|w| w.ord).unwrap_or(WitnessOrd::Archived)); - if details { - println!("Operation\tValue \tState\t{:78}\tWitness", "Seal"); - } else { - println!("Operation\tValue \t{:78}\tWitness", "Seal"); - } - for ContractOp { - direction, - ty, - opids, - state, - to, - witness, - } in history - { - print!("{:9}\t", direction.to_string()); - if let AllocatedState::Amount(amount) = state { - print!("{: >9}", amount.value()); - } else { - print!("{state:>9}"); - } - if details { - print!("\t{ty}"); - } - println!( - "\t{}\t{}", - to.first().expect("at least one receiver is always present"), - witness - .map(|info| format!("{} ({})", info.id, info.ord)) - .unwrap_or_else(|| s!("~")) - ); - if details { - println!( - "\topid={}", - opids - .iter() - .map(OpId::to_string) - .collect::>() - .join("\n\topid=") - ) - } - } - } - - #[allow(clippy::too_many_arguments)] - pub fn send( - &mut self, - recv_wlt: &mut TestWallet, - transfer_type: TransferType, - contract_id: ContractId, - iface_type_name: &TypeName, - amount: u64, - sats: u64, - report: Option<&Report>, - ) -> (Transfer, Tx) { - let invoice = recv_wlt.invoice( - contract_id, - iface_type_name, - amount, - recv_wlt.close_method(), - transfer_type.into(), - ); - self.send_to_invoice(recv_wlt, invoice, Some(sats), None, report) - } - - pub fn send_to_invoice( - &mut self, - recv_wlt: &mut TestWallet, - invoice: RgbInvoice, - sats: Option, - fee: Option, - report: Option<&Report>, - ) -> (Transfer, Tx) { - let (consignment, tx) = self.transfer(invoice, sats, fee, true, report); - self.mine_tx(&tx.txid(), false); - recv_wlt.accept_transfer(consignment.clone(), report); - self.sync(); - (consignment, tx) - } - - pub fn check_allocations( - &self, - contract_id: ContractId, - iface_type_name: &TypeName, - asset_schema: AssetSchema, - expected_fungible_allocations: Vec, - nonfungible_allocation: bool, - ) { - match asset_schema { - AssetSchema::Nia | AssetSchema::Cfa => { - let allocations = - self.contract_fungible_allocations(contract_id, iface_type_name, false); - let mut actual_fungible_allocations = allocations - .iter() - .map(|a| a.state.value()) - .collect::>(); - let mut expected_fungible_allocations = expected_fungible_allocations.clone(); - actual_fungible_allocations.sort(); - expected_fungible_allocations.sort(); - assert_eq!(actual_fungible_allocations, expected_fungible_allocations); - assert!(allocations - .iter() - .all(|a| a.seal.method() == self.close_method())); - } - AssetSchema::Uda => { - let allocations = self.contract_data_allocations(contract_id, iface_type_name); - let expected_allocations = if nonfungible_allocation { - assert_eq!( - allocations - .iter() - .filter(|a| a.state.to_string() == "000000000100000000000000") - .count(), - 1 - ); - 1 - } else { - 0 - }; - assert_eq!(allocations.len(), expected_allocations); - } - } - } - - pub fn check_history_operation( - &self, - contract_id: &ContractId, - iface_type_name: &TypeName, - txid: Option<&Txid>, - direction: OpDirection, - amount: u64, - ) { - let operation = self - .history(*contract_id, iface_type_name) - .into_iter() - .find(|co| { - co.direction == direction - && co - .witness - .map_or(true, |w| Some(w.id.as_reduced_unsafe()) == txid) - }) - .unwrap(); - assert!(matches!(operation.state, AllocatedState::Amount(amt) if amt.value() == amount)); - } - - fn _construct_psbt_offchain( - &mut self, - input_outpoints: Vec<(Outpoint, u64, Terminal)>, - beneficiaries: Vec<&PsbtBeneficiary>, - tx_params: TxParams, - ) -> (Psbt, PsbtMeta) { - let mut psbt = Psbt::create(PsbtVer::V2); - - for (outpoint, value, terminal) in input_outpoints { - psbt.construct_input_expect( - Prevout::new(outpoint, Sats::from(value)), - self.wallet.wallet().descriptor(), - terminal, - tx_params.seq_no, - ); - } - if psbt.inputs().count() == 0 { - panic!("no inputs"); - } - - let input_value = psbt.input_sum(); - let mut max = Vec::new(); - let mut output_value = Sats::ZERO; - for beneficiary in beneficiaries { - let amount = beneficiary.amount.unwrap_or(Sats::ZERO); - output_value.checked_add_assign(amount).unwrap(); - let out = psbt.construct_output_expect(beneficiary.script_pubkey(), amount); - if beneficiary.amount.is_max() { - max.push(out.index()); - } - } - let mut remaining_value = input_value - .checked_sub(output_value) - .unwrap() - .checked_sub(tx_params.fee) - .unwrap(); - if !max.is_empty() { - let portion = remaining_value / max.len(); - for out in psbt.outputs_mut() { - if max.contains(&out.index()) { - out.amount = portion; - } - } - remaining_value = Sats::ZERO; - } - - let (change_vout, change_terminal) = if remaining_value > Sats::from(546u64) { - let change_index = self - .wallet - .wallet_mut() - .next_derivation_index(tx_params.change_keychain, tx_params.change_shift); - let change_terminal = Terminal::new(tx_params.change_keychain, change_index); - let change_vout = psbt - .construct_change_expect( - self.wallet.wallet().descriptor(), - change_terminal, - remaining_value, - ) - .index(); - ( - Some(Vout::from_u32(change_vout as u32)), - Some(change_terminal), - ) - } else { - (None, None) - }; - - ( - psbt, - PsbtMeta { - change_vout, - change_terminal, - }, - ) - } - - fn _construct_beneficiaries( - &self, - beneficiaries: Vec<(Address, Option)>, - ) -> Vec { - beneficiaries - .into_iter() - .map(|(addr, amt)| { - let payment = if let Some(amt) = amt { - Payment::Fixed(Sats::from_sats(amt)) - } else { - Payment::Max - }; - PsbtBeneficiary::new(addr, payment) - }) - .collect() - } - - pub fn construct_psbt_offchain( - &mut self, - input_outpoints: Vec<(Outpoint, u64, Terminal)>, - beneficiaries: Vec<(Address, Option)>, - fee: Option, - ) -> (Psbt, PsbtMeta) { - let tx_params = TxParams::with(Sats::from_sats(fee.unwrap_or(DEFAULT_FEE_ABS))); - let beneficiaries = self._construct_beneficiaries(beneficiaries); - let beneficiaries: Vec<&PsbtBeneficiary> = beneficiaries.iter().collect(); - - self._construct_psbt_offchain(input_outpoints, beneficiaries, tx_params) - } - - pub fn construct_psbt( - &mut self, - input_outpoints: Vec, - beneficiaries: Vec<(Address, Option)>, - fee: Option, - ) -> (Psbt, PsbtMeta) { - let tx_params = TxParams::with(Sats::from_sats(fee.unwrap_or(DEFAULT_FEE_ABS))); - let beneficiaries = self._construct_beneficiaries(beneficiaries); - let beneficiaries: Vec<&PsbtBeneficiary> = beneficiaries.iter().collect(); - - self.wallet - .wallet_mut() - .construct_psbt(input_outpoints, beneficiaries, tx_params) - .unwrap() - } - - pub fn psbt_add_input(&self, psbt: &mut Psbt, utxo: Outpoint) { - for account in self.descriptor.xpubs() { - psbt.xpubs.insert(*account.xpub(), account.origin().clone()); - } - let input = self.wallet.wallet().utxo(utxo).unwrap(); - psbt.construct_input_expect( - input.to_prevout(), - self.wallet.wallet().descriptor(), - input.terminal, - SeqNo::ZERO, - ); - } - - pub fn color_psbt( - &self, - psbt: &mut Psbt, - coloring_info: ColoringInfo, - ) -> (Fascia, AssetBeneficiariesMap) { - let asset_beneficiaries = self.color_psbt_init(psbt, coloring_info); - psbt.complete_construction(); - let fascia = psbt.rgb_commit().unwrap(); - (fascia, asset_beneficiaries) - } - - pub fn color_psbt_init( - &self, - psbt: &mut Psbt, - coloring_info: ColoringInfo, - ) -> AssetBeneficiariesMap { - if !psbt.outputs().any(|o| o.script.is_op_return()) { - let _output = psbt.construct_output_expect(ScriptPubkey::op_return(&[]), Sats::ZERO); - } - - let prev_outputs = psbt - .to_unsigned_tx() - .inputs - .iter() - .map(|txin| txin.prev_output) - .map(|outpoint| XOutpoint::from(XChain::Bitcoin(outpoint))) - .collect::>(); - - let mut all_transitions: HashMap = HashMap::new(); - let mut asset_beneficiaries: AssetBeneficiariesMap = bmap![]; - let assignment_name = FieldName::from("assetOwner"); - - for (contract_id, asset_coloring_info) in coloring_info.asset_info_map.clone() { - let mut asset_transition_builder = self - .wallet - .stock() - .transition_builder(contract_id, asset_coloring_info.iface, None::<&str>) - .unwrap(); - let assignment_id = asset_transition_builder - .assignments_type(&assignment_name) - .unwrap(); - - let mut asset_available_amt = 0; - for (_, opout_state_map) in self - .wallet - .stock() - .contract_assignments_for( - contract_id, - prev_outputs - .iter() - // only retrieve assignments for owned prevouts using coloring_info - .filter(|xop| { - coloring_info.asset_info_map[&contract_id] - .input_outpoints - .contains(xop.as_reduced_unsafe()) - }) - .copied(), - ) - .unwrap() - { - for (opout, state) in opout_state_map { - if let PersistedState::Amount(amt, _, _) = &state { - asset_available_amt += amt.value(); - } - asset_transition_builder = - asset_transition_builder.add_input(opout, state).unwrap(); - } - } - - let mut beneficiaries = vec![]; - let mut sending_amt = 0; - for (vout, amount) in asset_coloring_info.output_map { - if amount == 0 { - continue; - } - sending_amt += amount; - if vout as usize > psbt.outputs().count() { - panic!("invalid vout in output_map, does not exist in the given PSBT"); - } - let graph_seal = if let Some(blinding) = asset_coloring_info.static_blinding { - GraphSeal::with_blinded_vout(CloseMethod::OpretFirst, vout, blinding) - } else { - GraphSeal::new_random_vout(CloseMethod::OpretFirst, vout) - }; - let seal = BuilderSeal::Revealed(XChain::with(Layer1::Bitcoin, graph_seal)); - beneficiaries.push(seal); - - let blinding_factor = if let Some(blinding) = asset_coloring_info.static_blinding { - let mut blinding_32_bytes: [u8; 32] = [0; 32]; - blinding_32_bytes[0..8].copy_from_slice(&blinding.to_le_bytes()); - BlindingFactor::try_from(blinding_32_bytes).unwrap() - } else { - BlindingFactor::random() - }; - asset_transition_builder = asset_transition_builder - .add_fungible_state_raw(assignment_id, seal, amount, blinding_factor) - .unwrap(); - } - if sending_amt > asset_available_amt { - panic!("total amount in output_map greater than available ({asset_available_amt})"); - } - - if let Some(nonce) = coloring_info.nonce { - asset_transition_builder = asset_transition_builder.set_nonce(nonce); - } - - let transition = asset_transition_builder.complete_transition().unwrap(); - all_transitions.insert(contract_id, transition); - asset_beneficiaries.insert(contract_id, beneficiaries); - } - - let (opreturn_index, _) = psbt - .to_unsigned_tx() - .outputs - .iter() - .enumerate() - .find(|(_, o)| o.script_pubkey.is_op_return()) - .expect("psbt should have an op_return output"); - let (_, opreturn_output) = psbt - .outputs_mut() - .enumerate() - .find(|(i, _)| i == &opreturn_index) - .unwrap(); - opreturn_output.set_opret_host().unwrap(); - if let Some(blinding) = coloring_info.static_blinding { - opreturn_output.set_mpc_entropy(blinding).unwrap(); - } - - let tx_inputs = psbt.clone().to_unsigned_tx().inputs; - for (contract_id, transition) in all_transitions { - for (input, txin) in psbt.inputs_mut().zip(&tx_inputs) { - let prevout = txin.prev_output; - let outpoint = Outpoint::new(prevout.txid.to_byte_array().into(), prevout.vout); - if coloring_info - .asset_info_map - .clone() - .get(&contract_id) - .unwrap() - .input_outpoints - .contains(&outpoint) - { - input - .set_rgb_consumer(contract_id, transition.id()) - .unwrap(); - } - } - psbt.push_rgb_transition(transition, CloseMethod::OpretFirst) - .unwrap(); - } - - asset_beneficiaries - } - - pub fn consume_fascia(&mut self, fascia: Fascia, witness_txid: Txid) { - struct FasciaResolver { - witness_id: XWitnessId, - } - impl ResolveWitness for FasciaResolver { - fn resolve_pub_witness( - &self, - _: XWitnessId, - ) -> Result { - unreachable!() - } - fn resolve_pub_witness_ord( - &self, - witness_id: XWitnessId, - ) -> Result { - assert_eq!(witness_id, self.witness_id); - Ok(WitnessOrd::Tentative) - } - } - - let resolver = FasciaResolver { - witness_id: XChain::Bitcoin(witness_txid), - }; - - self.wallet - .stock_mut() - .consume_fascia(fascia, resolver) - .unwrap(); - } - - pub fn update_witnesses(&mut self, after_height: u32) { - let resolver = self.get_resolver(); - self.wallet - .stock_mut() - .update_witnesses(resolver, after_height) - .unwrap(); - } - - pub fn create_consignments( - &self, - asset_beneficiaries: AssetBeneficiariesMap, - witness_txid: Txid, - ) -> Vec { - let mut transfers = vec![]; - let stock = self.wallet.stock(); - - for (contract_id, beneficiaries) in asset_beneficiaries { - for beneficiary in beneficiaries { - match beneficiary { - BuilderSeal::Revealed(seal) => { - let explicit_seal = XChain::Bitcoin(ExplicitSeal::new( - seal.method(), - Outpoint::new(witness_txid, seal.as_reduced_unsafe().vout), - )); - transfers.push(stock.transfer(contract_id, [explicit_seal], None).unwrap()); - } - BuilderSeal::Concealed(seal) => { - transfers.push(stock.transfer(contract_id, vec![], Some(seal)).unwrap()); - } - } - } - } - transfers - } -} diff --git a/tests/utils/mod.rs b/tests/utils/mod.rs index d36a9e3..795bad5 100644 --- a/tests/utils/mod.rs +++ b/tests/utils/mod.rs @@ -1,112 +1,29 @@ +pub mod runtime; +pub mod report; pub mod chain; -pub mod helpers; -pub const TEST_DATA_DIR: &str = "test-data"; -pub const INTEGRATION_DATA_DIR: &str = "integration"; -pub const STRESS_DATA_DIR: &str = "stress"; - -pub const ELECTRUM_1_REGTEST_URL: &str = "127.0.0.1:50001"; -pub const ELECTRUM_2_REGTEST_URL: &str = "127.0.0.1:50002"; -pub const ELECTRUM_3_REGTEST_URL: &str = "127.0.0.1:50003"; -pub const ELECTRUM_MAINNET_URL: &str = "ssl://electrum.iriswallet.com:50003"; -pub const ESPLORA_1_REGTEST_URL: &str = "http://127.0.0.1:8094/regtest/api"; -pub const ESPLORA_2_REGTEST_URL: &str = "http://127.0.0.1:8095/regtest/api"; -pub const ESPLORA_3_REGTEST_URL: &str = "http://127.0.0.1:8096/regtest/api"; -pub const ESPLORA_MAINNET_URL: &str = "https://blockstream.info/api"; -pub const FAKE_TXID: &str = "e5a3e577309df31bd606f48049049d2e1e02b048206ba232944fcc053a176ccb:0"; -pub const UDA_FIXED_INDEX: u32 = 0; pub const DEFAULT_FEE_ABS: u64 = 400; -pub const INSTANCE_1: u8 = 1; -pub const INSTANCE_2: u8 = 2; -pub const INSTANCE_3: u8 = 3; +use amplify::Display; -pub use std::{ - cell::OnceCell, - collections::{BTreeMap, BTreeSet, HashMap, HashSet}, - env::VarError, - ffi::OsString, - fmt::{self, Display}, - fs::OpenOptions, - io::Write, - num::NonZeroU32, - path::{PathBuf, MAIN_SEPARATOR}, - process::{Command, Stdio}, - str::FromStr, - sync::{Mutex, Once, OnceLock, RwLock}, - time::{Duration, Instant}, -}; +#[derive(Debug, Copy, Clone, PartialEq, Eq, Display)] +#[display(lowercase)] +pub enum TransferType { + Blinded, + Witness, +} -pub use amplify::{ - bmap, - confinement::{Confined, U16}, - map, s, ByteArray, Wrapper, -}; -use bitcoin_hashes::{sha256, Hash}; -pub use bp::{ - seals::txout::{BlindSeal, CloseMethod, ExplicitSeal}, - ConsensusDecode, Outpoint, Sats, ScriptPubkey, SeqNo, Tx, Txid, Vout, -}; -pub use bpstd::{ - h, signers::TestnetSigner, Address, DerivationPath, DerivationSeg, DerivedAddr, Descriptor, - HardenedIndex, Keychain, Network, Terminal, XkeyOrigin, Xpriv, XprivAccount, Xpub, XpubAccount, - XpubDerivable, XpubFp, -}; -pub use bpwallet::{ - fs::FsTextStore, indexers::esplora::Client as EsploraClient, AnyIndexer, Indexer as BpIndexer, - Wallet, WalletUtxo, -}; -pub use descriptors::Wpkh; -pub use electrum::{Client as ElectrumClient, ElectrumApi, Param}; -pub use file_format::FileFormat; -pub use ifaces::{ - rgb20, rgb21, - rgb21::{EmbeddedMedia, TokenData}, - rgb25, IssuerWrapper, Rgb20, Rgb21, Rgb25, -}; -pub use once_cell::sync::Lazy; -pub use psbt::{ - Beneficiary as PsbtBeneficiary, Payment, Prevout, Psbt, PsbtConstructor, PsbtMeta, PsbtVer, -}; -pub use psrgbt::{RgbExt, RgbInExt, RgbPsbt, TxParams}; -pub use rand::RngCore; -pub use rgb::{ - info::ContractInfo, - interface::{AllocatedState, AssignmentsFilter, ContractOp, OpDirection}, - invoice::Pay2Vout, - persistence::{MemContract, MemContractState, Stock}, - resolvers::AnyResolver, - stl::ContractTerms, - validation::{Failure, ResolveWitness, Scripts, Validity, WitnessResolverError}, - vm::{WitnessOrd, WitnessPos, XWitnessTx}, - BlindingFactor, DescriptorRgb, GenesisSeal, GraphSeal, Identity, OpId, RgbDescr, RgbKeychain, - RgbWallet, TapretKey, TransferParams, Transition, WalletProvider, XOutpoint, XWitnessId, -}; -pub use rgbstd::{ - containers::{ - BuilderSeal, ConsignmentExt, Fascia, FileContent, IndexedConsignment, Kit, Transfer, - ValidKit, - }, - interface::{ - ContractBuilder, ContractIface, DataAllocation, FilterExclude, FungibleAllocation, Iface, - IfaceClass, IfaceId, IfaceImpl, NamedField, - }, - invoice::{Beneficiary, RgbInvoice, RgbInvoiceBuilder, XChainNet}, - persistence::{fs::FsBinStore, PersistedState, SchemaIfaces, StashReadProvider}, - schema::SchemaId, - stl::{ - AssetSpec, Attachment, Details, MediaType, Name, ProofOfReserves, RicardianContract, Ticker, - }, - Allocation, Amount, ContractId, GlobalStateType, KnownState, Layer1, Operation, - OutputAssignment, OwnedFraction, Precision, Schema, TokenIndex, TxoSeal, XChain, -}; -pub use rstest::rstest; -pub use schemata::{CollectibleFungibleAsset, NonInflatableAsset, UniqueDigitalAsset}; -pub use serial_test::serial; -pub use strict_encoding::{fname, tn, FieldName, StrictSerialize, TypeName}; -pub use strict_types::{StrictVal, TypeSystem}; -pub use strum::IntoEnumIterator; -pub use strum_macros::EnumIter; -pub use time::OffsetDateTime; +#[derive(Debug, Copy, Clone, PartialEq, Eq, Display)] +#[display(lowercase)] +pub enum DescriptorType { + Wpkh, + Tr, +} -pub use crate::utils::{chain::*, helpers::*}; +#[derive(Debug, Copy, Clone, PartialEq, Eq, Display)] +#[display(lowercase)] +pub enum AssetSchema { + Nia, + Uda, + Cfa, +} diff --git a/tests/utils/report.rs b/tests/utils/report.rs new file mode 100644 index 0000000..d6f97bb --- /dev/null +++ b/tests/utils/report.rs @@ -0,0 +1,38 @@ +use std::fs::OpenOptions; +use std::io::Write; +use std::path::PathBuf; +use std::time::Duration; + +pub struct Report { + pub report_path: PathBuf, +} + +impl Report { + pub fn write_header(&self, fields: &[&str]) { + let mut file = std::fs::File::options() + .read(true) + .write(true) + .create_new(true) + .open(&self.report_path) + .unwrap(); + file.write_all(format!("{}\n", fields.join(";")).as_bytes()) + .unwrap(); + } + + pub fn write_duration(&self, duration: Duration) { + let mut file = OpenOptions::new() + .append(true) + .open(&self.report_path) + .unwrap(); + file.write_all(format!("{};", duration.as_millis()).as_bytes()) + .unwrap(); + } + + pub fn end_line(&self) { + let mut file = OpenOptions::new() + .append(true) + .open(&self.report_path) + .unwrap(); + file.write_all("\n".as_bytes()).unwrap(); + } +} diff --git a/tests/utils/runtime.rs b/tests/utils/runtime.rs new file mode 100644 index 0000000..75a5464 --- /dev/null +++ b/tests/utils/runtime.rs @@ -0,0 +1,368 @@ +use std::ops::{Deref, DerefMut}; +use std::path::{Path, PathBuf}; +use std::str::FromStr; +use std::sync::atomic::{AtomicU32, Ordering}; +use std::sync::OnceLock; +use std::time::Instant; + +use bpstd::psbt::{PsbtConstructor, TxParams}; +use bpstd::signers::TestnetSigner; +use bpstd::{ + h, Address, HardenedIndex, Keychain, Network, Psbt, Sats, Tx, Txid, Vout, Wpkh, XprivAccount, + XpubDerivable, +}; +use bpwallet::fs::FsTextStore; +use bpwallet::AnyIndexer; +use rand::RngCore; +use rgb::invoice::{RgbBeneficiary, RgbInvoice}; +use rgb::popls::bp::file::{BpDirMound, DirBarrow}; +use rgb::{ + Assignment, CodexId, Consensus, ContractId, CreateParams, EitherSeal, NamedState, Outpoint, + StateAtom, +}; +use rgbp::descriptor::RgbDescr; +use rgbp::{CoinselectStrategy, RgbDirRuntime, RgbWallet}; +use strict_types::{svenum, svnum, svstr, tn, vname, StrictVal}; + +use crate::utils::chain::{ + broadcast_tx, fund_wallet, get_indexer, indexer_url, is_tx_mined, mine_custom, INSTANCE_1, +}; +use crate::utils::report::Report; +use crate::utils::{AssetSchema, DescriptorType, DEFAULT_FEE_ABS}; + +pub struct TestRuntime { + rt: RgbDirRuntime, + signer: TestnetSigner, + instance: u8, +} + +impl Deref for TestRuntime { + type Target = RgbDirRuntime; + fn deref(&self) -> &Self::Target { &self.rt } +} +impl DerefMut for TestRuntime { + fn deref_mut(&mut self) -> &mut Self::Target { &mut self.rt } +} + +impl TestRuntime { + pub fn new(descriptor_type: &DescriptorType) -> Self { Self::with(descriptor_type, INSTANCE_1) } + + pub fn with(descriptor_type: &DescriptorType, instance: u8) -> Self { + let mut seed = vec![0u8; 128]; + rand::rng().fill_bytes(&mut seed); + + let xpriv_account = XprivAccount::with_seed(true, &seed).derive(h![86, 1, 0]); + + let fingerprint = xpriv_account.account_fp().to_string(); + let wallet_dir = PathBuf::from("tests").join("test-data").join(fingerprint); + + Self::_init(descriptor_type, wallet_dir, xpriv_account, instance) + } + + fn _init( + descriptor_type: &DescriptorType, + wallet_dir: PathBuf, + account: XprivAccount, + instance: u8, + ) -> Self { + std::fs::create_dir_all(&wallet_dir).unwrap(); + println!("wallet dir: {wallet_dir:?}"); + + let xpub = account.to_xpub_account(); + let xpub = XpubDerivable::with(xpub, &[Keychain::OUTER, Keychain::INNER]); + let signer = TestnetSigner::new(account); + + let mut mound = BpDirMound::load_testnet(Consensus::Bitcoin, &wallet_dir, true); + mound + .load_issuer("tests/fixtures/NonInflatableAsset.issuer") + .unwrap(); + mound + .load_issuer("tests/fixtures/CollectibleFungibleAsset.issuer") + .unwrap(); + + let provider = FsTextStore::new(wallet_dir).expect("Broken directory structure"); + let noise = xpub.xpub().chain_code().to_byte_array(); + let descr = match descriptor_type { + DescriptorType::Wpkh => RgbDescr::new_unfunded(Wpkh::from(xpub), noise), + DescriptorType::Tr => RgbDescr::key_only_unfunded(xpub, noise), + }; + let wallet = RgbWallet::create(provider, descr, Network::Regtest, true).unwrap(); + let rt = RgbDirRuntime::from(DirBarrow::with(wallet, mound)); + + let mut me = Self { rt, signer, instance }; + me.sync(); + me + } + + pub fn get_address(&self) -> Address { + self.wallet + .addresses(Keychain::OUTER) + .next() + .expect("no addresses left") + .addr + } + + pub fn get_utxo(&mut self, sats: Option) -> Outpoint { + let address = self.get_address(); + let txid = Txid::from_str(&fund_wallet(address.to_string(), sats, self.instance)).unwrap(); + self.sync(); + let mut vout = None; + let coins = self.wallet.address_coins(); + assert!(!coins.is_empty()); + for (_derived_addr, utxos) in coins { + for utxo in utxos { + if utxo.outpoint.txid == txid { + vout = Some(utxo.outpoint.vout_u32()); + } + } + } + Outpoint { txid, vout: Vout::from_u32(vout.unwrap()) } + } + + pub fn issue_nia(&mut self, name: &str, issued_supply: u64, outpoint: Outpoint) -> ContractId { + let params = CreateParams { + codex_id: CodexId::from_str( + "qaeakTdk-FccgZC9-4yYpoHa-quPSbQL-XmyBxtn-2CpD~38#jackson-couple-oberon", + ) + .unwrap(), + consensus: Consensus::Bitcoin, + testnet: true, + method: vname!("issue"), + name: tn!("NIA"), + timestamp: None, + global: vec![ + // TODO: simplify API for named state creation + NamedState { + name: vname!("name"), + state: StateAtom { verified: svstr!(name), unverified: None }, + }, + NamedState { + name: vname!("ticker"), + state: StateAtom { verified: svstr!("NIA"), unverified: None }, + }, + NamedState { + name: vname!("precision"), + state: StateAtom { verified: svenum!(centiMilli), unverified: None }, + }, + NamedState { + name: vname!("circulating"), + state: StateAtom { verified: svnum!(issued_supply), unverified: None }, + }, + ], + owned: vec![NamedState { + name: vname!("owned"), + state: Assignment { seal: EitherSeal::Alt(outpoint), data: svnum!(issued_supply) }, + }], + }; + self.rt.issue_to_file(params).unwrap() + } + + pub fn issue_cfa(&mut self, name: &str, issued_supply: u64, outpoint: Outpoint) -> ContractId { + let params = CreateParams { + codex_id: CodexId::from_str( + "6bl9LdZ_-BU8Skh9-f~4UazR-TFwyotq-ac4yebi-zodXJnw#weather-motif-patriot", + ) + .unwrap(), + consensus: Consensus::Bitcoin, + testnet: true, + method: vname!("issue"), + name: tn!("CFA"), + timestamp: None, + global: vec![ + // TODO: simplify API for named state creation + NamedState { + name: vname!("name"), + state: StateAtom { verified: svstr!(name), unverified: None }, + }, + NamedState { + name: vname!("details"), + state: StateAtom { + verified: StrictVal::Unit, + unverified: Some(svstr!("Demo CFA asset")), + }, + }, + NamedState { + name: vname!("precision"), + state: StateAtom { verified: svenum!(centiMilli), unverified: None }, + }, + NamedState { + name: vname!("circulating"), + state: StateAtom { verified: svnum!(issued_supply), unverified: None }, + }, + ], + owned: vec![NamedState { + name: vname!("owned"), + state: Assignment { seal: EitherSeal::Alt(outpoint), data: svnum!(issued_supply) }, + }], + }; + self.rt.issue_to_file(params).unwrap() + } + + pub fn invoice( + &mut self, + contract_id: ContractId, + amount: u64, + wout: bool, + ) -> RgbInvoice { + let beneficiary = if wout { + let wout = self.rt.wout(None); + RgbBeneficiary::WitnessOut(wout) + } else { + let auth = self.rt.auth_token(None).unwrap(); + RgbBeneficiary::Token(auth) + }; + let value = StrictVal::num(amount); + RgbInvoice::new(contract_id, beneficiary, Some(value)) + } + + pub fn send( + &mut self, + recv_wlt: &mut TestRuntime, + wout: bool, + contract_id: ContractId, + amount: u64, + sats: u64, + report: Option<&Report>, + ) -> (PathBuf, Tx) { + let invoice = recv_wlt.invoice(contract_id, amount, wout); + self.send_to_invoice(recv_wlt, invoice, Some(sats), None, report) + } + + pub fn send_to_invoice( + &mut self, + recv_wlt: &mut TestRuntime, + invoice: RgbInvoice, + sats: Option, + fee: Option, + report: Option<&Report>, + ) -> (PathBuf, Tx) { + let (consignment, tx) = self.transfer(invoice, sats, fee, true, report); + self.mine_tx(tx.txid(), false); + recv_wlt.accept_transfer(&consignment, report); + self.sync(); + (consignment, tx) + } + + pub fn transfer( + &mut self, + invoice: RgbInvoice, + sats: Option, + fee: Option, + broadcast: bool, + report: Option<&Report>, + ) -> (PathBuf, Tx) { + static COUNTER: OnceLock = OnceLock::new(); + + let counter = COUNTER.get_or_init(|| AtomicU32::new(0)); + counter.fetch_add(1, Ordering::SeqCst); + let consignment_no = counter.load(Ordering::SeqCst); + + self.sync(); + + let fee = Sats::from_sats(fee.unwrap_or(DEFAULT_FEE_ABS)); + let sats = Sats::from_sats(sats.unwrap_or(2000)); + let strategy = CoinselectStrategy::Aggregate; + let pay_start = Instant::now(); + let params = TxParams::with(fee); + let (mut psbt, terminal) = self + .pay_invoice(&invoice, strategy, params, Some(sats)) + .unwrap(); + + let pay_duration = pay_start.elapsed(); + if let Some(report) = report { + report.write_duration(pay_duration); + } + + let tx = self.sign_finalize_extract(&mut psbt); + + println!("transfer txid: {}, consignment: {consignment_no}", tx.txid()); + + if broadcast { + self.broadcast_tx(&tx); + } + + let consignment = PathBuf::new() + .join("tests") + .join("test-data") + .join(format!("consignment-{consignment_no}")) + .with_extension("rgb"); + self.mound + .consign_to_file(invoice.scope, [terminal], &consignment) + .unwrap(); + + (consignment, tx) + } + + pub fn accept_transfer(&mut self, consignment: &Path, report: Option<&Report>) { + self.sync(); + let accept_start = Instant::now(); + self.consume_from_file(consignment).unwrap(); + let accept_duration = accept_start.elapsed(); + if let Some(report) = report { + report.write_duration(accept_duration); + } + } + + pub fn check_allocations( + &mut self, + contract_id: ContractId, + asset_schema: AssetSchema, + mut expected_fungible_allocations: Vec, + nonfungible_allocation: bool, + ) { + match asset_schema { + AssetSchema::Nia | AssetSchema::Cfa => { + let state = self.rt.state_own(Some(contract_id)).next().unwrap().1; + let mut actual_fungible_allocations = state + .owned + .get("owned") + .unwrap() + .iter() + .map(|(_, assignment)| assignment.data.unwrap_num().unwrap_uint::()) + .collect::>(); + actual_fungible_allocations.sort(); + expected_fungible_allocations.sort(); + assert_eq!(actual_fungible_allocations, expected_fungible_allocations); + } + AssetSchema::Uda => { + todo!() + } + } + } + pub fn sync(&mut self) { + let indexer = self.get_indexer(); + self.wallet.update(&indexer).into_result().unwrap(); + } + + pub fn network(&self) -> Network { self.wallet.network() } + + fn get_indexer(&self) -> AnyIndexer { get_indexer(&self.indexer_url()) } + + pub fn indexer_url(&self) -> String { indexer_url(self.instance, self.network()) } + + pub fn sign_finalize(&self, psbt: &mut Psbt) { + let _sig_count = psbt.sign(&self.signer).unwrap(); + psbt.finalize(self.wallet.descriptor()); + } + + pub fn sign_finalize_extract(&self, psbt: &mut Psbt) -> Tx { + self.sign_finalize(psbt); + psbt.extract().unwrap() + } + + pub fn mine_tx(&self, txid: Txid, resume: bool) { + let mut attempts = 10; + loop { + mine_custom(resume, self.instance, 1); + if is_tx_mined(txid, &self.get_indexer()) { + break; + } + attempts -= 1; + if attempts == 0 { + panic!("TX is not getting mined"); + } + } + } + + pub fn broadcast_tx(&self, tx: &Tx) { broadcast_tx(tx, &self.indexer_url()); } +} diff --git a/tests/validation.rs b/tests/validation.rs deleted file mode 100644 index 6049d92..0000000 --- a/tests/validation.rs +++ /dev/null @@ -1,401 +0,0 @@ -pub mod utils; - -use utils::*; - -enum MockResolvePubWitness { - Success(Tx), - Error(WitnessResolverError), -} - -enum MockResolvePubWitnessOrd { - Success(WitnessOrd), - Error(WitnessResolverError), -} - -struct MockResolver { - pub_witnesses: HashMap, - pub_witness_ords: HashMap, -} - -impl ResolveWitness for MockResolver { - fn resolve_pub_witness( - &self, - witness_id: XWitnessId, - ) -> Result { - if let Some(res) = self.pub_witnesses.get(&witness_id) { - match res { - MockResolvePubWitness::Success(tx) => Ok(XChain::Bitcoin(tx.clone())), - MockResolvePubWitness::Error(err) => Err(err.clone()), - } - } else { - Err(WitnessResolverError::Unknown(witness_id)) - } - } - - fn resolve_pub_witness_ord( - &self, - witness_id: XWitnessId, - ) -> Result { - if let Some(res) = self.pub_witness_ords.get(&witness_id) { - match res { - MockResolvePubWitnessOrd::Success(witness_ord) => Ok(*witness_ord), - MockResolvePubWitnessOrd::Error(err) => Err(err.clone()), - } - } else { - Err(WitnessResolverError::Unknown(witness_id)) - } - } -} - -#[derive(Debug, EnumIter, Copy, Clone, PartialEq)] -enum Scenario { - A, - B, -} - -impl fmt::Display for Scenario { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - write!(f, "{:?}", self) - } -} - -impl Scenario { - fn resolver(&self) -> MockResolver { - match self { - Self::A => { - let (tx_1, witness_id_1) = - get_tx("bc:a5c3085efe8dfdba0fa0e11d81bf90cdcac27c0af496c4de1a2fd9659948ffce"); - let (tx_2, witness_id_2) = - get_tx("bc:d077ea7e3a55a215893a18e82cb03fda0f50619893e4aee0ba70b014e6d63248"); - let (tx_3, witness_id_3) = - get_tx("bc:3652d9fea802cb051f671455cbd7472e3bce2c440a4e54fa4321107037dfaff0"); - MockResolver { - pub_witnesses: map![ - witness_id_1 => MockResolvePubWitness::Success(tx_1), - witness_id_2 => MockResolvePubWitness::Success(tx_2), - witness_id_3 => MockResolvePubWitness::Success(tx_3), - ], - pub_witness_ords: map![ - witness_id_1 => MockResolvePubWitnessOrd::Success(WitnessOrd::Mined(WitnessPos::bitcoin(NonZeroU32::new(106).unwrap(), 1726062111).unwrap())), - witness_id_2 => MockResolvePubWitnessOrd::Success(WitnessOrd::Mined(WitnessPos::bitcoin(NonZeroU32::new(108).unwrap(), 1726062111).unwrap())), - witness_id_3 => MockResolvePubWitnessOrd::Success(WitnessOrd::Mined(WitnessPos::bitcoin(NonZeroU32::new(110).unwrap(), 1726062112).unwrap())), - ], - } - } - Self::B => { - let (tx_1, witness_id_1) = - get_tx("bc:c269055b7750a234087c11acd7a408172cb84d8fc6af0ded42d8a8cbea6712e9"); - let (tx_2, witness_id_2) = - get_tx("bc:d84c37b6c6616184c454c815d970505bed9b3a3723a4445dd1289dc708bc80b3"); - let (tx_3, witness_id_3) = - get_tx("bc:0bc3024ce6404cd7aea387debde687d9e8731228e16b04b4eefda7283069f1c3"); - MockResolver { - pub_witnesses: map![ - witness_id_1 => MockResolvePubWitness::Success(tx_1), - witness_id_2 => MockResolvePubWitness::Success(tx_2), - witness_id_3 => MockResolvePubWitness::Success(tx_3), - ], - pub_witness_ords: map![ - witness_id_1 => MockResolvePubWitnessOrd::Success(WitnessOrd::Mined(WitnessPos::bitcoin(NonZeroU32::new(105).unwrap(), 1726062423).unwrap())), - witness_id_2 => MockResolvePubWitnessOrd::Success(WitnessOrd::Mined(WitnessPos::bitcoin(NonZeroU32::new(106).unwrap(), 1726062423).unwrap())), - witness_id_3 => MockResolvePubWitnessOrd::Success(WitnessOrd::Mined(WitnessPos::bitcoin(NonZeroU32::new(106).unwrap(), 1726062423).unwrap())), - ], - } - } - } - } -} - -fn get_consignment(scenario: Scenario) -> (Transfer, Vec) { - initialize(); - - let transfer_type = match scenario { - Scenario::A => TransferType::Blinded, - Scenario::B => TransferType::Witness, - }; - - let mut wlt_1 = get_wallet(&DescriptorType::Wpkh); - let mut wlt_2 = get_wallet(&DescriptorType::Wpkh); - - let issued_supply_1 = 999; - let issued_supply_2 = 666; - - let sats = 9000; - - let utxo = wlt_1.get_utxo(None); - let (contract_id_1, iface_type_name_1) = - wlt_1.issue_nia(issued_supply_1, wlt_1.close_method(), Some(&utxo)); - let (contract_id_2, iface_type_name_2) = - wlt_1.issue_nia(issued_supply_2, wlt_1.close_method(), Some(&utxo)); - - let mut txes = vec![]; - - let (_consignment, tx) = wlt_1.send( - &mut wlt_2, - transfer_type, - contract_id_1, - &iface_type_name_1, - 66, - sats, - None, - ); - txes.push(tx); - - // spend asset moved with blank transition - let (_consignment, tx) = wlt_1.send( - &mut wlt_2, - transfer_type, - contract_id_2, - &iface_type_name_2, - 50, - sats, - None, - ); - txes.push(tx); - - // spend change of previous send - let (consignment, tx) = wlt_1.send( - &mut wlt_2, - transfer_type, - contract_id_2, - &iface_type_name_2, - 77, - sats, - None, - ); - txes.push(tx); - - (consignment, txes) -} - -// run once to generate tests/fixtures/consignemnt_.yaml -// for example: -// SCENARIO=B cargo test --test validation validate_consignment_generate -- --ignored --show-output -// -// then copy the generated consignemnt file to tests/fixtures/attack_.yaml -// manually change tests/fixtures/attack_.yaml files to simulate attacks -#[test] -#[ignore = "one-shot"] -fn validate_consignment_generate() { - let scenario = match std::env::var("SCENARIO") { - Ok(val) if val.to_uppercase() == Scenario::A.to_string() => Scenario::A, - Ok(val) if val.to_uppercase() == Scenario::B.to_string() => Scenario::B, - Err(VarError::NotPresent) => Scenario::A, - _ => panic!("invalid scenario"), - }; - let (consignment, txes) = get_consignment(scenario); - println!(); - let cons_path = format!("tests/fixtures/consignment_{scenario}.yaml"); - let yaml = serde_yaml::to_string(&consignment).unwrap(); - std::fs::write(&cons_path, yaml).unwrap(); - println!("written consignment in: {cons_path}"); - for tx in txes { - let txid = tx.txid().to_string(); - let witness_id = XWitnessId::from_str(&txid).unwrap(); - let normalized_witness_id = witness_id.to_string().replace(":", "_"); - let yaml = serde_yaml::to_string(&tx).unwrap(); - let yaml_path = format!("tests/fixtures/{normalized_witness_id}.yaml"); - std::fs::write(&yaml_path, yaml).unwrap(); - println!("written tx: {witness_id}"); - } -} - -fn get_consignment_from_yaml(fname: &str) -> Transfer { - let cons_path = format!("tests/fixtures/{fname}.yaml"); - println!("loading {cons_path}"); - let file = std::fs::File::open(cons_path).unwrap(); - let consignment: Transfer = serde_yaml::from_reader(file).unwrap(); - consignment -} - -fn get_tx(witness_id: &str) -> (Tx, XWitnessId) { - let normalized_witness_id = witness_id.replace(":", "_"); - let yaml_path = format!("tests/fixtures/{normalized_witness_id}.yaml"); - let file = std::fs::File::open(yaml_path).unwrap(); - let tx: Tx = serde_yaml::from_reader(file).unwrap(); - let xwitness_id = XWitnessId::from_str(witness_id).unwrap(); - (tx, xwitness_id) -} - -#[test] -fn validate_consignment_success() { - for scenario in Scenario::iter() { - let resolver = scenario.resolver(); - let consignment = get_consignment_from_yaml(&format!("consignment_{scenario}")); - let res = consignment.validate(&resolver, true); - assert!(res.is_ok()); - let validation_status = match res { - Ok(validated_consignment) => validated_consignment.validation_status().clone(), - Err((status, _consignment)) => status, - }; - dbg!(&validation_status); - assert!(validation_status.failures.is_empty()); - assert!(validation_status.warnings.is_empty()); - assert!(validation_status.info.is_empty()); - let validity = validation_status.validity(); - assert_eq!(validity, Validity::Valid); - } -} - -#[test] -fn validate_consignment_chain_fail() { - let resolver = Scenario::A.resolver(); - - // liquid - let consignment = get_consignment_from_yaml("attack_chain"); - let res = consignment.validate(&resolver, true); - assert!(res.is_err()); - let validation_status = match res { - Ok(validated_consignment) => validated_consignment.validation_status().clone(), - Err((status, _consignment)) => status, - }; - dbg!(&validation_status); - assert!(validation_status.warnings.is_empty()); - assert!(validation_status.info.is_empty()); - let validity = validation_status.validity(); - assert_eq!(validity, Validity::Invalid); -} - -#[test] -fn validate_consignment_genesis_fail() { - let resolver = Scenario::B.resolver(); - - // schema ID: change genesis[schemaId] with CFA schema ID - let consignment = get_consignment_from_yaml("attack_genesis_schema_id"); - let res = consignment.validate(&resolver, true); - assert!(res.is_err()); - let validation_status = match res { - Ok(validated_consignment) => validated_consignment.validation_status().clone(), - Err((status, _consignment)) => status, - }; - dbg!(&validation_status); - assert_eq!(validation_status.failures.len(), 5); - assert!(matches!( - validation_status.failures[0], - Failure::OperationAbsent(_) - )); - assert!(matches!( - validation_status.failures[1], - Failure::MpcInvalid(_, _, _) - )); - assert!(matches!( - validation_status.failures[2], - Failure::BundleExtraTransition(_, _) - )); - assert!(matches!( - validation_status.failures[3], - Failure::MpcInvalid(_, _, _) - )); - assert!(matches!( - validation_status.failures[4], - Failure::MpcInvalid(_, _, _) - )); - assert!(validation_status.warnings.is_empty()); - assert!(validation_status.info.is_empty()); - let validity = validation_status.validity(); - assert_eq!(validity, Validity::Invalid); - - // genesis testnet: change from true to false - let consignment = get_consignment_from_yaml("attack_genesis_testnet"); - let res = consignment.validate(&resolver, true); - assert!(res.is_err()); - let validation_status = match res { - Ok(validated_consignment) => validated_consignment.validation_status().clone(), - Err((status, _consignment)) => status, - }; - dbg!(&validation_status); - assert_eq!(validation_status.failures.len(), 1); - assert!(matches!( - validation_status.failures[0], - Failure::NetworkMismatch(_) - )); - assert!(validation_status.warnings.is_empty()); - assert!(validation_status.info.is_empty()); - let validity = validation_status.validity(); - assert_eq!(validity, Validity::Invalid); -} - -#[test] -fn validate_consignment_bundles_fail() { - let resolver = Scenario::A.resolver(); - - // bundles pubWitness data inputs[0] sequence: change from 0 to 1 - let consignment = get_consignment_from_yaml("attack_bundles_pubWitness_data_input_sequence"); - let res = consignment.validate(&resolver, true); - assert!(res.is_err()); - let validation_status = match res { - Ok(validated_consignment) => validated_consignment.validation_status().clone(), - Err((status, _consignment)) => status, - }; - dbg!(&validation_status); - assert_eq!(validation_status.failures.len(), 3); - assert!(matches!( - validation_status.failures[0], - Failure::SealsInvalid(_, _, _) - )); - assert!(matches!( - validation_status.failures[1], - Failure::BundleInvalidCommitment(_, _, _, _) - )); - assert!(matches!( - validation_status.failures[2], - Failure::SealNoPubWitness(_, _, _) - )); - assert!(validation_status.warnings.is_empty()); - assert!(validation_status.info.is_empty()); - let validity = validation_status.validity(); - assert_eq!(validity, Validity::Invalid); -} - -#[test] -fn validate_consignment_resolver_error() { - let scenario = Scenario::A; - let mut resolver = scenario.resolver(); - let txid = - Txid::from_str("d077ea7e3a55a215893a18e82cb03fda0f50619893e4aee0ba70b014e6d63248").unwrap(); - let xwitness_id = XChain::Bitcoin(txid); - - // resolve_pub_witness error - *resolver.pub_witnesses.get_mut(&xwitness_id).unwrap() = MockResolvePubWitness::Error( - WitnessResolverError::Other(xwitness_id, s!("unexpected error")), - ); - let consignment = get_consignment_from_yaml("attack_resolver_error"); - let res = consignment.validate(&resolver, true); - assert!(res.is_err()); - let validation_status = match res { - Ok(validated_consignment) => validated_consignment.validation_status().clone(), - Err((status, _consignment)) => status, - }; - dbg!(&validation_status); - assert_eq!(validation_status.failures.len(), 1); - assert!(matches!( - validation_status.failures[0], - Failure::SealNoPubWitness(_, _, _) - )); - assert!(validation_status.warnings.is_empty()); - assert!(validation_status.info.is_empty()); - let validity = validation_status.validity(); - assert_eq!(validity, Validity::Invalid); - - // resolve_pub_witness_ord error - *resolver.pub_witness_ords.get_mut(&xwitness_id).unwrap() = MockResolvePubWitnessOrd::Error( - WitnessResolverError::Other(xwitness_id, s!("unexpected error")), - ); - let consignment = get_consignment_from_yaml("attack_resolver_error"); - let res = consignment.validate(&resolver, true); - assert!(res.is_err()); - let validation_status = match res { - Ok(validated_consignment) => validated_consignment.validation_status().clone(), - Err((status, _consignment)) => status, - }; - dbg!(&validation_status); - assert_eq!(validation_status.failures.len(), 1); - assert!(matches!( - validation_status.failures[0], - Failure::SealNoPubWitness(_, _, _) - )); - assert!(validation_status.warnings.is_empty()); - assert!(validation_status.info.is_empty()); - let validity = validation_status.validity(); - assert_eq!(validity, Validity::Invalid); -} diff --git a/ultrasonic b/ultrasonic new file mode 160000 index 0000000..4bd48cf --- /dev/null +++ b/ultrasonic @@ -0,0 +1 @@ +Subproject commit 4bd48cf423fc344aa8a137cf42f9cc562fdde510 diff --git a/zk-aluvm b/zk-aluvm new file mode 160000 index 0000000..c3bb703 --- /dev/null +++ b/zk-aluvm @@ -0,0 +1 @@ +Subproject commit c3bb7030c993b76640949b9ce3ef29d384abb8e4