From ff79ad0ddfde7794487d06ae6707617c8f663ad9 Mon Sep 17 00:00:00 2001 From: driemworks Date: Mon, 9 Sep 2024 21:40:49 -0500 Subject: [PATCH 01/20] WIP: separate into core and cli modules --- Cargo.lock | 4114 ++++------------- Cargo.toml | 157 +- README.md | 34 +- artifacts/metadata.scale | Bin 74340 -> 0 bytes cli/Cargo.toml | 45 + cli/artifacts/metadata.scale | Bin 0 -> 618943 bytes .../generate_metadata.sh | 0 src/main.rs => cli/src/_main copy.rs | 0 cli/src/main.rs | 260 ++ core/Cargo.toml | 54 + core/README.md | 3 + core/src/lib.rs | 4 + core/src/murmur.rs | 258 ++ {src => core/src}/otp.rs | 3 +- core/src/types.rs | 38 + mmr_store | Bin 6556 -> 68 bytes 16 files changed, 1773 insertions(+), 3197 deletions(-) create mode 100644 cli/Cargo.toml create mode 100644 cli/artifacts/metadata.scale rename generate_metadata.sh => cli/generate_metadata.sh (100%) rename src/main.rs => cli/src/_main copy.rs (100%) create mode 100644 cli/src/main.rs create mode 100644 core/Cargo.toml create mode 100644 core/README.md create mode 100644 core/src/lib.rs create mode 100644 core/src/murmur.rs rename {src => core/src}/otp.rs (95%) create mode 100644 core/src/types.rs diff --git a/Cargo.lock b/Cargo.lock index 1e7e5ee..046e0c6 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -12,22 +12,13 @@ dependencies = [ "regex", ] -[[package]] -name = "addr2line" -version = "0.19.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a76fd60b23679b7d19bd066031410fb7e458ccc5e958eb5c325888ce4baedc97" -dependencies = [ - "gimli 0.27.3", -] - [[package]] name = "addr2line" version = "0.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb" dependencies = [ - "gimli 0.28.1", + "gimli", ] [[package]] @@ -43,7 +34,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d122413f284cf2d62fb1b7db97e02edb8cda96d769b16e443a4f6195e35662b0" dependencies = [ "crypto-common", - "generic-array 0.14.7", + "generic-array", ] [[package]] @@ -71,17 +62,6 @@ dependencies = [ "subtle", ] -[[package]] -name = "ahash" -version = "0.7.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "891477e0c6a8957309ee5c45a6368af3ae14bb510732d2684ffa19af310920f9" -dependencies = [ - "getrandom 0.2.12", - "once_cell", - "version_check", -] - [[package]] name = "ahash" version = "0.8.11" @@ -89,7 +69,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" dependencies = [ "cfg-if", - "getrandom 0.2.12", + "getrandom", "once_cell", "version_check", "zerocopy", @@ -97,42 +77,18 @@ dependencies = [ [[package]] name = "aho-corasick" -version = "1.1.2" +version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2969dcb958b36655471fc61f7e416fa76033bdd4bfed0678d8fee1e2d07a1f0" +checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" dependencies = [ "memchr", ] [[package]] name = "allocator-api2" -version = "0.2.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0942ffc6dcaadf03badf6e6a2d0228460359d5e34b57ccdc720b7382dfbd5ec5" - -[[package]] -name = "android-tzdata" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" - -[[package]] -name = "android_system_properties" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" -dependencies = [ - "libc", -] - -[[package]] -name = "ansi_term" -version = "0.12.1" +version = "0.2.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d52a9bb7ec0cf484c551830a7ce27bd20d67eac647e1befb56b0be4ee39a55d2" -dependencies = [ - "winapi", -] +checksum = "5c6cb57a04249c6480766f7f7cef5467412af1490f8d1e243141daddada3264f" [[package]] name = "anstream" @@ -184,31 +140,22 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.80" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ad32ce52e4161730f7098c077cd2ed6229b5804ccf99e5366be1ab72a98b4e1" - -[[package]] -name = "approx" -version = "0.5.1" +version = "1.0.82" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cab112f0a86d568ea0e627cc1d6be74a1e9cd55214684db5561995f6dad897c6" -dependencies = [ - "num-traits", -] +checksum = "f538837af36e6f6a9be0faa67f9a314f8119e4e4b5867c6ab40ed60360142519" [[package]] name = "aquamarine" -version = "0.3.3" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1da02abba9f9063d786eab1509833ebb2fac0f966862ca59439c76b9c566760" +checksum = "21cc1548309245035eb18aa7f0967da6bc65587005170c56e6ef2788a4cf3f4e" dependencies = [ "include_dir", "itertools 0.10.5", "proc-macro-error", "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.60", ] [[package]] @@ -285,24 +232,6 @@ dependencies = [ "ark-std", ] -[[package]] -name = "ark-crypto-primitives" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f3a13b34da09176a8baba701233fdffbaa7c1b1192ce031a3da4e55ce1f1a56" -dependencies = [ - "ark-ec", - "ark-ff", - "ark-relations", - "ark-serialize", - "ark-snark", - "ark-std", - "blake2", - "derivative", - "digest 0.10.7", - "sha2 0.10.8", -] - [[package]] name = "ark-ec" version = "0.4.2" @@ -384,10 +313,10 @@ dependencies = [ "derivative", "digest 0.10.7", "itertools 0.10.5", - "num-bigint 0.4.4", + "num-bigint", "num-traits", "paste", - "rustc_version 0.4.0", + "rustc_version", "zeroize", ] @@ -407,7 +336,7 @@ version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7abe79b0e4288889c4574159ab790824d0033b9fdcb2a112a3182fac2e514565" dependencies = [ - "num-bigint 0.4.4", + "num-bigint", "num-traits", "proc-macro2", "quote", @@ -440,31 +369,6 @@ dependencies = [ "hashbrown 0.13.2", ] -[[package]] -name = "ark-relations" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00796b6efc05a3f48225e59cb6a2cda78881e7c390872d5786aaf112f31fb4f0" -dependencies = [ - "ark-ff", - "ark-std", - "tracing", -] - -[[package]] -name = "ark-scale" -version = "0.0.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51bd73bb6ddb72630987d37fa963e99196896c0d0ea81b7c894567e74a2f83af" -dependencies = [ - "ark-ec", - "ark-ff", - "ark-serialize", - "ark-std", - "parity-scale-codec", - "scale-info", -] - [[package]] name = "ark-scale" version = "0.0.12" @@ -482,7 +386,7 @@ dependencies = [ [[package]] name = "ark-secret-scalar" version = "0.0.2" -source = "git+https://github.com/w3f/ring-vrf?rev=cbc342e#cbc342e95d3cbcd3c5ba8d45af7200eb58e63502" +source = "git+https://github.com/w3f/ring-vrf?rev=e9782f9#e9782f938629c90f3adb3fff2358bc8d1386af3e" dependencies = [ "ark-ec", "ark-ff", @@ -490,7 +394,7 @@ dependencies = [ "ark-std", "ark-transcript", "digest 0.10.7", - "rand_core 0.6.4", + "getrandom_or_panic", "zeroize", ] @@ -503,7 +407,7 @@ dependencies = [ "ark-serialize-derive", "ark-std", "digest 0.10.7", - "num-bigint 0.4.4", + "num-bigint", ] [[package]] @@ -517,18 +421,6 @@ dependencies = [ "syn 1.0.109", ] -[[package]] -name = "ark-snark" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84d3cc6833a335bb8a600241889ead68ee89a3cf8448081fb7694c0fe503da63" -dependencies = [ - "ark-ff", - "ark-relations", - "ark-serialize", - "ark-std", -] - [[package]] name = "ark-std" version = "0.4.0" @@ -536,29 +428,23 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94893f1e0c6eeab764ade8dc4c0db24caf4fe7cbbaafc0eba0a9030f447b5185" dependencies = [ "num-traits", - "rand 0.8.5", + "rand", "rayon", ] [[package]] name = "ark-transcript" version = "0.0.2" -source = "git+https://github.com/w3f/ring-vrf?rev=cbc342e#cbc342e95d3cbcd3c5ba8d45af7200eb58e63502" +source = "git+https://github.com/w3f/ring-vrf?rev=e9782f9#e9782f938629c90f3adb3fff2358bc8d1386af3e" dependencies = [ "ark-ff", "ark-serialize", "ark-std", "digest 0.10.7", - "rand_core 0.6.4", - "sha3 0.10.8", + "rand_core", + "sha3", ] -[[package]] -name = "array-bytes" -version = "4.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f52f63c5c1316a16a4b35eaac8b76a98248961a533f061684cb2a7cb0eafb6c6" - [[package]] name = "array-bytes" version = "6.2.2" @@ -580,12 +466,6 @@ dependencies = [ "nodrop", ] -[[package]] -name = "arrayvec" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23b62fc65de8e4e7f52534fb52b0f3ed04746ae267519eef2a83941e8085068b" - [[package]] name = "arrayvec" version = "0.7.4" @@ -594,24 +474,23 @@ checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711" [[package]] name = "async-channel" -version = "2.2.0" +version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f28243a43d821d11341ab73c80bed182dc015c514b951616cf79bd4af39af0c3" +checksum = "136d4d23bcc79e27423727b36823d86233aad06dfea531837b038394d11e9928" dependencies = [ "concurrent-queue", - "event-listener 5.2.0", - "event-listener-strategy 0.5.0", + "event-listener 5.3.0", + "event-listener-strategy 0.5.1", "futures-core", "pin-project-lite", ] [[package]] name = "async-executor" -version = "1.8.0" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17ae5ebefcc48e7452b4987947920dac9450be1110cadf34d1b8c116bdbaf97c" +checksum = "b10202063978b3351199d68f8b22c4e47e4b1b822f8d43fd862d5ea8c006b29a" dependencies = [ - "async-lock 3.3.0", "async-task", "concurrent-queue", "fastrand", @@ -625,7 +504,7 @@ version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bc19683171f287921f2405677dd2ed2549c3b3bda697a563ebc3a121ace2aba1" dependencies = [ - "async-lock 3.3.0", + "async-lock", "blocking", "futures-lite", ] @@ -636,28 +515,19 @@ version = "2.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dcccb0f599cfa2f8ace422d3555572f47424da5648a4382a9dd0310ff8210884" dependencies = [ - "async-lock 3.3.0", + "async-lock", "cfg-if", "concurrent-queue", "futures-io", "futures-lite", "parking", "polling", - "rustix 0.38.31", + "rustix", "slab", "tracing", "windows-sys 0.52.0", ] -[[package]] -name = "async-lock" -version = "2.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "287272293e9d8c41773cec55e365490fe034813a2f172f502d6ddcf75b2f582b" -dependencies = [ - "event-listener 2.5.3", -] - [[package]] name = "async-lock" version = "3.3.0" @@ -682,38 +552,40 @@ dependencies = [ [[package]] name = "async-process" -version = "2.1.0" +version = "2.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "451e3cf68011bd56771c79db04a9e333095ab6349f7e47592b788e9b98720cc8" +checksum = "a53fc6301894e04a92cb2584fedde80cb25ba8e02d9dc39d4a87d036e22f397d" dependencies = [ "async-channel", "async-io", - "async-lock 3.3.0", + "async-lock", "async-signal", + "async-task", "blocking", "cfg-if", - "event-listener 5.2.0", + "event-listener 5.3.0", "futures-lite", - "rustix 0.38.31", + "rustix", + "tracing", "windows-sys 0.52.0", ] [[package]] name = "async-signal" -version = "0.2.5" +version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e47d90f65a225c4527103a8d747001fc56e375203592b25ad103e1ca13124c5" +checksum = "afe66191c335039c7bb78f99dc7520b0cbb166b3a1cb33a03f53d8a1c6f2afda" dependencies = [ "async-io", - "async-lock 2.8.0", + "async-lock", "atomic-waker", "cfg-if", "futures-core", "futures-io", - "rustix 0.38.31", + "rustix", "signal-hook-registry", "slab", - "windows-sys 0.48.0", + "windows-sys 0.52.0", ] [[package]] @@ -724,13 +596,13 @@ checksum = "fbb36e985947064623dbd357f727af08ffd077f93d696782f3c56365fa2e2799" [[package]] name = "async-trait" -version = "0.1.77" +version = "0.1.80" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c980ee35e870bd1a4d2c8294d4c04d0499e67bca1e4b5cefcc693c2fa00caea9" +checksum = "c6fa2087f2753a7da8cc1c0dbfcf89579dd57458e36769de5ac750b4671737ca" dependencies = [ "proc-macro2", "quote", - "syn 2.0.52", + "syn 2.0.60", ] [[package]] @@ -747,38 +619,29 @@ checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" [[package]] name = "autocfg" -version = "0.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0dde43e75fd43e8a1bf86103336bc699aa8d17ad1be60c76c0bdfd4828e19b78" -dependencies = [ - "autocfg 1.1.0", -] - -[[package]] -name = "autocfg" -version = "1.1.0" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" +checksum = "f1fdabc7756949593fe60f30ec81974b613357de856987752631dea1e3394c80" [[package]] name = "backtrace" -version = "0.3.69" +version = "0.3.71" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2089b7e3f35b9dd2d0ed921ead4f6d318c27680d4a5bd167b3ee120edb105837" +checksum = "26b05800d2e817c8b3b4b54abd461726265fa9789ae34330622f2db9ee696f9d" dependencies = [ - "addr2line 0.21.0", + "addr2line", "cc", "cfg-if", "libc", "miniz_oxide", - "object 0.32.2", + "object", "rustc-demangle", ] [[package]] name = "bandersnatch_vrfs" -version = "0.0.3" -source = "git+https://github.com/w3f/ring-vrf?rev=cbc342e#cbc342e95d3cbcd3c5ba8d45af7200eb58e63502" +version = "0.0.4" +source = "git+https://github.com/w3f/ring-vrf?rev=e9782f9#e9782f938629c90f3adb3fff2358bc8d1386af3e" dependencies = [ "ark-bls12-381", "ark-ec", @@ -788,9 +651,9 @@ dependencies = [ "ark-std", "dleq_vrf", "fflonk", - "merlin 3.0.0", - "rand_chacha 0.3.1", - "rand_core 0.6.4", + "merlin", + "rand_chacha", + "rand_core", "ring 0.1.0", "sha2 0.10.8", "sp-ark-bls12-381", @@ -798,12 +661,6 @@ dependencies = [ "zeroize", ] -[[package]] -name = "base16ct" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "349a06037c7bf932dd7e7d1f653678b2038b9ad46a74102f1fc7bd7872678cce" - [[package]] name = "base16ct" version = "0.2.0" @@ -834,6 +691,12 @@ version = "0.21.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" +[[package]] +name = "base64" +version = "0.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9475866fec1451be56a3c2400fd081ff546538961565ccb5b7142cbd22bc7a51" + [[package]] name = "base64ct" version = "1.6.0" @@ -849,34 +712,39 @@ dependencies = [ "serde", ] -[[package]] -name = "bincode" -version = "1.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad" -dependencies = [ - "serde", -] - [[package]] name = "bip39" version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "93f2635620bf0b9d4576eb7bb9a38a55df78bd1205d26fa994b25911a69f212f" dependencies = [ - "bitcoin_hashes", - "rand 0.8.5", - "rand_core 0.6.4", + "bitcoin_hashes 0.11.0", "serde", "unicode-normalization", ] +[[package]] +name = "bitcoin-internals" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9425c3bf7089c983facbae04de54513cce73b41c7f9ff8c845b54e7bc64ebbfb" + [[package]] name = "bitcoin_hashes" version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "90064b8dee6815a6470d60bad07bbbaee885c0e12d04177138fa3291a01b7bc4" +[[package]] +name = "bitcoin_hashes" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1930a4dabfebb8d7d9992db18ebe3ae2876f0a305fab206fd168df931ede293b" +dependencies = [ + "bitcoin-internals", + "hex-conservative", +] + [[package]] name = "bitflags" version = "1.3.2" @@ -885,9 +753,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.4.2" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed570934406eb16438a4e976b1b4500774099c13b8cb96eec99f620f05090ddf" +checksum = "cf4b9d6a944f767f8e5e0db018570623c85f3d925ac718db4e06d0187adb21c1" [[package]] name = "bitvec" @@ -931,26 +799,13 @@ dependencies = [ "constant_time_eq 0.3.0", ] -[[package]] -name = "block-buffer" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0940dc441f31689269e10ac70eb1002a3a1d3ad1390e030043662eb7fe4688b" -dependencies = [ - "block-padding 0.1.5", - "byte-tools", - "byteorder 1.5.0 (registry+https://github.com/rust-lang/crates.io-index)", - "generic-array 0.12.4", -] - [[package]] name = "block-buffer" version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" dependencies = [ - "block-padding 0.2.1", - "generic-array 0.14.7", + "generic-array", ] [[package]] @@ -959,24 +814,9 @@ version = "0.10.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" dependencies = [ - "generic-array 0.14.7", -] - -[[package]] -name = "block-padding" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa79dedbb091f449f1f39e53edf88d5dbe95f895dae6135a8d7b881fb5af73f5" -dependencies = [ - "byte-tools", + "generic-array", ] -[[package]] -name = "block-padding" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d696c370c750c948ada61c69a0ee2cbbb9c50b1019ddb86d9317157a99c2cae" - [[package]] name = "blocking" version = "1.5.1" @@ -984,7 +824,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a37913e8dc4ddcc604f0c6d3bf2887c995153af3611de9e23c352b44c1b9118" dependencies = [ "async-channel", - "async-lock 3.3.0", + "async-lock", "async-task", "fastrand", "futures-io", @@ -995,9 +835,9 @@ dependencies = [ [[package]] name = "bounded-collections" -version = "0.1.9" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca548b6163b872067dc5eb82fd130c56881435e30367d2073594a3d9744120dd" +checksum = "d32385ecb91a31bddaf908e8dcf4a15aef1bcd3913cc03ebfad02ff6d568abc1" dependencies = [ "log", "parity-scale-codec", @@ -1007,27 +847,18 @@ dependencies = [ [[package]] name = "bs58" -version = "0.5.0" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f5353f36341f7451062466f0b755b96ac3a9547e4d7f6b70d603fc721a7d7896" +checksum = "bf88ba1141d185c399bee5288d850d63b8369520c1eafc32a0430b5b6c287bf4" dependencies = [ "tinyvec", ] -[[package]] -name = "build-helper" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bdce191bf3fa4995ce948c8c83b4640a1745457a149e73c6db75b4ffe36aad5f" -dependencies = [ - "semver 0.6.0", -] - [[package]] name = "bumpalo" -version = "3.15.4" +version = "3.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ff69b9dd49fd426c69a0db9fc04dd934cdb6645ff000864d98f7e2af8830eaa" +checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" [[package]] name = "byte-slice-cast" @@ -1035,85 +866,29 @@ version = "1.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c3ac9f8b63eca6fd385229b3675f6cc0dc5c8a5c8a54a59d4f52ffd670d87b0c" -[[package]] -name = "byte-tools" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3b5ca7a04898ad4bcd41c90c5285445ff5b791899bb1b0abdd2a2aa791211d7" - -[[package]] -name = "bytemuck" -version = "1.14.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2ef034f05691a48569bd920a96c81b9d91bbad1ab5ac7c4616c1f6ef36cb79f" - [[package]] name = "byteorder" version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" -[[package]] -name = "byteorder" -version = "1.5.0" -source = "git+https://github.com/ideal-lab5/byteorder#50d1e9cd4e922a8f1ff0d81dacce44e217352dbd" -dependencies = [ - "core2", -] - [[package]] name = "bytes" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2bd12c1caf447e69cd4528f47f94d203fd2582878ecb9e9465484c4148a8223" - -[[package]] -name = "camino" -version = "1.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c59e92b5a388f549b863a7bea62612c09f24c8393560709a54558a9abdfb3b9c" -dependencies = [ - "serde", -] - -[[package]] -name = "cargo-platform" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "694c8807f2ae16faecc43dc17d74b3eb042482789fd0eb64b39a2e04e087053f" -dependencies = [ - "serde", -] - -[[package]] -name = "cargo_metadata" -version = "0.15.4" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eee4243f1f26fc7a42710e7439c149e2b10b05472f88090acce52632f231a73a" -dependencies = [ - "camino", - "cargo-platform", - "semver 1.0.22", - "serde", - "serde_json", - "thiserror", -] +checksum = "514de17de45fdb8dc022b1a7975556c53c86f9f0aa5f534b98977b171857c2c9" [[package]] name = "cc" -version = "1.0.90" +version = "1.0.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8cd6604a82acf3039f1144f54b8eb34e91ffba622051189e71b781822d5ee1f5" -dependencies = [ - "jobserver", - "libc", -] +checksum = "d32a725bc159af97c3e629873bb9f88fb8cf8a4867175f76dc987815ea07c83b" [[package]] name = "cfg-expr" -version = "0.15.7" +version = "0.15.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa50868b64a9a6fda9d593ce778849ea8715cd2a3d2cc17ffdb4a2f2f2f1961d" +checksum = "d067ad48b8650848b989a59a86c6c36a995d02d2bf778d45c3c5d57bc2718f02" dependencies = [ "smallvec", ] @@ -1136,15 +911,16 @@ dependencies = [ ] [[package]] -name = "chrono" -version = "0.4.35" +name = "chacha20poly1305" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8eaf5903dcbc0a39312feb77df2ff4c76387d591b9fc7b04a238dcf8bb62639a" +checksum = "10cd79432192d1c0f4e1a0fef9527696cc039165d729fb41b3f4f4f354c2dc35" dependencies = [ - "android-tzdata", - "iana-time-zone", - "num-traits", - "windows-targets 0.52.4", + "aead", + "chacha20", + "cipher", + "poly1305", + "zeroize", ] [[package]] @@ -1155,6 +931,7 @@ checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad" dependencies = [ "crypto-common", "inout", + "zeroize", ] [[package]] @@ -1168,9 +945,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.2" +version = "4.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b230ab84b0ffdf890d5a10abdbc8b83ae1c4918275daea1ab8801f71536b2651" +checksum = "90bc066a67923782aa8515dbaea16946c5bcc5addbd668bb80af688e53e548a0" dependencies = [ "clap_builder", "clap_derive", @@ -1185,19 +962,19 @@ dependencies = [ "anstream", "anstyle", "clap_lex", - "strsim 0.11.0", + "strsim 0.11.1", ] [[package]] name = "clap_derive" -version = "4.5.0" +version = "4.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "307bc0538d5f0f83b8248db3087aa92fe504e4691294d0c96c0eabc33f47ba47" +checksum = "528131438037fd55894f62d6e9f068b8f45ac57ffa77517819645d10aed04f64" dependencies = [ - "heck", + "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.52", + "syn 2.0.60", ] [[package]] @@ -1206,25 +983,6 @@ version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "98cc8fbded0c607b7ba9dd60cd98df59af97e84d24e49c8557331cfc26d301ce" -[[package]] -name = "cloudabi" -version = "0.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ddfc5b9aa5d4507acaf872de71051dfd0e309860e88966e1051e462a077aac4f" -dependencies = [ - "bitflags 1.3.2", -] - -[[package]] -name = "codespan-reporting" -version = "0.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3538270d33cc669650c4b093848450d380def10c331d38c768e34cac80576e6e" -dependencies = [ - "termcolor", - "unicode-width", -] - [[package]] name = "colorchoice" version = "1.0.0" @@ -1243,8 +1001,8 @@ dependencies = [ "ark-std", "fflonk", "getrandom_or_panic", - "merlin 3.0.0", - "rand_chacha 0.3.1", + "merlin", + "rand_chacha", ] [[package]] @@ -1296,7 +1054,7 @@ version = "0.1.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f9d839f2a20b0aee515dc581a6172f2321f96cab76c1a38a4c584a194955390e" dependencies = [ - "getrandom 0.2.12", + "getrandom", "once_cell", "tiny-keccak", ] @@ -1348,65 +1106,29 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" [[package]] -name = "core2" -version = "0.3.3" +name = "cpufeatures" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "239fa3ae9b63c2dc74bd3fa852d4792b8b305ae64eeede946265b6af62f1fff3" +checksum = "53fe5e26ff1b7aef8bca9c6080520cfb8d9333c7568e1829cef191a9723e5504" dependencies = [ - "memchr", + "libc", ] [[package]] -name = "cpp_demangle" -version = "0.3.5" +name = "crossbeam-deque" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eeaa953eaad386a53111e47172c2fedba671e5684c8dd601a5f474f4f118710f" +checksum = "613f8cc01fe9cf1a3eb3d7f488fd2fa8388403e97039e2f73692932e291a770d" dependencies = [ - "cfg-if", + "crossbeam-epoch", + "crossbeam-utils", ] [[package]] -name = "cpufeatures" -version = "0.2.12" +name = "crossbeam-epoch" +version = "0.9.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53fe5e26ff1b7aef8bca9c6080520cfb8d9333c7568e1829cef191a9723e5504" -dependencies = [ - "libc", -] - -[[package]] -name = "cranelift-entity" -version = "0.95.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40099d38061b37e505e63f89bab52199037a72b931ad4868d9089ff7268660b0" -dependencies = [ - "serde", -] - -[[package]] -name = "crc32fast" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3855a8a784b474f333699ef2bbca9db2c4a1f6d9088a90a2d25b1eb53111eaa" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "crossbeam-deque" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "613f8cc01fe9cf1a3eb3d7f488fd2fa8388403e97039e2f73692932e291a770d" -dependencies = [ - "crossbeam-epoch", - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-epoch" -version = "0.9.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" +checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" dependencies = [ "crossbeam-utils", ] @@ -1432,26 +1154,14 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" -[[package]] -name = "crypto-bigint" -version = "0.4.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef2b4b23cddf68b89b8f8069890e8c270d54e2d5fe1b143820234805e4cb17ef" -dependencies = [ - "generic-array 0.14.7", - "rand_core 0.6.4", - "subtle", - "zeroize", -] - [[package]] name = "crypto-bigint" version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76" dependencies = [ - "generic-array 0.14.7", - "rand_core 0.6.4", + "generic-array", + "rand_core", "subtle", "zeroize", ] @@ -1462,8 +1172,8 @@ version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" dependencies = [ - "generic-array 0.14.7", - "rand_core 0.6.4", + "generic-array", + "rand_core", "typenum", ] @@ -1473,17 +1183,7 @@ version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b584a330336237c1eecd3e94266efb216c56ed91225d634cb2991c5f3fd1aeab" dependencies = [ - "generic-array 0.14.7", - "subtle", -] - -[[package]] -name = "crypto-mac" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25fab6889090c8133f3deb8f73ba3c65a7f456f66436fc012a1b1e272b1e103e" -dependencies = [ - "generic-array 0.14.7", + "generic-array", "subtle", ] @@ -1496,65 +1196,6 @@ dependencies = [ "cipher", ] -[[package]] -name = "curv-kzen" -version = "0.11.0" -dependencies = [ - "core2", - "curve25519-dalek 3.2.0", - "digest 0.9.0", - "ff 0.6.3", - "generic-array 0.14.7", - "hex", - "hmac 0.11.0", - "lazy_static", - "merkle-cbt", - "num-bigint 0.4.4", - "num-integer", - "num-traits", - "p256", - "pairing-plus", - "rand 0.6.5", - "rand 0.7.3", - "rand_chacha 0.3.1", - "secp256k1 0.20.3", - "serde", - "serde_bytes", - "serde_derive", - "sha2 0.8.2", - "sha2 0.9.9", - "sha3 0.9.1", - "thiserror", - "typenum", - "zeroize", -] - -[[package]] -name = "curve25519-dalek" -version = "2.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a9b85542f99a2dfa2a1b8e192662741c9859a846b296bef1c92ef9b58b5a216" -dependencies = [ - "byteorder 1.5.0 (registry+https://github.com/rust-lang/crates.io-index)", - "digest 0.8.1", - "rand_core 0.5.1", - "subtle", - "zeroize", -] - -[[package]] -name = "curve25519-dalek" -version = "3.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b9fdf9972b2bd6af2d913799d9ebc165ea4d2e65878e329d9c6b372c4491b61" -dependencies = [ - "byteorder 1.5.0 (registry+https://github.com/rust-lang/crates.io-index)", - "digest 0.9.0", - "rand_core 0.5.1", - "subtle", - "zeroize", -] - [[package]] name = "curve25519-dalek" version = "4.1.2" @@ -1567,7 +1208,7 @@ dependencies = [ "digest 0.10.7", "fiat-crypto", "platforms", - "rustc_version 0.4.0", + "rustc_version", "subtle", "zeroize", ] @@ -1580,51 +1221,7 @@ checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.52", -] - -[[package]] -name = "cxx" -version = "1.0.119" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "635179be18797d7e10edb9cd06c859580237750c7351f39ed9b298bfc17544ad" -dependencies = [ - "cc", - "cxxbridge-flags", - "cxxbridge-macro", - "link-cplusplus", -] - -[[package]] -name = "cxx-build" -version = "1.0.119" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9324397d262f63ef77eb795d900c0d682a34a43ac0932bec049ed73055d52f63" -dependencies = [ - "cc", - "codespan-reporting", - "once_cell", - "proc-macro2", - "quote", - "scratch", - "syn 2.0.52", -] - -[[package]] -name = "cxxbridge-flags" -version = "1.0.119" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a87ff7342ffaa54b7c61618e0ce2bbcf827eba6d55b923b83d82551acbbecfe5" - -[[package]] -name = "cxxbridge-macro" -version = "1.0.119" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70b5b86cf65fa0626d85720619d80b288013477a91a0389fa8bc716bf4903ad1" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.52", + "syn 2.0.60", ] [[package]] @@ -1672,7 +1269,7 @@ dependencies = [ "proc-macro2", "quote", "strsim 0.10.0", - "syn 2.0.52", + "syn 2.0.60", ] [[package]] @@ -1694,24 +1291,14 @@ checksum = "a668eda54683121533a393014d8692171709ff57a7d61f187b6e782719f8933f" dependencies = [ "darling_core 0.20.8", "quote", - "syn 2.0.52", -] - -[[package]] -name = "der" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1a467a65c5e759bce6e65eaf91cc29f466cdc57cb65777bd646872a8a1fd4de" -dependencies = [ - "const-oid", - "zeroize", + "syn 2.0.60", ] [[package]] name = "der" -version = "0.7.8" +version = "0.7.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fffa369a668c8af7dbf8b5e56c9f744fbd399949ed171606040001947de40b1c" +checksum = "f55bf8e7b65898637379c1b74eb1551107c8294ed26d855ceb9fd1a09cfc9bc0" dependencies = [ "const-oid", "zeroize", @@ -1740,25 +1327,27 @@ dependencies = [ ] [[package]] -name = "derive_more" -version = "0.99.17" +name = "derive-syn-parse" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fb810d30a7c1953f91334de7244731fc3f3c10d7fe163338a35b9f640960321" +checksum = "d65d7ce8132b7c0e54497a4d9a55a1c2a0912a0d786cf894472ba818fba45762" dependencies = [ - "convert_case", "proc-macro2", "quote", - "rustc_version 0.4.0", - "syn 1.0.109", + "syn 2.0.60", ] [[package]] -name = "digest" -version = "0.8.1" +name = "derive_more" +version = "0.99.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3d0c8c8752312f9713efd397ff63acb9f85585afbf179282e720e7704954dd5" +checksum = "4fb810d30a7c1953f91334de7244731fc3f3c10d7fe163338a35b9f640960321" dependencies = [ - "generic-array 0.12.4", + "convert_case", + "proc-macro2", + "quote", + "rustc_version", + "syn 1.0.109", ] [[package]] @@ -1767,7 +1356,7 @@ version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" dependencies = [ - "generic-array 0.14.7", + "generic-array", ] [[package]] @@ -1785,52 +1374,51 @@ dependencies = [ [[package]] name = "dleq_vrf" version = "0.0.2" -source = "git+https://github.com/w3f/ring-vrf?rev=cbc342e#cbc342e95d3cbcd3c5ba8d45af7200eb58e63502" +source = "git+https://github.com/w3f/ring-vrf?rev=e9782f9#e9782f938629c90f3adb3fff2358bc8d1386af3e" dependencies = [ "ark-ec", "ark-ff", - "ark-scale 0.0.11", + "ark-scale", "ark-secret-scalar", "ark-serialize", "ark-std", "ark-transcript", "arrayvec 0.7.4", - "rand_core 0.6.4", "zeroize", ] [[package]] name = "docify" -version = "0.2.7" +version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7cc4fd38aaa9fb98ac70794c82a00360d1e165a87fbf96a8a91f9dfc602aaee2" +checksum = "43a2f138ad521dc4a2ced1a4576148a6a610b4c5923933b062a263130a6802ce" dependencies = [ "docify_macros", ] [[package]] name = "docify_macros" -version = "0.2.7" +version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "63fa215f3a0d40fb2a221b3aa90d8e1fbb8379785a990cb60d62ac71ebdc6460" +checksum = "1a081e51fb188742f5a7a1164ad752121abcb22874b21e2c3b0dd040c515fdad" dependencies = [ "common-path", - "derive-syn-parse", + "derive-syn-parse 0.2.0", "once_cell", "proc-macro2", "quote", "regex", - "syn 2.0.52", + "syn 2.0.60", "termcolor", - "toml 0.8.11", + "toml", "walkdir", ] [[package]] name = "downcast-rs" -version = "1.2.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ea835d29036a4087793836fa931b08837ad5e957da9e23886b29586fb9b6650" +checksum = "75b325c5dbd37f80359721ad39aca5a29fb04c89279657cffdda8736d0c0b9d2" [[package]] name = "dyn-clonable" @@ -1859,30 +1447,19 @@ version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0d6ef0072f8a535281e4876be788938b528e9a1d43900b82c2569af7da799125" -[[package]] -name = "ecdsa" -version = "0.14.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "413301934810f597c1d19ca71c8710e99a3f1ba28a0d2ebc01551a2daeea3c5c" -dependencies = [ - "der 0.6.1", - "elliptic-curve 0.12.3", - "rfc6979 0.3.1", - "signature 1.6.4", -] - [[package]] name = "ecdsa" version = "0.16.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ee27f32b5c5292967d2d4a9d7f1e0b0aed2c15daded5a60300e4abb9d8020bca" dependencies = [ - "der 0.7.8", + "der", "digest 0.10.7", - "elliptic-curve 0.13.8", - "rfc6979 0.4.0", - "signature 2.2.0", - "spki 0.7.3", + "elliptic-curve", + "rfc6979", + "serdect", + "signature", + "spki", ] [[package]] @@ -1891,8 +1468,8 @@ version = "2.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "115531babc129696a58c64a4fef0a8bf9e9698629fb97e9e40767d235cfbcd53" dependencies = [ - "pkcs8 0.10.2", - "signature 2.2.0", + "pkcs8", + "signature", ] [[package]] @@ -1901,7 +1478,7 @@ version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4a3daa8e81a3963a60642bcc1f90a670680bd4a77535faa384e9d1c79d620871" dependencies = [ - "curve25519-dalek 4.1.2", + "curve25519-dalek", "ed25519", "serde", "sha2 0.10.8", @@ -1909,59 +1486,26 @@ dependencies = [ "zeroize", ] -[[package]] -name = "ed25519-zebra" -version = "3.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c24f403d068ad0b359e577a77f92392118be3f3c927538f2bb544a5ecd828c6" -dependencies = [ - "curve25519-dalek 3.2.0", - "hashbrown 0.12.3", - "hex", - "rand_core 0.6.4", - "sha2 0.9.9", - "zeroize", -] - [[package]] name = "ed25519-zebra" version = "4.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7d9ce6874da5d4415896cd45ffbc4d1cfc0c4f9c079427bd870742c30f2f65a9" dependencies = [ - "curve25519-dalek 4.1.2", + "curve25519-dalek", "ed25519", "hashbrown 0.14.3", "hex", - "rand_core 0.6.4", + "rand_core", "sha2 0.10.8", "zeroize", ] [[package]] name = "either" -version = "1.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11157ac094ffbdde99aa67b23417ebdd801842852b500e395a45a9c0aac03e4a" - -[[package]] -name = "elliptic-curve" -version = "0.12.3" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7bb888ab5300a19b8e5bceef25ac745ad065f3c9f7efc6de1b91958110891d3" -dependencies = [ - "base16ct 0.1.1", - "crypto-bigint 0.4.9", - "der 0.6.1", - "digest 0.10.7", - "ff 0.12.1", - "generic-array 0.14.7", - "group 0.12.1", - "rand_core 0.6.4", - "sec1 0.3.0", - "subtle", - "zeroize", -] +checksum = "a47c1c47d2f5964e29c61246e81db715514cd532db6b5116a25ea3c03d6780a2" [[package]] name = "elliptic-curve" @@ -1969,15 +1513,16 @@ version = "0.13.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" dependencies = [ - "base16ct 0.2.0", - "crypto-bigint 0.5.5", + "base16ct", + "crypto-bigint", "digest 0.10.7", - "ff 0.13.0", - "generic-array 0.14.7", - "group 0.13.0", - "pkcs8 0.10.2", - "rand_core 0.6.4", - "sec1 0.7.3", + "ff", + "generic-array", + "group", + "pkcs8", + "rand_core", + "sec1", + "serdect", "subtle", "zeroize", ] @@ -2012,55 +1557,58 @@ dependencies = [ [[package]] name = "etf-crypto-primitives" -version = "0.2.3" -source = "git+https://github.com/ideal-lab5/etf-sdk.git?branch=main#950f781d26500ad4c38afd347dfb5a6519f58e8f" +version = "0.2.4" +source = "git+https://github.com/ideal-lab5/etf-sdk/?branch=tony/dev#159ed603ca8a31b7d2e5f4437c62411c4d1fd743" dependencies = [ "aes-gcm", + "ark-bls12-377", "ark-bls12-381", - "ark-crypto-primitives", "ark-ec", "ark-ff", "ark-poly", "ark-serialize", "ark-std", - "array-bytes 6.2.2", - "generic-array 0.14.7", + "array-bytes", + "chacha20poly1305", + "generic-array", "parity-scale-codec", + "rand_chacha", + "scale-info", "serde", + "serde_cbor", + "serde_json", "sha2 0.10.8", - "sha3 0.10.8", + "sha3", + "w3f-bls", ] [[package]] name = "etf-crypto-primitives" version = "0.2.4" +source = "git+https://github.com/ideal-lab5/etf-sdk/?branch=w3fbls-migration#181a312bbbf84fb0dec419d4fb3d41a9d852278f" dependencies = [ "aes-gcm", + "ark-bls12-377", "ark-bls12-381", "ark-ec", "ark-ff", "ark-poly", "ark-serialize", "ark-std", - "array-bytes 6.2.2", - "curv-kzen", - "generic-array 0.14.7", - "kzen-paillier", + "array-bytes", + "chacha20poly1305", + "generic-array", "parity-scale-codec", + "rand_chacha", "scale-info", "serde", "serde_cbor", "serde_json", "sha2 0.10.8", - "sha3 0.10.8", + "sha3", + "w3f-bls", ] -[[package]] -name = "event-listener" -version = "2.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" - [[package]] name = "event-listener" version = "4.0.3" @@ -2074,9 +1622,9 @@ dependencies = [ [[package]] name = "event-listener" -version = "5.2.0" +version = "5.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b5fb89194fa3cad959b833185b3063ba881dbfc7030680b314250779fb4cc91" +checksum = "6d9944b8ca13534cdfb2800775f8dd4902ff3fc75a50101466decadfdf322a24" dependencies = [ "concurrent-queue", "parking", @@ -2095,11 +1643,11 @@ dependencies = [ [[package]] name = "event-listener-strategy" -version = "0.5.0" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "feedafcaa9b749175d5ac357452a9d41ea2911da598fde46ce1fe02c37751291" +checksum = "332f51cb23d20b0de8458b86580878211da09bcd4503cb579c225b3d124cabb3" dependencies = [ - "event-listener 5.2.0", + "event-listener 5.3.0", "pin-project-lite", ] @@ -2114,47 +1662,14 @@ dependencies = [ "prettier-please", "proc-macro2", "quote", - "syn 2.0.52", + "syn 2.0.60", ] -[[package]] -name = "fake-simd" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e88a8acf291dafb59c2d96e8f59828f3838bb1a70398823ade51a84de6a6deed" - -[[package]] -name = "fallible-iterator" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4443176a9f2c162692bd3d352d745ef9413eec5782a80d8fd6f8a1ac692a07f7" - [[package]] name = "fastrand" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25cbce373ec4653f1a01a31e8a5e5ec0c622dc27ff9c4e6606eefef5cbbed4a5" - -[[package]] -name = "ff" -version = "0.6.3" -dependencies = [ - "byteorder 1.5.0 (git+https://github.com/ideal-lab5/byteorder)", - "core2", - "ff_derive", - "rand_core 0.5.1", - "zeroize", -] - -[[package]] -name = "ff" -version = "0.12.1" +version = "2.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d013fc25338cc558c5c2cfbad646908fb23591e2404481826742b651c9af7160" -dependencies = [ - "rand_core 0.6.4", - "subtle", -] +checksum = "658bd65b1cf4c852a3cc96f18a8ce7b5640f6b703f905c7d74532294c2a63984" [[package]] name = "ff" @@ -2162,22 +1677,10 @@ version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ded41244b729663b1e574f1b4fb731469f69f79c17667b5d776b16cda0479449" dependencies = [ - "rand_core 0.6.4", + "rand_core", "subtle", ] -[[package]] -name = "ff_derive" -version = "0.6.2" -dependencies = [ - "num-bigint 0.2.6", - "num-integer", - "num-traits", - "proc-macro2", - "quote", - "syn 1.0.109", -] - [[package]] name = "fflonk" version = "0.1.0" @@ -2188,42 +1691,14 @@ dependencies = [ "ark-poly", "ark-serialize", "ark-std", - "merlin 3.0.0", + "merlin", ] [[package]] name = "fiat-crypto" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1676f435fc1dadde4d03e43f5d62b259e1ce5f40bd4ffb21db2b42ebe59c1382" - -[[package]] -name = "filetime" -version = "0.2.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ee447700ac8aa0b2f2bd7bc4462ad686ba06baa6727ac149a2d6277f0d240fd" -dependencies = [ - "cfg-if", - "libc", - "redox_syscall", - "windows-sys 0.52.0", -] - -[[package]] -name = "finality-grandpa" -version = "0.16.2" +version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36530797b9bf31cd4ff126dcfee8170f86b00cfdcea3269d73133cc0415945c3" -dependencies = [ - "either", - "futures", - "futures-timer", - "log", - "num-traits", - "parity-scale-codec", - "parking_lot", - "scale-info", -] +checksum = "38793c55593b33412e3ae40c2c9781ffaa6f438f6f8c10f24e71846fbd7ae01e" [[package]] name = "fixed-hash" @@ -2231,8 +1706,8 @@ version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "835c052cb0c08c1acf6ffd71c022172e18723949c8282f2b9f27efbc51e64534" dependencies = [ - "byteorder 1.5.0 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.8.5", + "byteorder", + "rand", "rustc-hex", "static_assertions", ] @@ -2253,64 +1728,21 @@ dependencies = [ ] [[package]] -name = "frame-benchmarking" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/polkadot-sdk.git?tag=v1.4.0-rc1#00395a23d12bdda60499083ad578738da267efd0" +name = "frame-metadata" +version = "15.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "878babb0b136e731cc77ec2fd883ff02745ff21e6fb662729953d44923df009c" dependencies = [ - "frame-support", - "frame-support-procedural", - "frame-system", - "linregress", - "log", + "cfg-if", "parity-scale-codec", - "paste", "scale-info", - "serde", - "sp-api", - "sp-application-crypto", - "sp-core", - "sp-io", - "sp-runtime", - "sp-runtime-interface 17.0.0", - "sp-std 8.0.0", - "sp-storage 13.0.0", - "static_assertions", ] [[package]] -name = "frame-executive" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/polkadot-sdk.git?tag=v1.4.0-rc1#00395a23d12bdda60499083ad578738da267efd0" -dependencies = [ - "frame-support", - "frame-system", - "frame-try-runtime", - "log", - "parity-scale-codec", - "scale-info", - "sp-core", - "sp-io", - "sp-runtime", - "sp-std 8.0.0", - "sp-tracing 10.0.0", -] - -[[package]] -name = "frame-metadata" -version = "15.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "878babb0b136e731cc77ec2fd883ff02745ff21e6fb662729953d44923df009c" -dependencies = [ - "cfg-if", - "parity-scale-codec", - "scale-info", -] - -[[package]] -name = "frame-metadata" -version = "16.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87cf1549fba25a6fcac22785b61698317d958e96cac72a59102ea45b9ae64692" +name = "frame-metadata" +version = "16.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87cf1549fba25a6fcac22785b61698317d958e96cac72a59102ea45b9ae64692" dependencies = [ "cfg-if", "parity-scale-codec", @@ -2320,11 +1752,11 @@ dependencies = [ [[package]] name = "frame-support" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/polkadot-sdk.git?tag=v1.4.0-rc1#00395a23d12bdda60499083ad578738da267efd0" +version = "28.0.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" dependencies = [ "aquamarine", - "array-bytes 6.2.2", + "array-bytes", "bitflags 1.3.2", "docify", "environmental", @@ -2343,8 +1775,8 @@ dependencies = [ "sp-api", "sp-arithmetic", "sp-core", - "sp-core-hashing-proc-macro", - "sp-debug-derive 8.0.0", + "sp-crypto-hashing-proc-macro", + "sp-debug-derive 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", "sp-genesis-builder", "sp-inherents", "sp-io", @@ -2352,8 +1784,8 @@ dependencies = [ "sp-runtime", "sp-staking", "sp-state-machine", - "sp-std 8.0.0", - "sp-tracing 10.0.0", + "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", + "sp-tracing 16.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", "sp-weights", "static_assertions", "tt-call", @@ -2361,98 +1793,43 @@ dependencies = [ [[package]] name = "frame-support-procedural" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/polkadot-sdk.git?tag=v1.4.0-rc1#00395a23d12bdda60499083ad578738da267efd0" +version = "23.0.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" dependencies = [ "Inflector", "cfg-expr", - "derive-syn-parse", + "derive-syn-parse 0.2.0", "expander", "frame-support-procedural-tools", - "itertools 0.10.5", + "itertools 0.11.0", "macro_magic", "proc-macro-warning", "proc-macro2", "quote", - "sp-core-hashing 9.0.0", - "syn 2.0.52", + "sp-crypto-hashing 0.1.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", + "syn 2.0.60", ] [[package]] name = "frame-support-procedural-tools" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/polkadot-sdk.git?tag=v1.4.0-rc1#00395a23d12bdda60499083ad578738da267efd0" +version = "10.0.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" dependencies = [ "frame-support-procedural-tools-derive", - "proc-macro-crate 1.3.1", + "proc-macro-crate 3.1.0", "proc-macro2", "quote", - "syn 2.0.52", + "syn 2.0.60", ] [[package]] name = "frame-support-procedural-tools-derive" -version = "3.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?tag=v1.4.0-rc1#00395a23d12bdda60499083ad578738da267efd0" +version = "11.0.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.52", -] - -[[package]] -name = "frame-system" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/polkadot-sdk.git?tag=v1.4.0-rc1#00395a23d12bdda60499083ad578738da267efd0" -dependencies = [ - "cfg-if", - "frame-support", - "log", - "parity-scale-codec", - "scale-info", - "serde", - "sp-core", - "sp-io", - "sp-runtime", - "sp-std 8.0.0", - "sp-version", - "sp-weights", -] - -[[package]] -name = "frame-system-benchmarking" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/polkadot-sdk.git?tag=v1.4.0-rc1#00395a23d12bdda60499083ad578738da267efd0" -dependencies = [ - "frame-benchmarking", - "frame-support", - "frame-system", - "parity-scale-codec", - "scale-info", - "sp-core", - "sp-runtime", - "sp-std 8.0.0", -] - -[[package]] -name = "frame-system-rpc-runtime-api" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/polkadot-sdk.git?tag=v1.4.0-rc1#00395a23d12bdda60499083ad578738da267efd0" -dependencies = [ - "parity-scale-codec", - "sp-api", -] - -[[package]] -name = "frame-try-runtime" -version = "0.10.0-dev" -source = "git+https://github.com/paritytech/polkadot-sdk.git?tag=v1.4.0-rc1#00395a23d12bdda60499083ad578738da267efd0" -dependencies = [ - "frame-support", - "parity-scale-codec", - "sp-api", - "sp-runtime", - "sp-std 8.0.0", + "syn 2.0.60", ] [[package]] @@ -2461,15 +1838,9 @@ version = "2.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "88a41f105fe1d5b6b34b2055e3dc59bb79b46b48b2040b9e6c7b4b5de097aa41" dependencies = [ - "autocfg 1.1.0", + "autocfg", ] -[[package]] -name = "fuchsia-cprng" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a06f77d526c1a601b7c4cdd98f54b5eaabffc14d5f2f0296febdc7f357c6d3ba" - [[package]] name = "funty" version = "2.0.0" @@ -2527,9 +1898,9 @@ checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1" [[package]] name = "futures-lite" -version = "2.2.0" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "445ba825b27408685aaecefd65178908c36c6e96aaf6d8599419d46e624192ba" +checksum = "52527eb5074e35e9339c6b4e8d12600c7128b68fb25dcb9fa9dec18f7c25f3a5" dependencies = [ "fastrand", "futures-core", @@ -2546,7 +1917,7 @@ checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" dependencies = [ "proc-macro2", "quote", - "syn 2.0.52", + "syn 2.0.60", ] [[package]] @@ -2585,15 +1956,6 @@ dependencies = [ "slab", ] -[[package]] -name = "generic-array" -version = "0.12.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffdf9f34f1447443d37393cc6c2b8313aebddcd96906caf34e54c68d8e57d7bd" -dependencies = [ - "typenum", -] - [[package]] name = "generic-array" version = "0.14.7" @@ -2607,24 +1969,15 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.1.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" -dependencies = [ - "cfg-if", - "libc", - "wasi 0.9.0+wasi-snapshot-preview1", -] - -[[package]] -name = "getrandom" -version = "0.2.12" +version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "190092ea657667030ac6a35e305e62fc4dd69fd98ac98631e5d3a2b1575a12b5" +checksum = "94b22e06ecb0110981051723910cbf0b5f5e09a2062dd7663334ee79a9d1286c" dependencies = [ "cfg-if", + "js-sys", "libc", - "wasi 0.11.0+wasi-snapshot-preview1", + "wasi", + "wasm-bindgen", ] [[package]] @@ -2633,8 +1986,8 @@ version = "0.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6ea1015b5a70616b688dc230cfe50c8af89d972cb132d5a622814d29773b10b9" dependencies = [ - "rand 0.8.5", - "rand_core 0.6.4", + "rand", + "rand_core", ] [[package]] @@ -2643,54 +1996,32 @@ version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f0d8a4362ccb29cb0b265253fb0a2728f592895ee6854fd9bc13f2ffda266ff1" dependencies = [ - "opaque-debug 0.3.1", + "opaque-debug", "polyval", ] -[[package]] -name = "gimli" -version = "0.27.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6c80984affa11d98d1b88b66ac8853f143217b399d3c74116778ff8fdb4ed2e" -dependencies = [ - "fallible-iterator", - "indexmap 1.9.3", - "stable_deref_trait", -] - [[package]] name = "gimli" version = "0.28.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" -[[package]] -name = "group" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5dfbfb3a6cfbd390d5c9564ab283a0349b9b9fcd46a706c1eb10e0db70bfbac7" -dependencies = [ - "ff 0.12.1", - "rand_core 0.6.4", - "subtle", -] - [[package]] name = "group" version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" dependencies = [ - "ff 0.13.0", - "rand_core 0.6.4", + "ff", + "rand_core", "subtle", ] [[package]] name = "h2" -version = "0.3.24" +version = "0.3.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb2c4422095b67ee78da96fbb51a4cc413b3b25883c7717ff7ca1ab31022c9c9" +checksum = "81fe527a889e1532da5c525686d96d4c2e74cdd345badf8dfef9f6b39dd5f5e8" dependencies = [ "bytes", "fnv", @@ -2698,7 +2029,7 @@ dependencies = [ "futures-sink", "futures-util", "http", - "indexmap 2.2.5", + "indexmap", "slab", "tokio", "tokio-util", @@ -2726,22 +2057,13 @@ dependencies = [ "crunchy", ] -[[package]] -name = "hashbrown" -version = "0.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" -dependencies = [ - "ahash 0.7.8", -] - [[package]] name = "hashbrown" version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e" dependencies = [ - "ahash 0.8.11", + "ahash", ] [[package]] @@ -2750,7 +2072,7 @@ version = "0.14.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" dependencies = [ - "ahash 0.8.11", + "ahash", "allocator-api2", "serde", ] @@ -2761,6 +2083,12 @@ version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + [[package]] name = "hermit-abi" version = "0.3.9" @@ -2772,27 +2100,20 @@ name = "hex" version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" -dependencies = [ - "serde", -] [[package]] -name = "hmac" -version = "0.8.1" +name = "hex-conservative" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "126888268dcc288495a26bf004b38c5fdbb31682f992c84ceb046a1f0fe38840" -dependencies = [ - "crypto-mac 0.8.0", - "digest 0.9.0", -] +checksum = "30ed443af458ccb6d81c1e7e661545f94d3176752fb1df2f543b902a1e0f51e2" [[package]] name = "hmac" -version = "0.11.0" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a2a2320eb7ec0ebe8da8f744d7812d9fc4cb4d09344ac01898dbcb6a20ae69b" +checksum = "126888268dcc288495a26bf004b38c5fdbb31682f992c84ceb046a1f0fe38840" dependencies = [ - "crypto-mac 0.11.0", + "crypto-mac", "digest 0.9.0", ] @@ -2812,7 +2133,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "17ea0a1394df5b6574da6e0c1ade9e78868c9fb0a4e5ef4428e32da4676b85b1" dependencies = [ "digest 0.9.0", - "generic-array 0.14.7", + "generic-array", "hmac 0.8.1", ] @@ -2884,35 +2205,12 @@ dependencies = [ "http", "hyper", "log", - "rustls 0.21.10", + "rustls 0.21.11", "rustls-native-certs 0.6.3", "tokio", "tokio-rustls 0.24.1", ] -[[package]] -name = "iana-time-zone" -version = "0.1.60" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7ffbb5a1b541ea2561f8c41c087286cc091e21e556a4f09a8f6cbf17b69b141" -dependencies = [ - "android_system_properties", - "core-foundation-sys", - "iana-time-zone-haiku", - "js-sys", - "wasm-bindgen", - "windows-core", -] - -[[package]] -name = "iana-time-zone-haiku" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" -dependencies = [ - "cc", -] - [[package]] name = "ident_case" version = "1.0.1" @@ -2979,20 +2277,9 @@ dependencies = [ [[package]] name = "indexmap" -version = "1.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" -dependencies = [ - "autocfg 1.1.0", - "hashbrown 0.12.3", - "serde", -] - -[[package]] -name = "indexmap" -version = "2.2.5" +version = "2.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b0b929d511467233429c45a44ac1dcaa21ba0f5ba11e4879e6ed28ddb4f9df4" +checksum = "168fb715dda47215e360912c096649d23d58bf392ac62f73919e831745e40f26" dependencies = [ "equivalent", "hashbrown 0.14.3", @@ -3023,7 +2310,7 @@ version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a0c10553d664a4d0bcff9f4215d0aac67a639cc68ef660840afe309b807bc9f5" dependencies = [ - "generic-array 0.14.7", + "generic-array", ] [[package]] @@ -3045,21 +2332,19 @@ dependencies = [ ] [[package]] -name = "io-lifetimes" -version = "1.0.11" +name = "itertools" +version = "0.10.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eae7b9aee968036d54dce06cebaefd919e4472e753296daccd6d344e3e2df0c2" +checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" dependencies = [ - "hermit-abi", - "libc", - "windows-sys 0.48.0", + "either", ] [[package]] name = "itertools" -version = "0.10.5" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" +checksum = "b1c173a5686ce8bfa551b3563d0c2170bf24ca44da99c7ca4bfdab5418c3fe57" dependencies = [ "either", ] @@ -3075,18 +2360,9 @@ dependencies = [ [[package]] name = "itoa" -version = "1.0.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1a46d1a171d865aa5f83f92695765caa047a9b4cbae2cbf37dbd613a793fd4c" - -[[package]] -name = "jobserver" -version = "0.1.28" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab46a6e9526ddef3ae7f787c06f0f2600639ba80ea3eade3d8e670a2230f51d6" -dependencies = [ - "libc", -] +checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" [[package]] name = "js-sys" @@ -3099,9 +2375,9 @@ dependencies = [ [[package]] name = "jsonrpsee" -version = "0.21.0" +version = "0.22.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9579d0ca9fb30da026bac2f0f7d9576ec93489aeb7cd4971dd5b4617d82c79b2" +checksum = "c4b0e68d9af1f066c06d6e2397583795b912d78537d7d907c561e82c13d69fa1" dependencies = [ "jsonrpsee-client-transport", "jsonrpsee-core", @@ -3111,9 +2387,9 @@ dependencies = [ [[package]] name = "jsonrpsee-client-transport" -version = "0.21.0" +version = "0.22.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f9f9ed46590a8d5681975f126e22531698211b926129a40a2db47cbca429220" +checksum = "92f254f56af1ae84815b9b1325094743dcf05b92abb5e94da2e81a35cff0cada" dependencies = [ "futures-util", "http", @@ -3132,12 +2408,11 @@ dependencies = [ [[package]] name = "jsonrpsee-core" -version = "0.21.0" +version = "0.22.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "776d009e2f591b78c038e0d053a796f94575d66ca4e77dd84bfc5e81419e436c" +checksum = "274d68152c24aa78977243bb56f28d7946e6aa309945b37d33174a3f92d89a3a" dependencies = [ "anyhow", - "async-lock 3.3.0", "async-trait", "beef", "futures-timer", @@ -3156,9 +2431,9 @@ dependencies = [ [[package]] name = "jsonrpsee-http-client" -version = "0.21.0" +version = "0.22.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78b7de9f3219d95985eb77fd03194d7c1b56c19bce1abfcc9d07462574b15572" +checksum = "ac13bc1e44cd00448a5ff485824a128629c945f02077804cb659c07a0ba41395" dependencies = [ "async-trait", "hyper", @@ -3176,9 +2451,9 @@ dependencies = [ [[package]] name = "jsonrpsee-types" -version = "0.21.0" +version = "0.22.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3266dfb045c9174b24c77c2dfe0084914bb23a6b2597d70c9dc6018392e1cd1b" +checksum = "3dc828e537868d6b12bbb07ec20324909a22ced6efca0057c825c3e1126b2c6d" dependencies = [ "anyhow", "beef", @@ -3194,9 +2469,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "956ff9b67e26e1a6a866cb758f12c6f8746208489e3e4a4b5580802f2f0a587b" dependencies = [ "cfg-if", - "ecdsa 0.16.9", - "elliptic-curve 0.13.8", + "ecdsa", + "elliptic-curve", "once_cell", + "serdect", "sha2 0.10.8", ] @@ -3209,14 +2485,6 @@ dependencies = [ "cpufeatures", ] -[[package]] -name = "kzen-paillier" -version = "0.4.4" -dependencies = [ - "curv-kzen", - "serde", -] - [[package]] name = "lazy_static" version = "1.4.0" @@ -3248,7 +2516,7 @@ dependencies = [ "libsecp256k1-core", "libsecp256k1-gen-ecmult", "libsecp256k1-gen-genmult", - "rand 0.8.5", + "rand", "serde", "sha2 0.9.9", "typenum", @@ -3283,30 +2551,6 @@ dependencies = [ "libsecp256k1-core", ] -[[package]] -name = "link-cplusplus" -version = "1.0.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d240c6f7e1ba3a28b0249f774e6a9dd0175054b52dfbb61b16eb8505c3785c9" -dependencies = [ - "cc", -] - -[[package]] -name = "linregress" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4de04dcecc58d366391f9920245b85ffa684558a5ef6e7736e754347c3aea9c2" -dependencies = [ - "nalgebra", -] - -[[package]] -name = "linux-raw-sys" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f051f77a7c8e6957c0696eac88f26b0117e54f52d3fc682ab19397a8812846a4" - [[package]] name = "linux-raw-sys" version = "0.4.13" @@ -3319,7 +2563,7 @@ version = "0.4.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3c168f8615b12bc01f9c17e2eb0cc07dcae1940121185446edc3744920e8ef45" dependencies = [ - "autocfg 1.1.0", + "autocfg", "scopeguard", ] @@ -3338,15 +2582,6 @@ dependencies = [ "hashbrown 0.14.3", ] -[[package]] -name = "mach" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b823e83b2affd8f40a9ee8c29dbc56404c1e34cd2710921f2801e2cf29527afa" -dependencies = [ - "libc", -] - [[package]] name = "macro_magic" version = "0.5.0" @@ -3356,7 +2591,7 @@ dependencies = [ "macro_magic_core", "macro_magic_macros", "quote", - "syn 2.0.52", + "syn 2.0.60", ] [[package]] @@ -3366,11 +2601,11 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "468155613a44cfd825f1fb0ffa532b018253920d404e6fca1e8d43155198a46d" dependencies = [ "const-random", - "derive-syn-parse", + "derive-syn-parse 0.1.5", "macro_magic_core_macros", "proc-macro2", "quote", - "syn 2.0.52", + "syn 2.0.60", ] [[package]] @@ -3381,7 +2616,7 @@ checksum = "9ea73aa640dc01d62a590d48c0c3521ed739d53b27f919b25c3551e233481654" dependencies = [ "proc-macro2", "quote", - "syn 2.0.52", + "syn 2.0.60", ] [[package]] @@ -3392,51 +2627,23 @@ checksum = "ef9d79ae96aaba821963320eb2b6e34d17df1e5a83d8a1985c29cc5be59577b3" dependencies = [ "macro_magic_core", "quote", - "syn 2.0.52", + "syn 2.0.60", ] [[package]] name = "matchers" -version = "0.0.1" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f099785f7595cc4b4553a174ce30dd7589ef93391ff414dbb67f62392b9e0ce1" +checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558" dependencies = [ "regex-automata 0.1.10", ] -[[package]] -name = "matrixmultiply" -version = "0.3.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7574c1cf36da4798ab73da5b215bbf444f50718207754cb522201d78d1cd0ff2" -dependencies = [ - "autocfg 1.1.0", - "rawpointer", -] - [[package]] name = "memchr" -version = "2.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "523dc4f511e55ab87b694dc30d0f820d60906ef06413f93d4d7a1385599cc149" - -[[package]] -name = "memfd" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2cffa4ad52c6f791f4f8b15f0c05f9824b2ced1160e88cc393d64fff9a8ac64" -dependencies = [ - "rustix 0.38.31", -] - -[[package]] -name = "memoffset" -version = "0.8.0" +version = "2.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d61c719bcfbcf5d62b3a09efa6088de8c54bc0bfcd3ea7ae39fcc186108b8de1" -dependencies = [ - "autocfg 1.1.0", -] +checksum = "6c8640c5d730cb13ebd907d8d04b52f55ac9a2eec55b440c8892f40d56c76c1d" [[package]] name = "memory-db" @@ -3447,36 +2654,15 @@ dependencies = [ "hash-db", ] -[[package]] -name = "merkle-cbt" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "171d2f700835121c3b04ccf0880882987a050fd5c7ae88148abf537d33dd3a56" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "merlin" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e261cf0f8b3c42ded9f7d2bb59dea03aa52bc8a1cbc7482f9fc3fd1229d3b42" -dependencies = [ - "byteorder 1.5.0 (registry+https://github.com/rust-lang/crates.io-index)", - "keccak", - "rand_core 0.5.1", - "zeroize", -] - [[package]] name = "merlin" version = "3.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "58c38e2799fc0978b65dfff8023ec7843e2330bb462f19198840b34b6582397d" dependencies = [ - "byteorder 1.5.0 (registry+https://github.com/rust-lang/crates.io-index)", + "byteorder", "keccak", - "rand_core 0.6.4", + "rand_core", "zeroize", ] @@ -3502,99 +2688,88 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a4a650543ca06a924e8b371db273b2756685faae30f8487da1b56505a8f78b0c" dependencies = [ "libc", - "wasi 0.11.0+wasi-snapshot-preview1", + "wasi", "windows-sys 0.48.0", ] [[package]] -name = "nalgebra" -version = "0.32.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4541eb06dce09c0241ebbaab7102f0a01a0c8994afed2e5d0d66775016e25ac2" -dependencies = [ - "approx", - "matrixmultiply", - "nalgebra-macros", - "num-complex", - "num-rational", - "num-traits", - "simba", - "typenum", -] - -[[package]] -name = "nalgebra-macros" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91761aed67d03ad966ef783ae962ef9bbaca728d2dd7ceb7939ec110fffad998" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "no-std-net" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43794a0ace135be66a25d3ae77d41b91615fb68ae937f904090203e81f755b65" - -[[package]] -name = "node-primitives" -version = "2.0.0" +name = "murmur-cli" +version = "0.1.0" dependencies = [ + "ark-bls12-377", + "ark-ec", + "ark-ff", + "ark-serialize", + "ark-std", + "array-bytes", + "ckb-merkle-mountain-range", + "clap", + "etf-crypto-primitives 0.2.4 (git+https://github.com/ideal-lab5/etf-sdk/?branch=tony/dev)", + "frame-support", + "getrandom", + "hex", + "indicatif", + "murmur-core", + "parity-scale-codec", + "rand_chacha", + "rand_core", + "serde", + "serde_cbor", + "serde_json", + "sha3", + "sp-application-crypto", + "sp-consensus-beefy-etf", "sp-core", + "sp-keyring", "sp-runtime", + "subxt", + "subxt-signer", + "tokio", + "w3f-bls", ] [[package]] -name = "node-runtime" -version = "4.0.0-dev" +name = "murmur-core" +version = "0.1.0" dependencies = [ - "frame-benchmarking", - "frame-executive", + "ark-bls12-377", + "ark-ec", + "ark-ff", + "ark-serialize", + "ark-std", + "array-bytes", + "ckb-merkle-mountain-range", + "clap", + "etf-crypto-primitives 0.2.4 (git+https://github.com/ideal-lab5/etf-sdk/?branch=tony/dev)", "frame-support", - "frame-system", - "frame-system-benchmarking", - "frame-system-rpc-runtime-api", - "frame-try-runtime", - "log", - "node-primitives", - "pallet-balances", - "pallet-contracts", - "pallet-contracts-primitives", - "pallet-etf", - "pallet-etf-aura", - "pallet-grandpa", - "pallet-insecure-randomness-collective-flip", - "pallet-otp", - "pallet-preimage", - "pallet-proxy", - "pallet-scheduler", - "pallet-sudo", - "pallet-timestamp", - "pallet-transaction-payment", - "pallet-transaction-payment-rpc-runtime-api", + "getrandom", + "hex", + "indicatif", "parity-scale-codec", - "scale-info", - "sp-api", - "sp-block-builder", - "sp-consensus-etf-aura", - "sp-consensus-grandpa", - "sp-consensus-slots", + "rand_chacha", + "rand_core", + "serde", + "serde_cbor", + "serde_json", + "sha3", + "sp-application-crypto", + "sp-consensus-beefy-etf", "sp-core", - "sp-genesis-builder", - "sp-inherents", - "sp-offchain", + "sp-keyring", "sp-runtime", - "sp-session", - "sp-std 8.0.0", - "sp-storage 13.0.0", - "sp-transaction-pool", - "sp-version", - "substrate-wasm-builder", + "subxt", + "subxt-signer", + "tokio", + "totp-rs", + "w3f-bls", ] +[[package]] +name = "no-std-net" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43794a0ace135be66a25d3ae77d41b91615fb68ae937f904090203e81f755b65" + [[package]] name = "nodrop" version = "0.1.14" @@ -3618,14 +2793,13 @@ dependencies = [ ] [[package]] -name = "num-bigint" -version = "0.2.6" +name = "nu-ansi-term" +version = "0.46.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "090c7f9998ee0ff65aa5b723e4009f7b217707f1fb5ea551329cc4d6231fb304" +checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" dependencies = [ - "autocfg 1.1.0", - "num-integer", - "num-traits", + "overload", + "winapi", ] [[package]] @@ -3634,19 +2808,9 @@ version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "608e7659b5c3d7cba262d894801b9ec9d00de989e8a82bd4bef91d08da45cdc0" dependencies = [ - "autocfg 1.1.0", + "autocfg", "num-integer", "num-traits", - "serde", -] - -[[package]] -name = "num-complex" -version = "0.4.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23c6602fda94a57c990fe0df199a035d83576b496aa29f4e634a8ac6004e68a6" -dependencies = [ - "num-traits", ] [[package]] @@ -3674,8 +2838,8 @@ version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0638a1c9d0a3c0914158145bc76cff373a75a627e6ecbfb71cbe6f453a5a19b0" dependencies = [ - "autocfg 1.1.0", - "num-bigint 0.4.4", + "autocfg", + "num-bigint", "num-integer", "num-traits", ] @@ -3686,7 +2850,7 @@ version = "0.2.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "da0df0e5185db44f69b44f26786fe401b6c293d1907744beaa7fa62b2e5a517a" dependencies = [ - "autocfg 1.1.0", + "autocfg", ] [[package]] @@ -3705,428 +2869,57 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "830b246a0e5f20af87141b25c173cd1b609bd7779a4617d6ec582abaf90870f3" -[[package]] -name = "object" -version = "0.30.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03b4680b86d9cfafba8fc491dc9b6df26b68cf40e9e6cd73909194759a63c385" -dependencies = [ - "crc32fast", - "hashbrown 0.13.2", - "indexmap 1.9.3", - "memchr", -] - [[package]] name = "object" version = "0.32.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a6a622008b6e321afc04970976f62ee297fdbaa6f95318ca343e3eebb9648441" dependencies = [ - "memchr", -] - -[[package]] -name = "once_cell" -version = "1.19.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" - -[[package]] -name = "opaque-debug" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2839e79665f131bdb5782e51f2c6c9599c133c6098982a54c794358bf432529c" - -[[package]] -name = "opaque-debug" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" - -[[package]] -name = "openssl-probe" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" - -[[package]] -name = "otp-wallet-client" -version = "0.1.0" -dependencies = [ - "ckb-merkle-mountain-range", - "clap", - "etf-crypto-primitives 0.2.4", - "frame-support", - "indicatif", - "node-runtime", - "parity-scale-codec", - "rand_chacha 0.3.1", - "serde", - "serde_cbor", - "serde_json", - "sha3 0.10.8", - "sp-core", - "sp-keyring", - "sp-runtime", - "subxt", - "subxt-signer", - "tokio", - "totp-rs", -] - -[[package]] -name = "p256" -version = "0.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51f44edd08f51e2ade572f141051021c5af22677e42b7dd28a88155151c33594" -dependencies = [ - "ecdsa 0.14.8", - "elliptic-curve 0.12.3", - "sha2 0.10.8", -] - -[[package]] -name = "pairing-plus" -version = "0.20.1" -dependencies = [ - "byteorder 1.5.0 (git+https://github.com/ideal-lab5/byteorder)", - "core2", - "digest 0.8.1", - "ff 0.6.3", - "rand 0.4.6", - "rand_core 0.5.1", - "rand_xorshift 0.2.0", - "zeroize", -] - -[[package]] -name = "pallet-authorship" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/polkadot-sdk.git?tag=v1.4.0-rc1#00395a23d12bdda60499083ad578738da267efd0" -dependencies = [ - "frame-support", - "frame-system", - "impl-trait-for-tuples", - "parity-scale-codec", - "scale-info", - "sp-runtime", - "sp-std 8.0.0", -] - -[[package]] -name = "pallet-balances" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/polkadot-sdk.git?tag=v1.4.0-rc1#00395a23d12bdda60499083ad578738da267efd0" -dependencies = [ - "frame-benchmarking", - "frame-support", - "frame-system", - "log", - "parity-scale-codec", - "scale-info", - "sp-runtime", - "sp-std 8.0.0", -] - -[[package]] -name = "pallet-contracts" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/polkadot-sdk.git?tag=v1.4.0-rc1#00395a23d12bdda60499083ad578738da267efd0" -dependencies = [ - "bitflags 1.3.2", - "environmental", - "frame-benchmarking", - "frame-support", - "frame-system", - "impl-trait-for-tuples", - "log", - "pallet-balances", - "pallet-contracts-primitives", - "pallet-contracts-proc-macro", - "parity-scale-codec", - "rand 0.8.5", - "scale-info", - "serde", - "smallvec", - "sp-api", - "sp-core", - "sp-io", - "sp-runtime", - "sp-std 8.0.0", - "staging-xcm", - "staging-xcm-builder", - "wasm-instrument", - "wasmi", -] - -[[package]] -name = "pallet-contracts-primitives" -version = "24.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?tag=v1.4.0-rc1#00395a23d12bdda60499083ad578738da267efd0" -dependencies = [ - "bitflags 1.3.2", - "parity-scale-codec", - "scale-info", - "sp-runtime", - "sp-std 8.0.0", - "sp-weights", -] - -[[package]] -name = "pallet-contracts-proc-macro" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/polkadot-sdk.git?tag=v1.4.0-rc1#00395a23d12bdda60499083ad578738da267efd0" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.52", -] - -[[package]] -name = "pallet-etf" -version = "4.0.0-dev" -dependencies = [ - "ark-bls12-381", - "ark-serialize", - "array-bytes 4.2.0", - "etf-crypto-primitives 0.2.3", - "frame-benchmarking", - "frame-support", - "frame-system", - "log", - "pallet-etf-aura", - "parity-scale-codec", - "primitive-types", - "scale-info", - "serde", - "sp-consensus-etf-aura", - "sp-core", - "sp-io", - "sp-runtime", - "sp-std 8.0.0", -] - -[[package]] -name = "pallet-etf-aura" -version = "4.0.0-dev" -dependencies = [ - "frame-support", - "frame-system", - "log", - "pallet-timestamp", - "parity-scale-codec", - "scale-info", - "sp-application-crypto", - "sp-consensus-etf-aura", - "sp-runtime", - "sp-std 8.0.0", -] - -[[package]] -name = "pallet-grandpa" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/polkadot-sdk.git?tag=v1.4.0-rc1#00395a23d12bdda60499083ad578738da267efd0" -dependencies = [ - "frame-benchmarking", - "frame-support", - "frame-system", - "log", - "pallet-authorship", - "pallet-session", - "parity-scale-codec", - "scale-info", - "sp-application-crypto", - "sp-consensus-grandpa", - "sp-core", - "sp-io", - "sp-runtime", - "sp-session", - "sp-staking", - "sp-std 8.0.0", -] - -[[package]] -name = "pallet-insecure-randomness-collective-flip" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/polkadot-sdk.git?tag=v1.4.0-rc1#00395a23d12bdda60499083ad578738da267efd0" -dependencies = [ - "frame-support", - "frame-system", - "parity-scale-codec", - "safe-mix", - "scale-info", - "sp-runtime", - "sp-std 8.0.0", -] - -[[package]] -name = "pallet-otp" -version = "4.0.0-dev" -dependencies = [ - "ark-bls12-381", - "ark-serialize", - "array-bytes 4.2.0", - "ckb-merkle-mountain-range", - "etf-crypto-primitives 0.2.3", - "frame-support", - "frame-system", - "log", - "pallet-etf", - "pallet-etf-aura", - "pallet-proxy", - "parity-scale-codec", - "primitive-types", - "scale-info", - "serde", - "sha3 0.10.8", - "sp-consensus-etf-aura", - "sp-core", - "sp-io", - "sp-runtime", - "sp-std 8.0.0", -] - -[[package]] -name = "pallet-preimage" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/polkadot-sdk.git?tag=v1.4.0-rc1#00395a23d12bdda60499083ad578738da267efd0" -dependencies = [ - "frame-benchmarking", - "frame-support", - "frame-system", - "log", - "parity-scale-codec", - "scale-info", - "sp-core", - "sp-io", - "sp-runtime", - "sp-std 8.0.0", -] - -[[package]] -name = "pallet-proxy" -version = "28.1.0" -dependencies = [ - "frame-benchmarking", - "frame-support", - "frame-system", - "parity-scale-codec", - "scale-info", - "sp-io", - "sp-runtime", - "sp-std 8.0.0", -] - -[[package]] -name = "pallet-scheduler" -version = "4.0.0-dev" -dependencies = [ - "docify", - "frame-benchmarking", - "frame-support", - "frame-system", - "log", - "pallet-etf", - "parity-scale-codec", - "scale-info", - "sp-io", - "sp-runtime", - "sp-std 8.0.0", - "sp-weights", -] - -[[package]] -name = "pallet-session" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/polkadot-sdk.git?tag=v1.4.0-rc1#00395a23d12bdda60499083ad578738da267efd0" -dependencies = [ - "frame-support", - "frame-system", - "impl-trait-for-tuples", - "log", - "pallet-timestamp", - "parity-scale-codec", - "scale-info", - "sp-core", - "sp-io", - "sp-runtime", - "sp-session", - "sp-staking", - "sp-state-machine", - "sp-std 8.0.0", - "sp-trie", + "memchr", ] [[package]] -name = "pallet-sudo" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/polkadot-sdk.git?tag=v1.4.0-rc1#00395a23d12bdda60499083ad578738da267efd0" -dependencies = [ - "docify", - "frame-benchmarking", - "frame-support", - "frame-system", - "parity-scale-codec", - "scale-info", - "sp-io", - "sp-runtime", - "sp-std 8.0.0", -] +name = "once_cell" +version = "1.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" [[package]] -name = "pallet-timestamp" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/polkadot-sdk.git?tag=v1.4.0-rc1#00395a23d12bdda60499083ad578738da267efd0" -dependencies = [ - "docify", - "frame-benchmarking", - "frame-support", - "frame-system", - "log", - "parity-scale-codec", - "scale-info", - "sp-inherents", - "sp-io", - "sp-runtime", - "sp-std 8.0.0", - "sp-storage 13.0.0", - "sp-timestamp", -] +name = "opaque-debug" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" [[package]] -name = "pallet-transaction-payment" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/polkadot-sdk.git?tag=v1.4.0-rc1#00395a23d12bdda60499083ad578738da267efd0" -dependencies = [ - "frame-support", - "frame-system", - "parity-scale-codec", - "scale-info", - "serde", - "sp-core", - "sp-io", - "sp-runtime", - "sp-std 8.0.0", -] +name = "openssl-probe" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" [[package]] -name = "pallet-transaction-payment-rpc-runtime-api" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/polkadot-sdk.git?tag=v1.4.0-rc1#00395a23d12bdda60499083ad578738da267efd0" +name = "overload" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" + +[[package]] +name = "parity-bip39" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e69bf016dc406eff7d53a7d3f7cf1c2e72c82b9088aac1118591e36dd2cd3e9" dependencies = [ - "pallet-transaction-payment", - "parity-scale-codec", - "sp-api", - "sp-runtime", - "sp-weights", + "bitcoin_hashes 0.13.0", + "rand", + "rand_core", + "serde", + "unicode-normalization", ] [[package]] name = "parity-scale-codec" -version = "3.6.9" +version = "3.6.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "881331e34fa842a2fb61cc2db9643a8fedc615e47cfcc52597d1af0db9a7e8fe" +checksum = "306800abfa29c7f16596b5970a588435e3d5b3149683d00c12b699cc19f895ee" dependencies = [ "arrayvec 0.7.4", "bitvec", @@ -4139,11 +2932,11 @@ dependencies = [ [[package]] name = "parity-scale-codec-derive" -version = "3.6.9" +version = "3.6.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be30eaf4b0a9fba5336683b38de57bb86d179a35862ba6bfcf57625d006bde5b" +checksum = "d830939c76d294956402033aee57a6da7b438f2294eb94864c37b0569053a42c" dependencies = [ - "proc-macro-crate 2.0.0", + "proc-macro-crate 3.1.0", "proc-macro2", "quote", "syn 1.0.109", @@ -4185,19 +2978,21 @@ dependencies = [ ] [[package]] -name = "paste" -version = "1.0.14" +name = "password-hash" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de3145af08024dea9fa9914f381a17b8fc6034dfb00f3a84013f7ff43f29ed4c" +checksum = "346f04948ba92c43e8469c1ee6736c7563d71012b17d40745260fe106aac2166" +dependencies = [ + "base64ct", + "rand_core", + "subtle", +] [[package]] -name = "pbkdf2" -version = "0.8.0" +name = "paste" +version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d95f5254224e617595d2cc3cc73ff0a5eaf2637519e25f03388154e9378b6ffa" -dependencies = [ - "crypto-mac 0.11.0", -] +checksum = "de3145af08024dea9fa9914f381a17b8fc6034dfb00f3a84013f7ff43f29ed4c" [[package]] name = "pbkdf2" @@ -4206,6 +3001,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f8ed6a7761f76e3b9f92dfb0a60a6a6477c61024b775147ff0973a02653abaf2" dependencies = [ "digest 0.10.7", + "password-hash", ] [[package]] @@ -4231,14 +3027,14 @@ checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" dependencies = [ "proc-macro2", "quote", - "syn 2.0.52", + "syn 2.0.60", ] [[package]] name = "pin-project-lite" -version = "0.2.13" +version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8afb450f006bf6385ca15ef45d71d2288452bc3683ce2e2cacc0d18e4be60b58" +checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02" [[package]] name = "pin-utils" @@ -4257,114 +3053,80 @@ dependencies = [ "futures-io", ] -[[package]] -name = "pkcs8" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9eca2c590a5f85da82668fa685c09ce2888b9430e83299debf1f34b65fd4a4ba" -dependencies = [ - "der 0.6.1", - "spki 0.6.0", -] - [[package]] name = "pkcs8" version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" dependencies = [ - "der 0.7.8", - "spki 0.7.3", + "der", + "spki", ] -[[package]] -name = "pkg-config" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec" - [[package]] name = "platforms" -version = "3.3.0" +version = "3.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "626dec3cac7cc0e1577a2ec3fc496277ec2baa084bebad95bb6fdbfae235f84c" +checksum = "db23d408679286588f4d4644f965003d056e3dd5abcaaa938116871d7ce2fee7" [[package]] -name = "polkadot-core-primitives" -version = "1.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?tag=v1.4.0-rc1#00395a23d12bdda60499083ad578738da267efd0" -dependencies = [ - "parity-scale-codec", - "scale-info", - "sp-core", - "sp-runtime", - "sp-std 8.0.0", -] - -[[package]] -name = "polkadot-parachain-primitives" -version = "1.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?tag=v1.4.0-rc1#00395a23d12bdda60499083ad578738da267efd0" +name = "polkadot-ckb-merkle-mountain-range" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4b44320e5f7ce2c18227537a3032ae5b2c476a7e8eddba45333e1011fc31b92" dependencies = [ - "bounded-collections", - "derive_more", - "parity-scale-codec", - "polkadot-core-primitives", - "scale-info", - "serde", - "sp-core", - "sp-runtime", - "sp-std 8.0.0", - "sp-weights", + "cfg-if", + "itertools 0.10.5", ] [[package]] name = "polkavm-common" -version = "0.8.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92c99f7eee94e7be43ba37eef65ad0ee8cbaf89b7c00001c3f6d2be985cb1817" +checksum = "1d9428a5cfcc85c5d7b9fc4b6a18c4b802d0173d768182a51cc7751640f08b92" [[package]] name = "polkavm-derive" -version = "0.8.0" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79fa916f7962348bd1bb1a65a83401675e6fc86c51a0fdbcf92a3108e58e6125" +checksum = "ae8c4bea6f3e11cd89bb18bcdddac10bd9a24015399bd1c485ad68a985a19606" dependencies = [ "polkavm-derive-impl-macro", ] [[package]] name = "polkavm-derive-impl" -version = "0.8.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c10b2654a8a10a83c260bfb93e97b262cf0017494ab94a65d389e0eda6de6c9c" +checksum = "5c4fdfc49717fb9a196e74a5d28e0bc764eb394a2c803eb11133a31ac996c60c" dependencies = [ "polkavm-common", "proc-macro2", "quote", - "syn 2.0.52", + "syn 2.0.60", ] [[package]] name = "polkavm-derive-impl-macro" -version = "0.8.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15e85319a0d5129dc9f021c62607e0804f5fb777a05cdda44d750ac0732def66" +checksum = "8ba81f7b5faac81e528eb6158a6f3c9e0bb1008e0ffa19653bc8dea925ecb429" dependencies = [ "polkavm-derive-impl", - "syn 2.0.52", + "syn 2.0.60", ] [[package]] name = "polling" -version = "3.5.0" +version = "3.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24f040dee2588b4963afb4e420540439d126f73fdacf4a9c486a96d840bac3c9" +checksum = "645493cf344456ef24219d02a768cf1fb92ddf8c92161679ae3d91b91a637be3" dependencies = [ "cfg-if", "concurrent-queue", + "hermit-abi", "pin-project-lite", - "rustix 0.38.31", + "rustix", "tracing", "windows-sys 0.52.0", ] @@ -4376,7 +3138,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8159bd90725d2df49889a078b54f4f79e87f1f8a8444194cdca81d38f5393abf" dependencies = [ "cpufeatures", - "opaque-debug 0.3.1", + "opaque-debug", "universal-hash", ] @@ -4388,7 +3150,7 @@ checksum = "9d1fe60d06143b2430aa532c94cfe9e29783047f06c0d7fd359a9a51b729fa25" dependencies = [ "cfg-if", "cpufeatures", - "opaque-debug 0.3.1", + "opaque-debug", "universal-hash", ] @@ -4411,7 +3173,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "22020dfcf177fcc7bf5deaf7440af371400c67c0de14c399938d8ed4fb4645d3" dependencies = [ "proc-macro2", - "syn 2.0.52", + "syn 2.0.60", ] [[package]] @@ -4428,311 +3190,118 @@ dependencies = [ ] [[package]] -name = "proc-macro-crate" -version = "1.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f4c021e1093a56626774e81216a4ce732a735e5bad4868a03f3ed65ca0c3919" -dependencies = [ - "once_cell", - "toml_edit 0.19.15", -] - -[[package]] -name = "proc-macro-crate" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e8366a6159044a37876a2b9817124296703c586a5c92e2c53751fa06d8d43e8" -dependencies = [ - "toml_edit 0.20.7", -] - -[[package]] -name = "proc-macro-crate" -version = "3.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d37c51ca738a55da99dc0c4a34860fd675453b8b36209178c2249bb13651284" -dependencies = [ - "toml_edit 0.21.1", -] - -[[package]] -name = "proc-macro-error" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" -dependencies = [ - "proc-macro-error-attr", - "proc-macro2", - "quote", - "syn 1.0.109", - "version_check", -] - -[[package]] -name = "proc-macro-error-attr" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" -dependencies = [ - "proc-macro2", - "quote", - "version_check", -] - -[[package]] -name = "proc-macro-warning" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "834da187cfe638ae8abb0203f0b33e5ccdb02a28e7199f2f47b3e2754f50edca" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.52", -] - -[[package]] -name = "proc-macro2" -version = "1.0.78" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2422ad645d89c99f8f3e6b88a9fdeca7fabeac836b1002371c4367c8f984aae" -dependencies = [ - "unicode-ident", -] - -[[package]] -name = "psm" -version = "0.1.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5787f7cda34e3033a72192c018bc5883100330f362ef279a8cbccfce8bb4e874" -dependencies = [ - "cc", -] - -[[package]] -name = "quote" -version = "1.0.35" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "291ec9ab5efd934aaf503a6466c5d5251535d108ee747472c3977cc5acc868ef" -dependencies = [ - "proc-macro2", -] - -[[package]] -name = "radium" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" - -[[package]] -name = "rand" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "552840b97013b1a26992c11eac34bdd778e464601a4c2054b5f0bff7c6761293" -dependencies = [ - "fuchsia-cprng", - "libc", - "rand_core 0.3.1", - "rdrand", - "winapi", -] - -[[package]] -name = "rand" -version = "0.6.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d71dacdc3c88c1fde3885a3be3fbab9f35724e6ce99467f7d9c5026132184ca" -dependencies = [ - "autocfg 0.1.8", - "libc", - "rand_chacha 0.1.1", - "rand_core 0.4.2", - "rand_hc 0.1.0", - "rand_isaac", - "rand_jitter", - "rand_os", - "rand_pcg", - "rand_xorshift 0.1.1", - "winapi", -] - -[[package]] -name = "rand" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" -dependencies = [ - "getrandom 0.1.16", - "libc", - "rand_chacha 0.2.2", - "rand_core 0.5.1", - "rand_hc 0.2.0", -] - -[[package]] -name = "rand" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" -dependencies = [ - "libc", - "rand_chacha 0.3.1", - "rand_core 0.6.4", -] - -[[package]] -name = "rand_chacha" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "556d3a1ca6600bfcbab7c7c91ccb085ac7fbbcd70e008a98742e7847f4f7bcef" -dependencies = [ - "autocfg 0.1.8", - "rand_core 0.3.1", -] - -[[package]] -name = "rand_chacha" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" -dependencies = [ - "ppv-lite86", - "rand_core 0.5.1", -] - -[[package]] -name = "rand_chacha" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" -dependencies = [ - "ppv-lite86", - "rand_core 0.6.4", -] - -[[package]] -name = "rand_core" -version = "0.3.1" +name = "proc-macro-crate" +version = "1.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a6fdeb83b075e8266dcc8762c22776f6877a63111121f5f8c7411e5be7eed4b" +checksum = "7f4c021e1093a56626774e81216a4ce732a735e5bad4868a03f3ed65ca0c3919" dependencies = [ - "rand_core 0.4.2", + "once_cell", + "toml_edit 0.19.15", ] [[package]] -name = "rand_core" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c33a3c44ca05fa6f1807d8e6743f3824e8509beca625669633be0acbdf509dc" - -[[package]] -name = "rand_core" -version = "0.5.1" +name = "proc-macro-crate" +version = "3.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" +checksum = "6d37c51ca738a55da99dc0c4a34860fd675453b8b36209178c2249bb13651284" dependencies = [ - "getrandom 0.1.16", + "toml_edit 0.21.1", ] [[package]] -name = "rand_core" -version = "0.6.4" +name = "proc-macro-error" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" dependencies = [ - "getrandom 0.2.12", + "proc-macro-error-attr", + "proc-macro2", + "quote", + "syn 1.0.109", + "version_check", ] [[package]] -name = "rand_hc" -version = "0.1.0" +name = "proc-macro-error-attr" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b40677c7be09ae76218dc623efbf7b18e34bced3f38883af07bb75630a21bc4" +checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" dependencies = [ - "rand_core 0.3.1", + "proc-macro2", + "quote", + "version_check", ] [[package]] -name = "rand_hc" -version = "0.2.0" +name = "proc-macro-warning" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" +checksum = "834da187cfe638ae8abb0203f0b33e5ccdb02a28e7199f2f47b3e2754f50edca" dependencies = [ - "rand_core 0.5.1", + "proc-macro2", + "quote", + "syn 2.0.60", ] [[package]] -name = "rand_isaac" -version = "0.1.1" +name = "proc-macro2" +version = "1.0.81" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ded997c9d5f13925be2a6fd7e66bf1872597f759fd9dd93513dd7e92e5a5ee08" +checksum = "3d1597b0c024618f09a9c3b8655b7e430397a36d23fdafec26d6965e9eec3eba" dependencies = [ - "rand_core 0.3.1", + "unicode-ident", ] [[package]] -name = "rand_jitter" -version = "0.1.4" +name = "quote" +version = "1.0.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1166d5c91dc97b88d1decc3285bb0a99ed84b05cfd0bc2341bdf2d43fc41e39b" +checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7" dependencies = [ - "libc", - "rand_core 0.4.2", - "winapi", + "proc-macro2", ] [[package]] -name = "rand_os" -version = "0.1.3" +name = "radium" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b75f676a1e053fc562eafbb47838d67c84801e38fc1ba459e8f180deabd5071" -dependencies = [ - "cloudabi", - "fuchsia-cprng", - "libc", - "rand_core 0.4.2", - "rdrand", - "winapi", -] +checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" [[package]] -name = "rand_pcg" -version = "0.1.2" +name = "rand" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "abf9b09b01790cfe0364f52bf32995ea3c39f4d2dd011eac241d2914146d0b44" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" dependencies = [ - "autocfg 0.1.8", - "rand_core 0.4.2", + "libc", + "rand_chacha", + "rand_core", ] [[package]] -name = "rand_xorshift" -version = "0.1.1" +name = "rand_chacha" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cbf7e9e623549b0e21f6e97cf8ecf247c1a8fd2e8a992ae265314300b2455d5c" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" dependencies = [ - "rand_core 0.3.1", + "ppv-lite86", + "rand_core", ] [[package]] -name = "rand_xorshift" -version = "0.2.0" +name = "rand_core" +version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77d416b86801d23dde1aa643023b775c3a462efc0ed96443add11546cdf1dca8" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" dependencies = [ - "rand_core 0.5.1", + "getrandom", ] -[[package]] -name = "rawpointer" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60a357793950651c4ed0f3f52338f53b2f809f32d83a07f72909fa13e4c6c1e3" - [[package]] name = "rayon" -version = "1.9.0" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4963ed1bc86e4f3ee217022bd855b297cef07fb9eac5dfa1f788b220b49b3bd" +checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa" dependencies = [ "either", "rayon-core", @@ -4748,15 +3317,6 @@ dependencies = [ "crossbeam-utils", ] -[[package]] -name = "rdrand" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "678054eb77286b51581ba43620cc911abf02758c91f93f479767aed0f90458b2" -dependencies = [ - "rand_core 0.3.1", -] - [[package]] name = "redox_syscall" version = "0.4.1" @@ -4783,19 +3343,19 @@ checksum = "5fddb4f8d99b0a2ebafc65a87a69a7b9875e4b1ae1f00db265d300ef7f28bccc" dependencies = [ "proc-macro2", "quote", - "syn 2.0.52", + "syn 2.0.60", ] [[package]] name = "regex" -version = "1.10.3" +version = "1.10.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b62dbe01f0b06f9d8dc7d49e05a0785f153b00b2c227856282f671e0318c9b15" +checksum = "c117dbdfde9c8308975b6a18d71f3f385c89461f7b3fb054288ecf2a2058ba4c" dependencies = [ "aho-corasick", "memchr", "regex-automata 0.4.6", - "regex-syntax 0.8.2", + "regex-syntax 0.8.3", ] [[package]] @@ -4815,7 +3375,7 @@ checksum = "86b83b8b9847f9bf95ef68afb0b8e6cdb80f498442f5179a29fad448fcc1eaea" dependencies = [ "aho-corasick", "memchr", - "regex-syntax 0.8.2", + "regex-syntax 0.8.3", ] [[package]] @@ -4826,20 +3386,9 @@ checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" [[package]] name = "regex-syntax" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" - -[[package]] -name = "rfc6979" -version = "0.3.1" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7743f17af12fa0b03b803ba12cd6a8d9483a587e89c69445e3909655c0b9fabb" -dependencies = [ - "crypto-bigint 0.4.9", - "hmac 0.12.1", - "zeroize", -] +checksum = "adad44e29e4c806119491a7f06f03de4d1af22c3a680dd47f1e6e179439d1f56" [[package]] name = "rfc6979" @@ -4864,7 +3413,7 @@ dependencies = [ "blake2", "common", "fflonk", - "merlin 3.0.0", + "merlin", ] [[package]] @@ -4875,7 +3424,7 @@ checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d" dependencies = [ "cc", "cfg-if", - "getrandom 0.2.12", + "getrandom", "libc", "spin", "untrusted", @@ -4900,56 +3449,33 @@ version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3e75f6a532d0fd9f7f13144f392b6ad56a32696bfcd9c78f797f16bbb6f072d6" -[[package]] -name = "rustc_version" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a" -dependencies = [ - "semver 0.9.0", -] - [[package]] name = "rustc_version" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" dependencies = [ - "semver 1.0.22", -] - -[[package]] -name = "rustix" -version = "0.36.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "305efbd14fde4139eb501df5f136994bb520b033fa9fbdce287507dc23b8c7ed" -dependencies = [ - "bitflags 1.3.2", - "errno", - "io-lifetimes", - "libc", - "linux-raw-sys 0.1.4", - "windows-sys 0.45.0", + "semver", ] [[package]] name = "rustix" -version = "0.38.31" +version = "0.38.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ea3e1a662af26cd7a3ba09c0297a31af215563ecf42817c98df621387f4e949" +checksum = "70dc5ec042f7a43c4a73241207cecc9873a06d45debb38b329f8541d85c2730f" dependencies = [ - "bitflags 2.4.2", + "bitflags 2.5.0", "errno", "libc", - "linux-raw-sys 0.4.13", + "linux-raw-sys", "windows-sys 0.52.0", ] [[package]] name = "rustls" -version = "0.21.10" +version = "0.21.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9d5a6813c0759e4609cd494e8e725babae6a2ca7b62a5536a13daaec6fcb7ba" +checksum = "7fecbfb7b1444f477b345853b1fce097a2c6fb637b2bfb87e6bc5db0f043fae4" dependencies = [ "log", "ring 0.17.8", @@ -4959,14 +3485,14 @@ dependencies = [ [[package]] name = "rustls" -version = "0.22.2" +version = "0.22.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e87c9956bd9807afa1f77e0f7594af32566e830e088a5576d27c5b6f30f49d41" +checksum = "bf4ef73721ac7bcd79b2b315da7779d8fc09718c6b3d2d1b2d94850eb8c18432" dependencies = [ "log", "ring 0.17.8", "rustls-pki-types", - "rustls-webpki 0.102.2", + "rustls-webpki 0.102.3", "subtle", "zeroize", ] @@ -4990,7 +3516,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8f1fb85efa936c42c6d5fc28d2629bb51e4b2f4b8a5211e297d599cc5a093792" dependencies = [ "openssl-probe", - "rustls-pemfile 2.1.1", + "rustls-pemfile 2.1.2", "rustls-pki-types", "schannel", "security-framework", @@ -5007,19 +3533,19 @@ dependencies = [ [[package]] name = "rustls-pemfile" -version = "2.1.1" +version = "2.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f48172685e6ff52a556baa527774f61fcaa884f59daf3375c62a3f1cd2549dab" +checksum = "29993a25686778eb88d4189742cd713c9bce943bc54251a33509dc63cbacf73d" dependencies = [ - "base64 0.21.7", + "base64 0.22.0", "rustls-pki-types", ] [[package]] name = "rustls-pki-types" -version = "1.3.1" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ede67b28608b4c60685c7d54122d4400d90f62b40caee7700e700380a390fa8" +checksum = "beb461507cee2c2ff151784c52762cf4d9ff6a61f3e80968600ed24fa837fa54" [[package]] name = "rustls-webpki" @@ -5033,9 +3559,9 @@ dependencies = [ [[package]] name = "rustls-webpki" -version = "0.102.2" +version = "0.102.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "faaa0a62740bedb9b2ef5afa303da42764c012f743917351dc9a237ea1663610" +checksum = "f3bce581c0dd41bce533ce695a1437fa16a7ab5ac3ccfa99fe1a620a7885eabf" dependencies = [ "ring 0.17.8", "rustls-pki-types", @@ -5044,9 +3570,9 @@ dependencies = [ [[package]] name = "rustversion" -version = "1.0.14" +version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ffc183a10b4478d04cbbbfc96d0873219d962dd5accaff2ffbd4ceb7df837f4" +checksum = "80af6f9131f277a45a3fba6ce8e2258037bb0477a67e610d3c1fe046ab31de47" [[package]] name = "ruzstd" @@ -5054,7 +3580,7 @@ version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "58c4eb8a81997cf040a091d1f7e1938aeab6749d3a0dfa73af43cdc32393483d" dependencies = [ - "byteorder 1.5.0 (registry+https://github.com/rust-lang/crates.io-index)", + "byteorder", "derive_more", "twox-hash", ] @@ -5065,24 +3591,6 @@ version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e86697c916019a8588c99b5fac3cead74ec0b4b819707a682fd4d23fa0ce1ba1" -[[package]] -name = "safe-mix" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d3d055a2582e6b00ed7a31c1524040aa391092bf636328350813f3a0605215c" -dependencies = [ - "rustc_version 0.2.3", -] - -[[package]] -name = "safe_arch" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f398075ce1e6a179b46f51bd88d0598b92b00d3551f1a2d4ac49e771b56ac354" -dependencies = [ - "bytemuck", -] - [[package]] name = "same-file" version = "1.0.6" @@ -5094,38 +3602,38 @@ dependencies = [ [[package]] name = "scale-bits" -version = "0.4.0" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "036575c29af9b6e4866ffb7fa055dbf623fe7a9cc159b33786de6013a6969d89" +checksum = "662d10dcd57b1c2a3c41c9cf68f71fb09747ada1ea932ad961aca7e2ca28315f" dependencies = [ "parity-scale-codec", "scale-info", + "scale-type-resolver", "serde", ] [[package]] name = "scale-decode" -version = "0.10.0" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7caaf753f8ed1ab4752c6afb20174f03598c664724e0e32628e161c21000ff76" +checksum = "afc79ba56a1c742f5aeeed1f1801f3edf51f7e818f0a54582cac6f131364ea7b" dependencies = [ "derive_more", "parity-scale-codec", "primitive-types", "scale-bits", "scale-decode-derive", - "scale-info", + "scale-type-resolver", "smallvec", ] [[package]] name = "scale-decode-derive" -version = "0.10.0" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3475108a1b62c7efd1b5c65974f30109a598b2f45f23c9ae030acb9686966db" +checksum = "5398fdb3c7bea3cb419bac4983aadacae93fe1a7b5f693f4ebd98c3821aad7a5" dependencies = [ "darling 0.14.4", - "proc-macro-crate 1.3.1", "proc-macro2", "quote", "syn 1.0.109", @@ -5133,24 +3641,24 @@ dependencies = [ [[package]] name = "scale-encode" -version = "0.5.0" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d70cb4b29360105483fac1ed567ff95d65224a14dd275b6303ed0a654c78de5" +checksum = "628800925a33794fb5387781b883b5e14d130fece9af5a63613867b8de07c5c7" dependencies = [ "derive_more", "parity-scale-codec", "primitive-types", "scale-bits", "scale-encode-derive", - "scale-info", + "scale-type-resolver", "smallvec", ] [[package]] name = "scale-encode-derive" -version = "0.5.0" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "995491f110efdc6bea96d6a746140e32bfceb4ea47510750a5467295a4707a25" +checksum = "7a304e1af7cdfbe7a24e08b012721456cc8cecdedadc14b3d10513eada63233c" dependencies = [ "darling 0.14.4", "proc-macro-crate 1.3.1", @@ -5161,9 +3669,9 @@ dependencies = [ [[package]] name = "scale-info" -version = "2.10.0" +version = "2.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f7d66a1128282b7ef025a8ead62a4a9fcf017382ec53b8ffbf4d7bf77bd3c60" +checksum = "7c453e59a955f81fb62ee5d596b450383d699f152d350e9d23a0db2adb78e4c0" dependencies = [ "bitvec", "cfg-if", @@ -5175,9 +3683,9 @@ dependencies = [ [[package]] name = "scale-info-derive" -version = "2.10.0" +version = "2.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "abf2c68b89cafb3b8d918dd07b42be0da66ff202cf1155c5739a4e0c1ea0dc19" +checksum = "18cf6c6447f813ef19eb450e985bcce6705f9ce7660db221b59093d15c79c4b7" dependencies = [ "proc-macro-crate 1.3.1", "proc-macro2", @@ -5186,23 +3694,33 @@ dependencies = [ ] [[package]] -name = "scale-typegen" +name = "scale-type-resolver" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00860983481ac590ac87972062909bef0d6a658013b592ccc0f2feb272feab11" +checksum = "10b800069bfd43374e0f96f653e0d46882a2cb16d6d961ac43bea80f26c76843" +dependencies = [ + "scale-info", + "smallvec", +] + +[[package]] +name = "scale-typegen" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d470fa75e71b12b3244a4113adc4bc49891f3daba2054703cacd06256066397e" dependencies = [ "proc-macro2", "quote", "scale-info", - "syn 2.0.52", + "syn 2.0.60", "thiserror", ] [[package]] name = "scale-value" -version = "0.13.0" +version = "0.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "58223c7691bf0bd46b43c9aea6f0472d1067f378d574180232358d7c6e0a8089" +checksum = "c07ccfee963104335c971aaf8b7b0e749be8569116322df23f1f75c4ca9e4a28" dependencies = [ "base58", "blake2", @@ -5214,6 +3732,7 @@ dependencies = [ "scale-decode", "scale-encode", "scale-info", + "scale-type-resolver", "serde", "yap", ] @@ -5233,29 +3752,11 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "772575a524feeb803e5b0fcbc6dd9f367e579488197c94c6e4023aad2305774d" dependencies = [ - "ahash 0.8.11", + "ahash", "cfg-if", "hashbrown 0.13.2", ] -[[package]] -name = "schnorrkel" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "021b403afe70d81eea68f6ea12f6b3c9588e5d536a94c3bf80f15e7faa267862" -dependencies = [ - "arrayref", - "arrayvec 0.5.2", - "curve25519-dalek 2.1.3", - "getrandom 0.1.16", - "merlin 2.0.1", - "rand 0.7.3", - "rand_core 0.5.1", - "sha2 0.8.2", - "subtle", - "zeroize", -] - [[package]] name = "schnorrkel" version = "0.11.4" @@ -5265,10 +3766,10 @@ dependencies = [ "aead", "arrayref", "arrayvec 0.7.4", - "curve25519-dalek 4.1.2", + "curve25519-dalek", "getrandom_or_panic", - "merlin 3.0.0", - "rand_core 0.6.4", + "merlin", + "rand_core", "serde_bytes", "sha2 0.10.8", "subtle", @@ -5281,12 +3782,6 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" -[[package]] -name = "scratch" -version = "1.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3cf7c11c38cb994f3d40e8a8cde3bbd1f72a435e4c49e85d6553d8312306152" - [[package]] name = "sct" version = "0.7.1" @@ -5297,79 +3792,28 @@ dependencies = [ "untrusted", ] -[[package]] -name = "sec1" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3be24c1842290c45df0a7bf069e0c268a747ad05a192f2fd7dcfdbc1cba40928" -dependencies = [ - "base16ct 0.1.1", - "der 0.6.1", - "generic-array 0.14.7", - "pkcs8 0.9.0", - "subtle", - "zeroize", -] - [[package]] name = "sec1" version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc" dependencies = [ - "base16ct 0.2.0", - "der 0.7.8", - "generic-array 0.14.7", - "pkcs8 0.10.2", + "base16ct", + "der", + "generic-array", + "pkcs8", + "serdect", "subtle", "zeroize", ] -[[package]] -name = "secp256k1" -version = "0.20.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97d03ceae636d0fed5bae6a7f4f664354c5f4fcedf6eef053fef17e49f837d0a" -dependencies = [ - "rand 0.6.5", - "secp256k1-sys 0.4.2", - "serde", -] - -[[package]] -name = "secp256k1" -version = "0.24.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b1629c9c557ef9b293568b338dddfc8208c98a18c59d722a9d53f859d9c9b62" -dependencies = [ - "secp256k1-sys 0.6.1", -] - [[package]] name = "secp256k1" version = "0.28.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d24b59d129cdadea20aea4fb2352fa053712e5d713eee47d700cd4b2bc002f10" dependencies = [ - "secp256k1-sys 0.9.2", -] - -[[package]] -name = "secp256k1-sys" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "957da2573cde917463ece3570eab4a0b3f19de6f1646cde62e6fd3868f566036" -dependencies = [ - "cc", -] - -[[package]] -name = "secp256k1-sys" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83080e2c2fc1006e625be82e5d1eb6a43b7fd9578b617fcc55814daf286bba4b" -dependencies = [ - "cc", + "secp256k1-sys", ] [[package]] @@ -5392,9 +3836,9 @@ dependencies = [ [[package]] name = "security-framework" -version = "2.9.2" +version = "2.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05b64fb303737d99b81884b2c63433e9ae28abebe5eb5045dcdd175dc2ecf4de" +checksum = "770452e37cad93e0a50d5abc3990d2bc351c36d0328f86cefec2f2fb206eaef6" dependencies = [ "bitflags 1.3.2", "core-foundation", @@ -5405,52 +3849,25 @@ dependencies = [ [[package]] name = "security-framework-sys" -version = "2.9.1" +version = "2.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e932934257d3b408ed8f30db49d85ea163bfe74961f017f405b025af298f0c7a" +checksum = "41f3cc463c0ef97e11c3461a9d3787412d30e8e7eb907c79180c4a57bf7c04ef" dependencies = [ "core-foundation-sys", "libc", ] -[[package]] -name = "semver" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a3186ec9e65071a2095434b1f5bb24838d4e8e130f584c790f6033c79943537" -dependencies = [ - "semver-parser", -] - -[[package]] -name = "semver" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403" -dependencies = [ - "semver-parser", -] - [[package]] name = "semver" version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "92d43fe69e652f3df9bdc2b85b2854a0825b86e4fb76bc44d945137d053639ca" -dependencies = [ - "serde", -] - -[[package]] -name = "semver-parser" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" [[package]] name = "serde" -version = "1.0.197" +version = "1.0.198" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fb1c873e1b9b056a4dc4c0c198b24c3ffa059243875552b2bd0933b1aee4ce2" +checksum = "9846a40c979031340571da2545a4e5b7c4163bdae79b301d5f86d03979451fcc" dependencies = [ "serde_derive", ] @@ -5476,20 +3893,20 @@ dependencies = [ [[package]] name = "serde_derive" -version = "1.0.197" +version = "1.0.198" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7eb0b34b42edc17f6b7cac84a52a1c5f0e1bb2227e997ca9011ea3dd34e8610b" +checksum = "e88edab869b01783ba905e7d0153f9fc1a6505a96e4ad3018011eedb838566d9" dependencies = [ "proc-macro2", "quote", - "syn 2.0.52", + "syn 2.0.60", ] [[package]] name = "serde_json" -version = "1.0.114" +version = "1.0.116" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5f09b1bd632ef549eaa9f60a1f8de742bdbc698e6cee2095fc84dde5f549ae0" +checksum = "3e17db7126d17feb94eb3fad46bf1a96b034e8aacbc2e775fe81505f8b0b2813" dependencies = [ "itoa", "ryu", @@ -5505,6 +3922,16 @@ dependencies = [ "serde", ] +[[package]] +name = "serdect" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a84f14a19e9a014bb9f4512488d9829a68e04ecabffb0f9904cd1ace94598177" +dependencies = [ + "base16ct", + "serde", +] + [[package]] name = "sha-1" version = "0.9.8" @@ -5515,7 +3942,7 @@ dependencies = [ "cfg-if", "cpufeatures", "digest 0.9.0", - "opaque-debug 0.3.1", + "opaque-debug", ] [[package]] @@ -5529,18 +3956,6 @@ dependencies = [ "digest 0.10.7", ] -[[package]] -name = "sha2" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a256f46ea78a0c0d9ff00077504903ac881a1dafdc20da66545699e7776b3e69" -dependencies = [ - "block-buffer 0.7.3", - "digest 0.8.1", - "fake-simd", - "opaque-debug 0.2.3", -] - [[package]] name = "sha2" version = "0.9.9" @@ -5551,7 +3966,7 @@ dependencies = [ "cfg-if", "cpufeatures", "digest 0.9.0", - "opaque-debug 0.3.1", + "opaque-debug", ] [[package]] @@ -5565,18 +3980,6 @@ dependencies = [ "digest 0.10.7", ] -[[package]] -name = "sha3" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f81199417d4e5de3f04b1e871023acea7389672c4135918f05aa9cbf2f2fa809" -dependencies = [ - "block-buffer 0.9.0", - "digest 0.9.0", - "keccak", - "opaque-debug 0.3.1", -] - [[package]] name = "sha3" version = "0.10.8" @@ -5598,21 +4001,11 @@ dependencies = [ [[package]] name = "signal-hook-registry" -version = "1.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8229b473baa5980ac72ef434c4415e70c4b5e71b423043adb4ba059f89c99a1" -dependencies = [ - "libc", -] - -[[package]] -name = "signature" -version = "1.6.4" +version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74233d3b3b2f6d4b006dc19dee745e73e2a6bfb6f93607cd3b02bd5b00797d7c" +checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1" dependencies = [ - "digest 0.10.7", - "rand_core 0.6.4", + "libc", ] [[package]] @@ -5622,27 +4015,20 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" dependencies = [ "digest 0.10.7", - "rand_core 0.6.4", + "rand_core", ] [[package]] -name = "simba" -version = "0.8.1" +name = "simple-mermaid" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "061507c94fc6ab4ba1c9a0305018408e312e17c041eb63bef8aa726fa33aceae" -dependencies = [ - "approx", - "num-complex", - "num-traits", - "paste", - "wide", -] +checksum = "620a1d43d70e142b1d46a929af51d44f383db9c7a2ec122de2cd992ccfcf3c18" [[package]] name = "siphasher" -version = "1.0.0" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54ac45299ccbd390721be55b412d41931911f654fa99e2cb8bfb57184b2061fe" +checksum = "56199f7ddabf13fe5074ce809e7d3f42b42ae711800501b5b16ea82ad029c39d" [[package]] name = "slab" @@ -5650,14 +4036,14 @@ version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" dependencies = [ - "autocfg 1.1.0", + "autocfg", ] [[package]] name = "smallvec" -version = "1.13.1" +version = "1.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6ecd384b10a64542d77071bd64bd7b231f4ed5940fba55e98c3de13824cf3d7" +checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" [[package]] name = "smol" @@ -5669,7 +4055,7 @@ dependencies = [ "async-executor", "async-fs", "async-io", - "async-lock 3.3.0", + "async-lock", "async-net", "async-process", "blocking", @@ -5683,7 +4069,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e6d1eaa97d77be4d026a1e7ffad1bb3b78448763b357ea6f8188d3e6f736a9b9" dependencies = [ "arrayvec 0.7.4", - "async-lock 3.3.0", + "async-lock", "atomic-take", "base64 0.21.7", "bip39", @@ -5692,7 +4078,7 @@ dependencies = [ "chacha20", "crossbeam-queue", "derive_more", - "ed25519-zebra 4.0.3", + "ed25519-zebra", "either", "event-listener 4.0.3", "fnv", @@ -5704,23 +4090,23 @@ dependencies = [ "itertools 0.12.1", "libm", "libsecp256k1", - "merlin 3.0.0", + "merlin", "no-std-net", "nom", - "num-bigint 0.4.4", + "num-bigint", "num-rational", "num-traits", - "pbkdf2 0.12.2", + "pbkdf2", "pin-project", "poly1305", - "rand 0.8.5", - "rand_chacha 0.3.1", + "rand", + "rand_chacha", "ruzstd", - "schnorrkel 0.11.4", + "schnorrkel", "serde", "serde_json", "sha2 0.10.8", - "sha3 0.10.8", + "sha3", "siphasher", "slab", "smallvec", @@ -5738,7 +4124,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5496f2d116b7019a526b1039ec2247dd172b8670633b1a64a614c9ea12c9d8c7" dependencies = [ "async-channel", - "async-lock 3.3.0", + "async-lock", "base64 0.21.7", "blake2-rfc", "derive_more", @@ -5756,8 +4142,8 @@ dependencies = [ "no-std-net", "parking_lot", "pin-project", - "rand 0.8.5", - "rand_chacha 0.3.1", + "rand", + "rand_chacha", "serde", "serde_json", "siphasher", @@ -5788,26 +4174,28 @@ dependencies = [ "futures", "httparse", "log", - "rand 0.8.5", + "rand", "sha-1", ] [[package]] name = "sp-api" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/polkadot-sdk.git?tag=v1.4.0-rc1#00395a23d12bdda60499083ad578738da267efd0" +version = "26.0.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" dependencies = [ + "docify", "hash-db", "log", "parity-scale-codec", "scale-info", "sp-api-proc-macro", "sp-core", - "sp-externalities 0.19.0", + "sp-externalities 0.25.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", "sp-metadata-ir", "sp-runtime", + "sp-runtime-interface 24.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", "sp-state-machine", - "sp-std 8.0.0", + "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", "sp-trie", "sp-version", "thiserror", @@ -5815,42 +4203,43 @@ dependencies = [ [[package]] name = "sp-api-proc-macro" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/polkadot-sdk.git?tag=v1.4.0-rc1#00395a23d12bdda60499083ad578738da267efd0" +version = "15.0.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" dependencies = [ "Inflector", "blake2", "expander", - "proc-macro-crate 1.3.1", + "proc-macro-crate 3.1.0", "proc-macro2", "quote", - "syn 2.0.52", + "syn 2.0.60", ] [[package]] name = "sp-application-crypto" -version = "23.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?tag=v1.4.0-rc1#00395a23d12bdda60499083ad578738da267efd0" +version = "30.0.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" dependencies = [ "parity-scale-codec", "scale-info", "serde", "sp-core", "sp-io", - "sp-std 8.0.0", + "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", ] [[package]] name = "sp-arithmetic" -version = "16.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?tag=v1.4.0-rc1#00395a23d12bdda60499083ad578738da267efd0" +version = "23.0.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" dependencies = [ + "docify", "integer-sqrt", "num-traits", "parity-scale-codec", "scale-info", "serde", - "sp-std 8.0.0", + "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", "static_assertions", ] @@ -5873,118 +4262,66 @@ dependencies = [ ] [[package]] -name = "sp-block-builder" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/polkadot-sdk.git?tag=v1.4.0-rc1#00395a23d12bdda60499083ad578738da267efd0" -dependencies = [ - "sp-api", - "sp-inherents", - "sp-runtime", - "sp-std 8.0.0", -] - -[[package]] -name = "sp-consensus" -version = "0.10.0-dev" -source = "git+https://github.com/paritytech/polkadot-sdk.git?tag=v1.4.0-rc1#00395a23d12bdda60499083ad578738da267efd0" -dependencies = [ - "async-trait", - "futures", - "log", - "sp-core", - "sp-inherents", - "sp-runtime", - "sp-state-machine", - "thiserror", -] - -[[package]] -name = "sp-consensus-etf-aura" -version = "0.10.0-dev" -dependencies = [ - "async-trait", - "parity-scale-codec", - "scale-info", - "sp-api", - "sp-application-crypto", - "sp-consensus", - "sp-consensus-slots", - "sp-inherents", - "sp-runtime", - "sp-std 8.0.0", - "sp-timestamp", -] - -[[package]] -name = "sp-consensus-grandpa" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/polkadot-sdk.git?tag=v1.4.0-rc1#00395a23d12bdda60499083ad578738da267efd0" +name = "sp-consensus-beefy-etf" +version = "13.0.0" +source = "git+https://github.com/ideal-lab5/etf.git?branch=tony/dev#75415649dd95ba9d201a2a2201e5b3c917f9e1b2" dependencies = [ - "finality-grandpa", - "log", + "lazy_static", "parity-scale-codec", "scale-info", "serde", "sp-api", "sp-application-crypto", "sp-core", + "sp-crypto-hashing 0.1.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", + "sp-io", "sp-keystore", + "sp-mmr-primitives", "sp-runtime", - "sp-std 8.0.0", -] - -[[package]] -name = "sp-consensus-slots" -version = "0.10.0-dev" -source = "git+https://github.com/paritytech/polkadot-sdk.git?tag=v1.4.0-rc1#00395a23d12bdda60499083ad578738da267efd0" -dependencies = [ - "parity-scale-codec", - "scale-info", - "serde", - "sp-std 8.0.0", - "sp-timestamp", + "strum 0.24.1", ] [[package]] name = "sp-core" -version = "21.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?tag=v1.4.0-rc1#00395a23d12bdda60499083ad578738da267efd0" +version = "28.0.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" dependencies = [ - "array-bytes 6.2.2", + "ark-serialize", + "array-bytes", "bandersnatch_vrfs", - "bip39", "bitflags 1.3.2", "blake2", "bounded-collections", "bs58", "dyn-clonable", - "ed25519-zebra 3.1.0", + "ed25519-zebra", + "etf-crypto-primitives 0.2.4 (git+https://github.com/ideal-lab5/etf-sdk/?branch=w3fbls-migration)", "futures", "hash-db", "hash256-std-hasher", "impl-serde", - "itertools 0.10.5", - "lazy_static", + "itertools 0.11.0", + "k256", "libsecp256k1", "log", - "merlin 2.0.1", + "merlin", + "parity-bip39", "parity-scale-codec", "parking_lot", "paste", "primitive-types", - "rand 0.8.5", - "regex", + "rand", "scale-info", - "schnorrkel 0.9.1", - "secp256k1 0.24.3", + "schnorrkel", + "secp256k1", "secrecy", "serde", - "sp-core-hashing 9.0.0", - "sp-debug-derive 8.0.0", - "sp-externalities 0.19.0", - "sp-runtime-interface 17.0.0", - "sp-std 8.0.0", - "sp-storage 13.0.0", + "sp-crypto-hashing 0.1.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", + "sp-debug-derive 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", + "sp-externalities 0.25.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", + "sp-runtime-interface 24.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", + "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", + "sp-storage 19.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", "ss58-registry", "substrate-bip39", "thiserror", @@ -5994,149 +4331,149 @@ dependencies = [ ] [[package]] -name = "sp-core-hashing" -version = "9.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?tag=v1.4.0-rc1#00395a23d12bdda60499083ad578738da267efd0" +name = "sp-crypto-ec-utils" +version = "0.10.0" +source = "git+https://github.com/paritytech/polkadot-sdk#dd5b06e622c6c5c301a1554286ec1f4995c7daca" dependencies = [ - "blake2b_simd", - "byteorder 1.5.0 (registry+https://github.com/rust-lang/crates.io-index)", - "digest 0.10.7", - "sha2 0.10.8", - "sha3 0.10.8", - "twox-hash", + "ark-bls12-377", + "ark-bls12-377-ext", + "ark-bls12-381", + "ark-bls12-381-ext", + "ark-bw6-761", + "ark-bw6-761-ext", + "ark-ec", + "ark-ed-on-bls12-377", + "ark-ed-on-bls12-377-ext", + "ark-ed-on-bls12-381-bandersnatch", + "ark-ed-on-bls12-381-bandersnatch-ext", + "ark-scale", + "sp-runtime-interface 24.0.0 (git+https://github.com/paritytech/polkadot-sdk)", ] [[package]] -name = "sp-core-hashing" -version = "15.0.0" +name = "sp-crypto-hashing" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e0f4990add7b2cefdeca883c0efa99bb4d912cb2196120e1500c0cc099553b0" +checksum = "bc9927a7f81334ed5b8a98a4a978c81324d12bd9713ec76b5c68fd410174c5eb" dependencies = [ "blake2b_simd", - "byteorder 1.5.0 (registry+https://github.com/rust-lang/crates.io-index)", + "byteorder", "digest 0.10.7", "sha2 0.10.8", - "sha3 0.10.8", + "sha3", "twox-hash", ] [[package]] -name = "sp-core-hashing-proc-macro" -version = "9.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?tag=v1.4.0-rc1#00395a23d12bdda60499083ad578738da267efd0" +name = "sp-crypto-hashing" +version = "0.1.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" dependencies = [ - "quote", - "sp-core-hashing 9.0.0", - "syn 2.0.52", + "blake2b_simd", + "byteorder", + "digest 0.10.7", + "sha2 0.10.8", + "sha3", + "twox-hash", ] [[package]] -name = "sp-crypto-ec-utils" -version = "0.10.0" -source = "git+https://github.com/paritytech/polkadot-sdk#7a644fa082f09b557a8a198ed56412f02062bbcf" +name = "sp-crypto-hashing-proc-macro" +version = "0.1.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" dependencies = [ - "ark-bls12-377", - "ark-bls12-377-ext", - "ark-bls12-381", - "ark-bls12-381-ext", - "ark-bw6-761", - "ark-bw6-761-ext", - "ark-ec", - "ark-ed-on-bls12-377", - "ark-ed-on-bls12-377-ext", - "ark-ed-on-bls12-381-bandersnatch", - "ark-ed-on-bls12-381-bandersnatch-ext", - "ark-scale 0.0.12", - "sp-runtime-interface 24.0.0", - "sp-std 14.0.0", + "quote", + "sp-crypto-hashing 0.1.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", + "syn 2.0.60", ] [[package]] name = "sp-debug-derive" -version = "8.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?tag=v1.4.0-rc1#00395a23d12bdda60499083ad578738da267efd0" +version = "14.0.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.52", + "syn 2.0.60", ] [[package]] name = "sp-debug-derive" version = "14.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk#7a644fa082f09b557a8a198ed56412f02062bbcf" +source = "git+https://github.com/paritytech/polkadot-sdk#dd5b06e622c6c5c301a1554286ec1f4995c7daca" dependencies = [ "proc-macro2", "quote", - "syn 2.0.52", + "syn 2.0.60", ] [[package]] name = "sp-externalities" -version = "0.19.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?tag=v1.4.0-rc1#00395a23d12bdda60499083ad578738da267efd0" +version = "0.25.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" dependencies = [ "environmental", "parity-scale-codec", - "sp-std 8.0.0", - "sp-storage 13.0.0", + "sp-storage 19.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", ] [[package]] name = "sp-externalities" version = "0.25.0" -source = "git+https://github.com/paritytech/polkadot-sdk#7a644fa082f09b557a8a198ed56412f02062bbcf" +source = "git+https://github.com/paritytech/polkadot-sdk#dd5b06e622c6c5c301a1554286ec1f4995c7daca" dependencies = [ "environmental", "parity-scale-codec", - "sp-std 14.0.0", - "sp-storage 19.0.0", + "sp-storage 19.0.0 (git+https://github.com/paritytech/polkadot-sdk)", ] [[package]] name = "sp-genesis-builder" -version = "0.1.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?tag=v1.4.0-rc1#00395a23d12bdda60499083ad578738da267efd0" +version = "0.8.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" dependencies = [ + "parity-scale-codec", + "scale-info", "serde_json", "sp-api", "sp-runtime", - "sp-std 8.0.0", ] [[package]] name = "sp-inherents" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/polkadot-sdk.git?tag=v1.4.0-rc1#00395a23d12bdda60499083ad578738da267efd0" +version = "26.0.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" dependencies = [ "async-trait", "impl-trait-for-tuples", "parity-scale-codec", "scale-info", "sp-runtime", - "sp-std 8.0.0", "thiserror", ] [[package]] name = "sp-io" -version = "23.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?tag=v1.4.0-rc1#00395a23d12bdda60499083ad578738da267efd0" +version = "30.0.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" dependencies = [ "bytes", + "docify", "ed25519-dalek", "libsecp256k1", "log", "parity-scale-codec", + "polkavm-derive", "rustversion", - "secp256k1 0.24.3", + "secp256k1", "sp-core", - "sp-externalities 0.19.0", + "sp-crypto-hashing 0.1.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", + "sp-externalities 0.25.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", "sp-keystore", - "sp-runtime-interface 17.0.0", + "sp-runtime-interface 24.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", "sp-state-machine", - "sp-std 8.0.0", - "sp-tracing 10.0.0", + "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", + "sp-tracing 16.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", "sp-trie", "tracing", "tracing-core", @@ -6144,61 +4481,56 @@ dependencies = [ [[package]] name = "sp-keyring" -version = "24.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?tag=v1.4.0-rc1#00395a23d12bdda60499083ad578738da267efd0" +version = "31.0.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" dependencies = [ - "lazy_static", "sp-core", "sp-runtime", - "strum", + "strum 0.26.3", ] [[package]] name = "sp-keystore" -version = "0.27.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?tag=v1.4.0-rc1#00395a23d12bdda60499083ad578738da267efd0" +version = "0.34.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" dependencies = [ "parity-scale-codec", "parking_lot", "sp-core", - "sp-externalities 0.19.0", - "thiserror", -] - -[[package]] -name = "sp-maybe-compressed-blob" -version = "4.1.0-dev" -source = "git+https://github.com/paritytech/polkadot-sdk.git?tag=v1.4.0-rc1#00395a23d12bdda60499083ad578738da267efd0" -dependencies = [ - "thiserror", - "zstd", + "sp-externalities 0.25.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", ] [[package]] name = "sp-metadata-ir" -version = "0.1.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?tag=v1.4.0-rc1#00395a23d12bdda60499083ad578738da267efd0" +version = "0.6.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" dependencies = [ "frame-metadata 16.0.0", "parity-scale-codec", "scale-info", - "sp-std 8.0.0", ] [[package]] -name = "sp-offchain" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/polkadot-sdk.git?tag=v1.4.0-rc1#00395a23d12bdda60499083ad578738da267efd0" +name = "sp-mmr-primitives" +version = "26.0.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" dependencies = [ + "log", + "parity-scale-codec", + "polkadot-ckb-merkle-mountain-range", + "scale-info", + "serde", "sp-api", "sp-core", + "sp-debug-derive 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", "sp-runtime", + "thiserror", ] [[package]] name = "sp-panic-handler" -version = "8.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?tag=v1.4.0-rc1#00395a23d12bdda60499083ad578738da267efd0" +version = "13.0.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" dependencies = [ "backtrace", "lazy_static", @@ -6207,107 +4539,97 @@ dependencies = [ [[package]] name = "sp-runtime" -version = "24.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?tag=v1.4.0-rc1#00395a23d12bdda60499083ad578738da267efd0" +version = "31.0.1" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" dependencies = [ + "docify", "either", "hash256-std-hasher", "impl-trait-for-tuples", "log", + "num-traits", "parity-scale-codec", "paste", - "rand 0.8.5", + "rand", "scale-info", "serde", + "simple-mermaid", "sp-application-crypto", "sp-arithmetic", "sp-core", "sp-io", - "sp-std 8.0.0", + "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", "sp-weights", ] [[package]] name = "sp-runtime-interface" -version = "17.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?tag=v1.4.0-rc1#00395a23d12bdda60499083ad578738da267efd0" +version = "24.0.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" dependencies = [ "bytes", "impl-trait-for-tuples", "parity-scale-codec", + "polkavm-derive", "primitive-types", - "sp-externalities 0.19.0", - "sp-runtime-interface-proc-macro 11.0.0", - "sp-std 8.0.0", - "sp-storage 13.0.0", - "sp-tracing 10.0.0", - "sp-wasm-interface 14.0.0", + "sp-externalities 0.25.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", + "sp-runtime-interface-proc-macro 17.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", + "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", + "sp-storage 19.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", + "sp-tracing 16.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", + "sp-wasm-interface 20.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", "static_assertions", ] [[package]] name = "sp-runtime-interface" version = "24.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk#7a644fa082f09b557a8a198ed56412f02062bbcf" +source = "git+https://github.com/paritytech/polkadot-sdk#dd5b06e622c6c5c301a1554286ec1f4995c7daca" dependencies = [ "bytes", "impl-trait-for-tuples", "parity-scale-codec", "polkavm-derive", "primitive-types", - "sp-externalities 0.25.0", - "sp-runtime-interface-proc-macro 17.0.0", - "sp-std 14.0.0", - "sp-storage 19.0.0", - "sp-tracing 16.0.0", - "sp-wasm-interface 20.0.0", + "sp-externalities 0.25.0 (git+https://github.com/paritytech/polkadot-sdk)", + "sp-runtime-interface-proc-macro 17.0.0 (git+https://github.com/paritytech/polkadot-sdk)", + "sp-std 14.0.0 (git+https://github.com/paritytech/polkadot-sdk)", + "sp-storage 19.0.0 (git+https://github.com/paritytech/polkadot-sdk)", + "sp-tracing 16.0.0 (git+https://github.com/paritytech/polkadot-sdk)", + "sp-wasm-interface 20.0.0 (git+https://github.com/paritytech/polkadot-sdk)", "static_assertions", ] [[package]] name = "sp-runtime-interface-proc-macro" -version = "11.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?tag=v1.4.0-rc1#00395a23d12bdda60499083ad578738da267efd0" +version = "17.0.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" dependencies = [ "Inflector", - "proc-macro-crate 1.3.1", + "expander", + "proc-macro-crate 3.1.0", "proc-macro2", "quote", - "syn 2.0.52", + "syn 2.0.60", ] [[package]] name = "sp-runtime-interface-proc-macro" version = "17.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk#7a644fa082f09b557a8a198ed56412f02062bbcf" +source = "git+https://github.com/paritytech/polkadot-sdk#dd5b06e622c6c5c301a1554286ec1f4995c7daca" dependencies = [ "Inflector", "expander", "proc-macro-crate 3.1.0", "proc-macro2", "quote", - "syn 2.0.52", -] - -[[package]] -name = "sp-session" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/polkadot-sdk.git?tag=v1.4.0-rc1#00395a23d12bdda60499083ad578738da267efd0" -dependencies = [ - "parity-scale-codec", - "scale-info", - "sp-api", - "sp-core", - "sp-keystore", - "sp-runtime", - "sp-staking", - "sp-std 8.0.0", + "syn 2.0.60", ] [[package]] name = "sp-staking" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/polkadot-sdk.git?tag=v1.4.0-rc1#00395a23d12bdda60499083ad578738da267efd0" +version = "26.0.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" dependencies = [ "impl-trait-for-tuples", "parity-scale-codec", @@ -6315,24 +4637,22 @@ dependencies = [ "serde", "sp-core", "sp-runtime", - "sp-std 8.0.0", ] [[package]] name = "sp-state-machine" -version = "0.28.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?tag=v1.4.0-rc1#00395a23d12bdda60499083ad578738da267efd0" +version = "0.35.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" dependencies = [ "hash-db", "log", "parity-scale-codec", "parking_lot", - "rand 0.8.5", + "rand", "smallvec", "sp-core", - "sp-externalities 0.19.0", + "sp-externalities 0.25.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", "sp-panic-handler", - "sp-std 8.0.0", "sp-trie", "thiserror", "tracing", @@ -6341,60 +4661,44 @@ dependencies = [ [[package]] name = "sp-std" -version = "8.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?tag=v1.4.0-rc1#00395a23d12bdda60499083ad578738da267efd0" +version = "14.0.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" [[package]] name = "sp-std" version = "14.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk#7a644fa082f09b557a8a198ed56412f02062bbcf" +source = "git+https://github.com/paritytech/polkadot-sdk#dd5b06e622c6c5c301a1554286ec1f4995c7daca" [[package]] name = "sp-storage" -version = "13.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?tag=v1.4.0-rc1#00395a23d12bdda60499083ad578738da267efd0" +version = "19.0.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" dependencies = [ "impl-serde", "parity-scale-codec", "ref-cast", "serde", - "sp-debug-derive 8.0.0", - "sp-std 8.0.0", + "sp-debug-derive 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", ] [[package]] name = "sp-storage" version = "19.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk#7a644fa082f09b557a8a198ed56412f02062bbcf" +source = "git+https://github.com/paritytech/polkadot-sdk#dd5b06e622c6c5c301a1554286ec1f4995c7daca" dependencies = [ "impl-serde", "parity-scale-codec", "ref-cast", "serde", - "sp-debug-derive 14.0.0", - "sp-std 14.0.0", -] - -[[package]] -name = "sp-timestamp" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/polkadot-sdk.git?tag=v1.4.0-rc1#00395a23d12bdda60499083ad578738da267efd0" -dependencies = [ - "async-trait", - "parity-scale-codec", - "sp-inherents", - "sp-runtime", - "sp-std 8.0.0", - "thiserror", + "sp-debug-derive 14.0.0 (git+https://github.com/paritytech/polkadot-sdk)", ] [[package]] name = "sp-tracing" -version = "10.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?tag=v1.4.0-rc1#00395a23d12bdda60499083ad578738da267efd0" +version = "16.0.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" dependencies = [ "parity-scale-codec", - "sp-std 8.0.0", "tracing", "tracing-core", "tracing-subscriber", @@ -6403,42 +4707,31 @@ dependencies = [ [[package]] name = "sp-tracing" version = "16.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk#7a644fa082f09b557a8a198ed56412f02062bbcf" +source = "git+https://github.com/paritytech/polkadot-sdk#dd5b06e622c6c5c301a1554286ec1f4995c7daca" dependencies = [ "parity-scale-codec", - "sp-std 14.0.0", "tracing", "tracing-core", "tracing-subscriber", ] -[[package]] -name = "sp-transaction-pool" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/polkadot-sdk.git?tag=v1.4.0-rc1#00395a23d12bdda60499083ad578738da267efd0" -dependencies = [ - "sp-api", - "sp-runtime", -] - [[package]] name = "sp-trie" -version = "22.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?tag=v1.4.0-rc1#00395a23d12bdda60499083ad578738da267efd0" +version = "29.0.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" dependencies = [ - "ahash 0.8.11", + "ahash", "hash-db", - "hashbrown 0.13.2", "lazy_static", "memory-db", "nohash-hasher", "parity-scale-codec", "parking_lot", - "rand 0.8.5", + "rand", "scale-info", "schnellru", "sp-core", - "sp-std 8.0.0", + "sp-externalities 0.25.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", "thiserror", "tracing", "trie-db", @@ -6447,71 +4740,64 @@ dependencies = [ [[package]] name = "sp-version" -version = "22.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?tag=v1.4.0-rc1#00395a23d12bdda60499083ad578738da267efd0" +version = "29.0.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" dependencies = [ "impl-serde", "parity-scale-codec", "parity-wasm", "scale-info", "serde", - "sp-core-hashing-proc-macro", + "sp-crypto-hashing-proc-macro", "sp-runtime", - "sp-std 8.0.0", + "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", "sp-version-proc-macro", "thiserror", ] [[package]] name = "sp-version-proc-macro" -version = "8.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?tag=v1.4.0-rc1#00395a23d12bdda60499083ad578738da267efd0" +version = "13.0.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" dependencies = [ "parity-scale-codec", "proc-macro2", "quote", - "syn 2.0.52", + "syn 2.0.60", ] [[package]] name = "sp-wasm-interface" -version = "14.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?tag=v1.4.0-rc1#00395a23d12bdda60499083ad578738da267efd0" +version = "20.0.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" dependencies = [ - "anyhow", "impl-trait-for-tuples", "log", "parity-scale-codec", - "sp-std 8.0.0", - "wasmtime", ] [[package]] name = "sp-wasm-interface" version = "20.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk#7a644fa082f09b557a8a198ed56412f02062bbcf" +source = "git+https://github.com/paritytech/polkadot-sdk#dd5b06e622c6c5c301a1554286ec1f4995c7daca" dependencies = [ - "anyhow", "impl-trait-for-tuples", "log", "parity-scale-codec", - "sp-std 14.0.0", - "wasmtime", ] [[package]] name = "sp-weights" -version = "20.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?tag=v1.4.0-rc1#00395a23d12bdda60499083ad578738da267efd0" +version = "27.0.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" dependencies = [ + "bounded-collections", "parity-scale-codec", "scale-info", "serde", "smallvec", "sp-arithmetic", - "sp-core", - "sp-debug-derive 8.0.0", - "sp-std 8.0.0", + "sp-debug-derive 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", ] [[package]] @@ -6520,16 +4806,6 @@ version = "0.9.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" -[[package]] -name = "spki" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67cf02bbac7a337dc36e4f5a693db6c21e7863f45070f7064577eb4367a3212b" -dependencies = [ - "base64ct", - "der 0.6.1", -] - [[package]] name = "spki" version = "0.7.3" @@ -6537,14 +4813,14 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" dependencies = [ "base64ct", - "der 0.7.8", + "der", ] [[package]] name = "ss58-registry" -version = "1.46.0" +version = "1.47.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1114ee5900b8569bbc8b1a014a942f937b752af4b44f4607430b5f86cedaac0" +checksum = "4743ce898933fbff7bbf414f497c459a782d496269644b3d650a398ae6a487ba" dependencies = [ "Inflector", "num-format", @@ -6555,72 +4831,6 @@ dependencies = [ "unicode-xid", ] -[[package]] -name = "stable_deref_trait" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" - -[[package]] -name = "staging-xcm" -version = "1.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?tag=v1.4.0-rc1#00395a23d12bdda60499083ad578738da267efd0" -dependencies = [ - "bounded-collections", - "derivative", - "environmental", - "impl-trait-for-tuples", - "log", - "parity-scale-codec", - "scale-info", - "serde", - "sp-weights", - "xcm-procedural", -] - -[[package]] -name = "staging-xcm-builder" -version = "1.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?tag=v1.4.0-rc1#00395a23d12bdda60499083ad578738da267efd0" -dependencies = [ - "frame-support", - "frame-system", - "impl-trait-for-tuples", - "log", - "pallet-transaction-payment", - "parity-scale-codec", - "polkadot-parachain-primitives", - "scale-info", - "sp-arithmetic", - "sp-io", - "sp-runtime", - "sp-std 8.0.0", - "sp-weights", - "staging-xcm", - "staging-xcm-executor", -] - -[[package]] -name = "staging-xcm-executor" -version = "1.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?tag=v1.4.0-rc1#00395a23d12bdda60499083ad578738da267efd0" -dependencies = [ - "environmental", - "frame-benchmarking", - "frame-support", - "impl-trait-for-tuples", - "log", - "parity-scale-codec", - "scale-info", - "sp-arithmetic", - "sp-core", - "sp-io", - "sp-runtime", - "sp-std 8.0.0", - "sp-weights", - "staging-xcm", -] - [[package]] name = "static_assertions" version = "1.1.0" @@ -6635,9 +4845,9 @@ checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" [[package]] name = "strsim" -version = "0.11.0" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ee073c9e4cd00e28217186dbe12796d692868f432bf2e97ee73bed0c56dfa01" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" [[package]] name = "strum" @@ -6645,7 +4855,16 @@ version = "0.24.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "063e6045c0e62079840579a7e47a355ae92f60eb74daaf156fb1e84ba164e63f" dependencies = [ - "strum_macros", + "strum_macros 0.24.3", +] + +[[package]] +name = "strum" +version = "0.26.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fec0f0aef304996cf250b31b5a10dee7980c85da9d759361292b8bca5a18f06" +dependencies = [ + "strum_macros 0.26.4", ] [[package]] @@ -6654,44 +4873,38 @@ version = "0.24.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e385be0d24f186b4ce2f9982191e7101bb737312ad61c1f2f984f34bcf85d59" dependencies = [ - "heck", + "heck 0.4.1", + "proc-macro2", + "quote", + "rustversion", + "syn 1.0.109", +] + +[[package]] +name = "strum_macros" +version = "0.26.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c6bee85a5a24955dc440386795aa378cd9cf82acd5f764469152d2270e581be" +dependencies = [ + "heck 0.5.0", "proc-macro2", "quote", "rustversion", - "syn 1.0.109", + "syn 2.0.60", ] [[package]] name = "substrate-bip39" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a7590dc041b9bc2825e52ce5af8416c73dbe9d0654402bfd4b4941938b94d8f" +version = "0.4.7" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" dependencies = [ - "hmac 0.11.0", - "pbkdf2 0.8.0", - "schnorrkel 0.11.4", - "sha2 0.9.9", + "hmac 0.12.1", + "pbkdf2", + "schnorrkel", + "sha2 0.10.8", "zeroize", ] -[[package]] -name = "substrate-wasm-builder" -version = "5.0.0-dev" -source = "git+https://github.com/paritytech/polkadot-sdk.git?tag=v1.4.0-rc1#00395a23d12bdda60499083ad578738da267efd0" -dependencies = [ - "ansi_term", - "build-helper", - "cargo_metadata", - "filetime", - "parity-wasm", - "sp-maybe-compressed-blob", - "strum", - "tempfile", - "toml 0.7.8", - "walkdir", - "wasm-opt", -] - [[package]] name = "subtle" version = "2.5.0" @@ -6700,9 +4913,9 @@ checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc" [[package]] name = "subxt" -version = "0.34.0" +version = "0.35.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3323d5c27898b139d043dc1ee971f602f937b99354ee33ee933bd90e0009fbd" +checksum = "bd68bef23f4de5e513ab4c29af69053e232b098f9c87ab552d7ea153b4a1fbc5" dependencies = [ "async-trait", "base58", @@ -6724,7 +4937,7 @@ dependencies = [ "scale-value", "serde", "serde_json", - "sp-core-hashing 15.0.0", + "sp-crypto-hashing 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "subxt-lightclient", "subxt-macro", "subxt-metadata", @@ -6736,12 +4949,12 @@ dependencies = [ [[package]] name = "subxt-codegen" -version = "0.34.0" +version = "0.35.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d0e58c3f88651cff26aa52bae0a0a85f806a2e923a20eb438c16474990743ea" +checksum = "9d9e2b256b71d31a2629e44eb9cbfd944eb7d577c9e0c8e9802cc3c3943af2d9" dependencies = [ "frame-metadata 16.0.0", - "heck", + "heck 0.4.1", "hex", "jsonrpsee", "parity-scale-codec", @@ -6750,16 +4963,16 @@ dependencies = [ "scale-info", "scale-typegen", "subxt-metadata", - "syn 2.0.52", + "syn 2.0.60", "thiserror", "tokio", ] [[package]] name = "subxt-lightclient" -version = "0.34.0" +version = "0.35.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ecec7066ba7bc0c3608fcd1d0c7d9584390990cd06095b6ae4f114f74c4b8550" +checksum = "1d51f1ac12e3be7aafea4d037730a57da4f22f2e9c73955666081ffa2697c6f1" dependencies = [ "futures", "futures-util", @@ -6774,9 +4987,9 @@ dependencies = [ [[package]] name = "subxt-macro" -version = "0.34.0" +version = "0.35.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "365251668613323064803427af8c7c7bc366cd8b28e33639640757669dafebd5" +checksum = "98dc84d7e6a0abd7ed407cce0bf60d7d58004f699460cffb979640717d1ab506" dependencies = [ "darling 0.20.8", "parity-scale-codec", @@ -6784,41 +4997,43 @@ dependencies = [ "quote", "scale-typegen", "subxt-codegen", - "syn 2.0.52", + "syn 2.0.60", ] [[package]] name = "subxt-metadata" -version = "0.34.0" +version = "0.35.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c02aca8d39a1f6c55fff3a8fd81557d30a610fedc1cef03f889a81bc0f8f0b52" +checksum = "cc10c54028d079a9f1be65188707cd29e5ffd8d0031a2b1346a0941d57b7ab7e" dependencies = [ + "derive_more", "frame-metadata 16.0.0", + "hashbrown 0.14.3", "parity-scale-codec", "scale-info", - "sp-core-hashing 15.0.0", - "thiserror", + "sp-crypto-hashing 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "subxt-signer" -version = "0.34.0" +version = "0.35.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f88a76a5d114bfae2f6f9cc1491c46173ecc3fb2b9e53948eb3c8d43d4b43ab5" +checksum = "6ccb59a38fe357fab55247756174435e8626b93929864e8a498635a15e779df8" dependencies = [ "bip39", + "cfg-if", + "derive_more", "hex", "hmac 0.12.1", "parity-scale-codec", - "pbkdf2 0.12.2", + "pbkdf2", "regex", - "schnorrkel 0.11.4", - "secp256k1 0.28.2", + "schnorrkel", + "secp256k1", "secrecy", "sha2 0.10.8", - "sp-core-hashing 15.0.0", + "sp-crypto-hashing 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "subxt", - "thiserror", "zeroize", ] @@ -6835,9 +5050,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.52" +version = "2.0.60" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b699d15b36d1f02c3e7c69f8ffef53de37aefae075d8488d4ba1a7788d574a07" +checksum = "909518bc7b1c9b779f1bbf07f2929d35af9f0f37e47c6e9ef7f9dddc1e1821f3" dependencies = [ "proc-macro2", "quote", @@ -6850,24 +5065,6 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" -[[package]] -name = "target-lexicon" -version = "0.12.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1fc403891a21bcfb7c37834ba66a547a8f402146eba7265b5a6d88059c9ff2f" - -[[package]] -name = "tempfile" -version = "3.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85b77fafb263dd9d05cbeac119526425676db3784113aa9295c88498cbf8bff1" -dependencies = [ - "cfg-if", - "fastrand", - "rustix 0.38.31", - "windows-sys 0.52.0", -] - [[package]] name = "termcolor" version = "1.4.1" @@ -6879,22 +5076,22 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.57" +version = "1.0.59" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e45bcbe8ed29775f228095caf2cd67af7a4ccf756ebff23a306bf3e8b47b24b" +checksum = "f0126ad08bff79f29fc3ae6a55cc72352056dfff61e3ff8bb7129476d44b23aa" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.57" +version = "1.0.59" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a953cb265bef375dae3de6663da4d3804eee9682ea80d8e2542529b73c531c81" +checksum = "d1cd413b5d558b4c5bf3680e324a6fa5014e7b7c067a51e69dbdf47eb7148b66" dependencies = [ "proc-macro2", "quote", - "syn 2.0.52", + "syn 2.0.60", ] [[package]] @@ -6933,9 +5130,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.36.0" +version = "1.37.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61285f6515fa018fb2d1e46eb21223fff441ee8db5d0f1435e8ab4f5cdb80931" +checksum = "1adbebffeca75fcfd058afa480fb6c0b81e165a0323f9c9d39c9697e37c46787" dependencies = [ "backtrace", "bytes", @@ -6956,7 +5153,7 @@ checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.52", + "syn 2.0.60", ] [[package]] @@ -6965,7 +5162,7 @@ version = "0.24.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081" dependencies = [ - "rustls 0.21.10", + "rustls 0.21.11", "tokio", ] @@ -6975,16 +5172,16 @@ version = "0.25.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "775e0c0f0adb3a2f22a00c4745d728b479985fc15ee7ca6a2608388c5569860f" dependencies = [ - "rustls 0.22.2", + "rustls 0.22.4", "rustls-pki-types", "tokio", ] [[package]] name = "tokio-stream" -version = "0.1.14" +version = "0.1.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "397c988d37662c7dda6d2208364a706264bf3d6138b11d436cbac0ad38832842" +checksum = "267ac89e0bec6e691e5813911606935d77c476ff49024f98abcea3e7b15e37af" dependencies = [ "futures-core", "pin-project-lite", @@ -7008,26 +5205,14 @@ dependencies = [ [[package]] name = "toml" -version = "0.7.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd79e69d3b627db300ff956027cc6c3798cef26d22526befdfcd12feeb6d2257" -dependencies = [ - "serde", - "serde_spanned", - "toml_datetime", - "toml_edit 0.19.15", -] - -[[package]] -name = "toml" -version = "0.8.11" +version = "0.8.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af06656561d28735e9c1cd63dfd57132c8155426aa6af24f36a00a351f88c48e" +checksum = "e9dd1545e8208b4a5af1aa9bbd0b4cf7e9ea08fabc5d0a5c67fcaafa17433aa3" dependencies = [ "serde", "serde_spanned", "toml_datetime", - "toml_edit 0.22.7", + "toml_edit 0.22.12", ] [[package]] @@ -7045,20 +5230,7 @@ version = "0.19.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" dependencies = [ - "indexmap 2.2.5", - "serde", - "serde_spanned", - "toml_datetime", - "winnow 0.5.40", -] - -[[package]] -name = "toml_edit" -version = "0.20.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70f427fce4d84c72b5b732388bf4a9f4531b53f74e2887e3ecb2481f68f66d81" -dependencies = [ - "indexmap 2.2.5", + "indexmap", "toml_datetime", "winnow 0.5.40", ] @@ -7069,22 +5241,22 @@ version = "0.21.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a8534fd7f78b5405e860340ad6575217ce99f38d4d5c8f2442cb5ecb50090e1" dependencies = [ - "indexmap 2.2.5", + "indexmap", "toml_datetime", "winnow 0.5.40", ] [[package]] name = "toml_edit" -version = "0.22.7" +version = "0.22.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18769cd1cec395d70860ceb4d932812a0b4d06b1a4bb336745a4d21b9496e992" +checksum = "d3328d4f68a705b2a4498da1d580585d39a6510f98318a2cec3018a7ec61ddef" dependencies = [ - "indexmap 2.2.5", + "indexmap", "serde", "serde_spanned", "toml_datetime", - "winnow 0.6.5", + "winnow 0.6.6", ] [[package]] @@ -7147,7 +5319,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.52", + "syn 2.0.60", ] [[package]] @@ -7162,55 +5334,40 @@ dependencies = [ [[package]] name = "tracing-log" -version = "0.1.4" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f751112709b4e791d8ce53e32c4ed2d353565a795ce84da2285393f41557bdf2" +checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" dependencies = [ "log", "once_cell", "tracing-core", ] -[[package]] -name = "tracing-serde" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc6b213177105856957181934e4920de57730fc69bf42c37ee5bb664d406d9e1" -dependencies = [ - "serde", - "tracing-core", -] - [[package]] name = "tracing-subscriber" -version = "0.2.25" +version = "0.3.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e0d2eaa99c3c2e41547cfa109e910a68ea03823cccad4a0525dcbc9b01e8c71" +checksum = "ad0f048c97dbd9faa9b7df56362b8ebcaa52adb06b498c050d2f4e32f90a7a8b" dependencies = [ - "ansi_term", - "chrono", - "lazy_static", "matchers", + "nu-ansi-term", + "once_cell", "regex", - "serde", - "serde_json", "sharded-slab", "smallvec", "thread_local", "tracing", "tracing-core", "tracing-log", - "tracing-serde", ] [[package]] name = "trie-db" -version = "0.28.0" +version = "0.29.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff28e0f815c2fea41ebddf148e008b077d2faddb026c9555b29696114d602642" +checksum = "0c992b4f40c234a074d48a757efeabb1a6be88af84c0c23f7ca158950cb0ae7f" dependencies = [ "hash-db", - "hashbrown 0.13.2", "log", "rustc-hex", "smallvec", @@ -7245,7 +5402,7 @@ checksum = "97fee6b57c6a41524a810daee9286c02d7752c4253064d0b05472833a438f675" dependencies = [ "cfg-if", "digest 0.10.7", - "rand 0.8.5", + "rand", "static_assertions", ] @@ -7261,7 +5418,7 @@ version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "76f64bba2c53b04fcab63c01a7d7427eadc821e3bc48c34dc9ba29c501164b52" dependencies = [ - "byteorder 1.5.0 (registry+https://github.com/rust-lang/crates.io-index)", + "byteorder", "crunchy", "hex", "static_assertions", @@ -7360,11 +5517,11 @@ dependencies = [ "arrayref", "constcat", "digest 0.10.7", - "rand 0.8.5", - "rand_chacha 0.3.1", - "rand_core 0.6.4", + "rand", + "rand_chacha", + "rand_core", "sha2 0.10.8", - "sha3 0.10.8", + "sha3", "thiserror", "zeroize", ] @@ -7388,12 +5545,6 @@ dependencies = [ "try-lock", ] -[[package]] -name = "wasi" -version = "0.9.0+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" - [[package]] name = "wasi" version = "0.11.0+wasi-snapshot-preview1" @@ -7421,7 +5572,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.52", + "syn 2.0.60", "wasm-bindgen-shared", ] @@ -7443,7 +5594,7 @@ checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.52", + "syn 2.0.60", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -7454,55 +5605,6 @@ version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "af190c94f2773fdb3729c55b007a722abb5384da03bc0986df4c289bf5567e96" -[[package]] -name = "wasm-instrument" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a47ecb37b9734d1085eaa5ae1a81e60801fd8c28d4cabdd8aedb982021918bc" -dependencies = [ - "parity-wasm", -] - -[[package]] -name = "wasm-opt" -version = "0.116.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc942673e7684671f0c5708fc18993569d184265fd5223bb51fc8e5b9b6cfd52" -dependencies = [ - "anyhow", - "libc", - "strum", - "strum_macros", - "tempfile", - "thiserror", - "wasm-opt-cxx-sys", - "wasm-opt-sys", -] - -[[package]] -name = "wasm-opt-cxx-sys" -version = "0.116.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c57b28207aa724318fcec6575fe74803c23f6f266fce10cbc9f3f116762f12e" -dependencies = [ - "anyhow", - "cxx", - "cxx-build", - "wasm-opt-sys", -] - -[[package]] -name = "wasm-opt-sys" -version = "0.116.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a1cce564dc768dacbdb718fc29df2dba80bd21cb47d8f77ae7e3d95ceb98cbe" -dependencies = [ - "anyhow", - "cc", - "cxx", - "cxx-build", -] - [[package]] name = "wasmi" version = "0.31.2" @@ -7534,167 +5636,15 @@ dependencies = [ "paste", ] -[[package]] -name = "wasmparser" -version = "0.102.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48134de3d7598219ab9eaf6b91b15d8e50d31da76b8519fe4ecfcec2cf35104b" -dependencies = [ - "indexmap 1.9.3", - "url", -] - [[package]] name = "wasmparser-nostd" -version = "0.100.1" +version = "0.100.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9157cab83003221bfd385833ab587a039f5d6fa7304854042ba358a3b09e0724" +checksum = "d5a015fe95f3504a94bb1462c717aae75253e39b9dd6c3fb1062c934535c64aa" dependencies = [ "indexmap-nostd", ] -[[package]] -name = "wasmtime" -version = "8.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f907fdead3153cb9bfb7a93bbd5b62629472dc06dee83605358c64c52ed3dda9" -dependencies = [ - "anyhow", - "bincode", - "cfg-if", - "indexmap 1.9.3", - "libc", - "log", - "object 0.30.4", - "once_cell", - "paste", - "psm", - "serde", - "target-lexicon", - "wasmparser", - "wasmtime-environ", - "wasmtime-jit", - "wasmtime-runtime", - "windows-sys 0.45.0", -] - -[[package]] -name = "wasmtime-asm-macros" -version = "8.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3b9daa7c14cd4fa3edbf69de994408d5f4b7b0959ac13fa69d465f6597f810d" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "wasmtime-environ" -version = "8.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a990198cee4197423045235bf89d3359e69bd2ea031005f4c2d901125955c949" -dependencies = [ - "anyhow", - "cranelift-entity", - "gimli 0.27.3", - "indexmap 1.9.3", - "log", - "object 0.30.4", - "serde", - "target-lexicon", - "thiserror", - "wasmparser", - "wasmtime-types", -] - -[[package]] -name = "wasmtime-jit" -version = "8.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0de48df552cfca1c9b750002d3e07b45772dd033b0b206d5c0968496abf31244" -dependencies = [ - "addr2line 0.19.0", - "anyhow", - "bincode", - "cfg-if", - "cpp_demangle", - "gimli 0.27.3", - "log", - "object 0.30.4", - "rustc-demangle", - "serde", - "target-lexicon", - "wasmtime-environ", - "wasmtime-jit-icache-coherence", - "wasmtime-runtime", - "windows-sys 0.45.0", -] - -[[package]] -name = "wasmtime-jit-debug" -version = "8.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e0554b84c15a27d76281d06838aed94e13a77d7bf604bbbaf548aa20eb93846" -dependencies = [ - "once_cell", -] - -[[package]] -name = "wasmtime-jit-icache-coherence" -version = "8.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aecae978b13f7f67efb23bd827373ace4578f2137ec110bbf6a4a7cde4121bbd" -dependencies = [ - "cfg-if", - "libc", - "windows-sys 0.45.0", -] - -[[package]] -name = "wasmtime-runtime" -version = "8.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "658cf6f325232b6760e202e5255d823da5e348fdea827eff0a2a22319000b441" -dependencies = [ - "anyhow", - "cc", - "cfg-if", - "indexmap 1.9.3", - "libc", - "log", - "mach", - "memfd", - "memoffset", - "paste", - "rand 0.8.5", - "rustix 0.36.17", - "wasmtime-asm-macros", - "wasmtime-environ", - "wasmtime-jit-debug", - "windows-sys 0.45.0", -] - -[[package]] -name = "wasmtime-types" -version = "8.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4f6fffd2a1011887d57f07654dd112791e872e3ff4a2e626aee8059ee17f06f" -dependencies = [ - "cranelift-entity", - "serde", - "thiserror", - "wasmparser", -] - -[[package]] -name = "wide" -version = "0.7.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89beec544f246e679fc25490e3f8e08003bc4bf612068f325120dad4cea02c1c" -dependencies = [ - "bytemuck", - "safe_arch", -] - [[package]] name = "winapi" version = "0.3.9" @@ -7713,11 +5663,11 @@ checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" [[package]] name = "winapi-util" -version = "0.1.6" +version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f29e6f9198ba0d26b4c9f07dbe6f9ed633e1f3d5b8b414090084349e46a52596" +checksum = "4d4cc384e1e73b93bafa6fb4f1df8c41695c8a91cf9c4c64358067d15a7b6c6b" dependencies = [ - "winapi", + "windows-sys 0.52.0", ] [[package]] @@ -7726,24 +5676,6 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" -[[package]] -name = "windows-core" -version = "0.52.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" -dependencies = [ - "windows-targets 0.52.4", -] - -[[package]] -name = "windows-sys" -version = "0.45.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" -dependencies = [ - "windows-targets 0.42.2", -] - [[package]] name = "windows-sys" version = "0.48.0" @@ -7759,22 +5691,7 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" dependencies = [ - "windows-targets 0.52.4", -] - -[[package]] -name = "windows-targets" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" -dependencies = [ - "windows_aarch64_gnullvm 0.42.2", - "windows_aarch64_msvc 0.42.2", - "windows_i686_gnu 0.42.2", - "windows_i686_msvc 0.42.2", - "windows_x86_64_gnu 0.42.2", - "windows_x86_64_gnullvm 0.42.2", - "windows_x86_64_msvc 0.42.2", + "windows-targets 0.52.5", ] [[package]] @@ -7794,25 +5711,20 @@ dependencies = [ [[package]] name = "windows-targets" -version = "0.52.4" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7dd37b7e5ab9018759f893a1952c9420d060016fc19a472b4bb20d1bdd694d1b" +checksum = "6f0713a46559409d202e70e28227288446bf7841d3211583a4b53e3f6d96e7eb" dependencies = [ - "windows_aarch64_gnullvm 0.52.4", - "windows_aarch64_msvc 0.52.4", - "windows_i686_gnu 0.52.4", - "windows_i686_msvc 0.52.4", - "windows_x86_64_gnu 0.52.4", - "windows_x86_64_gnullvm 0.52.4", - "windows_x86_64_msvc 0.52.4", + "windows_aarch64_gnullvm 0.52.5", + "windows_aarch64_msvc 0.52.5", + "windows_i686_gnu 0.52.5", + "windows_i686_gnullvm", + "windows_i686_msvc 0.52.5", + "windows_x86_64_gnu 0.52.5", + "windows_x86_64_gnullvm 0.52.5", + "windows_x86_64_msvc 0.52.5", ] -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" - [[package]] name = "windows_aarch64_gnullvm" version = "0.48.5" @@ -7821,15 +5733,9 @@ checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" [[package]] name = "windows_aarch64_gnullvm" -version = "0.52.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bcf46cf4c365c6f2d1cc93ce535f2c8b244591df96ceee75d8e83deb70a9cac9" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.42.2" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" +checksum = "7088eed71e8b8dda258ecc8bac5fb1153c5cffaf2578fc8ff5d61e23578d3263" [[package]] name = "windows_aarch64_msvc" @@ -7839,15 +5745,9 @@ checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" [[package]] name = "windows_aarch64_msvc" -version = "0.52.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da9f259dd3bcf6990b55bffd094c4f7235817ba4ceebde8e6d11cd0c5633b675" - -[[package]] -name = "windows_i686_gnu" -version = "0.42.2" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" +checksum = "9985fd1504e250c615ca5f281c3f7a6da76213ebd5ccc9561496568a2752afb6" [[package]] name = "windows_i686_gnu" @@ -7857,15 +5757,15 @@ checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" [[package]] name = "windows_i686_gnu" -version = "0.52.4" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b474d8268f99e0995f25b9f095bc7434632601028cf86590aea5c8a5cb7801d3" +checksum = "88ba073cf16d5372720ec942a8ccbf61626074c6d4dd2e745299726ce8b89670" [[package]] -name = "windows_i686_msvc" -version = "0.42.2" +name = "windows_i686_gnullvm" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" +checksum = "87f4261229030a858f36b459e748ae97545d6f1ec60e5e0d6a3d32e0dc232ee9" [[package]] name = "windows_i686_msvc" @@ -7875,15 +5775,9 @@ checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" [[package]] name = "windows_i686_msvc" -version = "0.52.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1515e9a29e5bed743cb4415a9ecf5dfca648ce85ee42e15873c3cd8610ff8e02" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.42.2" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" +checksum = "db3c2bf3d13d5b658be73463284eaf12830ac9a26a90c717b7f771dfe97487bf" [[package]] name = "windows_x86_64_gnu" @@ -7893,15 +5787,9 @@ checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" [[package]] name = "windows_x86_64_gnu" -version = "0.52.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5eee091590e89cc02ad514ffe3ead9eb6b660aedca2183455434b93546371a03" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.42.2" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" +checksum = "4e4246f76bdeff09eb48875a0fd3e2af6aada79d409d33011886d3e1581517d9" [[package]] name = "windows_x86_64_gnullvm" @@ -7911,15 +5799,9 @@ checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" [[package]] name = "windows_x86_64_gnullvm" -version = "0.52.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77ca79f2451b49fa9e2af39f0747fe999fcda4f5e241b2898624dca97a1f2177" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.42.2" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" +checksum = "852298e482cd67c356ddd9570386e2862b5673c85bd5f88df9ab6802b334c596" [[package]] name = "windows_x86_64_msvc" @@ -7929,9 +5811,9 @@ checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" [[package]] name = "windows_x86_64_msvc" -version = "0.52.4" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32b752e52a2da0ddfbdbcc6fceadfeede4c939ed16d13e648833a61dfb611ed8" +checksum = "bec47e5bfd1bff0eeaf6d8b485cc1074891a197ab4225d504cb7a1ab88b02bf0" [[package]] name = "winnow" @@ -7944,9 +5826,9 @@ dependencies = [ [[package]] name = "winnow" -version = "0.6.5" +version = "0.6.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dffa400e67ed5a4dd237983829e66475f0a4a26938c4b04c21baede6262215b8" +checksum = "f0c976aaaa0e1f90dbb21e9587cdaf1d9679a1cde8875c0d6bd83ab96a208352" dependencies = [ "memchr", ] @@ -7966,23 +5848,12 @@ version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c7e468321c81fb07fa7f4c636c3972b9100f0346e5b6a9f2bd0603a52f7ed277" dependencies = [ - "curve25519-dalek 4.1.2", - "rand_core 0.6.4", + "curve25519-dalek", + "rand_core", "serde", "zeroize", ] -[[package]] -name = "xcm-procedural" -version = "1.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?tag=v1.4.0-rc1#00395a23d12bdda60499083ad578738da267efd0" -dependencies = [ - "Inflector", - "proc-macro2", - "quote", - "syn 2.0.52", -] - [[package]] name = "yap" version = "0.11.0" @@ -8006,7 +5877,7 @@ checksum = "9ce1b18ccd8e73a9321186f97e46f9f04b778851177567b1975109d26a08d2a6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.52", + "syn 2.0.60", ] [[package]] @@ -8026,34 +5897,5 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.52", -] - -[[package]] -name = "zstd" -version = "0.12.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a27595e173641171fc74a1232b7b1c7a7cb6e18222c11e9dfb9888fa424c53c" -dependencies = [ - "zstd-safe", -] - -[[package]] -name = "zstd-safe" -version = "6.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee98ffd0b48ee95e6c5168188e44a54550b1564d9d530ee21d5f0eaed1069581" -dependencies = [ - "libc", - "zstd-sys", -] - -[[package]] -name = "zstd-sys" -version = "2.0.9+zstd.1.5.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e16efa8a874a0481a574084d34cc26fdb3b99627480f785888deb6386506656" -dependencies = [ - "cc", - "pkg-config", + "syn 2.0.60", ] diff --git a/Cargo.toml b/Cargo.toml index 0856f7f..19696be 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,34 +1,129 @@ -[package] -name = "otp-wallet-client" -version = "0.1.0" +[workspace] +members = [ + "core/", + "cli/", +] +resolver = "2" + +[workspace.package] edition = "2021" +authors = ["Ideal Labs "] +repository = "https://github.com/ideal-lab5/etf" +homepage = "https://idealabs.network" + +[workspace.lints.rust] +suspicious_double_ref_op = { level = "allow", priority = 2 } + +[workspace.lints.clippy] +all = { level = "allow", priority = 0 } +correctness = { level = "warn", priority = 1 } +complexity = { level = "warn", priority = 1 } +if-same-then-else = { level = "allow", priority = 2 } +zero-prefixed-literal = { level = "allow", priority = 2 } # 00_1000_000 +type_complexity = { level = "allow", priority = 2 } # raison d'etre +nonminimal-bool = { level = "allow", priority = 2 } # maybe +borrowed-box = { level = "allow", priority = 2 } # Reasonable to fix this one +too-many-arguments = { level = "allow", priority = 2 } # (Turning this on would lead to) +needless-lifetimes = { level = "allow", priority = 2 } # generated code +unnecessary_cast = { level = "allow", priority = 2 } # Types may change +identity-op = { level = "allow", priority = 2 } # One case where we do 0 + +useless_conversion = { level = "allow", priority = 2 } # Types may change +unit_arg = { level = "allow", priority = 2 } # stylistic +option-map-unit-fn = { level = "allow", priority = 2 } # stylistic +bind_instead_of_map = { level = "allow", priority = 2 } # stylistic +erasing_op = { level = "allow", priority = 2 } # E.g. 0 * DOLLARS +eq_op = { level = "allow", priority = 2 } # In tests we test equality. +while_immutable_condition = { level = "allow", priority = 2 } # false positives +needless_option_as_deref = { level = "allow", priority = 2 } # false positives +derivable_impls = { level = "allow", priority = 2 } # false positives +stable_sort_primitive = { level = "allow", priority = 2 } # prefer stable sort +extra-unused-type-parameters = { level = "allow", priority = 2 } # stylistic +default_constructed_unit_structs = { level = "allow", priority = 2 } # stylistic + +# [workspace.dependencies] +# polkavm = "0.9.3" +# polkavm-linker = "0.9.2" +# polkavm-derive = "0.9.1" +# log = { version = "0.4.21", default-features = false } +# quote = { version = "1.0.33" } +# serde = { version = "1.0.197", default-features = false } +# serde-big-array = { version = "0.3.2" } +# serde_derive = { version = "1.0.117" } +# serde_json = { version = "1.0.114", default-features = false } +# serde_yaml = { version = "0.9" } +# syn = { versicargon = "2.0.53" } +# thiserror = { version = "1.0.48" } + +[profile.release] +opt-level = 3 +lto = "thin" +incremental = true +panic = 'unwind' + +[profile.bench] +opt-level = 3 +debug = false +rpath = false +lto = "thin" +incremental = true +debug-assertions = false + +[profile.dev] +opt-level = 0 +panic = 'unwind' + +[profile.test] +opt-level = 3 +lto = "thin" +incremental = true +debug-assertions = true +debug = true + +[workspace.metadata.release] +dependent-version = "fix" + +# [package] +# name = "murmur-rs" +# version = "0.1.0" +# edition = "2021" + +# # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html - -[dependencies] -subxt = "0.34.0" -subxt-signer = "0.34.0" -tokio = { version = "1.35", features = ["macros", "time", "rt-multi-thread"] } -totp-rs = "5.5.1" -# etf-crypto-primitives = { git = "https://github.com/ideal-lab5/etf-sdk/", branch = "main" } -etf-crypto-primitives = { path = "../etf-sdk/etf-crypto-primitives" } -clap = { version = "4.1.1", features = ["derive"] } -rand_chacha = "0.3.1" -ckb-merkle-mountain-range = "0.5.2" -# blake2b = "0.10.6" -sha3 = "0.10.8" -serde_cbor = "0.11.2" -# bytes = "1.4.0" -serde_json = "1.0.108" -indicatif = "0.17.8" -sp-keyring = { git = "https://github.com/paritytech/polkadot-sdk.git", tag = "v1.4.0-rc1" } -frame-support = { git = "https://github.com/paritytech/polkadot-sdk.git", tag = "v1.4.0-rc1" } -node-runtime = { path = "../etf/runtime" } -codec = { package = "parity-scale-codec", version = "3.2.2", features = [ - "derive", -] } -serde = { version = "1.0.188", features = ["alloc", "derive"] } -sp-core = { git = "https://github.com/paritytech/polkadot-sdk.git", tag = "v1.4.0-rc1" } -sp-runtime = { git = "https://github.com/paritytech/polkadot-sdk.git", tag = "v1.4.0-rc1" } -# pallet-balances = { default-features = false, git = "https://github.com/paritytech/polkadot-sdk.git", tag = "v1.4.0-rc1" } +# [dependencies] +# subxt = "0.35.2" +# subxt-signer = "0.35.2" +# tokio = { version = "1.35", features = ["macros", "time", "rt-multi-thread"] } +# totp-rs = "5.5.1" +# etf-crypto-primitives = { git = "https://github.com/ideal-lab5/etf-sdk/", branch = "tony/dev" } +# # etf-crypto-primitives = { path = "../etf-sdk/etf-crypto-primitives" } +# clap = { version = "4.1.1", features = ["derive"] } +# rand_chacha = "0.3.1" +# ckb-merkle-mountain-range = "0.5.2" +# # blake2b = "0.10.6" +# sha3 = "0.10.8" +# serde_cbor = "0.11.2" +# # bytes = "1.4.0" +# serde_json = "1.0.108" +# indicatif = "0.17.8" +# sp-keyring = { git = "https://github.com/ideal-lab5/polkadot-sdk.git", branch = "testing" } +# frame-support = { git = "https://github.com/ideal-lab5/polkadot-sdk.git", branch = "testing" } +# # node-runtime = { path = "../etf/runtime" } +# codec = { package = "parity-scale-codec", version = "3.6.12", features = [ +# "derive", +# ] } +# serde = { version = "1.0.188", features = ["alloc", "derive"] } +# sp-core = { git = "https://github.com/ideal-lab5/polkadot-sdk.git", branch = "testing", features = ["bls-experimental"] } +# sp-runtime = { git = "https://github.com/ideal-lab5/polkadot-sdk.git", branch = "testing" } +# beefy = { package = "sp-consensus-beefy-etf", git = "https://github.com/ideal-lab5/etf.git", branch = "tony/dev", features = ["bls-experimental"] } +# sp-application-crypto = { git = "https://github.com/ideal-lab5/polkadot-sdk.git", branch = "testing", features = ["bls-experimental"] } +# ark-bls12-377 = "0.4.0" +# ark-std = "0.4.0" +# ark-ec = "0.4.0" +# ark-ff = "0.4.0" +# ark-serialize = "0.4.0" +# w3f-bls = "0.1.3" +# getrandom = { version = "0.2", features = ["js"] } +# rand_core = { version = "0.6.4", features = ["getrandom"] } +# hex = "0.4.3" +# array-bytes = "6.1" \ No newline at end of file diff --git a/README.md b/README.md index 56a0200..3f5a720 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,7 @@ # Murmur +Murmur is a framework for building web3 applications. It enables on-chain, time-based event clocks. + An OTP Wallet Client This is an experimental keyless crytpo wallet client for OTP proxies on the ETF Network. @@ -18,33 +20,10 @@ cargo build cargo test ``` -## How it works - -In order to use the wallet, there must be at least one node running. I recommend running a local node for testing purposes. - -Also, the OTP wallet can only be called via proxy, so in order to use this client you must also have an ETF wallet somewhere. This could be through the polkadotjs extension or in the local keystore. - -### Wallet Creation - -- first build the project (cargo build) to generate the target/debug folder, where otp-wallet-client exists. Alternately, building in release mode will generate the target/release folder. +## Usage -``` bash -otp-wallet-client new -``` -This writes to a new file called mmr_store in the root directory. This file contains the MMR leaf data. It is **not** secret data and can be freely publicized or broadcast (e.g. it can be stored in IPFS without exposing any secret information). - -#### How it works -1. Use the seed to generate a new TOTP generator -2. Based on the current block number and the max block height parameter, generate future OTP codes for each future block in the range -3. Build an MMR -4. Call the `OTPProxy > create` extrinsic with the MMR root to create the proxy [TODO] - -### Wallet Usage -- delay must be >= 2 -- assumes mmr_store exists in root - -``` bash -otp-wallet-client execute --delay 2 --to AcctId --amount 100_000_00 +``` shell +murmur-cli new --seed [] --name [] --schedule 100 101 209... ``` ## Generating metadata for the chain @@ -68,5 +47,4 @@ subxt metadata > ./artifacts/metadata.scale - [ ] pass mmr_store path as a parameter - [ ] error handling -- [ ] add dry run option (e.g. to check if username is a duplicate) e.g. add the '-x' flag to indicate if the call should be executed: `otp-wallet-client execute ... -x` -- [ ] modify cli to allow any call to be submitted, something like `otp-wallet-client execute --pallet --extrinsic --params [path separated parameter list] --delay X` \ No newline at end of file +- [ ] add dry run option (e.g. to check if username is a duplicate) e.g. add the '-x' flag to indicate if the call should be executed: `otp-wallet-client execute ... -x` \ No newline at end of file diff --git a/artifacts/metadata.scale b/artifacts/metadata.scale index 887420915601b003f7b096ef91f6ac45e5e1c53f..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 100644 GIT binary patch literal 0 HcmV?d00001 literal 74340 zcmdSC4`5u!c^^2l`$#Qi$XQuXvPvQQ$%ZUY0biCBs6Y%P10+BZF-SrLC`+~&>;n5h zthv}-?b{^@SGuF`)XEn*l@se?wRUQ!QY*K1PwL63d?)AZM!t)$c5AnC zYo~H+HP*#W`uo0bX5M?d3;waCCZ%O^-@G?7-^_gT{hROmW<6||e`>d<28N>M(n_Nh z7FJpt&30pSYGtL-skdh<*X>fuQ=azU(;5Fo|GHhr=uu^TrBn|8Q(LlXAXi*%mDj_i zXd`Ne>#lBnwUHY<)Tpn7I&TZ7%k8orRD*i3PA~FWK2UmirBRPM>tQR(YyU{Nx{ta? zakJGpS*>&zk4Bx<)#^$$thdwO=PT%7P$#=nDi1KXsKJ4WX1P`i+e^#kS{a>3gYAuG z7$v{;hW5%kT~K+QUu}h9LEAE={Z<%-t&?FTSy)(YHQpE2lSPB8wes<3NRP~%Znw(& z=|QOiptwj4Z30E=Q%@CizO!@JxKjSWn3>#8v)O31{Yo`zmfI_9lk;I~+Wg*ED@T#% zE$U%4pbPazYrR|>*50Dhqm5?RDz~eRx-A)AFV`_ijn)Q#p@s)Wu=c0I>hZO9G%Wuv zo!nJ;7nfj_Y1FGr?dp0sq6a$Hk10KZMQN-qMb-D&A~mAa)=@QzA#PR0+(ffgU9YyQ zC&MM4;{1VKyRYxTqcNp2IW?ZA{##gW^e}WhtcR`YN}*Cc9!BlLH2;H|I$vuXk0$iQ zt>Maql+FUzZc=IjtxT%Pv$Qf2f3Ni5$b2h2BE99*w4UAvybFPP(M2l)5k+9cU~{b;g)i#CdHNS~5Yl(^+M7|j z&~7xVE72e60u6Z)6FQ$O)*F@3E=kcsM0J2rg$3T_o?6t+OQ?@zH79bJzr(i(9JF2ZnNyE2lS%(^0*Y4uhkai zn;jf^>M?y+*N*RLbgMeBh!&#q3hj~k@&?Vgr#_)SZfaux+P6zhdEL{YAw*;koC#93vB2TxkQkC-oWgF-V^j_SCpo4a~GxJ@t&6nXtXu^VJ)a52UWHmyd^@ zdd>~HY07%OA5g;!D{En;QzQI)-oX*s!k!wJD783{qVffSeUKL&qz9NZNz|@dkE$yR zofVMR$kSt%S}j$<4Q|s#OR;A0h;9AARNW74Eq|r4-UNLPD}E#mtafU(jbOsHyT4qm zg_WEhcg=>a7LZ+!*>-2>S)HR_?ain9UFBwj(S1OByW29}d}+@L3QGQ|a^!bp69yxP z!c&GfdU~iVTvF-c;+{Q@Wnz!6P5JfklyBa13oEUVwsA1_&MKHt<(!Rp-faLf*#a79 zq5*Kn^>XV3%|ii{3%s$rf1SrZUn}Y%Ky?7W)E2LKxb8RVJ66`p)jH@oHQ=w6n@y10 zO5inl75&vl%Lh&JWrzE+!oh8uaiFfn1m_X%F{~}~(1R<)neK?!hdGtfXnP}CS`EXJ z&STSoJKnKbFK%f~)q%nx=5L@cqlaVWrnDM9XgQn8C{^05LFrKE25t}0ugV>2psuRq z5^TuzY0zn0Xf?hr?km^pjrLrlaiY_tKKGU@hg(%}4)j?#*q}Y-sWm++Kc#+FF_$6f zhSsiHuhx%4iW)uC0D%{Mb=ihDzVco6fv-dV@Gm_^&iJ5Xg+@o4=-y>Y5O6-8ki3sKn55**e5Lyknw z!T`6bNm*^Fc%V_MsEgDXreNkYHco}-C8vh=)*36=j%u4y&D-CmMCIEGm}y)kn-Tq3r!7> z>{csWY1cMJ{Zqh5CLhNk_tk^Z`A#d8nX5pQZsMtjP7Rz|!{$p9PnIrEZ?NEa55Hp= z7a^)EJrBZPUSF;r@32e@t^yRh7h>to>y^&^5kN#Yj%b1k`paQh_YLj!mp7O!n{g1l z4C@2wR()>O2Qe`tCK)yup2EiOKy9cD=sYl~)&uw;x7$-ZyaKIbNhtEzKKv$ws#k0HGX=985#8|A{RHYJPc84orEj&&_ zeQ)pPRoFZGB*t$x(SxW~-pK1|M(#tM_2sa&ztJL~v)+LuDwGL?pvd5Wx;3C3{Wk{4 z13ORPCb$~`5qNhkf|r$;wUzv^-dXn>tC+%SWH{ShUO})s2RZo+NGR}>x+g6d5A%=(FTH`O`Ucgy7a9-**?|$W@gT_dZoAyX;dYa2oBe@` zleWliM)Z5m5j-$3Zu&7|aH=n*2gXTU>9p4xph(q_1hTSu+E@bZdr*(rw;OZSsEuLX zhZ?^7$j3*J6U;V(yiluRW()J+7@#)VduU$=`yXh#NsT6d7!1)oucJoBd*mE7hydZs zbFbcm(10FN4*}%dBctk(fqAxI7+r43%*OygF3fk9Yt`@lZ&vBWp_zJxIAm^90Z~Jg4nu2)D1f=|*<;iefca#X z+-Ip56WFM+9{N<V6NHm zKCmT!xzh$w1^e=6P6K7I_|=|#)wk66!NK|OVOyWX_$>_^m&@GvCk`vC-x|vKKD&agh z1#BE`61K(Svq^h>f%CktFVHe28^y%1<;Wjl>Vze1tjjur%-fgSgOQ_k`*0yWZt-5~ z>9ONlO7&@*C-y>8M?9ccPE$!UF$L zTXP3>54?$aAtl7XDKr}>Uu{JoGoo-2?DS0pQwO-TDGgrSj}B{oxpf>Q1VjmZyt;zn zMEr3AAh$Bi*@q1FUdV)B^?@F1kM0Z3DsGYi?5>1DlowM~nv;d6^qT+>gzs=J<-CIh*c-+79^=h;nu9Z(# z8?Eg@0pd6i>q5G{*n6aVj@P*nEG!TJ)Wt4*VQ;4eMfO4(e?xEM%iM@eXQJ`pg-%4` z{)M$a;9cG`XD~8KL*0G&Bh@y9ygCRg;XULyU{MX2i-{u{Jx=Xyrx~I;y+dX;y z(I&VhhUfJqnQ!z;Q*Ndi(L3h*pfDRn9abCqv6r9ncId@M8ym8U&&c4;wX1dFXAmEV z#+IaFX;egX;v0~5F?!4gmKf7vXlNxE#yqT$WKL>Izy9*x)&2Ubgy-t75-#`jR+wX* z?n37LQm@oQ(?l~2{G)aGbs_D&$y@7buVdN?jLLc;?OoOfKI~o`T?B>2wK5AVeR*cz z*&giETAN!rx9Ilq!StC%0oKoIJAx@1#*Qcty0J25Ik_+loy+eBuY#QH7&6J_pBS(P zW3Sa*a$>1zj}2h|;D9+SO)vp~~H^r~CvI zMDBs!t`(p-w2xD3)s;2Bga*W{$jX!DW*}~4umE*isddN@Ky8fP;l%GIz~xN?>8y0_ zS^ng}s8J5c7~MM?`9T=1tJqCAOsh1OKp*;P{@$k-g&E_e<;ARyu7hL{G|Y$5fDe_R z6)3Mc1%V8Y{LykJkcE}ysY~^IWTF^$Q@Jk;?hWQwhkeWbOC1a zK7^rKgUwJ~)*V=k>YEqA z$RbvPBu&Dp&6@Y_p|!Jpqa`#)s|Xfr>IQmr8P;$*RW7$Sx}fvEN!6`<#kFDf3SsDi znI_S2M5rJJUdy?3Va<)p;g>}iRd|~Zdt#_=)YL%(c1(b^!LlP5p`8z5g{Be&pNb#C z=*Man+cQEsn**Dr{Yd)`d~~`L!A7;@##ahp+^vKQEJ_T}aXXIq08jFmKo^Y+yR;V8 zaK_z5_izYOYhc&+7@0EOr>X7O0vIn6^$;5nM34z4?1aqFD9*ZU5A-e@58cc=4?NI( z>K~ul=5}lHGr+zUgM}qic0L3DAp9Q4Q^4o*W zf6w~_;5gd~5UN|8o3pb|Yi5qS1~%U~_w}xTLt{%O^%&?Z{6~6F%KIdllNdC{1h?-< z$F|2!ZkF^ID1P5&?!);eQ~X3*Y|M-Ibg;!cO|u{*O~|7UK@gkX^=nyBw~N#SV3RIuvDNI$ETCi^F9f$A@6uXq6K%Vg2%h@04NhJ{3DA@zpd%FEX?rlGoF; zb((A@_p4C4oBZBC72+_>P|pO_sBN56vV6{&%B>ShFC+tS{R88LYZvXBgtvks_X%4s z79Kzou?=AcxU&O`NWY4jI6!a3maP#C?E~=yUibEy@oGI)ac(G|pLdVHMm7UO;ry-yH-NF3&4 zUVbtVvfg%KD8wtQfYB5$3os6nMoAU|F5xX`5ny2^L%qhRR$hjuC6H}=9?pmj7?G{x z(N74S=ZT!pr_Q{P3{9s_t^_1ovi%RT6j)ybCW|s`Opsc=`l+f6&Yh*(sRV(SN81L2h9Ll z>IAkYaDJFSs$&CuM^|D`);)Vnn+pW+aiv~@hiqPb2j{~X^)mie>ic~?>hiQD*j(jf zJCUOnyJgUiSi`}D-mw4!(|bzR6d<3Ljs@cot)ah_n{ZcztmeV{ll~nwzPsLC>3Zp} zQJ*X-EQ5nc(ts14X1q#oW%>ry?y%LC=wJfJeoJsjSvi6JyIaY6kM?h+t0o#9rA7@a z#z3m@_>F#`$H-F^hM8N-wGOC`=QVrVGnLRr@dW(s;zshY-$Yt#-!yU)&g^nM*Nd-IfC_tj8e`)oM}qzT**2@!ux@!UGM|!h##sS(*7KSV>h;6W=w6- zU5HsD7o(`ioIu>d;W#&-N0yCQPF! z=jWT0+NL*i-|Or5ehFNNt>gP8y2ta~6veLZQlKvBKhkb^U=h>fJXklKi2;w%fZdBr zwH`N&QAR~1g1%_eQAoeHbmGHD!+l<=OLdZF4)@T^VWydv_aDb7uh?8zKi*!$66*oL zafQ~zGSc(UluTW5VRN33r##;?<5Ch&I6tc^H9NEkkBY3T`1G>O6vZ0kaW+)3v}*7a z+*U&Kq^^?6h8&L@@_MUKXB-TqDDhaD`s(2-T#J{4N_W4THqI;c7*idN z$?3qM(tvhP!qGZ~n1Iu_PqCIpDzfqPX-VwFJSpNNosfmylm%K3ezJZFrVjn4@$7>KqAYl{t%6~L#v5G6D49r=Jdp>0bBXBvnZ zgl|D|C)>#pf-ud9<%X;gWC1C`XVxuc$%lP~4TStE-F1m=DiAB@U}v8WSIan3Az6Yv zXF|Bu{cxcJ<1?%X)HEi6Gz5msT82QeF-!Fw6{!o8gQ@J3Ei;%vv*bDIqNhA>H%&Q| zI81MutFj9ZSQ!dQyyPG+Qkh6vBamq#Y@ zF=BFmhJywb+qSqN8i$c;D^AM@Jn=nt(s|0;{07GJ8+8E|@qxKz6466431UJxLL(Zr zWhcXxk-hRB`;A=qrnI+!U7}`m9LzEW4_R}30WIM4#ss_FVe)a-Mi@UZJY^%@;LOc0 z$)iu-BeYW-AF=CTAhjl+PwQzz;9XVF_>?nc+z>pUQI9++lMO1s2v$3#)hv(qAjW&} zg2#J{8Sl}=cyH+%Z_#?Kl0!^tu=xW}hIBCr7LSuCFnn9%dBJa5NOM@g)u8FEad=qw zu#VEOZqe#?P^RRx8)Z0_ZAZje*0|Ch(|X=bruf#Iv(`!Ia4X>wuN}JtSMjM;JmJJg zYf1}-7045m>ssHnw{d!6Vv(#!kdRiZ$8U17IH50u3-7kHe8sIprW(ePl5~|=?#*FK zEjb-?IcVZl@8dtKy|r}ru2+CigscZW>h*^r(=GKTI|d-*iD!6@f;@F84(a!(F)DtF zOXPx`Pw$5dn4Cd&zP{JEbPvN4Uf+Q4V)U}kFE<*sUTHtkD=nc2+yG$^vUwBkQDN)H zT)`9|2H#)m=Mb%j!A8Ut{Uy;!w{$PDg9;$R&MA)MBJI>R2QRtrx;)3XcB^8xQFJh8 zmc|y**8fTRy2yJVjj(;%mu}w+BE6LE){)I0YnZv-u6z1G*N8VIPj=fg+!xQITPAdy zL-l%4o^9Tl^h|cajiJ0YdfhS2QN2c_DXx=GF31cWq!$m;!<0PaVlt1g8B2mGs6wC7 zgSlC@KF8lc>KvSk#)j2brmT(>J7L!NbSb`?DpYU5_Tt9T6j z8*Rf@at6habO%||t)|qVdwSHMdsq!x2lGpYu8tb{i^zU5a`pTA2_1zs1X5D4PP4kS zRz(m)9b1@=wZaJU2D}+s9U!xr!99D@pX}LV1)7Ut4?^>#Y}3E{5hEc2&8TmB2g7lZ zu(xad`0LpVB=CdOiDgT_qsMCSrv@ zr1hs>&;D=5c^QI|6TPQ`ke}81Gp}d&#y2fW^uN`{BY#QjkG-CKle<%*-*kNQS6=6J zC-WDFQYRp=@zURTo$(z(*@<3L@z>vao!5KbM0F?nPsekA`*ogodmPnDK!8}#JHc{{ z$R7ti#R7j0nMEi7ngkJ?ZzinDI#0HUj@HdsokQ-0QIg)H_R;HhO~B4hQhS%hTiOH5 z6jcHlGtR3WJpk}FV5#9q)a#Ea?Xw0BWzgE4Mpmj#sLkY5aJSaCnNe}%{XX{wGCsI> zV->dKBH5DZ|Hv4TP()q^cZu4SJ$sfLr$hV`>m^Cmh|UxGX(@U$E#_a_Ndq108UO|@I{pKh#rP&dJrea zNZ+Bn`LqCv&t5a3^FxR?G&o?w?|R@GfNnxrY?g2&Up?6nt7A?dNIsJ8+gSau*3Z#~ znMr&I>87ztj>2TR81>n@oeWJSteC)Q%o1X|ao)h~d|vBG)WBiQVJhS%FbzE#O%GI< zmS!JdmpVvrL4Fzk?V;A*r_+mfHt+yGWMLSYfgs|7WerjNOcJ$aAkq?yVsvT>gBu^} zEFokTVZVKy6ne}D$-Z7QjQX(7^$qKs?!k(jcR&}tL$F|RRt%`)I7Jv-2$8`G?lVdB zdRXfN$?6jaM*TxzFAs0hS26jq>qh5>z=%&`f<5&St#8l<Tffv^)Ux^}iQ>bp-& zP3d{`V)qd_{2)-S1#6ZfVp|+Ctq)M|kLcW_ta^LH#>}P$ zJOCX~KjPgA^}$it?X2 zdyGjJKB=GOfjvb7`#f--W2|A`yR}ipA}jT*c8*>qP%BE(d>axyG|z`&ICWS8F>0Jz zsz4N6gD6Nbna4IY{tn{ksuO-er^0oW_h6a|_G=mxXk0AE_AQQwqecg|0|7$ChZB$i6GaT%WV2kr=Aj#MOyyp;)aiYCTQDHn_SqSXGdy&ATU!7TuN6 z;I#BXP9+9g&jmW2ZZ1)jbQcolx?MDST1I!TjiCMoY_qKe^+o&xN2V|7eo_bx!Q!u<*I~$Fdfuo$fM4X;BIG+EFCIt)a%K;7I^Tx-WP|b^>g@{hRJsfFJwz)6 zIgSL_@YJS=l|cw%$_L6+;}#@T>Rju4-lNI(^d%jjuMuMo2f#R;sHH)Q-{H&G1|hx@ zD*&)lVs9dwT$1SW!T-nvt@uB ztUt>)U)A~s+&4=jRuo>2A)qg;!GT> zsQtu<3)=CIzmOqyInQ+mDdE5}D%Vnm5bv2Z@|XFB*Akcfm^+-o}j-DtDb>*88O zA25!^=_8k*pR^r89m|9Qbup^v;0xjwd*#F7m79(((op z-Xvel(+jZ%kPWc+gKk;2r>oa&Hoq0Ci?FS6!rC6mWpIp5N%lS5zPm@HywhnGk*WY- zCpwg)lbmQwQrw;pBi$`ubk#s3lO}BFEUjd^b&l>TXyyQ^NgT0smWHz4ed!VPRzg$b zl%^WKh9)A*gA*1EA|Y}&^8tjhi;_cpm#a>?9$I>B_QtnkoR28`B&8GXS^BB+^hIypMWHoec^YAG()gI!7Q7oVG1wEIjlRz!3+)4 zhPYu0x&jN{d?4b#WZi;$&aAirT1yKg`y^KeDWuBNJ_TN}o9@}V_)9ZaJ;smppfJp$ z%$N)k5kKicX1jgRl3%ALsk{pD3zr3$fBTuR|I*A#&-Qb(!q8(}^R9$WEGtV~-ireN zU5s{1w>hrg*f8b^S5A2;IM{IWO?0l^oH$Ut8`isYU?+=-@&oCf!EIj3}#s85s2Tu6)4NOJjG#oGyC32k7EyD4de9YZz z>+?peos!ZZwN?O7zz&)(TX-zk#uTv93W_szCl(oT=~(agdUi`7IH8n-9Q-8!0g;26}0!lR3c07 zsE=es+$!QQ(HW8-19mQ;g`w0ilou#KhVKRVnavZN>LRbQk6J{H3c@>4PDT-iDeyS8 zP>BOK`sS()UWpIb;lJP#$U+fCo`%Saee{5Jln7M(`&7!0JKyDbp ztui#q%OasgSlTUmN=O;eOY#^%9>klEOdXo0T-BUoB@XYgDVfR00}5BahLX9Q3?CaY zNn#|6GLikVp?!wVOH12>qO7dxTqDG5^UmP|jO?h1;G#agONWoz{t1|Vy-QQugE7Ge zgB)NaFKynvq>vFtK)fk9u=YUgG>x=-}L0MbE%#O4no_atcNz!W^jL8f;TW#5reH}s!_ zvjn5vXofzO82XKy0WymHOCiA1I0eZ~n}>L)dZ)XC41r<@7v=fr{jT4Xs3{u4jTtp_ z!9$oeL%2OLgxSr8;Lld3ILCO7JVp*??3!4B4`#$Mq<7KO!A#n1f7&?C(}f$dhzK4X zcJ98Ox+SCSg;MSW3{GM3=NBh0L^=vS;~XxO!u;#*>u%Hg0GxW)!vrP;DkF`ACQspTjA^h<-}}rNJNjA65oKtTFn~L z#WT-@u!Fn?Z~zGw=c=H`$O(*GoKRt^5(x^`<~get)a(Z!*6|mh?i|?4+=g;xmutb? zER1OO?m!Dl#yf3(G6)!iSiMb#HXdf zn7u=$TEn=&p&nQ?dAEMvTr=jMYIKkci$ce2gTWmP2PVjCW>oXURK^ z48@$HFCwaS>&~e=Fgu8Y_-*L^Zt>k{4`TF!?Bol$^K`@a_w4qt{pb{e4I*ACSP!zY|2sy>jQm28#3MvMay;^ zguWgE2@2t0`a#gwMf@ax$IZ{ckn4fjf}Fcp!>}vmoHn*}KKZS6tmsJt>b|17=l+Tl zmzcThX=~9&wNpD}{UL0P?$78ewb7mSE@FQjEH{y~wGxu!HIgR6_gbz=<)s<*arAI8 z_V~2P)Ht1J3L4u7Ujy{HzkeIkR^eN21Ind!fY}B1fcH)~2H&a+g4G|&=y5lqcaHkE z0=^GrJl~e(?B~$eKMW4Xe`OxdDEtQx&tgG+8g~}r zXcI9dIEh074Kijk^5H5&szL{J$zt`<{^LE1z}dUyKGp})m^WC~!QjC=Qj+{U4xDEF z8`Nu#4r3__5(Baq#6FSHi{PNPSe$_(x)w@L;LaHMkh@PmmC=(2P_)0E_)0x~HlS?R zY6L#pl#&8jbLe(bJ6S`=YmMb{%{>>80xj`~2o$=97_;lXD6S)(zO^B_uxv9UZL(JK z{k67eY`L}6TZ+u+%N%bUQwxox>Ki2gB`Am0A z+xXPk+89gCFIWGe&2AeXlIzhbhqSV*SfV(lS&70ikY9G1U~lWhi%Bx;!iyDcNyd-F zyYcuPnHUpqtRXT{>iO;54_FDqbHXCW;jq_)omR0ba9{gbf=P1#~pYBs}q{-+Egsgui}0Q8pnZ{XQQCVgha$ z_7dM0D0;N9o+ueJv|18`C0^W-dci&L_DFnkTkj`ydYDq^!{h>U@iG2^&`8d3msRVC-3r?X;Sbc>`tfLJK5Q*RUxujW(t|#g=}ovinz&w_xh8IevqP*_KAX{ZB|ab* z<%zU10%>Q+aIDW~bi4cGy$RtMpK^ZVXEXY_?(ZZ?QTh^f=o^x<=m3x(mBq)W^@WW7 z@&#ANl%R!S7bf~8*v+~dk-$)vA#psW=Ao%4 zciM+nZ!SkT40@81#MwmrP`)K(0VU?%X+C&|Oo%ft1Um-vs0w*&FN}0yiw=X<(G!eq z$XiLt=J+K}HRx>$EXu%dnx2}UHBJaLAs`sAia{!q)OW^J z4>l_+ciNnNu+2jCSjPP<)_(wI7|yIm$8{kxIvrnokW5j|n2DTtWT_!5V%UP0gCQ`% z95iK``soli7Qntu3#_)}u1dm!!Qcz_Du7B(x7{Rq<#z-zs3_biaO6QvaA!P)4`SI) z(TxzW^qFjncx}Nk_!LZn(qND)bfverifr|sK7@Ol>@1Q?gXG9YQ#=wRcT8Ws1M5g7 z#2U?!l%X!deWJ8RD=17YO)1IkomV#e9N0WaH&ukP_&wlG+pLrJtQ#o^(YgaU=RLz9 zQ_@7Xmcl%ihS^>L!$1-1r-6&X$+fc0d(pO1g(2$vn;K;_XNyCmF2?&dPy$KziI>Ec(khahJnO*-Yv#~#Aqs>flI0jSHkeX#qABxDZ9 z6z^}ePL*3Y6jndwP3a`L1F4WVXdd0!twK&ts2BLNyis6{L`qQcqQbqmxG@C>_b1_| zLso}i{s=343u0NI*~Awr@4d*ADW!=;mhMGK?6YHnF|jS5e39G zV?+yasm)rvAVpMcg=D$`%1zw1?;vld&}^p5ynEzVVvi7n_>LR`5OS~{OuK`3yD`)t zUBYJ9Ja%Qnh4i8CaXlZ{0F zXz0yW2o$od64LcSWXwFFx?|4H&`=5{?FL)H{Vv2w)KBLx0iBWxuwFA6s@6~9?nPQb zOZ|BP&>iuAq<*Ezrqr`m0cZ!u7!~+(A#+&~d$phnS2ZAU4%tMreEBHNwXvAdh7=GO zAi6wg76?Hjkpqk!7NV$Rt|^jZv2_S*=!qOz8lVL7G1gr46I|{_o`&#w#74%vJZ)RS z06~=k(6yLq-e>w=n_TBx5qj8O?_M z&a`i2Djc2@%R3r{>I!dG(-Yr6g@&ia}5^8j9r&lgvm5LW7GJAo=2Yt9MZ*WkN8#tY95h;GB6(<23YS zwd^06--nc(e(CTDuqqlX*o18gB%N3ZdRT!?mS>ooX(2Ei>8)u%=z~}*zhhzf85G)Z zLH4u4x_|-5`1o2+h#|QA19zR8TQOOtIbz6_`YZkqk`tG_$xK8Wv=0!mWht?@Wz+m1 z@;y=sQv>U;y<`1Pgdm>gRxfY^8VmlDJzDokR3;3->QcgKx}6knQ=7ruo_C9;)QV;g z3I#?>&@Z4S)W~a?UQ=ahinbq8P9r%uR+UE$UR150xC$+_Hsn?z(Cv?JASr`X#jr3_ zR0U)(W|+2qpl$)#f-#?@4RU$~z_R{^BFf|#*3ZBI_aY(=fRc@y5W(2$2|)p^gna8t z<>NqVR->4Wly=k%W!kgHqHc5}*DeLn$?U>{wpUlw5cxaTF)UL|g}`vkgPT+A93g+e zM@%rO40a7@mZ6l%9f(j1IMxl4&uksK#&NL6NL|S?CD}@d$4PJ-$wm(Q%yy#Nv{>k% z8FZMBWoMyBFh7_-)Np+my$2ih%|v1(%+6gM!Fz?r;QX<9x7Oj4ZlUDY03Y2Vh9Nk; z$@!mEaNYukwIo`Di4%(!)rI!_digZpek&xvG^WTCjsfjhHB5Z}sowuHH_jM7CrHj7VMOr8cSK`qDEIBt~X&(Ch7EBe(|w zDd3u_Al#_7iaTR_My1{gnIB*AZiMv=c+{sMB0;q1jCG{nu*}B=RxWOnaB&{45MQGs z&Veyp1o90SNQ}!=9F3UpP{>W+yfdkwASw-2pC>rrc?%W?aL9LsCLW|p)DRXlFdPh& zf)xl(v~u&V?uKyp!8yG)zLm*M7yzwD)#PFF7UM`ea-Qx)sob`)Uz5(kv)}3YaFxfB z5i9<7M$eBpG0vTEBXiL}eENs9Or{TtV6j!d3%i=}Q0~_P>}rF2ylW2|sX=%(kD5Ai zkC0N|<|AfRP~S~?B?GYTpi}x1=Ctqi&cfK{Q&3o}B9lj3zk>GCQ&0fe!kbq!dM*jS ze1EnHC`#0xRR0nD?E1`tX{Bcpa5o4={PmxTS2Ab4BAl+{J5B*5)8rtu4`d!fgjl!o z-jwq8EANQ%rpXKp%kF-pUKES0Qm@J!zmicuN=-7x-aX0mDJEHG(M+zGS6i}u9nUZ5 zNPb(^Ilo%G?X~^+1?Y5ptGF}DdvxA}urkkvC96i37TWV9BEh^+-@!UpP&DKTq!2V+ zdylz_L}#r7FkiWdO$pZNYL20b@xMprH`wc*BQgyp9>)QRhdAC+$A;t!7lZkTECUp7 zBt7F63#x7hM;r+KiAY6>?d`p02)-e}=-mdK-ebUmc!R+yZW~y>Ybz1aBPRv%6&aWc zV(Dac!7&vxOS8oziVteLO$$f49n6PZtLD2+AqCIt*R1Gw?5Oorl-|^vu%UqjT?E+IRTqp~Vu79AUe1y`t$}<`%Tlq%8uqClPxk3Y<#tW``XKM?VEk zAzq*|bYEf729cm~P$S^gStEu=q$bHuS7%-2eRxFWN%PWWgWaCh2Tc2Myc9m{jY@sc zd}asUFRqyqSr)|0;>xT}j}g&1+5DI}G!li?oL~%FoQ{T!6BGr#tZSr3{9;BA6y~4} zuOO+Cxo>m$z@9y@U&3&OQ;EWCy#@=O2WKrkW@<|j)~g^_av<)RFt4Z+HIvK{^zzDV z+LgN~>q4^@!ec*Ih&B+zxbCT|vbvo<_>wQ}olukkk+aNs$UCQ}G>I@jNxJrnmk@qm zJqh27J$r2Ox~sCA-7z+dO!fj#DzHuu^tqcgMmWq=9#`;$6gY5oYA0OLyA!UEov=Oi z9fDcAxzOFjf|S~U&oh^1)y}N*RJRCZW9}33+2Ewuw-y@<@$pe5wt3mAzOmAPLW%&b zy}Lv%MNFo--^qSkVWj}}EY8K4I0uBf0($@$$744mP6%=@e<0UW`bL^3rBftgn6KNx z0eAx&z}UzLB_Ag|FUO_UhHXzhz%HD*QH%oa3=B*OX>fx>EphJ7^3`QVIUMIp6yns8NE|s+;Sj^kvrDR>1&KoR)D55(=0twa zoVcV7S>Z>11OcT6>4vCJL_Z8b)aCbDV>Q;LF)YxKw6oL0Qh{ce zN8G%D$BccvjvsM9f_yy2kDh(p&5v8`U_eJqvt4?Vbg`pK;FuU%@>Kd{?+XFQ_bl*@x@UoJhkF+I0{1NN{k(e?_=@gX;M-}RcME*G+_S)UoqHDe#@w^Ox7$4n zeAl~Yf$taGv%oj*o&~-e+_S*9$2|*tzi6MY7x*UJv%q(wdlvX^a?b+aJKVFtH|d@Q zzA5)C@a=Wa0^dIOEbvXcXMu0VKL3Kix8FSrd^fvif$xBO7Wih}v%vRD?pfe_r+XIo z=G?QuchEfxe23h#z<1a_j|+VB?pffw#XSprN8Gc(x8R-yzD4&e@Evu}0^hCfS>St@ zdlvX^bI$_b?e_Twf$!b!S>St*dlvZaaL)qYG50L+{jz%&_?FzWz*ln50$Rhy!WrSc_J;$ zxIiGiCoT|3KM)rPq<<|g5J-O|E)YoXjSB?Q55@%o>0gfv1kzu11%}bw7Z(Vm_s0bS z>HiWJ2&8`_E)Yl`hzkVL55)xn>955F0_oq33k1>!;{t*7!>+)voWB(p2&BIr7YL*e z#RUTC!*PK?`nTf(f%Nah1p?_Kae+Ykk+?u0{a@n(f%G?Afnh$6#svcDN8?g|VW`rqOLf%JFc0)g}sae+Yk zL|h<{{=K+BApQGsfk67nxIiHNR9qmC{%%|#kp2T#U>MS;;{t*7GjV}H`g?JKK>82k z0)h0&xIiF%DlQO6|502ZkpAPiKp=fOE)YmR>k15O`X_OLK>APP0)g~%ae+Yk`M5wJ z{bzB3K>EMO1p?_aae+YkY+N9a{`0s%ApJjV!LFiE{^#NXf%FS;fk68Eae+YkFX94$ z^!d0zApK%oAdvo_ae+Ykf5im?=?igzK>8(DV0hFY#03KB{~Z?yq+gB;1k$g>1p?{6 zj0*(PKa2|m(ih_bf%L0!fk68I#03KB|LY12kNTsyKp_2ETp*DCe{q38`mf>wf%NNf zfk66=xIiHN*KvVB`fuU_f%Kbkfk65#S73P5zl{q7(tj5h2&6B?1p?`};{t*7-^T?4 z>3@g|1k&%s1p?`J;{t*7kK+P?^gp@+!=qk~3k1^d#RUTCe~JqP(*GP62&CVS3k1?v z;sSy6zr+Os>7T>}0_hLp0)g~ZS73P5{~s3!q<7V23 z&dqHfqhkAjEodbiVY3M=Kr2Xcg|Kf=y`(9Mm`jujH*cjVt%!g7C^sYFrN;PD&7Lhb zzqF47qTu#gkL2uXzPv%F(FTg1*mAYr*90@jL572D1Ad5oS(syQuXROna?qumE zqBVYVCyq$u8>PuOX8e*ivKl!tRwi5}7`^Z8+ns60G?FVw@&jZBI{aMRRVgUPpP^eVllhq#Ag=zkQj0Syyo{MjG za7`XKYHxdRgU%1Z2ZEek^f4_bKI=L*Q|jH>LHe|;VSL2pvM_UPzzUhc^xmCy_tA_W zZkBQKe-M5_lwY3kDUktLy+3Va?={BXjV57a{{Xd|S0BXZFh#>TmCjG@@@Dk?sFFK; z!c%vle+AoH3)h-To%^%NSQ5GCMlfrMU9w>0D<#nFR`S_G8Jd6(C~nj-VHckI5NyKc zA@Mz#^^Vq0Aa=EmfOLFf9+IB`@(-OGihhmjQJ!(?#Owo1Lt%f1?x2Fna1f3Zl+{ro z+`j^!B+8_vrcFYNz13EGjW>YWqNa_@VuX3)TXrI~RTcIjbw~q;J;+$p8CMr6q;06+ zuoO##kZc&=5D8%(cv{$dO>I-d_>7F=I5D~y0r=-Jw0@H^P?VDlIlICT=MFWFn!DRf zceDcCP{PRmFb=U`b*(Q7@Up@g1{f==4!VPkTxHy>tbA&P}ttodZ?cywO>g=iR@8wB8tP@1>8XC zsWUv5ucp5GQtw#4BxCtncHk_Db|h`w+z}+szzN`VHA0rzl{HG#l8fEFObDzV#&#)) z)Q|{l9b7@?z~~M=W^3=GXWSJ|xd5x!OvnvTaLLz@rvE$u8bK<#X_J;Uh66-!jPDmG zUs!7PTQ~tXt^l)i?>LpC=7e!oA{T&xcD0%8{adMN`*!cNeOspO+vfo#s6pImI^7-x z42E4J*F$jB>MolrSKbQ}?{0_cdau5lg169v3<&ZBVt+52v-#Pa$1NS!!!H)+$rXF0_~`zmnB(J<|owUJ`BbbjhqS3wklASYGuCrbh-v za>lDfC@V(Jcohq2=_K|jX6ecrYF(f*%vQ8lLXk0vGsDSK#Z+dcnNI10+XJ`)+^3FOSjF&=^qkEn{u`x^-1>Bt6ANH z-Z~Ml4<78CzTkqCg7c~*oLBY0dDYqBTqHaZ( z0OMht#Ph3DP(lKj(c6L4tYmyPvH7;O{Sjue1r0N-~EcxU3p{toZCop6t(cnj;NP&6FbfH6{7Fiu~) zai@3EQ3RLek{Xos`5J_paeBi;;(V9l6Y|yRjh;`DqZKK~J)|(#RzyGw^PbP(_i!@> zPd4FHb9F|aHcsR5UAk!iwvejBnTR3}nJx8Q=KEz+*wg-22sX&J=OL?~%Q8wgC-!`p zQwYKmMuw)pn$c%W(_mH1-lCo=7ei2PuX^ytcSD3Xe$Qv{sF=4G-KcGF=`jskZ@``k z1IqbYLXX{iac9THDN1S4yKn;k*A>zniAjfe;ahu!{ za%p)f7@22V7|)72k11*T^r;P-!LB)3ZFC};pupI;w1Q#Pd)XI@m;E-i7^CpAM^bXa zNBiDPDcb;p0t>2t_Rte?@b|7g8 zA%CEDV8uyljo@^ClAI|e0HIpnVbU2;_Ck zpb0T!I3+A|MoTy_rBXS**50vFtJ>wL0VYaLEks1ZYB~1WbwNz%1Vm_@$A(gk56A-VXtQ zGK%sf%@T>&Ucxd+#3~{;PjN5`Au{4v34ac1Zb_DwE0m~!!Y~D|P>FC+7SMLgQToJd zc}C3K(UlZ}=~@G0329-xlc{#Gz@T>~Wkh=obb*@Y1*TBQH4bg5A<{NDFbB_OBl#R{ zLcpj%3Hv6f#!>B)7KC}Ds->g@Yl+cFipU!o33VuS3pr8aQ7OWgzIYj3Vu}`99S(fO^zqJhaV4Np9Q<42rLgr%L{>_OL_?JQeh{+I zA3;u!GVF}oDSQ?a6O`f(7h6>Xaof6Dq0ij0^XSux>5^ncGV=i%MD2545`;~z`X$?} zh2%glC}8j5N{2SYJk}TU{2~S|j5!YNZ_+Djk>*m!nf|_BEEE~}gs(?i^s74ap0^xR zkfMI+@h|Di{@nceXOBL9rP6PBVd*!1E6|s%%AeoTZ%_~Y$xX-HXa5vZkNxuBeJ}ra z-IxCsU#1(>7pZ%XytjRs;m(s>jdxJ!X~^8$`$z?O|Jtq(LWsT9JT$+)l)G zAX-3>xLg;Nnm|+Y{D1G`OcHH8tr0db4~D2Ghgf$Jmq4m$m^SU@W3}yP|QI zY0Fwd3j#0CnBz6X*f8+~f;Vudsr?d^d-y)3hSrJkHTeYXgV z-*{yU&4}gvMxFw+hUl}PKnAHeft73|`yLTy*!h&cA{a7G+*j#uWb&ku@L$wV1^=gi z$NtrO|HazF7nS}FX@bA-Z+`uUcYWxUZ$jHqlYh47%lZc&{@Yve`wyOe=-2=Fg}*_u zO6pI3^_pM();nhA=$o(IdH)^H?pppbHS{|ZTUy)S@*jScet-AjXFu_~zx>@-==-NX z^1%lVzvtK9LFK>j+&{i-{_)@ZIQ8|P|9tQ(zjLH{JAJeEdnZ2n)-Sx{x2erPefHE- ze|YnM{Fn4S|KGdEzZr53;Vj5)wNByxofe%#xIp-kg@xVY5c!d){NCKPYEaf26Hd3x z5TBy=n0xv_@E?1d8w=D8M3nIewpJ@ckm8Qs8b!OuL5Cq&zm)_mg!r{LC~6nX9?cnE z$}Mn)rocy3H?G+L&DcrA*yM+@D`F%PI<)f35L9F|1|Bp9OC1Ch;0ovPpcoA-HzGXB zQ4=WcBb3veq1eqUuKRK|(MNB1KtV27%s1c-6 zqFO*~U#7smkrW8PY8PwGL65W?=9B0uZ4xD5a*R-F?+7mQ6M?i7YMN;BOm4m0vWn&OX2r?SZhChP)ZMFyccCAkrCTU`z z?6YvW7rUo0`RF$vO3h9FQkfdwTLwT(ks#X&?oLC33oJgCiR2%o^JfW_bB~ae0L_cK z2$VJ$1*GEfksOOvM8G=iw+);LISGTMSEOsff{ReVsiUgV)f!w8Vq{}=#3Q;Y(vR_*RL zMhp=1aNRBgY7-`WMqf5AViucAfbQpHC`-id1EhBcSsd9OfGdpH zS)-jn>R2!Ws!tGOYvl7jCJh=7?HqD!U{Y&Gb|jZ=b=h?6xrF@igidnkqQli%+`c+e^u&5w)l!0E&e z4Ag8FQt*OF$`iYwjPb}%#F$d{O9s7J*s@uCMzAmtIVr`}&g*?artLwc&#){$zjP*z z&-pK(2RX%4FFw!cE3?jRi`~>vZj~n3cGe~$g zB-b$Tu?0`F84nDFZ>Pk0s;4{p6%B#%JD@S<(n^pyNUfxxm=dTM75^FvQYW!Fx`q)D z_CO>h;c(#X+P`HFwh%azO;uyWY77?Q3Mm-SJ|p6(8=}*`gZUiNv9J^hZxXy9w0wuY zQ|tQ_$%$%s5e4v_S#Rq2XKvt7-$$a%UI=>=C4vnya6MC1WTogarx$8*_Cbt0=eMVcJSaDF*V>X@c<}Ng5eX zU{b@+WpiaFGe#b&bOxqEF_XX$Y**L}&>TP_GXjG4XnP7j$Hu0bl)=Twg0bjrwQoA< zL@v=9rvY4RG)@Hiex&ypJ1E)P=lMeCQUA#|$ix-y_jWXvM_$A-*l5U(o?ZLTNFf&$>ZI7s?j=OSw78K17zN6^MDsJ2)s|| z5>)A%Ru{S!2xoX22vrMlsi^3EQ}7Xh9f=T`#3GxMs?z9CZOR^m+v{X*SeRfnjYJ$e ztil9kRi2vA{P)19yhk2f-*cy%2)_wJG!LmP<01X0Y8q=_9)n?@U>4 z?m+B1A_s6mB=uhOr{`vFp@nL!;w>nN1>&~3hhPY>0#Q)= z1qR*hcCnk#ycjA3?tdpao7xg|i&c1Ro7k8pokae~GE9byo|ZmB9FtXn z88U3uICmCEYQ3?J3|KP#Kz6#@3TU_e8H?I)1x~z`X4WhLi9A)%zeWpIrB-9zH(|9w zae<&)0I`A$Nmw$PhoKH8B}Ni9)yemAxWfYe?6lqZVre!Dcr7PFlRJ5@#fRJ^6J(R` ztW7FxxW0@SVw;nL(1$l`pjc)R0>dUKFddP14Co}9k)zQ`W1=%i8TeCuuYsgXoIt_I z5(VuJb4b@x?&!XjQsgPg9%UegUg1oU$As8a3KWdE?>cc13S2&ffO=)gcU3wa{Bl|bVvNK0~@KqXu-Df?(Z#41tBAdN9)gi=5` z1_FI`CUJ}lVZof;4k1-8NZ@RQgtC|wcz#Y=-e&*B@z^5fs?Dc#9q=rYE256@6`DmE z0cB7Z)IMut+eF_;wuV_rCKIXvNw7mOO%QVgOiL+EPpL!JLCDNM*`G5d1C*TJ*8)WwADdmwCxIIA--d%gmRi)9Un-UA4N63aoQ$9J{VIeR)2zLo2WQ*+ zSd-XGFLmOpdfw;JTBOA{`desB6{iLgPi04F>)<(X@Tdn5uDfKLhQSR|5w|6;OchG(+3T4lis*CttMPul@`HlHAi zTt;mt;q*yxbLffgmQk{WQ#ZJS8p>Vw5QD2NKnr4;VR%5F@FAaFW1JvhAmAjikBThE za|Px}cL?xrqzD{>LECNyUl z!YF@0va_%c#`o0_njT0^2{IUtl3JnUrwJ=1B2i_sY6Fi1PXf%^DPm;O67JT-85&TD zQ`bT;@>|vD#2%@^x(~q(g&QcmUVbkWyy?b*IVlbZVslJMVDr)3I!@W>JPpm_#wMUX zsI5^!Tacw$r$w>!j>Kc)XaE~CWFxEL-iOhmF?cQ@ZJ$gD$p<_NOa(JW^)k-s+la^j zBG;juOgDH4lv)d*u9i8yeM6TznNJQdYkDFZ>3=rUjECL#ItKnWVg!nCm013c1IX_>=J`lJ&;I# zC$~!&Bt`@B>+FJuM#p<2pQmFP+_kdF@W`4+0uknBleTEuAkIiyDl(~>jb*?EZt*tg z0T^UG!57lZ{>~Lpj6i2HdSoFlFi#!A}mdRR1xvuk4$;vXZp#5bwqb{iJkVh4?HxEaLq`$(-ErJj+t@*e z8x^D@k7u_8(&?tkA7S1OZw0`%9UEo?V8NB&*q8}mnGa-;rr{72!s8Ru8mI}9cUn+J zM{#Nhp=;9r`JZQNl!f*__7@+)FjrHT^9SNH@}{ zvk5q$)xfa?wcuatCn~0}=ogcOeAdMPB;D#5;pV(ViSN2Ff;6ouqmt=PXYkD z;6>uAs>Ne<;GN+HHnP*56ZU>?8Ss-ME14$({UxnGsdOikQ>7!|5RG*tKa2J?U{7KV ze}Apo)SJHX#-+|dLPuBuwb}p;8Nk37@GSf;Wu^oD1CydDVHcS3onm0L8)^k=8O#!x ze*l72!EOO};HJe73N2$Zms|M4TwQ^a1d^%DwNbo*O5Ej=QM0f1$9Iz35q(7+iz@AI zt0*CSgPe0!j`PHuxD@>ACD* z3!53xxlymKTzf45fWihs0`x@QU2FnOI8c_YF@%Sp;O1^f*y;kcC2olsIf$k^@fT}3 zHYb#89I*gFtC(vrR5Ezk2BQGV!6N3_yd`v$b2a+~Ew81z0EW?prYsQ@K>HD6+#c}R zE$n6VMD?7&X?@IMZ%A6(RUmca6rn*x$;6p@a4vJ)dO=(49@@nX*bvDUzk-je_HqMK znxL)hQEUEA+@s(g?w2KZ^+v zd$bve90_hymda(oYR6}5W8qk|1XH6~C*v^rEzoM#%I~Y9Lz4aQHC|ZPHn4FsEK3uB z`{@P82j+$lI;#-F44EfS#URsa@krpbJ5RTVglHG|g%u{o3laxW3itXLrxY_Sf^^2k zLFj|otjUqNRf4C<$q=-kq%w0s5HODh&lANB;3g15PNhRuIOr3r*unruW7M3o&6GXuX2PLwhaYNa94wv2UyY7L#D9AsAGMX{j4EiRHvfh+&By z6CWZ`m$6;Yq6E&VW-*HmnnLJ2@Y`|Qw7N=0V*4SXKlx>~8aQSTT&R*GD_hhDh%k#k z5s@8`*{HEX=m?{(+~^@TX)|BAlPGDqU6|TG13`xNOp=?RS33P7EsIVv*MhNW!aER) zTj-i}vhL?Uh>r8m!3h-l06Mb}TatgOjHy_`onJsuLS9B(rZ!lceZA#O|KX2PJ_#$e z6{Jwhcnw&N8#^?(b%lp@1aXU=0S7QBD&vwB>Xdj3_68^w;VlLgH;e~#f;W^<)@&wJ zEz!wWrG_)F^u_S(Yexe2M>0O~5BigX;5Y?^v)ZDa=EyH*g7-mesUS9Uf{_m*Cl=Gq z6_{X)&S!~~+WGmo-P0`E;$yqx?F7>ZLFPJP|NBR94?V0O;HNltv2jAY!w_pr${b_4 z5u?n(Ca{qiiJeio8jer^2oM1_lCJC+FlcDHeAkI3Fs>imX-PM<5Gf|NTlPajOlOyH zK*G5YG4^#LoX}s<`bil4a9~~O)WVNtZrMUA3;WmM#~J)&-*Ng&E9K)KHA#P|+%<5| z{JqZ%s=|MI>({n^Z~H&`!Q~g}Yft{%&#J=pqi;|HfABMi$@!%}#rtuCe&zjd`LK6?PCb?L{>#69`+?cwUoW=b@&PaJ zz4`qIF8Tm`dc8l`edMB#d0+S`@2~A`z2#%xB^P^tJooC`%h$a9Ezh0&z_ovT_k6f} z`x_7a!2?g+a_mx7zx)0_dE(kk_{A%~a?KNORy%#wijb`IsY}%#{{TrdXLqZ&FI=ho zhc8pV|A$C2`k~9zPyhQ@FW#-|zx>tA$KUk1@+F_wJ4)U^*@|KR^Y>n+9=&#Pn;Ll2 zw$-;hHS)&mcE9DS5pNAKZa^s;HN>dK7f?oYeIYN$eAwCxN3O!;nZK2G#u`{+ni1UPI+QG%!@FqKUZ^a>}M zz<6PA<_OIqszbbBZdzQQ%^>(rE;=kYb7Cj(#r{D^9Jxx@=*}|J8^GlW5Vj-o08t$Z z@gTEIl>|H@?jmTCg~sqV8FO;pWNBW-Xt!jm0|T;_vGnA{d*??J`oc{>B#gSJGdmx6~b zf8l5v+<~k%<<$^>w`n}Hq^qsMxBF#J4TH)aq>B<`%)s38sBJ2I za))EF0Si`o+j}~um1A)Bb61v#6p!n5b zIshGD5ejsg&D7RS&BzWUTv50WnbAymCYHMnhaqM%mGC5}C?r{uUhLL84I+=d1g|P< zr6C=}*!f}opfk&Nm0NYt0`)l(vah`slo;x53ILJ}vFnXj81xq67f~?HD6rf)F4t1a zW`xuLm!IU?$D5I`RqmWKHV2Ddh(N2uXw|3_oKIyGu1WM4DJY8ZVj12Jm>)n76{F8Zc*0fq~%U4xcEA}w}?iC)Fg2iu&mMf$0{j2)PHxN*s$N}?uk zHZWJTkS^uD09EP-OgV7|#S9D96Py^bC&Y0i?IvSNK4x;M~M4`f{xMqC$IB& z+~l7e<2S_HC^Qxe-jM)Q04vcN-ct+?n3^QRx&XI3$&%tJaQ(kmxggIA{ei3xe!JaaF*30QApb^-MkWCc4?tPH9k=h3i6 z{G4w&25jlr%phUc0AggpBeDzP%Q1w;CWQ^VhGz^xq(~Y9EeR+T9TdaNOh)8q(jSR` z6ioS?1!+gzHh7~Pat3;5_7deC!&N}Lvol%0&-EL#*)x-zWGr!+2JYhMx*UV<)!?sg zmisP_W{X`HSlpg1CQ>_=vuBbS8pG_F5@d8-V73U$Y&!p9HGAfBV@S)=3I~QDX|UJd zRT}$U@@|L(W?opC(F{2lGh0Xkz&**$xSl=ZRp6vTae^#}8NW4Ip~=`G)zosS8qXkp zZq~W0Vo7AXu(U>tVF--`b>sd|#?2BzUUD&OE9Ubi-h1mO^lDOPB;7m(V=@=6Q zP#toHG9hBFT{n6g@7BHC(>)C$apORGh?}0u|CAfC#|YH3V5ON>C836F(APeDwrT$KE6H2LI*?*5^Ulb<5_aX zP>$YVbtN%3(PQptMFwBxEy#k3J5^$hCLlSHrm@r?ACd@1cqF<2<`byocvYfjW96Mb zyt>L8=v|0b30qUmsy6`-K`vUN2$rzrC0OBe6bsQZ1`vEFw~exl$k;23&$CI^cF?u} zT$jMMjpAH_8YO}m3{hALy3CJJEXR`d6-K_yfi$D%P!Ic>JEEF_g08ermZ-J?;|{4F zw6dajm>p*j7^^CZ3(}B?v?8p^Q2byt;Tx{DWxPiWi{u6!9zfnA?LsaYvU2*UHZ4HLfa(<1fqz6{au+7gFPhMG$(IQ-7lRZ7jYqjrRmX1J#*_~M&Oj0c$lt+PhlM1%vna1WaI3E|kRpU! z@Lw?`JYg7WFkq}m*V%jMth**AcAE9Lthuo0 z6esg89;A>cumryt%j;KG`M~#;S5|r{CA^GV(1br)m&=2M$VZZhd8%3_mRNI7uwAtE ztE=gu6;#d!#IX6A-=HjG7~oV>JL}y>J-YDL+yGeDWdDnWH4b@Tl{WN0<(HpYKeu|g z@US0fhAQ6|hPO}E=uVQOzNns;)B3(7vi6SuCfNz$89dUMTsc$^#OP4Ttstp)rXcB* zO19eX;7N3xnqT%|%|vSO#dCZML&xrOWdfU>uJ~}?i7xlPP_q+bMbj$)hp6 zs9v4kq3>0mLr;8v0ZGcd_DM$Za657ag>LDj7w%?!oCnorLt%-Cp_n8_G0 z*u0|4B1Kr~NYr3i6`qEGkf1IPPuaaU&Z=_^^*Xp5nY4sTq7qO}vZD$5BV3qE=H_E_ z_LBNIcY$H7TE6e4tXtJt93lOd=iY1a`wh0<*$kWKFz z8O!G7HJ7+9dlQtn9(Y4Ki_ohTinrbb*7GEtl{d4KbQx=&lkuE0sm%yaJ6!EK%SUJZ z(9pqXSE-wfgU!15ou=?0G%T^Ub=YNi*7NOGrA$&`(U#6pM@fugbgXss)4x)@mSiKWjINVoL%9Gj3@jMbFZbXt;Rl$uV+XXTeh)OywirhbMo=* zq}3rT)P3BlUh^kpKNAr&6S^Gmq*ZPD0N2F^vxyR=+qr4|Vt(vFruwn}+oe5e=`#p` zHaH;xwdOPHz#Ou!{=DyBZ-3ls-=trLZBbz72CLu&Itcf9&pPE(p%tt{#GpKG8|3KA zD)dmR4%55En&qC$rJuCg4`XFbmOTsSPx|jDlB3S|p}UMjOifgoO#fxRFuZF!*qXed znt-rUF4g}_v;N*0|IsB8ofyjfX`zqw76bj`o zr|L7z4LNRiCdlUNZbTppz zFSR>IxZLY$fxS#0P1QFB*6_V&fmMKWkKPg&88je=s5P7r;c8BU6C*~|aXctZpmU%~*UVKNSZa6QrvYI9YJ2IvYLAtedlo$r zd9E>{z(Sae7MFFbgEVc++&;D=11|_QRo|UOA`G%Yfp%j3!JoOdo;pc4FlaFtW`jKq z%By`#WZs2^3=s6T-R3++dIU}6R#xeaRYOGTss7V64QP(fupm)%_ta&6j(D*dZgPGi zXXTA6J;-dC@dR}Zh1}jCX2Xgooy1Ylp52rUUr!o z&0I-S&xbO1#jQfOccDWs4>3n`?KLJBFQkOwKWkU|P6q>w@j zDZJnBf6lr0&fFQvvaO~m%ggJ^ckVqO|MNfp?~hj4tG@S{g33=vd*xcE8y0Kb{k>ji zcBxkD^xM6)`Ujp@%2S^9Ki*&XkpF?_U*|v7312Cd!~av0CsaN+x81F_!g919^}<&C zZF{?uo4Vd<*Fs%z50|UGs-99)daBJI3fjD&^h~YOj{2>z8x^#FGu*z+>G624+qu)I z4?mub`rF%$S|e=t2H!8#F~O8hPp4D?%bZkG`Nh3zvl;fvTh(S2lSfm%{kmh>y2oy+N z*=y9IXD4-$o8AOSH*=fqP90|#w)UEs+nvswTO7Yu`e|LQ4>b z@XY%s)#_%q+K#F<-iGz+K4I&r&*?v~U*f*HU(0*u=gc6d)WT8}g}u#t@c?h>x9tG9 zgCH@zdt<-Osfv6JjJgB5hGnG2`Ca{ufpI_;?Mnv@d0OqRG()o`OE0hWo4tk{w5PtP zzhwsv?OSC>R?98ER~FRB?DH`-z0s@QZnSqi^{4SsMCMWE?Z@$U7;!(I`gVM}k$Gg_ zR(UnE9JV^OZnXv^_>TUxU0B^c%nbX4nkFx(HJYCKf&Q_5zt#aI$A<5OLm$lgBi>kR zW6_}a=Ps!C00F|16AL%a+!8`(#yVV^a z+|ZIQfI(f27j-RcZ2>KI8+)G8I$l;QemwMbyy5g4sSQ7=rauCluJ2VnHL2rs*)h-T zVCrX-zu66|QNN30c}m9@sb?P!O?pB7teO!lz6r|Usi(Dm!*18$Ke)~C$y`uVLPl}J zYCS;cSskA~u-rV&O!E{-X}{j_)LE^Yc7_NKGB5s|^4D57+D#B|Pn}DKZnVlBd7Am+ z=aqkBdpo2c;Hi&k{fZsFV;|ZN)YBNb4k{sJ>(vA_kV@oXX5eXDgbrjAlDVo*?u~ht zdHop$d8gLFHOKp{Wc;punEBur6c|&~lWX~jWc)kkS?2X$R5Kg3-LT$olF#%L&_wQO z<`W+{)9m+pyvo0x!Wr|-zOJ5CKDcP3Rowx|e=}M5o_&}Z_LtPudbe{A+x#u9_bj+U ziSF%ZUVWePg@Q#5(4H?OV+*;$!^{UWU<4Ey8$8Y5OFr1L4>KP;rwW^mJ-qz;31;>1 zAoJq?P({IXy!s`rznez$;g{pPD3<`grtabURcXD`X}Y2Q@Ii+Hr75ZDs~ylSBFrBp z2+%aoG8>px`Rfg={!g^twX1J8hL?UpodtJpH$KrP0RKE0wQrtfMh#Tq`Zn+JUnlTu z<3Z-dUs3CL@d|If2%wEmiX`f(f71HPZav$*GDL^LH!>s5sp1C2b8h>eweHz(BYBj0 z`J7s~429-O*lc$08glwCTEAsKqOMckj(^L1{rrHOumM3?u>7fsk%B^Ge$R~Z0X6ed z2j_IP5kbg!dP4umPQL|>pxngMp-*B2O1+T6p?S3mhTID`yN&Q#107cW1*(Ri z5P&Y!@nfg-@49WpKbG&vubG+8tC^Q~8@-Un;;CDw;+@@fPcxr<2!dd<*`R1~4TJJ5 z8mD5G{a`Z62QH{Z<-1|Q5l+R-7}~4Mm08D!)#CL|tI-yGAeF(j{KTnPByGpPmG}5# z=KBi(dbNE!tgl0?!ngfXF{X|?))-S$FE~sEiTYpaq8agWEU0xX@O_&cZcXDt%7%nxM{$$nP6xvcW*ojYJCr}S5h9<&ANVwac?Y=k}_#)rMm zoy?reYMMGgKf-ihO3qu92t3TZzoPt&>Naq$jt~AY!PE#3%Pl<3d~pRr07-*Ucm6o_ ziF=y)UM5Z=J@O6)^Ew9%v@_=j#b)_ zKrAuCKO{5k#g8)|T?I9~-PpSlLaT|QSQY#CQwcT1&!F=1`&fPKT1Fp>Hwy_o7Y{a! zaplekVc~|#-{?VdpUlO)w$t0oEPY+BN4?W(W965^D)87-r*kp2qHu10EN{uLnGyc4 zQm^C(>~2MaU{j)W!wjVK^hMgA8ttf2+vwLI=SH5Mcb21a1NOPs^qjLEt>K?Av3z!^ z?T79wzt(~7k3*^Zkr`mS-)!y&i}AQus*Pq?&*_DD*s$B}ba(Z<8+V2OR)@^1z4d{4 zw`JI1_A+qUSw1Gb^~(7g9#s6h)yVG~gGf-i9^SRqN>5K$jonh|xy|$EVnl=hp?8Tz2R6 zG*-2Wztp6+ccblh+GlIK)kYh(H4fnKR`>Q``l<)ZxAwr@>)}$rx7+E$!iJ$?A%!(& zXdFEcA-;CIY>foIE^L9qtCQGo8z7QFWV6+Hq`=z~6!Et^T_46L-#*4hE4b4 zW~YN4?7LSZSQ)1_K`=oH_H;@9GUJ_6rKN78w+rgnsClZV7n6UQH*#t|W!0*}QgTnH z?OfHSdG9n#6!&()XJ|=$OqC!Ycl&!3T-4)g_Ex)k2luYJ)eK>$S)dqpz0-pv(z%P* zpHQlq2HL=uVIQ7?i7vdC)4BcvO^dwstNKmx8eCg?rF`wi@~x{Y<&~Q^Z`>@eT)%u{ zd1bl0vG#vf;8560kDK1PE?vCRZ`Y&r%5W%9^YKd*m7hH>e%2(NRV>c=EK!av#w65d4OQ$9&Tk_;F43* z!VmHOX{CC(d04Hh@!@0+M(1a4ksfSgfj}q!2JWf+t<}PE<4%LtvP=8_C+v2J!}ro~ z7OKjMQlH8%SQ*2bR0lW$Y`hmQ(PgmK29xEnlc<JCo#trh`;oA zV76<|`qgOlE;KOwSICf{Ot2sm!7^v~j?&&YMopbCCYjT}i~E7K_-2sG;2d=5dgB1^c~3s%bOs(V=?0gB3{Zp{3ufO>Yv7=9Bi)n-;7YG7`7n$&g=ILF4u0f) zY7>m2B7CFbhwXlgJMHZ@BFi>D?Lo)mpgDLO-hkI(SLbp!pz*x{BvpAp-&4DaSc(U5 zUVJ9TRcqNFz*Ui6^7Dd6xV4QP@Wh0xzccJ<$)d^p;{~Ewst-K|5Sf zlF_fg!&e9V<%NRIjH10i9Ug^;x)p|PpWeYbn5JZd)+ z-uDlfjU)QK4)6|G)$c+D@5LKjTR!}Z-psfj2Y`-~Q{I}=uS~B%_yoz%jTNUf1kW&Z ze$*nk)%o+*4FkA;bx2CGa+bNHQKuCO3%#D zly0@%KaMivr1$;IjQx0|fjQmqya~j@Gr{Ujv$mTdT;kmZWqR@5Kg{{))w&p(#G+D$ z38B}IJ_}E${Gm?fuIbErQ*fbFZP#h&Bv4*hp;I2PcD@tA#NV#FOB{UX3QRcQhus|n zLf~?PD8WqyiTji1O>vV3zlu%D@ca5oVy_Is8%sQXuBs61;~s9Ghg!002h{BoB^qVo!Kq z90ncklNomyc)rz@!Ny0O&3nAcQVeN9bgLHEgW_5g^~wH6LioMjS-sim;X*d>8g0Dt zb)!vw7GZ;+u@!TFDzm;YIr5Dv|EvQZIAVaq($IPUvw2jbm@#g?g7@60`Rd_e^VP$x z%xuN0FxnmM#Gmvk0`oN0r|FLdj$3W>*HO;!XT06aczrugV0EygjQ6u6)`!~*p(rSB z?p8%$8HE6&Pj_m>XgwJvxGJYk+~A>K>2zxXNa%w@@<$#PrNKu}dGCmzJTQW>SHap+ z3yrb@n@@Y^ex&NpP7Q{A72zd^^oL*_mMOx~bz&GL86uLi` zcb-3t;3&GYhz>}BB6@pihTcdL6&M1?00Bk-Kf$5zR#?SqNcZu9b)!?(uyLu~?I%sao?fnjIa zQ!OrRbP#HSi%rLS2+}i6D@wl?{()X}F;+Cn;0erHFp$F_`;K0>*Ck~MsDld4As*#U zIs8?Gi-Ck#1G$?13N~+NFo00BZm*v(uO04Xh+o2L$rZrH$I z+x9E*7m+XgwY20ytIt$sU)7w-3O4RLvz-2x#HPu4$V*~h@Fh}@#H~s)71 zz?I-REn%g18&NnbBy(_Vv(*q1I0mTq;Ue0Rx8M^^&jSCz*8VkJ0YHTd-Vi`npayd~ zIvM~7Y^&Gp(Tm%GzeV>ejrf`?$}i*r%)fo0f7-f5Q1fQu%ZMRm&ZZJ zJ{2*BVsWb2{jptP39LVV9=?L@#?FPbXG>4rsW$r=-g^SVWJ>IfNqW~#<(xl_F07d}ufYld zgp=@1h^<73Z3nL)(YYSk`aJL1k?V_$b|=e|74;a&L0zfQ#zq0y%yNTe33C;53Zl({ zOCT6xp81Nd$WM!6vcKMEU?mV4vI)onOf?7oKGlWA35Eo*j8A%B1Q4RL9FbMJsP@Xh$f#GAq;{aY$LaUesl?o zl4<1}rDxy)8~^Ka{A)S-M866uKVl5^mHUH|iD>t7m)a083VDQejs}jWzN$+l60TYQ zQu_>Gm4eR+rM?R5WzH|CKP@a+X@t820$LuGWmT)wE8VIQk7tl#0jD}_&&XiG(={x+W6OtqlA4Wf|Y!!z{$^26@%PjtMH)?#G3P)SkZn+zfGLqbN3WogT(0i?&IE%Bsh z&3EQiYj0{qU*kLRw21|#RlO&YwKWSt5H|!Pp;5>q08HS)9yY`mXrKC;{*)nR%Zc?Y zZTcoZj+O0UapVcvs|{8HYlycR6D_bk@j2M#i8_D{rz~SBT2&OxglBBXV=!j^3FF!! zHh29}3_l+WiI;RHS(77FvLq)hm~{p7VxxjN5}7(AMlwh)QH zn?ovC#;K<<>4Zr9@{^<9mgL04&kp?ne|ZgtM8q;#*@WbtJB0HMCIjGrFu+aXm-A|L z?XrX28_l|G1o&_E0&h`G7!|@uY+S!X_&FQ;Z;;;0Jx%HkjoFv=l7yRat>p;34^}n7 zYsPZG(_{t)>!~pe3O){qUj1f$nf^tXQ7o^7(!8)CM-&Nnh7WYod&7iw(CiI_HK!hl z5GC{r-xM#w%t|GG4DOCWiIatI4f9YLCyj)G|JuhfWwZ;BijU&8*VQ$B{l@0Xd5B3s z&X8#`yp{+<-}gf+)QPY}aXW&!7gi!O?wtnCA@-Bf;T-soF7U_x?6Vp$xeNRdmn%Tx zhN2Y3O&cInlECIEi{X4BCSvqhc^25vnq%fWDm+d}bda;s@_P2|NCOa=aVBE=zXUcJ zv>yZT98o+m)^P@UBO#qsoVgfrduH(!2nBW0Fmd>prvyQ5x8J@E2;lC)fMB^%r5@XP zjR}fxN)%sE{Aj~i%4Xtgo>}hbU7YryL&P5?q~W#<=rBFLoWbUXIVHhd$SGE?e9YL4 z9Iv%PA`f07mUuUTJxIZ7L$V2`8MzCHz-KuUw2x;6E2tL;E2@KobP+((fRlu~2W+hZ zP))eS0JRI|5vv29gJqMBAp!|&aTh+t;TGd9lHF%nL*9F96Ql;efwV^Nw=BgV{!VBF zJeq8R<(DYokyRqEU_08N7i{z{k<7+7zM&TeKT%J3Z!M*^LkuEaz*PY0<2Q^^hSVMG zZnUd=(Qcs+wjco*LDP-0NefNy zfMMS2HSIg2#_>hJTIp6XH{&=cEesV>5IO_Z%i@q66PBN@Cax>QD-LUB=ON zB?JM^AY_iv3Fc|Rr9Ld@b}vtQUo@1Qgc648_)BQ`j9#eQZ-JbLOR!(d4GBrh8P@O3 z#5$=)bP3&OFegJco5Ej26ow$V)k7Mawy#4})ybz2V~wDS$6wD6M%wT-+DNx` z{1cL{-LLw_@EV8l1%XQ?sApF5`DTgbQF`bEEG0W{Ow#l_!+4E9|;PYSl_ z{*7qZ*Ot=jA(Cu`JAF7()@kAc<$z8yer(Ts2Yb#e5W%a6Z!}O&b{ot9>+WmV$iDqbocFz<@#8gve1py#OPd`DRNIde{R8B2_d3)* zMmi|w-SK4til>-F*DUDejL}4$J`6?g$dtkCr6#No%%kDqjGgK+@9PN~$vP5b-%3XC zLE=%Z08%s}&!>pV*whpOo7L?OL|a|pM}Md5mdkLc#k5=If_gk7;qnu)*i}===Wj^h z2GPaFaEw?B>m%&B`t(k12=^ zVR7~v>U%(-sv1!WF|c9x`+D9zy}^Hbi|(Jk{2mO)s(TCTHldTpvm3m}`*!>V30tyg zN{<6zGK2+J4Ki2|&vUsM(%u8v?$Iphz25hZyr7y{LvYo7Dds~+hvIGksNpggy}AmZ zVXj@v0@uN9%yzDl9}mApls1MnCw8bO=DS(eyFkQ- zkk!hg}*UoxZ}lH1Vp9T=`6&_%Vd(O}4~`v78&`n&9`asyq# z72dy8!4;kJ!P*dKjj|Qys(w!w_zn_TtaU3@V}&y09!g1oU?cuH^@Gm0tNZDHEA_oG z3o)ZZTtra~_5JKirasKzb%9qKfrExg<0~t!FywwvK2fEFBlEWmg9dUwQyLqCabn*uVN#Llpwhx5fhcr-9XWqMh@dH$`0j*w6@u2# z-hF$u4q}uO-q+$opt&q9Xi*yPhM(v+K)4b>2eYu%xz`S0!6&?L4U7ya<$gxT4G3#+ zi{he=Kbo;o=HmNtGCKDY+R;9QoiK*nn7Lr$s@%8@592nif!(lY!rN#Fq9NQwwl5e= zdZ_hGdPH&?)NiV2NNPjG7+7PSeSnn}FC%1_qRMy(-5<7|^lo8!PB0L?za~ScjHT4d z+#MrCt$jim@-~Q-#EiqyYkZu1qrZ2!#`eQ^=~KJ+E`0*(L907}io8po-lb1J3HtP- zJgOSO0?|jz1}{dUx6-!5LAqT!67T9hE9Mm3v(1=D#+^txajSth*&tM;T9=j7nD>C7|)Cv zBHpM8$FQeBPa~>3N#+zCLf;tLdjQ3r2GWo&h1|IR@+Q)7t`l4eAtD)rupC0@RtHP1X3H5QJ_JQtA5*{W+0aq8KZK zB-mg*VixgW0E8FSuZppmxUdaR0h7BZ*joQjyg7&qbE$)3$T|=eMlulpnfRRUe}SI& z7GpeN^_JxU>}E8JKX%00e!#?AgJ0rsrd;_T^NkBFm@K>qK*bv{t`i$*1TffWf;w&t zj)`$y_QX0{J*c;S73K@zDugBr>rS_XONx7T7E+Y@9_*V$8oWY>w|U2?0_Lp~`* zJ*PC{9BOL#SCpjuvHCFsX;AT0>sW-ea6w(W0n+SL+@e+5mKf-bum5fnx6r7Q7V4t; z@YfGvL*|wagpq?NAQU@*y3Sj5(>R9VJ^B8~k?igc9?NPM(FUSq;X%c1|IX%JL@>$> z@G+CpF@hGq9Xyb|>d{Ta#Kj>8sb${-he4P^*GJ^VedPL1 z>eyk0`Vy=xIB=q{kSu_u*wPhJkWJ6q@)N!NGM0W?>v{L{K5Jv)yx+tpe*BhfFt#27 zz|96$2JZw{h%+20Jqc?WBIe*tH6>)r7AkqHySOgSCcKL3wTof>`4?U|_u~2U?&(uH&dGI^76)MI zZpWOz!OSbrB~M@6>eu0mCB6l*-#aZYZ@`bg!dU42>9OVcQfP3$B0@Zw*zJaYIKqF&m?O(1GN*#_;PR-j)f4| z29pgLJx3|dI6qzV87V$TMQD#)9{Npik?uieBCO-QOoVEPJT_t%-WYIL=O*xRUKX@u zU2FGoCUIy@W_tiBip#KUHcIFXyRs&|w`~}e!IQDxyj(aR()%W6bbvKnlUkl`cqcIfs}L$SuwvE9fXJ=8k+6pe9a({uh9N(W>cB;bt;b zkCB1&hORSs6H!1dR7|7yGV<{c#Gj)+_G#}btWxG(9FGxtC1i-X%Opv&LJZLiL&b^ntmKe9?xB)BqYd9Ndo#RgYT{4l9hE3goLn3q;Md% zU*a5umvkth82zAQ8bf|ycntX?S0Q5_)@1d#DsSTA5Ex3 z<;Q3AP=wFyHaCI7g~& z(ESLOgW-s(xOw*5V2BnKSt3xM1RChRc^)kZ(fmS@T znEu4T89sqGvnLRvv6C0{JjfA*^h^ys@5@v@WNCs4@x3EQHg=@cvFLdax{<@Y83zU= zV_6}_9au2w-NR|vy}h5sp=>0lTV?Sw4VvK1MG1WFJ_jmp((aJ8hQ)X6yDmq7dEYSBAih;b zWELee9gMO|n=7)zsWQ2_5OgvpfwG|4h))U@T-4WP3-cHTL->_@R%a2+n)57ib-`Q$ zQxQ@SfnTFgOQQr58VDt*27A2YI5Ufdl0WI(pTWSTlk2z&(!_&*+sqGS8AQ>6X(0-o zn&xeH2R-yF4l%~epSr{PG`RwfciDt}rowfW+Vxeif(I(eG{`-2-j7Bqr|G~OGB$D^ z%EAugEKv+Td(awhT8jAy)_L0dS6S!K{23*9c-@X@A8zD$PUl>(uEVCNXy_0mQhi1v zcaZfV5dmX!5E-&PAdVm=NS)DRddN)QG`)B5Jvuw&XRRBDogK1*TVV<nQ3> z_uTpO_5ocrIFVssAF33bO9cG5pGOu?^2@6TEbO6RGP@s%;OptR*ro`D_64n}!pF8p zws~S~4S~Pwz7?RwlCxO9E2%FkFpxEyAL(>xhy2!(k@#s^v%KC$(bH*%N77%!uvFV@ z22q*3yvR|72n^^?<0by}qSj41B2BLmSZPG8+k`wDO2YDlcSavD8+j`vGWZ~XdN4Pc zJQ|sKn~BU;KDUz{P61xf1xEp5kWWWlv0u(Y+b`R{2MwI|VPfEXk=D`=Yv>NNmZ~L< z|4Eh8$Y!jewrU4mXTn^P?|}|b)()eK>|51i5vCQL>cf^t+~dH5qC{6mYg)e}FodZT zg?3Sw#tpw{V}93={ci_H61ZByvQ8G&8drHuBXKXiw$-)FFymI~!p4(LAl*fbe(7bR zh(v7ewWu+urvjsxR+t|NL6DW~ zZs8nGpdbtaGG9$VNtqA+mX>fsEYgVi%722!ch|MYb>8 zbWhf3O@wm`B4`XlfqFGU)|bnNj0XtT<5^iW@?q!o5LTa>*A6K2(@+RqlBU9V%8$S< zg8bCt=)?|v_&z6*43V0T*k$gQXiLd16ZnX06JDVBw{ajm$uhk0TLy%5dHP*z zD+Ob#VgvM~%LDtj*1cdM7Dy~o&BS8P@UcJUeQHTWUZDx`Ysnc07vsU~=^@%9es6fV z$C++V33|kE_GFOUWPb-$9z#dsAzs%yejRd-$}`3!P@b?5gt{1!Sx)P5};!aw)v|I_GUL7+@jkvsz8UDI(J% za6r&;AppxrG?s~=GKfTjoMKt44N0kM?qR*7?j&^kiSGP;9MLS1r2E!Gm)dk zfVoj#T{)6e2+J0VGl^#BBumPOZcgWxz?!&_cuLqn*Or}hf|x>?ZNa`}^5U2tg6dlN z2VN-BG4MUGVR&;Bhi-v(1NZfjw(|q*(rw4Z4cP4nRNSDr*bT!P+C`;U(Blqj zbkO9H4ucyM08e<6xDqiSg`U^pIcBAYl8t2pcMMU~0G=r*rx=fy#V{4=*o(}YL#Huz zd+>b;R2`hf7*()MD{P$!&_PgkcF@8nDQ=8eH%4@V8&(VwVxUjy5gY(8ZK0qrKc&n9}84 z8iN?CmWp*99N{q<tz-(Z`PJu^ zkwXv2cA0dD&;`De@nf0HL^oER@f)MY5`3*fCFY1^L}phra5YJzGj`#S)@D&d>-CQi z56$x{tWPH~Tu+GdNV6c7)@{@oG9SG5da`i-WN(H+<^cU>EYTm&C*I?2+6J}6&%XQM zegc->>wPn2B9{QjMD3T#+$8Ug137WkUulLC9R!8T03vg8h*@agM)9_r_z!BHytRb= znpd%3#+<`^E<;cydF|tTo92VV`jUjS>?qaHN!bp=V`oz^PbHxuQ*#zY&|LVwts|mK ze1`3ze2IG`uR#-rL(7#{(aSMrmMv6LiKyu98(V*1US!PJ{s5g z07YA?8wqqt0$K)fgVGoXC-{Inie)$aS{tPcO+dmN(#d*d`$pzupsz-?J_6^)y+Fg{ z0qZ~vota3M!l~S1$X)H=?okkL|0ObQ3iuDXx-lKuCcIZit(wp}WQhrch1FT!gsqs? zZvhm3dw`Oq2LbD$z-w9#Wsdns3pM$IQ1lD~va~mB<@?dKJ4NF zse=yOss=FG9|W&SQpF53;(485KZNyzX2wq>61Q!doxO*-1>0lWMjsr|oCXw>!(@XY zRL)clwgIE&r38JP&)=9*rQ99lGm|Lf!&fUo+mzUBojBK=4b^=&L1dlX&Gu-aQ>+?%soRFeWoY&MgIul&9yJR(GY4kXr+-Ml~+917_48&{*K`4ypWhS)Q z;o(%dpZIg)Cgj;8D8_xufv5$Rv>U0h$6<_8sa1LF8>Aa(%m<$wmxfAHw*wzS5sJMK z|i-SDj8=JG9k=o0!ChiKcrXr*p=CjAB1S2(%jglCc zXO+Xb@ChmD7fg5(MK;m)Y2<0&S#L0KEBRfBL4 zu-zLWcTX|5<=(z4Bq8@=G-Xz-Fejr3S#;4`KwB6dYba7RTwgwzU5A6)it|u$kb8@o zHiMe)XfrlTKHb|d(>MCtTE37)ZsOlcucK;iwYAmQ>C06y&ZN&Hrd`a0_jiyl*nyP;O9M2Ld83{#1QdY8o4=;-{OF^;m)SKYB$TdTF~; zO-$W~-;v)Q7p%qFW%u?C(iQSc?R_}t(agBL2_>A(5W#y&A0ZQKQ^tb2%@T$1^zX2^ z<>$eeCO!3qgyOUy@1XImtEryqS6-Nfc|>~7<7e1;jQ3=O;a0-~V+P3{ag1P|hR|ma z3?vJdGh(~@E-92}F9xe0UUYLWN#;xyRqzg2!wkb1BrV~0wBBPdhWuls{1?xApX)`} zTNuLZ9y4oYpADDWL%kDHE~0*talq?t3QCZyK!dC4{Id$xGn3rh^X(tcS%a5 z5-D0U%Y&P?9%qu=HSjST?6gOw0a9}x8dEr^EAaUttLU1vYLlNIteQzLp`>vuT#^LA zF{_?H5V1~Q$<|(&Bh*hCf*sY39E?a;qxW-y3993UNutgO7hB+C%<_xKG#`<) zmI^G)&;*Hh8#lKL>^oF<{1S9W%Z(%%bToSGPFw8-%QrcrymD+py~Mm_gi!;1saA}T zxlL8n;fsjw?BYj~(QwT8ukZq^oVeDkD`|2nh9v_Z0wNJMXoD199CO! z#nKNue#1opPga4Ns@9RqHGG%|NI|F_x~mWW;CXwra=_9C3xjBMJpMP zNU$6O{n1A~i6*5OTPonjBgSoI$Bi{ATI{5E&j8E@-kBIL>Yj*X8fY(jlu=KO9TibX zFjWS#OT0T*WD1a%(VNeCZzPAAYP%_y#V*ebv?-&G9q9By1KAZVTmMkR?oEO&<56&+-r*r)UrDqxuD{0`yx$uhjdT&z^X}Ln%vA{vdIu{?o zoGC6o7J>!uZMT6$ezA7M!67di+z9KAMI1mbBh;XQ>0{X5gdLi`0-0apDlKWs{iJtJ zmte($zr2Hja%ZeQltd&MG>4!hUK-0mjJiP_V1WV3W%g`LpM&#wY&z=VSaBu>$NjY$U4)ol z28&OsB&8AbDfs(^p(igeGO6lFQhYzHJI1ZbkU}~7V0zO9c8ph|IhCNtBdOd{;ktS3h}I zKe4(w3F*7~$-DZ=yZQ-D3-`xO8Flimev(lOEKp#vI7kclDb`Q^D2cg5RSe_{jR-9( zEL=4|S-T

j-AEuO~*R$n^Dmc8*aikqtXXMG$zZ=zF8d3%WMLTWAPyNosifZ1H93 z`hZ}8yYffI;<0EaOSJmI!dDYseF<8!w2p{%_!{e$wV#C>4E?ctaIYc^VN9MH;xZ7` zB~I->M!`C6z&K)0a9}i@#sJAi;WEWg&mOA#{jr3<=5p#!bRJb{8H!p)J?4SP2FaP3 zo2%qE| zfi9Zhfl&c>-nVFg5(`V*lNe=EcN=J5of-o^C&oYEk@#9h*_6CGM>77S;RQ&qO~kXq zhVo}9P=IK0bXdbqn@yN#`I$rv$nS3PA@Zapt_0RV)GI<*LDXmX#E7+_2!w%Bgsqy4 zjiEZ4=re#xY%&KHXEH!+y&85MsE1n(264vL7Gqp9Nx|+c9KyH+RoQb*o=kkJ1N+X z83L9=Sm9y9g9qN+GZ!EK<{G-e^t%19LUc3P)D~|UNm6GZo`;%ZZHLVX-76vez|`nM zA}4Q66Ez1cf)=m1+0rpucF5FY+!y5RnHfOuQ_i-uOYq=H zCKx7^87=V)7S|-;0Y$u%J&giW0cej}_A`Lr8vYWanp~}6q2dI>wBRq{>jpL>BPxzQ z+kM+IJ>cZP0@64chg2MW0i#cA5?z)DW=nzgia0HEM+fam?==ybQ&0p!9|$=(^7>C@ z$Fwx&VsatOictanKx9C)oLOG-mN{y>$kc#_WgIr(>2U+v6%GZ29K1R`LtoWM+L^H?uxxhHb}`_@PM7_&q(rVqC-S=+v^DOProsM<&R>9sME{=->@oe~_V} z1O97zU!4zonFMmkk$dn~-{Y~;_P`7eFs=ued!WqSHWt#^6lpc$5c0 zHL1)0U_g1&d+QLO7@W#Pr#t|w_!;l5L%?F^n!OpuR+mHPxtQpdW)@jd>)2tcDYE)k zTGK!=gwrpv38sB<3e}Q$R&nISK|w_W2*!G$hCiczg4>|QAS0AEr7xNTN@(}n`nBYklKV{@`8n@v@%YwGA-X21 zTg?QUnh+t-XcHC?ypoJ?t$J^RZ7^8H^-z?RQY_Ln0||MO^8fSR7cm0N5ga0+8L*6* zIsIe{!5py~wef1<{ov>*Zj1U)wGj2t;(=_r9=!}*v==r}9Tmmkw)$u+Gp1&^Dw{7{*8f_X?P=fqoJcCUnJQOt9iI^i6!p0UxW><$wBO{@D^h}PJjT`I}A7Y@^?9X2OH#Ye{HG52V^_Q_wWbvAK$Ti30Kl*-mcNUn5ncvtZ@ zp^Oi$cyBH>o929xJdlcQe^e*^9#pzQjR|A_z!b*yCFTJsMHpKIg4dFJe7V!!ZtTPn z-3PD5)K(sA2tdyrj1^1H&i(>Ks=@DIW4lKi0S+grGy?q1;YI-H;fE-<18UMkX#7te zQR5fU+bP2k;}6xsMi6(=`tJh@P`eL-f>pb(lE1k{S@rPnvuNO>0b~1pE8CA;&7VS8 zHyvZvcwkj0Dp4?w8O{bChB7h8gcxTrbXAxJECGkA6ZfSgL&d)zO8}1a5K92e#z;*< z4YykO|Fr&etXQ)kn>-z=6in^=(OV7<6-XWpP>#6QpL-ORh9+-94A#gIYN^iiAXgO_ zIXa2z=UstZN2qDtZFTC6ZIm6r8U}Rn*VkLTMe3jI)^SYn0lb}$Z*?nkx_?9%>UhchhH&nNucJyu zGT&N#t&JD}rYy5g#WcIRBM|Ta3)nPLqokFQzZ0@ygXtQJ_yijxP#K<}VqQeOLO0KU z4&&4_CN67?aSGS!kr<|aA#DPS4O6_dj4p5&;XjE{>K8{ErKVZc0SIy^e;Xlwj44X2 zO^gLfX$>p!Nu1Ct%O=p&X7sUknv@Ioy+u=tLPFOVf;GEwx4L)PL@X5bsIs4*g8z9C_H0&XycNx=v^=`Frj@Fqy<%q{>wwB)W@1 z58FRRFEVQHkdvK}ce03KzUA}L?s$DwLWj_Z{E!LeCDvYXsl}OekrnG)M5}#>$?J}){{!61@_9_>mHLNKlMKIw6@u5+vBK$_ zrnf8C_m87Ky*P|{-dqBxwYo0o96OHHH#?U}{5-UL7I_~Z(D72y|nFTF-M zzws9Gea%k{!kcmPMMb?VS^X&ifOkpq%dr*tZLMxz6 za(9z)bKsgKtnXI4vE5+JpawZ4PB= zIG5a1+*)W{FHy85vF&N3qKoMdL^;D$L`MNXHkc1eH>D>g0=3~!8R=Y)FG;4Zmn3}H zNlXt&4r8?!Qz0-YtfTKDyx*f*-yL+~$=%FOn`_kH&~;Mj_3C~LorDqG1$hDgxPYJx zy6LW>tSo+_NENsEn!CJ@@B;)vvG#jX6>w1=OQ^p=#1p2pH}xpL#!nD_jsg`?Fin9B zJ*&pR37Xg4@`!DEti5NUM8?dnSMZ*r7nO@II20%TMdx3!_Zg*|!}2yn!p>brNDSO$ zha9u>ra@0^;l*3sYAgCTk~H}%7R7O~nlfRxc#h_E{&usvGZ6cb^vN2H%qW*>$1pMt3gF^Q7*Y;*8a;s~ zBN%vYfE1K&Y;SLMs$D7nI12SnfK3k!3DwtXawbpVpyAOrJqQD=pjKtF34D^b8BgEt z+%2N8SO;yt;L~fd#P}E}P500m9$$SPg|ctrzwv3HgW2$^ki8*8NjM-xJ5zXyU$Y0& z1I;q&eS3J8x*2J3k`g_mvLo4JP{g*R6YVI7>gj54^rlXF&tzbYU120xz3fduO-i&y z=*c{@KC%;g=!(b#W){I&Ssgs^sfz7mAX~WGh;~m;=)%kRuR7&Dk)9dBDmW7#ZSK)V z5!oe1&cr=LJ`B=4q$^3%Ax3z!yjC-`k|z-4aay6(}yI2VH;;9;pR+ z-!oQgQB8ex#x(s%aOslVka%^}fNbs!lRM&NKQW=>1sQ$Xt8m!(Lu|`#2w$N#3r|kyS*!Nq;|oTL7nu0WEukQ0b4%ha(=5>G znyfT;qj0j2s+#*j4qXf-OdI)F*6I{5oBOprN4u zjZS@XVjvDU<*!brSZ5_DLo7ilj_~0{SdoNRlvyMlmvX3nwfgrXD^NvG8mH=sq;sl9 zXSa!>nw&Ul6V`$m3&E~M33k1p)ai+FXK2Wt&dnh2lb5d3hK9hJ_}~-#2ULS6j=X|w z8`vi&(mh^qKZbQOR?^4+o|?$-TCqjqUWhX|8{4;JKy(o$BwyS>(X6y^X8R<4#ym$? z-5%QKviz)%&XP5e@^Q~m2t0tU1*(<#R(o&S9}fDMO%OWUmv=)76A&NY=6t9F%G^ni zQ!!Jfbq-Vj=9`CKx2Gra7cB&~syk7cA(sRDb|PEOzZv2UR5~4#B`di`bE0N#PzFTX zj9w@GZv}S+m@4ZL$21AaFD)NL8mb3mCH5DVq}X6ihOl|tV`!hGtVEnDJqyYr+t0|k zefgb?G-CTIM+z+|wly+E-98*t&rIZ-7F5Eh%LwxiQQvI`m9&9115gueDfrjqM*&%{ zvu8tW^%NTDHmP#-Kkz(@{hHoA&raxz=6wuy**sG!_oDs?=n~o<_1QR7{KqAXH49#d zLC#csM0VSFD6M5A<|n)##Dhv82|AlncuIBa<*UMzkxh5jgn`%$^}yR(lLUSAl4^rbiJ+B8=g;2P zNoP+>=ZeOBN#hTf3O-(`;i800C1pU)`SaKk zlMli+K9`=q!Lyp>0QM8P!J-^giUtP8$L3 z$kP@lAw(|ITHsCxx%Sn#eN}>qPSdozZSH@TTmfIjYjL|jfBq^&H*BTyda!W4(_2B) zot<6gAVgI1J@AlZ}od1l2lRHf;bCn7xaC5d!?D;R+!0(m^h$ z8^nlFAM-6y)y9qTyyvv}HFb12R?b*8@5Cx0A#0D{;FHl0#l!3GL-53%uU{sGx!LLT z&~&E4B?-y#!Et)zJ7z)NrwQqbpl`(wL8gXp)0v671Sw40rWE5^Ma+&L^+1!K_TCvW z`!�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Ð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 olceBYj;EK;$_ZMxr>yniD1kI=A73r?6951J literal 0 HcmV?d00001 diff --git a/generate_metadata.sh b/cli/generate_metadata.sh similarity index 100% rename from generate_metadata.sh rename to cli/generate_metadata.sh diff --git a/src/main.rs b/cli/src/_main copy.rs similarity index 100% rename from src/main.rs rename to cli/src/_main copy.rs diff --git a/cli/src/main.rs b/cli/src/main.rs new file mode 100644 index 0000000..7163248 --- /dev/null +++ b/cli/src/main.rs @@ -0,0 +1,260 @@ +#![allow(missing_docs)] +use subxt::{ + client::OnlineClient, + config::SubstrateConfig, + backend::rpc::{RpcClient, RpcParams}, +}; +use subxt_signer::sr25519::dev; + +// Generate an interface that we can use from the node's metadata. +#[subxt::subxt(runtime_metadata_path = "artifacts/metadata.scale")] +pub mod etf {} + +use std::io::{Read, Write, BufRead, BufReader}; +use std::fs::File; +use std::time::Duration; +use std::collections::HashMap; + +use clap::{Args, Parser, Subcommand}; + +use ckb_merkle_mountain_range::{ + MerkleProof, + MMR, Merge, Result as MMRResult, MMRStore, + util::{ + MemMMR, + MemStore + }, +}; + +use rand_chacha::{ + ChaCha20Rng, + rand_core::SeedableRng, +}; + + +use subxt::ext::codec::Encode; +use beefy::{known_payloads, Payload, Commitment, VersionedFinalityProof}; +use sp_core::{Bytes, Decode}; + +use murmur_core::{ + types::{ + BlockNumber, + Leaf, + MergeLeaves, + }, + murmur, +}; +use etf_crypto_primitives::{ + ibe::fullident::{IBESecret, Identity}, + encryption::tlock::{TLECiphertext, tle} +}; + +use ark_serialize::CanonicalDeserialize; +use ark_ff::UniformRand; +use rand_core::OsRng; + +use w3f_bls::{EngineBLS, TinyBLS377, SerializableToBytes, DoublePublicKey}; + +use sp_keyring::AccountKeyring; +use frame_support::{BoundedVec, traits::ConstU32}; + +use std::time::Instant; +use indicatif::ProgressBar; + +/// Command line +#[derive(Parser)] +#[command(author, version, about, long_about = None)] +#[command(propagate_version = true)] +struct Cli { + #[command(subcommand)] + commands: Commands, +} + +#[derive(Subcommand)] +enum Commands { + /// create a new OTP wallet + New(WalletCreationDetails), + /// dispatch (proxy) a call to an OTP wallet + Execute(WalletExecuteDetails), +} + +#[derive(Parser)] +struct WalletCreationDetails { + #[arg(long)] + name: String, + #[arg(long)] + seed: String, + #[clap(short, long, value_delimiter = ' ', num_args = 1..)] + schedule: Vec, +} + +#[derive(Parser)] +struct WalletExecuteDetails { + #[arg()] + name: String, + #[arg()] + password: String, + #[arg(long)] + block_number: u64, + #[arg(short, long)] + amount: String, +} + +use sha3::Digest; + +/// read an MMR from a file +fn load_leaves() -> Vec<(u64, Leaf)> { + let mmr_store_file = File::open("mmr_store") + .expect("Unable to open file"); + let leaves: Vec<(u64, Leaf)> = serde_cbor::from_reader(mmr_store_file) + .unwrap(); + leaves +} + +/// Write the MMR to a file +fn write_leaves(leaves: &[(BlockNumber, Leaf)]) { + let mut mmr_store_file = File::create("mmr_store") + .expect("should be ok"); + serde_cbor::to_writer(mmr_store_file, &leaves) + .unwrap(); +} + +#[tokio::main] +async fn main() -> Result<(), Box> { + + let cli = Cli::parse(); + + let before = Instant::now(); + match &cli.commands { + Commands::New(args) => { + // first we need to connect to a node and fetch the round key and current block number + println!("🎲 Connecting to Ideal network (local node)"); + + let rpc_client = RpcClient::from_url("ws://localhost:9944").await?; + let client = OnlineClient::::from_rpc_client(rpc_client.clone()).await?; + println!("🔗 RPC Client: connection established"); + + // fetch the round public key from etf runtime storage + let round_key_query = subxt::dynamic::storage("Etf", "RoundPublic", ()); + let result = client + .storage() + .at_latest() + .await? + .fetch(&round_key_query) + .await?; + let round_pubkey_bytes = result.unwrap().as_type::>()?; + + let round_pubkey = DoublePublicKey::::from_bytes(&round_pubkey_bytes).unwrap(); + println!("🔑 Successfully retrieved the round public key."); + let current_block = client.blocks().at_latest().await?; + let current_block_number = current_block.header().number; + + println!("🧊 Current block number: #{:?}", current_block_number); + println!("🭠Murmur: Generating Merkle mountain range"); + + let etf = OnlineClient::::new().await?; + + let mut mmr_store_file = File::create("mmr_store").unwrap(); + let store = MemStore::default(); + let mut mmr = MemMMR::<_, MergeLeaves>::new(0, store); + + // TODO: HKDF? just hash the seed? + let ephem_msk = [1;32]; + let leaves = murmur::create::( + args.seed.clone().into(), + args.schedule.clone(), + ephem_msk, + round_pubkey, + ); + + leaves.iter().for_each(|leaf| { + // TODO: error handling + mmr.push(leaf.1.clone()).unwrap(); + }); + + write_leaves(&leaves); + + let root = mmr.get_root() + .expect("The MMR root should be calculable"); + + let name = args.name.as_bytes().to_vec(); + + let create_anon_tx = etf::tx() + .otp() + .create( + root.0.into(), + etf::runtime_types::bounded_collections::bounded_vec::BoundedVec(name)); + // TODO: make the origin a parameter + let from = dev::alice(); + let events = etf + .tx() + .sign_and_submit_then_watch_default(&create_anon_tx, &from) + .await?; + println!("✅ MMR proxy account creation successful!"); + + } + _ => panic!("Hey, don't do that!"), + } + println!("Elapsed time: {:.2?}", before.elapsed()); + Ok(()) +} + + +/// construct the encoded commitment for the round in which block_number h +async fn get_validator_set_id( + client: OnlineClient, + block_number: BlockNumber, +) -> Result> { + let epoch_index_query = subxt::dynamic::storage("Beefy", "ValidatorSetId", ()); + let result = client.storage() + .at_latest() + .await? + .fetch(&epoch_index_query) + .await?; + let epoch_index = result.unwrap().as_type::()?; + + Ok(epoch_index) +} + +/// perform timelock encryption over BLS12-377 +async fn tlock_encrypt( + client: OnlineClient, + round_pubkey: E::PublicKeyGroup, + message: Vec, + target: BlockNumber, +) -> Result, Box> { + println!("🔒 Encrypting the message for target block #{:?}", target); + // let msk = SecretKey(E::Scalar::rand(&mut OsRng)); + let epoch_index = get_validator_set_id(client.clone(), target).await?; + let payload = Payload::from_single_entry(known_payloads::ETF_SIGNATURE, Vec::new()); + let commitment = Commitment { payload, block_number: target, validator_set_id: epoch_index }; + // validators sign the SCALE encoded commitment, so that becomes our identity for TLE as well + let id = Identity::new(&commitment.encode()); + // generate a random secret key + let sk: [u8;32] = [1;32]; + // 2) tlock for encoded commitment (TODO: error handling) + let ciphertext = tle( + round_pubkey, + sk, + &message, + id, + OsRng, + ).unwrap(); + Ok(ciphertext) +} + +// /// perform timelock encryption over BLS12-377 +// async fn tlock_decrypt( +// ciphertext: TLECiphertext, +// signatures: Vec>, +// ) -> Result, Box> { +// let result = ciphertext.decrypt(signatures).unwrap(); +// Ok(result.message) +// } + +#[cfg(test)] +mod tests { + // pub fn test_can_read_write_leaves() { + + // } +} \ No newline at end of file diff --git a/core/Cargo.toml b/core/Cargo.toml new file mode 100644 index 0000000..f88e5c2 --- /dev/null +++ b/core/Cargo.toml @@ -0,0 +1,54 @@ +[package] +name = "murmur-core" +version = "0.1.0" +edition = "2021" +authors.workspace = true + +[lib] +name = "murmur" +path = "src/lib.rs" + +[lints] +workspace = true + +[package.metadata.docs.rs] +targets = ["x86_64-unknown-linux-gnu"] + +[dependencies] +subxt = "0.35.2" +subxt-signer = "0.35.2" +tokio = { version = "1.35", features = ["macros", "time", "rt-multi-thread"] } +totp-rs = "5.5.1" +etf-crypto-primitives = { git = "https://github.com/ideal-lab5/etf-sdk/", branch = "tony/dev" } +# etf-crypto-primitives = { path = "../etf-sdk/etf-crypto-primitives" } +clap = { version = "4.1.1", features = ["derive"] } +rand_chacha = "0.3.1" +ckb-merkle-mountain-range = "0.5.2" +# blake2b = "0.10.6" +sha3 = "0.10.8" +serde_cbor = "0.11.2" +# bytes = "1.4.0" +serde_json = "1.0.108" +indicatif = "0.17.8" +sp-keyring = { git = "https://github.com/ideal-lab5/polkadot-sdk.git", branch = "testing" } +frame-support = { git = "https://github.com/ideal-lab5/polkadot-sdk.git", branch = "testing" } +# node-runtime = { path = "../etf/runtime" } +codec = { package = "parity-scale-codec", version = "3.6.12", features = [ + "derive", +] } +serde = { version = "1.0.188", features = ["alloc", "derive"] } +sp-core = { git = "https://github.com/ideal-lab5/polkadot-sdk.git", branch = "testing", features = ["bls-experimental"] } +sp-runtime = { git = "https://github.com/ideal-lab5/polkadot-sdk.git", branch = "testing" } +beefy = { package = "sp-consensus-beefy-etf", git = "https://github.com/ideal-lab5/etf.git", branch = "tony/dev", features = ["bls-experimental"] } +sp-application-crypto = { git = "https://github.com/ideal-lab5/polkadot-sdk.git", branch = "testing", features = ["bls-experimental"] } + +ark-bls12-377 = "0.4.0" +ark-std = "0.4.0" +ark-ec = "0.4.0" +ark-ff = "0.4.0" +ark-serialize = "0.4.0" +w3f-bls = "0.1.3" +getrandom = { version = "0.2", features = ["js"] } +rand_core = { version = "0.6.4", features = ["getrandom"] } +hex = "0.4.3" +array-bytes = "6.1" \ No newline at end of file diff --git a/core/README.md b/core/README.md new file mode 100644 index 0000000..db26cce --- /dev/null +++ b/core/README.md @@ -0,0 +1,3 @@ +# Murmur Core + +The core implementation of the murmur protocol diff --git a/core/src/lib.rs b/core/src/lib.rs new file mode 100644 index 0000000..ada4513 --- /dev/null +++ b/core/src/lib.rs @@ -0,0 +1,4 @@ +// the murmur core library +mod otp; +pub mod murmur; +pub mod types; \ No newline at end of file diff --git a/core/src/murmur.rs b/core/src/murmur.rs new file mode 100644 index 0000000..c3e2cef --- /dev/null +++ b/core/src/murmur.rs @@ -0,0 +1,258 @@ +//! The murmur protocol implementation +//! + +// mod otp; +use crate::otp::BOTPGenerator; +use crate::types::*; +use etf_crypto_primitives::{ + ibe::fullident::Identity, + encryption::tlock::* +}; +use w3f_bls::{DoublePublicKey, EngineBLS, TinyBLS377}; +use ckb_merkle_mountain_range::{ + MerkleProof, + MMR, Merge, Result as MMRResult, MMRStore, + util::{ + MemMMR, + MemStore + }, +}; +use ark_serialize::CanonicalSerialize; +use beefy::{ + known_payloads, + Payload, + Commitment, + VersionedFinalityProof +}; +use codec::{Decode, Encode}; +use rand_core::OsRng; +use sha3::Digest; + +pub enum Error { + ExecuteError +} + +/// creates the leaves needed to generate an MMR +/// This function generates otp codes for the given block schedule +/// then it encrypts the resulting codes and constructs leaves +/// the leaves can be used to generate an MMR +/// +pub fn create( + seed: Vec, + block_schedule: Vec, + ephemeral_msk: [u8;32], + pk: DoublePublicKey, +) -> Vec<(BlockNumber, Leaf)> { + let totp = build_generator(&seed.clone()); + + let mut leaves = Vec::new(); + + for i in &block_schedule { + let otp_code = totp.generate(*i); + let ct_bytes = timelock_encrypt::( + *i, + pk.1, + ephemeral_msk, + otp_code.as_bytes(), + ); + // build encoded commitment (the message signed by ETF PFG) + // let payload = Payload::from_single_entry(known_payloads::ETF_SIGNATURE, Vec::new()); + // let commitment = Commitment { + // payload, + // block_number: *i, + // validator_set_id: 1, // TODO: how to ensure correct validator set ID is used? could just always set to 1 for now, else set input param. + // }; + + // let ciphertext = tle::( + // pk.clone(), + // ephemeral_msk.clone(), + // otp_code.as_bytes(), + // Identity::new(&commitment.encode()), + // OsRng, // TODO + // ).unwrap(); // TODO: Error Handling + // // serialize ciphertext to bytes TODO: can optimize ct_bytes w/ upper bound (as slice) + // let mut ct_bytes = Vec::new(); + // ciphertext.serialize_compressed(&mut ct_bytes).unwrap(); + let leaf = Leaf::from(ct_bytes); + leaves.push((*i, leaf)); + } + + leaves +} + +/// computes parameters needed to execute a transaction at the specified block number +/// outputs (ciphertext, hash, merkle proof, position/index) +pub fn execute( + seed: Vec, + when: BlockNumber, + ephemeral_msk: [u8;32], + pk: DoublePublicKey, + call_data: Vec, + leaves: Vec<(BlockNumber, Leaf)>, +) -> Result<(Leaf, Vec, MerkleProof, Leaf, u64), Error> { + let botp = build_generator(&seed.clone()); + let otp_code = botp.generate(when); + let ct: Vec = timelock_encrypt::( + when, + pk.1, + ephemeral_msk, + otp_code.as_bytes(), + ); + // now generate a merkle proof + // rebuild the MMR and search for the position of the leaf for the given block number + let store = MemStore::default(); + let mut mmr = MemMMR::<_, MergeLeaves>::new(0, store); + + // let mut target_leaf = Vec::new(); + let mut target_pos: u64 = 0; + let mut target_leaf: Leaf = Leaf::default(); + + leaves.into_iter().for_each(|leaf_data| { + let leaf = leaf_data.1; + let block_num = leaf_data.0; + let pos = mmr.push(leaf.clone()).unwrap(); + if block_num == when { + target_pos = pos; + target_leaf = leaf; + } + }); + + // prepare merkle proof + let root = mmr.get_root() + .expect("The MMR root should be calculable"); + let proof = mmr.gen_proof(vec![target_pos]) + .expect("should be ok"); + // sanity check + // proof.verify(root, vec![(target_pos, Leaf::from(ct_bytes))]).unwrap(); + + // let proof_items: Vec> = proof.proof_items().iter() + // .map(|leaf| leaf.0.to_vec().clone()) + // .collect::>(); + + // hash(otp || call) + let mut hasher = sha3::Sha3_256::default(); + hasher.update(otp_code.as_bytes()); + hasher.update(&call_data); + let hash = hasher.finalize().to_vec(); + + Ok((root, hash, proof, target_leaf, target_pos)) +} + +fn timelock_encrypt( + when: BlockNumber, + pk: E::PublicKeyGroup, + ephemeral_msk: [u8;32], + message: &[u8], +) -> Vec { + let payload = Payload::from_single_entry(known_payloads::ETF_SIGNATURE, Vec::new()); + let commitment = Commitment { + payload, + block_number: when, + validator_set_id: 1, // TODO: how to ensure correct validator set ID is used? could just always set to 1 for now, else set input param. + }; + let ciphertext = tle::( + pk.clone(), + ephemeral_msk.clone(), + message, + Identity::new(&commitment.encode()), + OsRng, // TODO + ).unwrap(); // TODO: Error Handling + let mut ct_bytes = Vec::new(); + ciphertext.serialize_compressed(&mut ct_bytes).unwrap(); + ct_bytes +} + +/// build a block-otp generator from the seed +fn build_generator(seed: &[u8]) -> BOTPGenerator { + let mut hasher = sha3::Sha3_256::default(); + hasher.update(seed); + let hash = hasher.finalize(); + BOTPGenerator::new(hash.to_vec()) +} + + +mod tests { + + use super::*; + use ark_ff::UniformRand; + use w3f_bls::DoublePublicKeyScheme; + + #[test] + pub fn it_can_generate_leaves() { + let keypair = w3f_bls::KeypairVT::::generate(&mut OsRng); + // let msk = keypair.secret.0; // can destroy this + let double_public: DoublePublicKey = DoublePublicKey( + keypair.into_public_key_in_signature_group().0, + keypair.public.0, + ); + + let ephem_msk = [1;32]; + let seed = vec![1,2,3]; + let schedule = vec![1,2,3]; + + let leaves = create::( + seed.clone(), + schedule, + ephem_msk, + double_public, + ); + + assert!(leaves.len() == 3); + } + + #[test] + pub fn it_can_generate_valid_merkle_proofs_and_hashes() { + let keypair = w3f_bls::KeypairVT::::generate(&mut OsRng); + // let msk = keypair.secret.0; // can destroy this + let double_public: DoublePublicKey = DoublePublicKey( + keypair.into_public_key_in_signature_group().0, + keypair.public.0, + ); + + let double_public_again: DoublePublicKey = DoublePublicKey( + keypair.into_public_key_in_signature_group().0, + keypair.public.0, + ); + + let ephem_msk = [1;32]; + let seed = vec![1,2,3]; + let schedule = vec![1,2,3]; + + let leaves = create::( + seed.clone(), + schedule, + ephem_msk, + double_public, + ); + + let later = 2; + // let expected_hash = '0x0123'; + // generate execution parameters + if let Ok(result) = execute::( + seed, + later, + ephem_msk, + double_public_again, + vec![], + leaves, + ) { + let root: Leaf = result.0; + let hash: Vec = result.1; + let proof: MerkleProof = result.2; + let target_leaf: Leaf = result.3; + let pos: u64 = result.4; + // verify the merkle proof is valid + match proof.verify(root, vec![(pos, target_leaf)]) { + Ok(validity) => { + assert!(validity); + }, + Err(e) => { + panic!("The test failed with error: {:?}", e); + } + } + // then we verify the hash + } else { + panic!("The test should pass"); + } + } +} \ No newline at end of file diff --git a/src/otp.rs b/core/src/otp.rs similarity index 95% rename from src/otp.rs rename to core/src/otp.rs index dae65fc..f08c4f2 100644 --- a/src/otp.rs +++ b/core/src/otp.rs @@ -13,13 +13,12 @@ pub struct BOTPGenerator { impl BOTPGenerator { /// create a new BOTP generator with the given seed pub fn new(seed: Vec) -> Self { - let secret = Secret::Raw(seed.to_vec()).to_bytes().unwrap(); let totp = TOTP::new( Algorithm::SHA256, // algorithm 6, // num digits 1, // skew - 1, // step + 1, // step secret // secret ).unwrap(); diff --git a/core/src/types.rs b/core/src/types.rs new file mode 100644 index 0000000..fd4f912 --- /dev/null +++ b/core/src/types.rs @@ -0,0 +1,38 @@ +use ckb_merkle_mountain_range::{ + MerkleProof, + MMR, Merge, Result as MMRResult, MMRStore, + util::{ + MemMMR, + MemStore + }, +}; +use sha3::Digest; + +pub type BlockNumber = u32; + +#[derive( + Eq, PartialEq, Clone, Debug, Default, + serde::Serialize, serde::Deserialize +)] +pub struct Leaf(pub Vec); +impl From> for Leaf { + fn from(data: Vec) -> Self { + let mut hasher = sha3::Sha3_256::default(); + hasher.update(&data); + let hash = hasher.finalize(); + Leaf(hash.to_vec().into()) + } +} + +pub struct MergeLeaves; + +impl Merge for MergeLeaves { + type Item = Leaf; + fn merge(lhs: &Self::Item, rhs: &Self::Item) -> MMRResult { + let mut hasher = sha3::Sha3_256::default(); + hasher.update(&lhs.0); + hasher.update(&rhs.0); + let hash = hasher.finalize(); + Ok(Leaf(hash.to_vec().into())) + } +} \ No newline at end of file diff --git a/mmr_store b/mmr_store index 33357848ecbddcec979970f3904c4b26e6397435..b6aa2ee5ac245a2fe842cbeaac02af8b4b260c67 100644 GIT binary patch literal 68 zcmZo{VxFNO(IXKeFgG4{0_UfQ?rD+=P52%;! zX`J?H5Uak{11-`E{i_Wct>wC_OU4_FIl*eJWF;uxmmqOE=1fMb%MdzQg<7dPI;QEa z+OG@Ru8q2;P`m(Bo;`}$4YbLZ6`$ln1K&=DOdBgSFuhAG|WYNO&|cZ^-Ok8$hibfhgHj)w2$JT z5hyuQb2UVD%R*iy)zg0(1)1|nCqc6j^pPnCKselN)LbWt$B*$tZm9!e(R~eoU$gWt zU2-lJwGAHY4TjhwvaBg7b|b%bP&L#Y1`Vc-*H{Y1r;gCSrq zE9%$?X?Z6R*H418n!4_e373^cn%g|vt`)&N{8j%MRbc-qJiLQ|_i*o2H7ui@On{wg zPNFx6yUhvzPQhhiN_R%t5F%%z^Df3hb)$+P#Gs@dcB8OGnv(r|abz$3NFQ}%!!r*C z#D8e~Jqg6mQH8jS7{9=sW0^tKVU0wz?mXSs>+qS5x7uobx!(brdXsrimvznHxiz+XnVHiPs z^Qo;-B@lK~)&y;Kaiog5xcYh!CC_1RdmVJ)Z8Tolh36*I$GJ`(Or1<^b5*fXWp=M( z0>n|!^8og=fWImLu0+j2PM}r7Yq_{Hmx}IzGLIMs)WQSt>nqhL6ogK6={ZPgqR-2s zKp)C(s2+5~It`#T^U*LCSAK^BkQ;X$1FoO$__J)kQ57Jfp|3BiSMa135*%dk65>w` zT7;oiLQWQovi#KChwnZj;$%9wHg?)%IfQQ=J5E}2Z)qHGnlGO7l^A@%mbc2jB99=!IY+&X}Ssdo^gKE#iJ!)c_B)N`P8 z&evh|EMdOZR)kS?5dP)kLfY;HoQ1>6RamJJjJ)~Sw>l(lw88dRCd(S8LUI{*hItr< z+OMZZH2|mwEBTDJhj^tDjGZI(f0&7@^bPOk;=;8^RfqCNkwG!fyW;frz-0s2(x@gN zZ@}w|r%$n|1Ue4tKpAg_=^Z|u^ke!JL(E~w97DnrnN=s0>!Q}4+GJFV{jEUQhBEC) zU@?ZT#o`Y+i`gZ>g6bgdM^CuZ(H~Fb}4VFp}cIZisjnXo^ho z%p}vz?AomFg5CM<6!nIvk|QVGHtj8gGChsL0C=S{t_Zh7wS(z{34pA^K#>aZVIW>+ z0z^^Z9e5}JJ=UK9(Q4%a))1pQ>|el=P|9pk4%WIb-NW>zY-y>P%*d+{Je~nH8*W}e zcN(ipFhe$ZJknjGaC@kSGXYao%@rB8;ly<~>01a}fWr5DkZdm?NtC^o17cfgbG+p9 zJ$Rw3>H{AU_59k}m zpq;`D-Vi`0muQ16@O1`VPXoT4iXKt_3;3|k;$h6wx|(71wmsB^(Z0b0`ma)YI@B6uPEw_=oKg1m#*?i^|PT&{YNc_Sz83u-_PJE%1R9tO}+H*n6MnCk!)4QAkU zq~+TBG5Gd*x|L4i4BGb@)odb*`>JQu5QH;CIs*BLL4>_Sh*->rLCRfcXw9C5%pW|{%fR*PN1&%n4p z6D5Q@pC!sD5@^cmjU+url{~oy_n^C?Z76WlHCXE%jNV~;9fb#?e1wK_Lu$*Y-vnV3 z87tX@+ll%koM>-ue4J-l7$c7Y%A?dAXqa!*9Ee4>(y^8W=S57Eid;h$lIeYnnn-6H zX6%VWt}=9d=_9)h6($pCHs&vH)WW)R>~tjFZS4ORGhh>o>w9T|J0Z(M@L>Gam|mY@ z-T#xJ_8}b9QkpM!Pqie0@yJr7O*W|dB9PRVkUTH584YAV zzBNh=Hi`gYDg3ShHx3q;AmFJWxH_UmE+ln^W{n~Dn;Pkbspcs%fYI;*wc;?%Wutci zNGgjy(`k~A7+$f8a$!pnu6%(I#Tw_s#zfw%SGQmuPvX=sfb~2*@i1z|{t8h02_3N# zfVW5>fxs6zZr&r_GU|GxW_~C;51g$Gzt>c>ntHzBQMLvcy$8ncKAf77z~`X&LmLY+ zOQ%FU=gT6sEDIAiaYemSftyqRbQFy$ZSGW~)*v(`hi61yhNIiz`EY3MXVX`{i2Z^) zU>0(YM!0Gipr5|6IYH<_5_qG@Mr{B%h;@qGoY2D#kLwV$6C3v{--mO}y3#fEpsD7Q z|9+%>$blU}pq6Ak(x@!}FX^)u4AmG!9YFk{EKK)Os+Y>UD>+apuC#m+gLxhQ+Jp0k z7(E?qM(x=B1Kpp1xHX~LvdJ_E&!BG~GmU4tF%!d_U}YX+zs8Qw8JgA+n1VF7EHAYO zViy5RC{d7Ck0G;+rk%*A#f+*LJ$0Z_C*aFZbk3ia&vPUeXKpb6-8bq0z;;f@1uAgy z&?pD}-A`e_Lg+!LqJ6_Rh^FvtiUr{=@D*?9lgS9!lkhzCDqh^XY4Z?i+za^D{*k% zhqocLM~bEg=!y;VzcA`#4|U_+Ze&_O35zJ?CvNV29JRuaCW?mnZGjL!9}`*gs+-1p z)6^~aVzXuB&LnUTj@se!8}4vhM51p)L^Uco3{!>r)Q=CZOKtK30*2tIi8yGwyB4?@ zMFH@=YTGdLEgxiyq7Jx@LId&S5K=j44g9-Q6vFTw&he6~^G00&IK;JU z5nud-jW&DW$79%S7^7_#my*x@Iqr@#vvVM1HLTr(zG^4KeP$z<}CgoPl zm2jNWj3cc9hr@r&{IM9bGUZl;praUJD+f_A4V6bP4%Sm|r5km#hx#HzC^^Mr#e6I< z3g!#gvJU$C0C|fOdW#nobtbhvs#%tFE&;cJ@wnEgJ9R{n-(Z#=NBf!lU0qCzWOG}&q^&o=tN9$Jo!pF40W=R)Qt%9&r<)h(D-M@S?bFPxCVNKLM=+#Q0I^i& z?$#TK&P006H6)YlCnNd=>|2#_dkve6LzgBLewbm_(1#xW*qu3%1Jo60{@1!T^#S7d zK!(;=DB75PcNmTXDf&11bdIKalpb?)d9W6F#cRBJIdj}v!(f8-x5$Se^yUJ6i*c6j zO2kfZe1T3p09i%2_$oJxSjJWi|8Bs^ZuafvoJn%g_ul+QpuQmV527nZuq%Y|_7usQ zVBOmUOH#2bMmPh_Y4Bfz9x356QU?~cqVHi>H8bi5!YG1Vao|dD8a-mP)q_rcCxCfd zlcBMN=Iu&X-9(Kv*t&~!OB9N^H`uhtD7v(WZtQDHlhxG?PZp$8Mt`e=8wEh%|FqSS zs$*%;s?gA#b}3}gcVt-?qmKZ1OyUE*R(J|an>#7hTa%`48S#7 ze-AoV0l1Bp_+Z5Zg7+h()#N&o^Qbn*W;+_QCyBOX^OdhsvLC>D%x;QyqS4C}&s zlY?fW4;1X6HCJ$Se2Rb0RdddK%-RFRacX)T|(e*JGYVgW1cPm~lX4L*Xlyk7jB%*6u(jA5!!>&Z9dFc5%lOrV#je36!WgfB{{VKSShB5XYIR}pO%BVhtV zb|}JzII6NcVZ)hr?TrQjG1yzFE-v_{kiNPYgpX%)fja7qG7IU#E&j~l@ib%zWbMI0 z3mxF)a~Y$-?2ZI}EE`YzqQ&3j(UdxOVjb(3z`1Z!qM@#gi}pCFm>O%ULpc``T%?bT zh5%3*s|P8s~5QSTNJ-A)K3I!_!}&SQ-SBz&bw?3}yQ=hW91p z`VnFW!HZ~_UXD;YkoB)M!Wl{ODXs?_CqjaCOIc4AM|H=|C?16Fq?;GO*Dcw;6i*hw zT0Knkig}sE8CM=AGpJ<;G}t*Q2GL9hm@PZ|vaV=3L33B9{mI0sG&5Md5+-@~x|#?Aigi= zJE>epg}ON~z>67G6|6}=oc%vD23w=*Grsx`J8j|+OCgaG)e8dnyHa0u(1UW`1n#_^0P;1#Q`20i>toJ|d~Yahpa!nE)4E(2W9!eTygClq$gy_V52)Qd?5BT?K4pJ< zCi_*)KAV%Jiw?N~X#M&*1z869F_==h;jb=N1`QVCf|ro9n9lqV-cA`M0I-@KKC2t9 znBg4T#xsNlc@t_9gVmDK`dzrtk+;tn%$qz3bQ0y$)fWj8+5bL=YZ5eGri~f{dyySI i@FPDTaGqz-LcJMtY1SV&sQnIWy6cHwSynw#jsF8GMA+{D From 7af88a8a9954e0fc904908b0137e0a64b6f3b521 Mon Sep 17 00:00:00 2001 From: driemworks Date: Wed, 11 Sep 2024 21:03:48 -0500 Subject: [PATCH 02/20] can create and execute balance transfer call --- Cargo.lock | 10932 ++++++++++++++++++++++++++------- LICENSE | 52 + README.md | 2 +- cli/Cargo.toml | 6 +- cli/artifacts/metadata.scale | Bin 618943 -> 618956 bytes cli/src/main.rs | 315 +- cli/src/mmr_store | 1 + core/Cargo.toml | 51 +- core/src/lib.rs | 21 +- core/src/murmur.rs | 108 +- core/src/otp.rs | 29 +- core/src/types.rs | 33 +- mmr_store | 2 +- test | 1 + 14 files changed, 9095 insertions(+), 2458 deletions(-) create mode 100644 LICENSE create mode 100644 cli/src/mmr_store create mode 100644 test diff --git a/Cargo.lock b/Cargo.lock index 046e0c6..8aae826 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -12,13 +12,22 @@ dependencies = [ "regex", ] +[[package]] +name = "addr2line" +version = "0.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a76fd60b23679b7d19bd066031410fb7e458ccc5e958eb5c325888ce4baedc97" +dependencies = [ + "gimli 0.27.3", +] + [[package]] name = "addr2line" version = "0.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb" dependencies = [ - "gimli", + "gimli 0.28.1", ] [[package]] @@ -62,6 +71,17 @@ dependencies = [ "subtle", ] +[[package]] +name = "ahash" +version = "0.7.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "891477e0c6a8957309ee5c45a6368af3ae14bb510732d2684ffa19af310920f9" +dependencies = [ + "getrandom", + "once_cell", + "version_check", +] + [[package]] name = "ahash" version = "0.8.11" @@ -90,6 +110,65 @@ version = "0.2.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5c6cb57a04249c6480766f7f7cef5467412af1490f8d1e243141daddada3264f" +[[package]] +name = "alloy-primitives" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0628ec0ba5b98b3370bb6be17b12f23bfce8ee4ad83823325a20546d9b03b78" +dependencies = [ + "alloy-rlp", + "bytes", + "cfg-if", + "const-hex", + "derive_more", + "hex-literal", + "itoa", + "proptest", + "rand", + "ruint", + "serde", + "tiny-keccak", +] + +[[package]] +name = "alloy-rlp" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26154390b1d205a4a7ac7352aa2eb4f81f391399d4e2f546fb81a2f8bb383f62" +dependencies = [ + "arrayvec 0.7.4", + "bytes", +] + +[[package]] +name = "alloy-sol-macro" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a98ad1696a2e17f010ae8e43e9f2a1e930ed176a8e3ff77acfeff6dfb07b42c" +dependencies = [ + "const-hex", + "dunce", + "heck 0.4.1", + "proc-macro-error", + "proc-macro2", + "quote", + "syn 2.0.77", + "syn-solidity", + "tiny-keccak", +] + +[[package]] +name = "alloy-sol-types" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "98d7107bed88e8f09f0ddcc3335622d87bfb6821f3e0c7473329fb1cfad5e015" +dependencies = [ + "alloy-primitives", + "alloy-sol-macro", + "const-hex", + "serde", +] + [[package]] name = "anstream" version = "0.6.13" @@ -144,6 +223,15 @@ version = "1.0.82" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f538837af36e6f6a9be0faa67f9a314f8119e4e4b5867c6ab40ed60360142519" +[[package]] +name = "approx" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cab112f0a86d568ea0e627cc1d6be74a1e9cd55214684db5561995f6dad897c6" +dependencies = [ + "num-traits", +] + [[package]] name = "aquamarine" version = "0.5.0" @@ -155,7 +243,7 @@ dependencies = [ "proc-macro-error", "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.77", ] [[package]] @@ -165,8 +253,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fb00293ba84f51ce3bd026bd0de55899c4e68f0a39a5728cebae3a73ffdc0a4f" dependencies = [ "ark-ec", - "ark-ff", - "ark-std", + "ark-ff 0.4.2", + "ark-std 0.4.0", ] [[package]] @@ -178,7 +266,7 @@ dependencies = [ "ark-bls12-377", "ark-ec", "ark-models-ext", - "ark-std", + "ark-std 0.4.0", ] [[package]] @@ -188,9 +276,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c775f0d12169cba7aae4caeb547bb6a50781c7449a8aa53793827c9ec4abf488" dependencies = [ "ark-ec", - "ark-ff", - "ark-serialize", - "ark-std", + "ark-ff 0.4.2", + "ark-serialize 0.4.2", + "ark-std 0.4.0", ] [[package]] @@ -201,10 +289,10 @@ checksum = "b1dc4b3d08f19e8ec06e949712f95b8361e43f1391d94f65e4234df03480631c" dependencies = [ "ark-bls12-381", "ark-ec", - "ark-ff", + "ark-ff 0.4.2", "ark-models-ext", - "ark-serialize", - "ark-std", + "ark-serialize 0.4.2", + "ark-std 0.4.0", ] [[package]] @@ -215,8 +303,8 @@ checksum = "2e0605daf0cc5aa2034b78d008aaf159f56901d92a52ee4f6ecdfdac4f426700" dependencies = [ "ark-bls12-377", "ark-ec", - "ark-ff", - "ark-std", + "ark-ff 0.4.2", + "ark-std 0.4.0", ] [[package]] @@ -227,9 +315,9 @@ checksum = "ccee5fba47266f460067588ee1bf070a9c760bf2050c1c509982c5719aadb4f2" dependencies = [ "ark-bw6-761", "ark-ec", - "ark-ff", + "ark-ff 0.4.2", "ark-models-ext", - "ark-std", + "ark-std 0.4.0", ] [[package]] @@ -238,10 +326,10 @@ version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "defd9a439d56ac24968cca0571f598a61bc8c55f71d50a89cda591cb750670ba" dependencies = [ - "ark-ff", + "ark-ff 0.4.2", "ark-poly", - "ark-serialize", - "ark-std", + "ark-serialize 0.4.2", + "ark-std 0.4.0", "derivative", "hashbrown 0.13.2", "itertools 0.10.5", @@ -258,8 +346,8 @@ checksum = "b10d901b9ac4b38f9c32beacedfadcdd64e46f8d7f8e88c1ae1060022cf6f6c6" dependencies = [ "ark-bls12-377", "ark-ec", - "ark-ff", - "ark-std", + "ark-ff 0.4.2", + "ark-std 0.4.0", ] [[package]] @@ -270,9 +358,9 @@ checksum = "524a4fb7540df2e1a8c2e67a83ba1d1e6c3947f4f9342cc2359fc2e789ad731d" dependencies = [ "ark-ec", "ark-ed-on-bls12-377", - "ark-ff", + "ark-ff 0.4.2", "ark-models-ext", - "ark-std", + "ark-std 0.4.0", ] [[package]] @@ -283,8 +371,8 @@ checksum = "f9cde0f2aa063a2a5c28d39b47761aa102bda7c13c84fc118a61b87c7b2f785c" dependencies = [ "ark-bls12-381", "ark-ec", - "ark-ff", - "ark-std", + "ark-ff 0.4.2", + "ark-std 0.4.0", ] [[package]] @@ -295,9 +383,27 @@ checksum = "d15185f1acb49a07ff8cbe5f11a1adc5a93b19e211e325d826ae98e98e124346" dependencies = [ "ark-ec", "ark-ed-on-bls12-381-bandersnatch", - "ark-ff", + "ark-ff 0.4.2", "ark-models-ext", - "ark-std", + "ark-std 0.4.0", +] + +[[package]] +name = "ark-ff" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b3235cc41ee7a12aaaf2c575a2ad7b46713a8a50bda2fc3b003a04845c05dd6" +dependencies = [ + "ark-ff-asm 0.3.0", + "ark-ff-macros 0.3.0", + "ark-serialize 0.3.0", + "ark-std 0.3.0", + "derivative", + "num-bigint", + "num-traits", + "paste", + "rustc_version 0.3.3", + "zeroize", ] [[package]] @@ -306,20 +412,30 @@ version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec847af850f44ad29048935519032c33da8aa03340876d351dfab5660d2966ba" dependencies = [ - "ark-ff-asm", - "ark-ff-macros", - "ark-serialize", - "ark-std", + "ark-ff-asm 0.4.2", + "ark-ff-macros 0.4.2", + "ark-serialize 0.4.2", + "ark-std 0.4.0", "derivative", "digest 0.10.7", "itertools 0.10.5", "num-bigint", "num-traits", "paste", - "rustc_version", + "rustc_version 0.4.0", "zeroize", ] +[[package]] +name = "ark-ff-asm" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db02d390bf6643fb404d3d22d31aee1c4bc4459600aef9113833d17e786c6e44" +dependencies = [ + "quote", + "syn 1.0.109", +] + [[package]] name = "ark-ff-asm" version = "0.4.2" @@ -330,6 +446,18 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "ark-ff-macros" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db2fd794a08ccb318058009eefdf15bcaaaaf6f8161eb3345f907222bac38b20" +dependencies = [ + "num-bigint", + "num-traits", + "quote", + "syn 1.0.109", +] + [[package]] name = "ark-ff-macros" version = "0.4.2" @@ -350,9 +478,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3e9eab5d4b5ff2f228b763d38442adc9b084b0a465409b059fac5c2308835ec2" dependencies = [ "ark-ec", - "ark-ff", - "ark-serialize", - "ark-std", + "ark-ff 0.4.2", + "ark-serialize 0.4.2", + "ark-std 0.4.0", "derivative", ] @@ -362,9 +490,9 @@ version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d320bfc44ee185d899ccbadfa8bc31aab923ce1558716e1997a1e74057fe86bf" dependencies = [ - "ark-ff", - "ark-serialize", - "ark-std", + "ark-ff 0.4.2", + "ark-serialize 0.4.2", + "ark-std 0.4.0", "derivative", "hashbrown 0.13.2", ] @@ -376,9 +504,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5f69c00b3b529be29528a6f2fd5fa7b1790f8bed81b9cdca17e326538545a179" dependencies = [ "ark-ec", - "ark-ff", - "ark-serialize", - "ark-std", + "ark-ff 0.4.2", + "ark-serialize 0.4.2", + "ark-std 0.4.0", "parity-scale-codec", "scale-info", ] @@ -389,15 +517,25 @@ version = "0.0.2" source = "git+https://github.com/w3f/ring-vrf?rev=e9782f9#e9782f938629c90f3adb3fff2358bc8d1386af3e" dependencies = [ "ark-ec", - "ark-ff", - "ark-serialize", - "ark-std", - "ark-transcript", + "ark-ff 0.4.2", + "ark-serialize 0.4.2", + "ark-std 0.4.0", + "ark-transcript 0.0.2 (git+https://github.com/w3f/ring-vrf?rev=e9782f9)", "digest 0.10.7", "getrandom_or_panic", "zeroize", ] +[[package]] +name = "ark-serialize" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d6c2b318ee6e10f8c2853e73a83adc0ccb88995aa978d8a3408d492ab2ee671" +dependencies = [ + "ark-std 0.3.0", + "digest 0.9.0", +] + [[package]] name = "ark-serialize" version = "0.4.2" @@ -405,7 +543,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "adb7b85a02b83d2f22f89bd5cac66c9c89474240cb6207cb1efc16d098e822a5" dependencies = [ "ark-serialize-derive", - "ark-std", + "ark-std 0.4.0", "digest 0.10.7", "num-bigint", ] @@ -421,6 +559,16 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "ark-std" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1df2c09229cbc5a028b1d70e00fdb2acee28b1055dfb5ca73eea49c5a25c4e7c" +dependencies = [ + "num-traits", + "rand", +] + [[package]] name = "ark-std" version = "0.4.0" @@ -437,14 +585,33 @@ name = "ark-transcript" version = "0.0.2" source = "git+https://github.com/w3f/ring-vrf?rev=e9782f9#e9782f938629c90f3adb3fff2358bc8d1386af3e" dependencies = [ - "ark-ff", - "ark-serialize", - "ark-std", + "ark-ff 0.4.2", + "ark-serialize 0.4.2", + "ark-std 0.4.0", + "digest 0.10.7", + "rand_core", + "sha3", +] + +[[package]] +name = "ark-transcript" +version = "0.0.2" +source = "git+https://github.com/w3f/ring-vrf#0fef8266d851932ad25d6b41bc4b34d834d1e11d" +dependencies = [ + "ark-ff 0.4.2", + "ark-serialize 0.4.2", + "ark-std 0.4.0", "digest 0.10.7", "rand_core", "sha3", ] +[[package]] +name = "array-bytes" +version = "4.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f52f63c5c1316a16a4b35eaac8b76a98248961a533f061684cb2a7cb0eafb6c6" + [[package]] name = "array-bytes" version = "6.2.2" @@ -472,6 +639,65 @@ version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711" +[[package]] +name = "assert_matches" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b34d609dfbaf33d6889b2b7106d3ca345eacad44200913df5ba02bfd31d2ba9" + +[[package]] +name = "asset-test-utils" +version = "7.0.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +dependencies = [ + "cumulus-pallet-parachain-system", + "cumulus-pallet-xcmp-queue", + "cumulus-primitives-core", + "frame-support", + "frame-system", + "pallet-assets", + "pallet-balances", + "pallet-collator-selection", + "pallet-session", + "pallet-timestamp", + "pallet-xcm", + "pallet-xcm-bridge-hub-router", + "parachains-common", + "parachains-runtimes-test-utils", + "parity-scale-codec", + "sp-io", + "sp-runtime", + "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", + "staging-parachain-info", + "staging-xcm", + "staging-xcm-builder", + "staging-xcm-executor", + "substrate-wasm-builder", +] + +[[package]] +name = "assets-common" +version = "0.7.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +dependencies = [ + "cumulus-primitives-core", + "frame-support", + "impl-trait-for-tuples", + "log", + "pallet-asset-conversion", + "pallet-xcm", + "parachains-common", + "parity-scale-codec", + "scale-info", + "sp-api", + "sp-runtime", + "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", + "staging-xcm", + "staging-xcm-builder", + "staging-xcm-executor", + "substrate-wasm-builder", +] + [[package]] name = "async-channel" version = "2.2.1" @@ -522,7 +748,7 @@ dependencies = [ "futures-lite", "parking", "polling", - "rustix", + "rustix 0.38.34", "slab", "tracing", "windows-sys 0.52.0", @@ -565,7 +791,7 @@ dependencies = [ "cfg-if", "event-listener 5.3.0", "futures-lite", - "rustix", + "rustix 0.38.34", "tracing", "windows-sys 0.52.0", ] @@ -582,7 +808,7 @@ dependencies = [ "cfg-if", "futures-core", "futures-io", - "rustix", + "rustix 0.38.34", "signal-hook-registry", "slab", "windows-sys 0.52.0", @@ -602,7 +828,7 @@ checksum = "c6fa2087f2753a7da8cc1c0dbfcf89579dd57458e36769de5ac750b4671737ca" dependencies = [ "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.77", ] [[package]] @@ -617,6 +843,17 @@ version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" +[[package]] +name = "auto_impl" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c87f3f15e7794432337fc718554eaa4dc8f04c9677a950ffe366f20a162ae42" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.77", +] + [[package]] name = "autocfg" version = "1.2.0" @@ -629,12 +866,12 @@ version = "0.3.71" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "26b05800d2e817c8b3b4b54abd461726265fa9789ae34330622f2db9ee696f9d" dependencies = [ - "addr2line", + "addr2line 0.21.0", "cc", "cfg-if", "libc", "miniz_oxide", - "object", + "object 0.32.2", "rustc-demangle", ] @@ -646,9 +883,9 @@ dependencies = [ "ark-bls12-381", "ark-ec", "ark-ed-on-bls12-381-bandersnatch", - "ark-ff", - "ark-serialize", - "ark-std", + "ark-ff 0.4.2", + "ark-serialize 0.4.2", + "ark-std 0.4.0", "dleq_vrf", "fflonk", "merlin", @@ -712,6 +949,24 @@ dependencies = [ "serde", ] +[[package]] +name = "binary-merkle-tree" +version = "13.0.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +dependencies = [ + "hash-db", + "log", +] + +[[package]] +name = "bincode" +version = "1.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad" +dependencies = [ + "serde", +] + [[package]] name = "bip39" version = "2.0.0" @@ -723,6 +978,21 @@ dependencies = [ "unicode-normalization", ] +[[package]] +name = "bit-set" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0700ddab506f33b20a03b13996eccd309a48e5ff77d0d95926aa0210fb4e95f1" +dependencies = [ + "bit-vec", +] + +[[package]] +name = "bit-vec" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "349f9b6a179ed607305526ca489b34ad0a41aed5f7980fa90eb03160b69598fb" + [[package]] name = "bitcoin-internals" version = "0.2.0" @@ -765,6 +1035,7 @@ checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" dependencies = [ "funty", "radium", + "serde", "tap", "wyz", ] @@ -846,3311 +1117,8434 @@ dependencies = [ ] [[package]] -name = "bs58" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf88ba1141d185c399bee5288d850d63b8369520c1eafc32a0430b5b6c287bf4" +name = "bp-asset-hub-rococo" +version = "0.4.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" dependencies = [ - "tinyvec", + "bp-xcm-bridge-hub-router", + "frame-support", + "parity-scale-codec", + "scale-info", ] [[package]] -name = "bumpalo" -version = "3.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" - -[[package]] -name = "byte-slice-cast" -version = "1.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3ac9f8b63eca6fd385229b3675f6cc0dc5c8a5c8a54a59d4f52ffd670d87b0c" +name = "bp-asset-hub-westend" +version = "0.3.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +dependencies = [ + "bp-xcm-bridge-hub-router", + "frame-support", + "parity-scale-codec", + "scale-info", +] [[package]] -name = "byteorder" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" +name = "bp-bridge-hub-cumulus" +version = "0.7.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +dependencies = [ + "bp-messages", + "bp-polkadot-core", + "bp-runtime", + "frame-support", + "frame-system", + "polkadot-primitives", + "sp-api", + "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", +] [[package]] -name = "bytes" -version = "1.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "514de17de45fdb8dc022b1a7975556c53c86f9f0aa5f534b98977b171857c2c9" +name = "bp-bridge-hub-kusama" +version = "0.6.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +dependencies = [ + "bp-bridge-hub-cumulus", + "bp-messages", + "bp-runtime", + "frame-support", + "sp-api", + "sp-runtime", + "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", +] [[package]] -name = "cc" -version = "1.0.95" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d32a725bc159af97c3e629873bb9f88fb8cf8a4867175f76dc987815ea07c83b" +name = "bp-bridge-hub-polkadot" +version = "0.6.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +dependencies = [ + "bp-bridge-hub-cumulus", + "bp-messages", + "bp-runtime", + "frame-support", + "sp-api", + "sp-runtime", + "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", +] [[package]] -name = "cfg-expr" -version = "0.15.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d067ad48b8650848b989a59a86c6c36a995d02d2bf778d45c3c5d57bc2718f02" +name = "bp-bridge-hub-rococo" +version = "0.7.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" dependencies = [ - "smallvec", + "bp-bridge-hub-cumulus", + "bp-messages", + "bp-runtime", + "frame-support", + "sp-api", + "sp-runtime", + "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", ] [[package]] -name = "cfg-if" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" - -[[package]] -name = "chacha20" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3613f74bd2eac03dad61bd53dbe620703d4371614fe0bc3b9f04dd36fe4e818" +name = "bp-bridge-hub-westend" +version = "0.3.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" dependencies = [ - "cfg-if", - "cipher", - "cpufeatures", + "bp-bridge-hub-cumulus", + "bp-messages", + "bp-runtime", + "frame-support", + "sp-api", + "sp-runtime", + "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", ] [[package]] -name = "chacha20poly1305" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10cd79432192d1c0f4e1a0fef9527696cc039165d729fb41b3f4f4f354c2dc35" +name = "bp-header-chain" +version = "0.7.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" dependencies = [ - "aead", - "chacha20", - "cipher", - "poly1305", - "zeroize", + "bp-runtime", + "finality-grandpa", + "frame-support", + "parity-scale-codec", + "scale-info", + "serde", + "sp-consensus-grandpa", + "sp-core", + "sp-runtime", + "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", ] [[package]] -name = "cipher" -version = "0.4.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad" +name = "bp-kusama" +version = "0.5.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" dependencies = [ - "crypto-common", - "inout", - "zeroize", + "bp-header-chain", + "bp-polkadot-core", + "bp-runtime", + "frame-support", + "sp-api", + "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", ] [[package]] -name = "ckb-merkle-mountain-range" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56ccb671c5921be8a84686e6212ca184cb1d7c51cadcdbfcbd1cc3f042f5dfb8" +name = "bp-messages" +version = "0.7.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" dependencies = [ - "cfg-if", + "bp-header-chain", + "bp-runtime", + "frame-support", + "parity-scale-codec", + "scale-info", + "serde", + "sp-core", + "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", ] [[package]] -name = "clap" -version = "4.5.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90bc066a67923782aa8515dbaea16946c5bcc5addbd668bb80af688e53e548a0" +name = "bp-parachains" +version = "0.7.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" dependencies = [ - "clap_builder", - "clap_derive", + "bp-header-chain", + "bp-polkadot-core", + "bp-runtime", + "frame-support", + "impl-trait-for-tuples", + "parity-scale-codec", + "scale-info", + "sp-core", + "sp-runtime", + "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", ] [[package]] -name = "clap_builder" -version = "4.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae129e2e766ae0ec03484e609954119f123cc1fe650337e155d03b022f24f7b4" +name = "bp-polkadot" +version = "0.5.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" dependencies = [ - "anstream", - "anstyle", - "clap_lex", - "strsim 0.11.1", + "bp-header-chain", + "bp-polkadot-core", + "bp-runtime", + "frame-support", + "sp-api", + "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", ] [[package]] -name = "clap_derive" -version = "4.5.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "528131438037fd55894f62d6e9f068b8f45ac57ffa77517819645d10aed04f64" +name = "bp-polkadot-bulletin" +version = "0.4.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" dependencies = [ - "heck 0.5.0", - "proc-macro2", - "quote", - "syn 2.0.60", + "bp-header-chain", + "bp-messages", + "bp-polkadot-core", + "bp-runtime", + "frame-support", + "frame-system", + "parity-scale-codec", + "scale-info", + "sp-api", + "sp-runtime", + "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", ] [[package]] -name = "clap_lex" +name = "bp-polkadot-core" version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "98cc8fbded0c607b7ba9dd60cd98df59af97e84d24e49c8557331cfc26d301ce" - -[[package]] -name = "colorchoice" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +dependencies = [ + "bp-messages", + "bp-runtime", + "frame-support", + "frame-system", + "parity-scale-codec", + "parity-util-mem", + "scale-info", + "serde", + "sp-core", + "sp-runtime", + "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", +] [[package]] -name = "common" -version = "0.1.0" -source = "git+https://github.com/w3f/ring-proof#b273d33f9981e2bb3375ab45faeb537f7ee35224" +name = "bp-relayers" +version = "0.7.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" dependencies = [ - "ark-ec", - "ark-ff", - "ark-poly", - "ark-serialize", - "ark-std", - "fflonk", - "getrandom_or_panic", - "merlin", - "rand_chacha", + "bp-messages", + "bp-runtime", + "frame-support", + "parity-scale-codec", + "scale-info", + "sp-runtime", + "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", ] [[package]] -name = "common-path" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2382f75942f4b3be3690fe4f86365e9c853c1587d6ee58212cebf6e2a9ccd101" +name = "bp-rococo" +version = "0.6.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +dependencies = [ + "bp-header-chain", + "bp-polkadot-core", + "bp-runtime", + "frame-support", + "sp-api", + "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", +] [[package]] -name = "concurrent-queue" -version = "2.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d16048cd947b08fa32c24458a22f5dc5e835264f689f4f5653210c69fd107363" +name = "bp-runtime" +version = "0.7.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" dependencies = [ - "crossbeam-utils", + "frame-support", + "frame-system", + "hash-db", + "impl-trait-for-tuples", + "log", + "num-traits", + "parity-scale-codec", + "scale-info", + "serde", + "sp-core", + "sp-io", + "sp-runtime", + "sp-state-machine", + "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", + "sp-trie", + "trie-db", ] [[package]] -name = "console" -version = "0.15.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e1f83fc076bd6dd27517eacdf25fef6c4dfe5f1d7448bafaaf3a26f13b5e4eb" +name = "bp-test-utils" +version = "0.7.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" dependencies = [ - "encode_unicode", - "lazy_static", - "libc", - "unicode-width", - "windows-sys 0.52.0", + "bp-header-chain", + "bp-parachains", + "bp-polkadot-core", + "bp-runtime", + "ed25519-dalek", + "finality-grandpa", + "parity-scale-codec", + "sp-application-crypto", + "sp-consensus-grandpa", + "sp-core", + "sp-runtime", + "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", + "sp-trie", ] [[package]] -name = "const-oid" -version = "0.9.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" +name = "bp-westend" +version = "0.3.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +dependencies = [ + "bp-header-chain", + "bp-polkadot-core", + "bp-runtime", + "frame-support", + "sp-api", + "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", +] [[package]] -name = "const-random" -version = "0.1.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87e00182fe74b066627d63b85fd550ac2998d4b0bd86bfed477a0ae4c7c71359" +name = "bp-xcm-bridge-hub" +version = "0.2.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" dependencies = [ - "const-random-macro", + "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", ] [[package]] -name = "const-random-macro" -version = "0.1.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9d839f2a20b0aee515dc581a6172f2321f96cab76c1a38a4c584a194955390e" +name = "bp-xcm-bridge-hub-router" +version = "0.6.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" dependencies = [ - "getrandom", - "once_cell", - "tiny-keccak", + "parity-scale-codec", + "scale-info", + "sp-core", + "sp-runtime", ] [[package]] -name = "constant_time_eq" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "245097e9a4535ee1e3e3931fcfcd55a796a44c643e8596ff6566d68f09b87bbc" +name = "bridge-hub-common" +version = "0.1.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +dependencies = [ + "cumulus-primitives-core", + "frame-support", + "pallet-message-queue", + "parity-scale-codec", + "scale-info", + "snowbridge-core", + "sp-core", + "sp-runtime", + "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", + "staging-xcm", +] [[package]] -name = "constant_time_eq" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21a53c0a4d288377e7415b53dcfc3c04da5cdc2cc95c8d5ac178b58f0b861ad6" +name = "bridge-hub-test-utils" +version = "0.7.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +dependencies = [ + "asset-test-utils", + "bp-header-chain", + "bp-messages", + "bp-polkadot-core", + "bp-relayers", + "bp-runtime", + "bp-test-utils", + "bridge-runtime-common", + "cumulus-pallet-parachain-system", + "cumulus-pallet-xcmp-queue", + "frame-support", + "frame-system", + "impl-trait-for-tuples", + "log", + "pallet-balances", + "pallet-bridge-grandpa", + "pallet-bridge-messages", + "pallet-bridge-parachains", + "pallet-bridge-relayers", + "pallet-timestamp", + "pallet-utility", + "parachains-common", + "parachains-runtimes-test-utils", + "parity-scale-codec", + "sp-core", + "sp-io", + "sp-keyring", + "sp-runtime", + "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", + "sp-tracing 16.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", + "staging-xcm", + "staging-xcm-builder", + "staging-xcm-executor", +] [[package]] -name = "constant_time_eq" -version = "0.3.0" +name = "bridge-runtime-common" +version = "0.7.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +dependencies = [ + "bp-header-chain", + "bp-messages", + "bp-parachains", + "bp-polkadot-core", + "bp-relayers", + "bp-runtime", + "bp-xcm-bridge-hub", + "bp-xcm-bridge-hub-router", + "frame-support", + "frame-system", + "hash-db", + "log", + "pallet-bridge-grandpa", + "pallet-bridge-messages", + "pallet-bridge-parachains", + "pallet-bridge-relayers", + "pallet-transaction-payment", + "pallet-utility", + "parity-scale-codec", + "scale-info", + "sp-api", + "sp-core", + "sp-io", + "sp-runtime", + "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", + "sp-trie", + "staging-xcm", + "staging-xcm-builder", + "tuplex", +] + +[[package]] +name = "bs58" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7144d30dcf0fafbce74250a3963025d8d52177934239851c917d29f1df280c2" +checksum = "bf88ba1141d185c399bee5288d850d63b8369520c1eafc32a0430b5b6c287bf4" +dependencies = [ + "tinyvec", +] [[package]] -name = "constcat" -version = "0.3.1" +name = "build-helper" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd7e35aee659887cbfb97aaf227ac12cad1a9d7c71e55ff3376839ed4e282d08" +checksum = "bdce191bf3fa4995ce948c8c83b4640a1745457a149e73c6db75b4ffe36aad5f" +dependencies = [ + "semver 0.6.0", +] [[package]] -name = "convert_case" -version = "0.4.0" +name = "bumpalo" +version = "3.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" +checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" [[package]] -name = "core-foundation" -version = "0.9.4" +name = "byte-slice-cast" +version = "1.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" -dependencies = [ - "core-foundation-sys", - "libc", -] +checksum = "c3ac9f8b63eca6fd385229b3675f6cc0dc5c8a5c8a54a59d4f52ffd670d87b0c" [[package]] -name = "core-foundation-sys" -version = "0.8.6" +name = "bytemuck" +version = "1.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" +checksum = "94bbb0ad554ad961ddc5da507a12a29b14e4ae5bda06b19f575a3e6079d2e2ae" [[package]] -name = "cpufeatures" -version = "0.2.12" +name = "byteorder" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53fe5e26ff1b7aef8bca9c6080520cfb8d9333c7568e1829cef191a9723e5504" -dependencies = [ - "libc", -] +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] -name = "crossbeam-deque" -version = "0.8.5" +name = "bytes" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "613f8cc01fe9cf1a3eb3d7f488fd2fa8388403e97039e2f73692932e291a770d" -dependencies = [ - "crossbeam-epoch", - "crossbeam-utils", -] +checksum = "514de17de45fdb8dc022b1a7975556c53c86f9f0aa5f534b98977b171857c2c9" [[package]] -name = "crossbeam-epoch" -version = "0.9.18" +name = "camino" +version = "1.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" +checksum = "8b96ec4966b5813e2c0507c1f86115c8c5abaadc3980879c3424042a02fd1ad3" dependencies = [ - "crossbeam-utils", + "serde", ] [[package]] -name = "crossbeam-queue" -version = "0.3.11" +name = "cargo-platform" +version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df0346b5d5e76ac2fe4e327c5fd1118d6be7c51dfb18f9b7922923f287471e35" +checksum = "24b1f0365a6c6bb4020cd05806fd0d33c44d38046b8bd7f0e40814b9763cabfc" dependencies = [ - "crossbeam-utils", + "serde", ] [[package]] -name = "crossbeam-utils" -version = "0.8.19" +name = "cargo_metadata" +version = "0.15.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "248e3bacc7dc6baa3b21e405ee045c3047101a49145e7e9eca583ab4c2ca5345" +checksum = "eee4243f1f26fc7a42710e7439c149e2b10b05472f88090acce52632f231a73a" +dependencies = [ + "camino", + "cargo-platform", + "semver 1.0.22", + "serde", + "serde_json", + "thiserror", +] [[package]] -name = "crunchy" -version = "0.2.2" +name = "cassowary" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" +checksum = "df8670b8c7b9dae1793364eafadf7239c40d669904660c5960d74cfd80b46a53" [[package]] -name = "crypto-bigint" -version = "0.5.5" +name = "castaway" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76" +checksum = "0abae9be0aaf9ea96a3b1b8b1b55c602ca751eba1b1500220cea4ecbafe7c0d5" dependencies = [ - "generic-array", - "rand_core", - "subtle", - "zeroize", + "rustversion", ] [[package]] -name = "crypto-common" -version = "0.1.6" +name = "cc" +version = "1.0.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +checksum = "d32a725bc159af97c3e629873bb9f88fb8cf8a4867175f76dc987815ea07c83b" dependencies = [ - "generic-array", - "rand_core", - "typenum", + "jobserver", + "libc", + "once_cell", ] [[package]] -name = "crypto-mac" -version = "0.8.0" +name = "cfg-expr" +version = "0.15.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b584a330336237c1eecd3e94266efb216c56ed91225d634cb2991c5f3fd1aeab" +checksum = "d067ad48b8650848b989a59a86c6c36a995d02d2bf778d45c3c5d57bc2718f02" dependencies = [ - "generic-array", - "subtle", + "smallvec", ] [[package]] -name = "ctr" -version = "0.9.2" +name = "cfg-if" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0369ee1ad671834580515889b80f2ea915f23b8be8d0daa4bbaf2ac5c7590835" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "chacha20" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3613f74bd2eac03dad61bd53dbe620703d4371614fe0bc3b9f04dd36fe4e818" dependencies = [ + "cfg-if", "cipher", + "cpufeatures", ] [[package]] -name = "curve25519-dalek" -version = "4.1.2" +name = "chacha20poly1305" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a677b8922c94e01bdbb12126b0bc852f00447528dee1782229af9c720c3f348" +checksum = "10cd79432192d1c0f4e1a0fef9527696cc039165d729fb41b3f4f4f354c2dc35" dependencies = [ - "cfg-if", - "cpufeatures", - "curve25519-dalek-derive", - "digest 0.10.7", - "fiat-crypto", - "platforms", - "rustc_version", - "subtle", + "aead", + "chacha20", + "cipher", + "poly1305", "zeroize", ] [[package]] -name = "curve25519-dalek-derive" -version = "0.1.1" +name = "cipher" +version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" +checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad" dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.60", + "crypto-common", + "inout", + "zeroize", ] [[package]] -name = "darling" -version = "0.14.4" +name = "ckb-merkle-mountain-range" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b750cb3417fd1b327431a470f388520309479ab0bf5e323505daf0290cd3850" +checksum = "56ccb671c5921be8a84686e6212ca184cb1d7c51cadcdbfcbd1cc3f042f5dfb8" dependencies = [ - "darling_core 0.14.4", - "darling_macro 0.14.4", + "cfg-if", ] [[package]] -name = "darling" -version = "0.20.8" +name = "clap" +version = "4.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54e36fcd13ed84ffdfda6f5be89b31287cbb80c439841fe69e04841435464391" +checksum = "90bc066a67923782aa8515dbaea16946c5bcc5addbd668bb80af688e53e548a0" dependencies = [ - "darling_core 0.20.8", - "darling_macro 0.20.8", + "clap_builder", + "clap_derive", ] [[package]] -name = "darling_core" -version = "0.14.4" +name = "clap_builder" +version = "4.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "109c1ca6e6b7f82cc233a97004ea8ed7ca123a9af07a8230878fcfda9b158bf0" +checksum = "ae129e2e766ae0ec03484e609954119f123cc1fe650337e155d03b022f24f7b4" dependencies = [ - "fnv", - "ident_case", - "proc-macro2", - "quote", - "strsim 0.10.0", - "syn 1.0.109", + "anstream", + "anstyle", + "clap_lex", + "strsim 0.11.1", ] [[package]] -name = "darling_core" -version = "0.20.8" +name = "clap_derive" +version = "4.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c2cf1c23a687a1feeb728783b993c4e1ad83d99f351801977dd809b48d0a70f" +checksum = "528131438037fd55894f62d6e9f068b8f45ac57ffa77517819645d10aed04f64" dependencies = [ - "fnv", - "ident_case", + "heck 0.5.0", "proc-macro2", "quote", - "strsim 0.10.0", - "syn 2.0.60", + "syn 2.0.77", ] [[package]] -name = "darling_macro" -version = "0.14.4" +name = "clap_lex" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4aab4dbc9f7611d8b55048a3a16d2d010c2c8334e46304b40ac1cc14bf3b48e" -dependencies = [ - "darling_core 0.14.4", - "quote", - "syn 1.0.109", -] +checksum = "98cc8fbded0c607b7ba9dd60cd98df59af97e84d24e49c8557331cfc26d301ce" [[package]] -name = "darling_macro" -version = "0.20.8" +name = "codespan-reporting" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a668eda54683121533a393014d8692171709ff57a7d61f187b6e782719f8933f" +checksum = "3538270d33cc669650c4b093848450d380def10c331d38c768e34cac80576e6e" dependencies = [ - "darling_core 0.20.8", - "quote", - "syn 2.0.60", + "termcolor", + "unicode-width", ] [[package]] -name = "der" -version = "0.7.9" +name = "colorchoice" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f55bf8e7b65898637379c1b74eb1551107c8294ed26d855ceb9fd1a09cfc9bc0" +checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7" + +[[package]] +name = "common" +version = "0.1.0" +source = "git+https://github.com/w3f/ring-proof#31658d1f5b88e106c969557c36c821aff46b2236" dependencies = [ - "const-oid", - "zeroize", + "ark-ec", + "ark-ff 0.4.2", + "ark-poly", + "ark-serialize 0.4.2", + "ark-std 0.4.0", + "fflonk", + "getrandom_or_panic", + "rand_core", ] [[package]] -name = "derivative" -version = "2.2.0" +name = "common-path" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] +checksum = "2382f75942f4b3be3690fe4f86365e9c853c1587d6ee58212cebf6e2a9ccd101" [[package]] -name = "derive-syn-parse" -version = "0.1.5" +name = "compact_str" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e79116f119dd1dba1abf1f3405f03b9b0e79a27a3883864bfebded8a3dc768cd" +checksum = "6050c3a16ddab2e412160b31f2c871015704239bca62f72f6e5f0be631d3f644" dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", + "castaway", + "cfg-if", + "itoa", + "rustversion", + "ryu", + "static_assertions", ] [[package]] -name = "derive-syn-parse" -version = "0.2.0" +name = "concurrent-queue" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d65d7ce8132b7c0e54497a4d9a55a1c2a0912a0d786cf894472ba818fba45762" +checksum = "d16048cd947b08fa32c24458a22f5dc5e835264f689f4f5653210c69fd107363" dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.60", + "crossbeam-utils", ] [[package]] -name = "derive_more" -version = "0.99.17" +name = "console" +version = "0.15.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fb810d30a7c1953f91334de7244731fc3f3c10d7fe163338a35b9f640960321" +checksum = "0e1f83fc076bd6dd27517eacdf25fef6c4dfe5f1d7448bafaaf3a26f13b5e4eb" dependencies = [ - "convert_case", - "proc-macro2", - "quote", - "rustc_version", - "syn 1.0.109", + "encode_unicode", + "lazy_static", + "libc", + "unicode-width", + "windows-sys 0.52.0", ] [[package]] -name = "digest" -version = "0.9.0" +name = "const-hex" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" +checksum = "94fb8a24a26d37e1ffd45343323dc9fe6654ceea44c12f2fcb3d7ac29e610bc6" dependencies = [ - "generic-array", + "cfg-if", + "cpufeatures", + "hex", + "proptest", + "serde", ] [[package]] -name = "digest" -version = "0.10.7" +name = "const-oid" +version = "0.9.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" -dependencies = [ - "block-buffer 0.10.4", - "const-oid", - "crypto-common", - "subtle", -] +checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" [[package]] -name = "dleq_vrf" -version = "0.0.2" -source = "git+https://github.com/w3f/ring-vrf?rev=e9782f9#e9782f938629c90f3adb3fff2358bc8d1386af3e" +name = "const-random" +version = "0.1.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87e00182fe74b066627d63b85fd550ac2998d4b0bd86bfed477a0ae4c7c71359" dependencies = [ - "ark-ec", - "ark-ff", - "ark-scale", - "ark-secret-scalar", - "ark-serialize", - "ark-std", - "ark-transcript", - "arrayvec 0.7.4", - "zeroize", + "const-random-macro", ] [[package]] -name = "docify" -version = "0.2.8" +name = "const-random-macro" +version = "0.1.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43a2f138ad521dc4a2ced1a4576148a6a610b4c5923933b062a263130a6802ce" +checksum = "f9d839f2a20b0aee515dc581a6172f2321f96cab76c1a38a4c584a194955390e" dependencies = [ - "docify_macros", + "getrandom", + "once_cell", + "tiny-keccak", ] [[package]] -name = "docify_macros" -version = "0.2.8" +name = "constant_time_eq" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a081e51fb188742f5a7a1164ad752121abcb22874b21e2c3b0dd040c515fdad" +checksum = "245097e9a4535ee1e3e3931fcfcd55a796a44c643e8596ff6566d68f09b87bbc" + +[[package]] +name = "constant_time_eq" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21a53c0a4d288377e7415b53dcfc3c04da5cdc2cc95c8d5ac178b58f0b861ad6" + +[[package]] +name = "constant_time_eq" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7144d30dcf0fafbce74250a3963025d8d52177934239851c917d29f1df280c2" + +[[package]] +name = "constcat" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd7e35aee659887cbfb97aaf227ac12cad1a9d7c71e55ff3376839ed4e282d08" + +[[package]] +name = "convert_case" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" + +[[package]] +name = "core-foundation" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" dependencies = [ - "common-path", - "derive-syn-parse 0.2.0", - "once_cell", - "proc-macro2", - "quote", - "regex", - "syn 2.0.60", - "termcolor", - "toml", - "walkdir", + "core-foundation-sys", + "libc", ] [[package]] -name = "downcast-rs" -version = "1.2.1" +name = "core-foundation-sys" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75b325c5dbd37f80359721ad39aca5a29fb04c89279657cffdda8736d0c0b9d2" +checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" [[package]] -name = "dyn-clonable" -version = "0.9.0" +name = "cpp_demangle" +version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e9232f0e607a262ceb9bd5141a3dfb3e4db6994b31989bbfd845878cba59fd4" +checksum = "eeaa953eaad386a53111e47172c2fedba671e5684c8dd601a5f474f4f118710f" dependencies = [ - "dyn-clonable-impl", - "dyn-clone", + "cfg-if", ] [[package]] -name = "dyn-clonable-impl" -version = "0.9.0" +name = "cpufeatures" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "558e40ea573c374cf53507fd240b7ee2f5477df7cfebdb97323ec61c719399c5" +checksum = "53fe5e26ff1b7aef8bca9c6080520cfb8d9333c7568e1829cef191a9723e5504" dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", + "libc", ] [[package]] -name = "dyn-clone" -version = "1.0.17" +name = "cranelift-bforest" +version = "0.95.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d6ef0072f8a535281e4876be788938b528e9a1d43900b82c2569af7da799125" +checksum = "1277fbfa94bc82c8ec4af2ded3e639d49ca5f7f3c7eeab2c66accd135ece4e70" +dependencies = [ + "cranelift-entity", +] [[package]] -name = "ecdsa" -version = "0.16.9" +name = "cranelift-codegen" +version = "0.95.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee27f32b5c5292967d2d4a9d7f1e0b0aed2c15daded5a60300e4abb9d8020bca" +checksum = "c6e8c31ad3b2270e9aeec38723888fe1b0ace3bea2b06b3f749ccf46661d3220" dependencies = [ - "der", - "digest 0.10.7", - "elliptic-curve", - "rfc6979", - "serdect", - "signature", - "spki", + "bumpalo", + "cranelift-bforest", + "cranelift-codegen-meta", + "cranelift-codegen-shared", + "cranelift-entity", + "cranelift-isle", + "gimli 0.27.3", + "hashbrown 0.13.2", + "log", + "regalloc2 0.6.1", + "smallvec", + "target-lexicon", ] [[package]] -name = "ed25519" -version = "2.2.3" +name = "cranelift-codegen-meta" +version = "0.95.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "115531babc129696a58c64a4fef0a8bf9e9698629fb97e9e40767d235cfbcd53" +checksum = "c8ac5ac30d62b2d66f12651f6b606dbdfd9c2cfd0908de6b387560a277c5c9da" dependencies = [ - "pkcs8", - "signature", + "cranelift-codegen-shared", ] [[package]] -name = "ed25519-dalek" -version = "2.1.1" +name = "cranelift-codegen-shared" +version = "0.95.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a3daa8e81a3963a60642bcc1f90a670680bd4a77535faa384e9d1c79d620871" +checksum = "dd82b8b376247834b59ed9bdc0ddeb50f517452827d4a11bccf5937b213748b8" + +[[package]] +name = "cranelift-entity" +version = "0.95.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "40099d38061b37e505e63f89bab52199037a72b931ad4868d9089ff7268660b0" dependencies = [ - "curve25519-dalek", - "ed25519", "serde", - "sha2 0.10.8", - "subtle", - "zeroize", ] [[package]] -name = "ed25519-zebra" -version = "4.0.3" +name = "cranelift-frontend" +version = "0.95.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d9ce6874da5d4415896cd45ffbc4d1cfc0c4f9c079427bd870742c30f2f65a9" +checksum = "64a25d9d0a0ae3079c463c34115ec59507b4707175454f0eee0891e83e30e82d" dependencies = [ - "curve25519-dalek", - "ed25519", - "hashbrown 0.14.3", - "hex", - "rand_core", - "sha2 0.10.8", - "zeroize", + "cranelift-codegen", + "log", + "smallvec", + "target-lexicon", ] [[package]] -name = "either" -version = "1.11.0" +name = "cranelift-isle" +version = "0.95.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a47c1c47d2f5964e29c61246e81db715514cd532db6b5116a25ea3c03d6780a2" +checksum = "80de6a7d0486e4acbd5f9f87ec49912bf4c8fb6aea00087b989685460d4469ba" [[package]] -name = "elliptic-curve" -version = "0.13.8" +name = "cranelift-native" +version = "0.95.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" +checksum = "bb6b03e0e03801c4b3fd8ce0758a94750c07a44e7944cc0ffbf0d3f2e7c79b00" dependencies = [ - "base16ct", - "crypto-bigint", - "digest 0.10.7", - "ff", - "generic-array", - "group", - "pkcs8", - "rand_core", - "sec1", - "serdect", - "subtle", - "zeroize", + "cranelift-codegen", + "libc", + "target-lexicon", ] [[package]] -name = "encode_unicode" -version = "0.3.6" +name = "cranelift-wasm" +version = "0.95.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a357d28ed41a50f9c765dbfe56cbc04a64e53e5fc58ba79fbc34c10ef3df831f" +checksum = "ff3220489a3d928ad91e59dd7aeaa8b3de18afb554a6211213673a71c90737ac" +dependencies = [ + "cranelift-codegen", + "cranelift-entity", + "cranelift-frontend", + "itertools 0.10.5", + "log", + "smallvec", + "wasmparser", + "wasmtime-types", +] [[package]] -name = "environmental" -version = "1.1.4" +name = "crc32fast" +version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e48c92028aaa870e83d51c64e5d4e0b6981b360c522198c23959f219a4e1b15b" +checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" +dependencies = [ + "cfg-if", +] [[package]] -name = "equivalent" -version = "1.0.1" +name = "crossbeam-deque" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" +checksum = "613f8cc01fe9cf1a3eb3d7f488fd2fa8388403e97039e2f73692932e291a770d" +dependencies = [ + "crossbeam-epoch", + "crossbeam-utils", +] [[package]] -name = "errno" -version = "0.3.8" +name = "crossbeam-epoch" +version = "0.9.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a258e46cdc063eb8519c00b9fc845fc47bcfca4130e2f08e88665ceda8474245" +checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" dependencies = [ - "libc", - "windows-sys 0.52.0", + "crossbeam-utils", ] [[package]] -name = "etf-crypto-primitives" -version = "0.2.4" -source = "git+https://github.com/ideal-lab5/etf-sdk/?branch=tony/dev#159ed603ca8a31b7d2e5f4437c62411c4d1fd743" +name = "crossbeam-queue" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df0346b5d5e76ac2fe4e327c5fd1118d6be7c51dfb18f9b7922923f287471e35" dependencies = [ - "aes-gcm", - "ark-bls12-377", - "ark-bls12-381", - "ark-ec", - "ark-ff", - "ark-poly", - "ark-serialize", - "ark-std", - "array-bytes", - "chacha20poly1305", - "generic-array", - "parity-scale-codec", - "rand_chacha", - "scale-info", - "serde", - "serde_cbor", - "serde_json", - "sha2 0.10.8", - "sha3", - "w3f-bls", -] - -[[package]] -name = "etf-crypto-primitives" -version = "0.2.4" -source = "git+https://github.com/ideal-lab5/etf-sdk/?branch=w3fbls-migration#181a312bbbf84fb0dec419d4fb3d41a9d852278f" -dependencies = [ - "aes-gcm", - "ark-bls12-377", - "ark-bls12-381", - "ark-ec", - "ark-ff", - "ark-poly", - "ark-serialize", - "ark-std", - "array-bytes", - "chacha20poly1305", - "generic-array", - "parity-scale-codec", - "rand_chacha", - "scale-info", - "serde", - "serde_cbor", - "serde_json", - "sha2 0.10.8", - "sha3", - "w3f-bls", -] - -[[package]] -name = "event-listener" -version = "4.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67b215c49b2b248c855fb73579eb1f4f26c38ffdc12973e20e07b91d78d5646e" -dependencies = [ - "concurrent-queue", - "parking", - "pin-project-lite", -] - -[[package]] -name = "event-listener" -version = "5.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d9944b8ca13534cdfb2800775f8dd4902ff3fc75a50101466decadfdf322a24" -dependencies = [ - "concurrent-queue", - "parking", - "pin-project-lite", + "crossbeam-utils", ] [[package]] -name = "event-listener-strategy" -version = "0.4.0" +name = "crossbeam-utils" +version = "0.8.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "958e4d70b6d5e81971bebec42271ec641e7ff4e170a6fa605f2b8a8b65cb97d3" -dependencies = [ - "event-listener 4.0.3", - "pin-project-lite", -] +checksum = "248e3bacc7dc6baa3b21e405ee045c3047101a49145e7e9eca583ab4c2ca5345" [[package]] -name = "event-listener-strategy" -version = "0.5.1" +name = "crossterm" +version = "0.28.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "332f51cb23d20b0de8458b86580878211da09bcd4503cb579c225b3d124cabb3" +checksum = "829d955a0bb380ef178a640b91779e3987da38c9aea133b20614cfed8cdea9c6" dependencies = [ - "event-listener 5.3.0", - "pin-project-lite", + "bitflags 2.5.0", + "crossterm_winapi", + "mio 1.0.2", + "parking_lot", + "rustix 0.38.34", + "signal-hook", + "signal-hook-mio", + "winapi", ] [[package]] -name = "expander" -version = "2.1.0" +name = "crossterm_winapi" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00e83c02035136f1592a47964ea60c05a50e4ed8b5892cfac197063850898d4d" +checksum = "acdd7c62a3665c7f6830a51635d9ac9b23ed385797f70a83bb8bafe9c572ab2b" dependencies = [ - "blake2", - "fs-err", - "prettier-please", - "proc-macro2", - "quote", - "syn 2.0.60", + "winapi", ] [[package]] -name = "fastrand" -version = "2.0.2" +name = "crunchy" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "658bd65b1cf4c852a3cc96f18a8ce7b5640f6b703f905c7d74532294c2a63984" +checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" [[package]] -name = "ff" -version = "0.13.0" +name = "crypto-bigint" +version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ded41244b729663b1e574f1b4fb731469f69f79c17667b5d776b16cda0479449" +checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76" dependencies = [ + "generic-array", "rand_core", "subtle", + "zeroize", ] [[package]] -name = "fflonk" -version = "0.1.0" -source = "git+https://github.com/w3f/fflonk#1e854f35e9a65d08b11a86291405cdc95baa0a35" +name = "crypto-common" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" dependencies = [ - "ark-ec", - "ark-ff", - "ark-poly", - "ark-serialize", - "ark-std", - "merlin", + "generic-array", + "rand_core", + "typenum", ] [[package]] -name = "fiat-crypto" -version = "0.2.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38793c55593b33412e3ae40c2c9781ffaa6f438f6f8c10f24e71846fbd7ae01e" - -[[package]] -name = "fixed-hash" +name = "crypto-mac" version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "835c052cb0c08c1acf6ffd71c022172e18723949c8282f2b9f27efbc51e64534" +checksum = "b584a330336237c1eecd3e94266efb216c56ed91225d634cb2991c5f3fd1aeab" dependencies = [ - "byteorder", - "rand", - "rustc-hex", - "static_assertions", + "generic-array", + "subtle", ] [[package]] -name = "fnv" -version = "1.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" - -[[package]] -name = "form_urlencoded" -version = "1.2.1" +name = "ctr" +version = "0.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" +checksum = "0369ee1ad671834580515889b80f2ea915f23b8be8d0daa4bbaf2ac5c7590835" dependencies = [ - "percent-encoding", + "cipher", ] [[package]] -name = "frame-metadata" -version = "15.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "878babb0b136e731cc77ec2fd883ff02745ff21e6fb662729953d44923df009c" +name = "cumulus-pallet-aura-ext" +version = "0.7.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" dependencies = [ - "cfg-if", + "cumulus-pallet-parachain-system", + "frame-support", + "frame-system", + "pallet-aura", + "pallet-timestamp", "parity-scale-codec", "scale-info", + "sp-application-crypto", + "sp-consensus-aura", + "sp-runtime", + "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", ] [[package]] -name = "frame-metadata" -version = "16.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87cf1549fba25a6fcac22785b61698317d958e96cac72a59102ea45b9ae64692" +name = "cumulus-pallet-dmp-queue" +version = "0.7.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" dependencies = [ - "cfg-if", + "cumulus-primitives-core", + "frame-benchmarking", + "frame-support", + "frame-system", + "log", "parity-scale-codec", "scale-info", - "serde", + "sp-io", + "sp-runtime", + "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", + "staging-xcm", ] [[package]] -name = "frame-support" -version = "28.0.0" +name = "cumulus-pallet-parachain-system" +version = "0.7.0" source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" dependencies = [ - "aquamarine", - "array-bytes", - "bitflags 1.3.2", - "docify", + "bytes", + "cumulus-pallet-parachain-system-proc-macro", + "cumulus-primitives-core", + "cumulus-primitives-parachain-inherent", + "cumulus-primitives-proof-size-hostfunction", "environmental", - "frame-metadata 16.0.0", - "frame-support-procedural", + "frame-benchmarking", + "frame-support", + "frame-system", "impl-trait-for-tuples", - "k256", "log", - "macro_magic", + "pallet-message-queue", "parity-scale-codec", - "paste", + "polkadot-parachain-primitives", + "polkadot-runtime-common", + "polkadot-runtime-parachains", "scale-info", - "serde", - "serde_json", - "smallvec", - "sp-api", - "sp-arithmetic", "sp-core", - "sp-crypto-hashing-proc-macro", - "sp-debug-derive 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", - "sp-genesis-builder", + "sp-externalities 0.25.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", "sp-inherents", "sp-io", - "sp-metadata-ir", "sp-runtime", - "sp-staking", "sp-state-machine", "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", - "sp-tracing 16.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", - "sp-weights", - "static_assertions", - "tt-call", + "sp-trie", + "sp-version", + "staging-xcm", + "staging-xcm-builder", + "trie-db", ] [[package]] -name = "frame-support-procedural" -version = "23.0.0" +name = "cumulus-pallet-parachain-system-proc-macro" +version = "0.6.0" source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" dependencies = [ - "Inflector", - "cfg-expr", - "derive-syn-parse 0.2.0", - "expander", - "frame-support-procedural-tools", - "itertools 0.11.0", - "macro_magic", - "proc-macro-warning", + "proc-macro-crate 3.1.0", "proc-macro2", "quote", - "sp-crypto-hashing 0.1.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", - "syn 2.0.60", + "syn 2.0.77", ] [[package]] -name = "frame-support-procedural-tools" -version = "10.0.0" +name = "cumulus-pallet-session-benchmarking" +version = "9.0.0" source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" dependencies = [ - "frame-support-procedural-tools-derive", - "proc-macro-crate 3.1.0", - "proc-macro2", - "quote", - "syn 2.0.60", + "frame-benchmarking", + "frame-support", + "frame-system", + "pallet-session", + "parity-scale-codec", + "sp-runtime", + "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", ] [[package]] -name = "frame-support-procedural-tools-derive" -version = "11.0.0" +name = "cumulus-pallet-solo-to-para" +version = "0.7.0" source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.60", + "cumulus-pallet-parachain-system", + "frame-support", + "frame-system", + "pallet-sudo", + "parity-scale-codec", + "polkadot-primitives", + "scale-info", + "sp-runtime", + "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", ] [[package]] -name = "fs-err" -version = "2.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88a41f105fe1d5b6b34b2055e3dc59bb79b46b48b2040b9e6c7b4b5de097aa41" +name = "cumulus-pallet-xcm" +version = "0.7.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" dependencies = [ - "autocfg", + "cumulus-primitives-core", + "frame-support", + "frame-system", + "parity-scale-codec", + "scale-info", + "sp-io", + "sp-runtime", + "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", + "staging-xcm", ] [[package]] -name = "funty" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" - -[[package]] -name = "futures" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "645c6916888f6cb6350d2550b80fb63e734897a8498abe35cfb732b6487804b0" +name = "cumulus-pallet-xcmp-queue" +version = "0.7.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" dependencies = [ - "futures-channel", - "futures-core", - "futures-executor", - "futures-io", - "futures-sink", - "futures-task", - "futures-util", + "bounded-collections", + "bp-xcm-bridge-hub-router", + "cumulus-primitives-core", + "frame-benchmarking", + "frame-support", + "frame-system", + "log", + "pallet-message-queue", + "parity-scale-codec", + "polkadot-runtime-common", + "polkadot-runtime-parachains", + "scale-info", + "sp-core", + "sp-io", + "sp-runtime", + "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", + "staging-xcm", + "staging-xcm-builder", + "staging-xcm-executor", ] [[package]] -name = "futures-channel" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78" +name = "cumulus-ping" +version = "0.7.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" dependencies = [ - "futures-core", - "futures-sink", + "cumulus-pallet-xcm", + "cumulus-primitives-core", + "frame-support", + "frame-system", + "parity-scale-codec", + "scale-info", + "sp-runtime", + "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", + "staging-xcm", ] [[package]] -name = "futures-core" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" - -[[package]] -name = "futures-executor" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a576fc72ae164fca6b9db127eaa9a9dda0d61316034f33a0a0d4eda41f02b01d" +name = "cumulus-primitives-aura" +version = "0.7.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" dependencies = [ - "futures-core", - "futures-task", - "futures-util", - "num_cpus", + "parity-scale-codec", + "polkadot-core-primitives", + "polkadot-primitives", + "sp-api", + "sp-consensus-aura", + "sp-runtime", + "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", ] [[package]] -name = "futures-io" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1" +name = "cumulus-primitives-core" +version = "0.7.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +dependencies = [ + "parity-scale-codec", + "polkadot-core-primitives", + "polkadot-parachain-primitives", + "polkadot-primitives", + "scale-info", + "sp-api", + "sp-runtime", + "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", + "sp-trie", + "staging-xcm", +] [[package]] -name = "futures-lite" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52527eb5074e35e9339c6b4e8d12600c7128b68fb25dcb9fa9dec18f7c25f3a5" +name = "cumulus-primitives-parachain-inherent" +version = "0.7.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" dependencies = [ - "fastrand", - "futures-core", - "futures-io", - "parking", - "pin-project-lite", + "async-trait", + "cumulus-primitives-core", + "parity-scale-codec", + "scale-info", + "sp-core", + "sp-inherents", + "sp-runtime", + "sp-state-machine", + "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", + "sp-trie", ] [[package]] -name = "futures-macro" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" +name = "cumulus-primitives-proof-size-hostfunction" +version = "0.2.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.60", + "sp-externalities 0.25.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", + "sp-runtime-interface 24.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", + "sp-trie", ] [[package]] -name = "futures-sink" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5" +name = "cumulus-primitives-storage-weight-reclaim" +version = "1.0.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +dependencies = [ + "cumulus-primitives-core", + "cumulus-primitives-proof-size-hostfunction", + "docify", + "frame-support", + "frame-system", + "log", + "parity-scale-codec", + "scale-info", + "sp-runtime", + "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", +] [[package]] -name = "futures-task" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004" +name = "cumulus-primitives-timestamp" +version = "0.7.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +dependencies = [ + "cumulus-primitives-core", + "futures", + "parity-scale-codec", + "sp-inherents", + "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", + "sp-timestamp", +] [[package]] -name = "futures-timer" -version = "3.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f288b0a4f20f9a56b5d1da57e2227c661b7b16168e2f72365f57b63326e29b24" +name = "cumulus-primitives-utility" +version = "0.7.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +dependencies = [ + "cumulus-primitives-core", + "frame-support", + "log", + "pallet-asset-conversion", + "parity-scale-codec", + "polkadot-runtime-common", + "polkadot-runtime-parachains", + "sp-io", + "sp-runtime", + "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", + "staging-xcm", + "staging-xcm-builder", + "staging-xcm-executor", +] [[package]] -name = "futures-util" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48" +name = "cumulus-test-relay-sproof-builder" +version = "0.7.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" dependencies = [ - "futures-channel", - "futures-core", - "futures-io", - "futures-macro", - "futures-sink", - "futures-task", - "memchr", - "pin-project-lite", - "pin-utils", - "slab", + "cumulus-primitives-core", + "parity-scale-codec", + "polkadot-primitives", + "sp-runtime", + "sp-state-machine", + "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", + "sp-trie", ] [[package]] -name = "generic-array" -version = "0.14.7" +name = "curve25519-dalek" +version = "4.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +checksum = "97fb8b7c4503de7d6ae7b42ab72a5a59857b4c937ec27a3d4539dba95b5ab2be" dependencies = [ - "typenum", - "version_check", + "cfg-if", + "cpufeatures", + "curve25519-dalek-derive", + "digest 0.10.7", + "fiat-crypto", + "rustc_version 0.4.0", + "subtle", "zeroize", ] [[package]] -name = "getrandom" -version = "0.2.14" +name = "curve25519-dalek-derive" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94b22e06ecb0110981051723910cbf0b5f5e09a2062dd7663334ee79a9d1286c" +checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" dependencies = [ - "cfg-if", - "js-sys", - "libc", - "wasi", - "wasm-bindgen", + "proc-macro2", + "quote", + "syn 2.0.77", ] [[package]] -name = "getrandom_or_panic" -version = "0.0.3" +name = "cxx" +version = "1.0.128" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ea1015b5a70616b688dc230cfe50c8af89d972cb132d5a622814d29773b10b9" +checksum = "54ccead7d199d584d139148b04b4a368d1ec7556a1d9ea2548febb1b9d49f9a4" dependencies = [ - "rand", - "rand_core", + "cc", + "cxxbridge-flags", + "cxxbridge-macro", + "link-cplusplus", ] [[package]] -name = "ghash" -version = "0.5.1" +name = "cxx-build" +version = "1.0.128" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0d8a4362ccb29cb0b265253fb0a2728f592895ee6854fd9bc13f2ffda266ff1" +checksum = "c77953e99f01508f89f55c494bfa867171ef3a6c8cea03d26975368f2121a5c1" dependencies = [ - "opaque-debug", - "polyval", + "cc", + "codespan-reporting", + "once_cell", + "proc-macro2", + "quote", + "scratch", + "syn 2.0.77", ] [[package]] -name = "gimli" -version = "0.28.1" +name = "cxxbridge-flags" +version = "1.0.128" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" +checksum = "65777e06cc48f0cb0152024c77d6cf9e4bdb4408e7b48bea993d42fa0f5b02b6" [[package]] -name = "group" -version = "0.13.0" +name = "cxxbridge-macro" +version = "1.0.128" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" +checksum = "98532a60dedaebc4848cb2cba5023337cc9ea3af16a5b062633fabfd9f18fb60" dependencies = [ - "ff", - "rand_core", - "subtle", + "proc-macro2", + "quote", + "syn 2.0.77", ] [[package]] -name = "h2" -version = "0.3.26" +name = "darling" +version = "0.14.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81fe527a889e1532da5c525686d96d4c2e74cdd345badf8dfef9f6b39dd5f5e8" +checksum = "7b750cb3417fd1b327431a470f388520309479ab0bf5e323505daf0290cd3850" dependencies = [ - "bytes", - "fnv", - "futures-core", - "futures-sink", - "futures-util", - "http", - "indexmap", - "slab", - "tokio", - "tokio-util", - "tracing", + "darling_core 0.14.4", + "darling_macro 0.14.4", ] [[package]] -name = "half" -version = "1.8.3" +name = "darling" +version = "0.20.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b43ede17f21864e81be2fa654110bf1e793774238d86ef8555c37e6519c0403" +checksum = "54e36fcd13ed84ffdfda6f5be89b31287cbb80c439841fe69e04841435464391" +dependencies = [ + "darling_core 0.20.8", + "darling_macro 0.20.8", +] [[package]] -name = "hash-db" -version = "0.16.0" +name = "darling_core" +version = "0.14.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e7d7786361d7425ae2fe4f9e407eb0efaa0840f5212d109cc018c40c35c6ab4" +checksum = "109c1ca6e6b7f82cc233a97004ea8ed7ca123a9af07a8230878fcfda9b158bf0" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2", + "quote", + "strsim 0.10.0", + "syn 1.0.109", +] [[package]] -name = "hash256-std-hasher" -version = "0.15.2" +name = "darling_core" +version = "0.20.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92c171d55b98633f4ed3860808f004099b36c1cc29c42cfc53aa8591b21efcf2" +checksum = "9c2cf1c23a687a1feeb728783b993c4e1ad83d99f351801977dd809b48d0a70f" dependencies = [ - "crunchy", + "fnv", + "ident_case", + "proc-macro2", + "quote", + "strsim 0.10.0", + "syn 2.0.77", +] + +[[package]] +name = "darling_macro" +version = "0.14.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4aab4dbc9f7611d8b55048a3a16d2d010c2c8334e46304b40ac1cc14bf3b48e" +dependencies = [ + "darling_core 0.14.4", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "darling_macro" +version = "0.20.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a668eda54683121533a393014d8692171709ff57a7d61f187b6e782719f8933f" +dependencies = [ + "darling_core 0.20.8", + "quote", + "syn 2.0.77", +] + +[[package]] +name = "der" +version = "0.7.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f55bf8e7b65898637379c1b74eb1551107c8294ed26d855ceb9fd1a09cfc9bc0" +dependencies = [ + "const-oid", + "zeroize", +] + +[[package]] +name = "deranged" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4" +dependencies = [ + "powerfmt", +] + +[[package]] +name = "derivative" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "derive-syn-parse" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e79116f119dd1dba1abf1f3405f03b9b0e79a27a3883864bfebded8a3dc768cd" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "derive-syn-parse" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d65d7ce8132b7c0e54497a4d9a55a1c2a0912a0d786cf894472ba818fba45762" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.77", +] + +[[package]] +name = "derive_more" +version = "0.99.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fb810d30a7c1953f91334de7244731fc3f3c10d7fe163338a35b9f640960321" +dependencies = [ + "convert_case", + "proc-macro2", + "quote", + "rustc_version 0.4.0", + "syn 1.0.109", +] + +[[package]] +name = "digest" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" +dependencies = [ + "generic-array", +] + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer 0.10.4", + "const-oid", + "crypto-common", + "subtle", +] + +[[package]] +name = "directories-next" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "339ee130d97a610ea5a5872d2bbb130fdf68884ff09d3028b81bec8a1ac23bbc" +dependencies = [ + "cfg-if", + "dirs-sys-next", +] + +[[package]] +name = "dirs-sys-next" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ebda144c4fe02d1f7ea1a7d9641b6fc6b580adcfa024ae48797ecdeb6825b4d" +dependencies = [ + "libc", + "redox_users", + "winapi", +] + +[[package]] +name = "dleq_vrf" +version = "0.0.2" +source = "git+https://github.com/w3f/ring-vrf?rev=e9782f9#e9782f938629c90f3adb3fff2358bc8d1386af3e" +dependencies = [ + "ark-ec", + "ark-ff 0.4.2", + "ark-scale", + "ark-secret-scalar", + "ark-serialize 0.4.2", + "ark-std 0.4.0", + "ark-transcript 0.0.2 (git+https://github.com/w3f/ring-vrf?rev=e9782f9)", + "arrayvec 0.7.4", + "zeroize", +] + +[[package]] +name = "docify" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43a2f138ad521dc4a2ced1a4576148a6a610b4c5923933b062a263130a6802ce" +dependencies = [ + "docify_macros", +] + +[[package]] +name = "docify_macros" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a081e51fb188742f5a7a1164ad752121abcb22874b21e2c3b0dd040c515fdad" +dependencies = [ + "common-path", + "derive-syn-parse 0.2.0", + "once_cell", + "proc-macro2", + "quote", + "regex", + "syn 2.0.77", + "termcolor", + "toml 0.8.12", + "walkdir", +] + +[[package]] +name = "downcast-rs" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75b325c5dbd37f80359721ad39aca5a29fb04c89279657cffdda8736d0c0b9d2" + +[[package]] +name = "dunce" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" + +[[package]] +name = "dyn-clonable" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e9232f0e607a262ceb9bd5141a3dfb3e4db6994b31989bbfd845878cba59fd4" +dependencies = [ + "dyn-clonable-impl", + "dyn-clone", +] + +[[package]] +name = "dyn-clonable-impl" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "558e40ea573c374cf53507fd240b7ee2f5477df7cfebdb97323ec61c719399c5" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "dyn-clone" +version = "1.0.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d6ef0072f8a535281e4876be788938b528e9a1d43900b82c2569af7da799125" + +[[package]] +name = "ecdsa" +version = "0.16.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee27f32b5c5292967d2d4a9d7f1e0b0aed2c15daded5a60300e4abb9d8020bca" +dependencies = [ + "der", + "digest 0.10.7", + "elliptic-curve", + "rfc6979", + "serdect", + "signature", + "spki", +] + +[[package]] +name = "ed25519" +version = "2.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "115531babc129696a58c64a4fef0a8bf9e9698629fb97e9e40767d235cfbcd53" +dependencies = [ + "pkcs8", + "signature", +] + +[[package]] +name = "ed25519-dalek" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a3daa8e81a3963a60642bcc1f90a670680bd4a77535faa384e9d1c79d620871" +dependencies = [ + "curve25519-dalek", + "ed25519", + "serde", + "sha2 0.10.8", + "subtle", + "zeroize", +] + +[[package]] +name = "ed25519-zebra" +version = "4.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d9ce6874da5d4415896cd45ffbc4d1cfc0c4f9c079427bd870742c30f2f65a9" +dependencies = [ + "curve25519-dalek", + "ed25519", + "hashbrown 0.14.3", + "hex", + "rand_core", + "sha2 0.10.8", + "zeroize", +] + +[[package]] +name = "either" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a47c1c47d2f5964e29c61246e81db715514cd532db6b5116a25ea3c03d6780a2" + +[[package]] +name = "elliptic-curve" +version = "0.13.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" +dependencies = [ + "base16ct", + "crypto-bigint", + "digest 0.10.7", + "ff", + "generic-array", + "group", + "pkcs8", + "rand_core", + "sec1", + "serdect", + "subtle", + "zeroize", +] + +[[package]] +name = "encode_unicode" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a357d28ed41a50f9c765dbfe56cbc04a64e53e5fc58ba79fbc34c10ef3df831f" + +[[package]] +name = "enumflags2" +version = "0.7.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d232db7f5956f3f14313dc2f87985c58bd2c695ce124c8cdd984e08e15ac133d" +dependencies = [ + "enumflags2_derive", +] + +[[package]] +name = "enumflags2_derive" +version = "0.7.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "de0d48a183585823424a4ce1aa132d174a6a81bd540895822eb4c8373a8e49e8" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.77", +] + +[[package]] +name = "enumn" +version = "0.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f9ed6b3789237c8a0c1c505af1c7eb2c560df6186f01b098c3a1064ea532f38" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.77", +] + +[[package]] +name = "env_logger" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cd405aab171cb85d6735e5c8d9db038c17d3ca007a4d2c25f337935c3d90580" +dependencies = [ + "humantime", + "is-terminal", + "log", + "regex", + "termcolor", +] + +[[package]] +name = "environmental" +version = "1.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e48c92028aaa870e83d51c64e5d4e0b6981b360c522198c23959f219a4e1b15b" + +[[package]] +name = "equivalent" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" + +[[package]] +name = "errno" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a258e46cdc063eb8519c00b9fc845fc47bcfca4130e2f08e88665ceda8474245" +dependencies = [ + "libc", + "windows-sys 0.52.0", +] + +[[package]] +name = "etf-crypto-primitives" +version = "0.2.4" +source = "git+https://github.com/ideal-lab5/etf-sdk.git?branch=dev#e2b3615e0936c2cdd1ab8673e15208bef880b040" +dependencies = [ + "aes-gcm", + "ark-bls12-377", + "ark-bls12-381", + "ark-ec", + "ark-ff 0.4.2", + "ark-poly", + "ark-serialize 0.4.2", + "ark-std 0.4.0", + "array-bytes 6.2.2", + "chacha20poly1305", + "generic-array", + "parity-scale-codec", + "rand_chacha", + "scale-info", + "serde", + "serde_cbor", + "serde_json", + "sha2 0.10.8", + "sha3", + "w3f-bls", +] + +[[package]] +name = "etf-crypto-primitives" +version = "0.2.4" +source = "git+https://github.com/ideal-lab5/etf-sdk/?branch=tony/dev#159ed603ca8a31b7d2e5f4437c62411c4d1fd743" +dependencies = [ + "aes-gcm", + "ark-bls12-377", + "ark-bls12-381", + "ark-ec", + "ark-ff 0.4.2", + "ark-poly", + "ark-serialize 0.4.2", + "ark-std 0.4.0", + "array-bytes 6.2.2", + "chacha20poly1305", + "generic-array", + "parity-scale-codec", + "rand_chacha", + "scale-info", + "serde", + "serde_cbor", + "serde_json", + "sha2 0.10.8", + "sha3", + "w3f-bls", +] + +[[package]] +name = "etf-crypto-primitives" +version = "0.2.4" +source = "git+https://github.com/ideal-lab5/etf-sdk/?branch=w3fbls-migration#c6e61a89b94b57bcbde2293208a2875469f4fc5c" +dependencies = [ + "aes-gcm", + "ark-bls12-377", + "ark-bls12-381", + "ark-ec", + "ark-ff 0.4.2", + "ark-poly", + "ark-serialize 0.4.2", + "ark-std 0.4.0", + "array-bytes 6.2.2", + "chacha20poly1305", + "generic-array", + "parity-scale-codec", + "rand_chacha", + "scale-info", + "serde", + "serde_cbor", + "serde_json", + "sha2 0.10.8", + "sha3", + "w3f-bls", +] + +[[package]] +name = "ethabi-decode" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09d398648d65820a727d6a81e58b962f874473396a047e4c30bafe3240953417" +dependencies = [ + "ethereum-types", + "tiny-keccak", +] + +[[package]] +name = "ethbloom" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c22d4b5885b6aa2fe5e8b9329fb8d232bf739e434e6b87347c63bdd00c120f60" +dependencies = [ + "crunchy", + "fixed-hash", + "impl-codec", + "impl-rlp", + "impl-serde", + "scale-info", + "tiny-keccak", +] + +[[package]] +name = "ethereum-types" +version = "0.14.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02d215cbf040552efcbe99a38372fe80ab9d00268e20012b79fcd0f073edd8ee" +dependencies = [ + "ethbloom", + "fixed-hash", + "impl-codec", + "impl-rlp", + "impl-serde", + "primitive-types", + "scale-info", + "uint", +] + +[[package]] +name = "event-listener" +version = "4.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67b215c49b2b248c855fb73579eb1f4f26c38ffdc12973e20e07b91d78d5646e" +dependencies = [ + "concurrent-queue", + "parking", + "pin-project-lite", +] + +[[package]] +name = "event-listener" +version = "5.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d9944b8ca13534cdfb2800775f8dd4902ff3fc75a50101466decadfdf322a24" +dependencies = [ + "concurrent-queue", + "parking", + "pin-project-lite", +] + +[[package]] +name = "event-listener-strategy" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "958e4d70b6d5e81971bebec42271ec641e7ff4e170a6fa605f2b8a8b65cb97d3" +dependencies = [ + "event-listener 4.0.3", + "pin-project-lite", +] + +[[package]] +name = "event-listener-strategy" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "332f51cb23d20b0de8458b86580878211da09bcd4503cb579c225b3d124cabb3" +dependencies = [ + "event-listener 5.3.0", + "pin-project-lite", +] + +[[package]] +name = "expander" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00e83c02035136f1592a47964ea60c05a50e4ed8b5892cfac197063850898d4d" +dependencies = [ + "blake2", + "fs-err", + "prettier-please", + "proc-macro2", + "quote", + "syn 2.0.77", +] + +[[package]] +name = "fallible-iterator" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4443176a9f2c162692bd3d352d745ef9413eec5782a80d8fd6f8a1ac692a07f7" + +[[package]] +name = "fallible-iterator" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2acce4a10f12dc2fb14a218589d4f1f62ef011b2d0cc4b3cb1bba8e94da14649" + +[[package]] +name = "fastrand" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "658bd65b1cf4c852a3cc96f18a8ce7b5640f6b703f905c7d74532294c2a63984" + +[[package]] +name = "fastrlp" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "139834ddba373bbdd213dffe02c8d110508dcf1726c2be27e8d1f7d7e1856418" +dependencies = [ + "arrayvec 0.7.4", + "auto_impl", + "bytes", +] + +[[package]] +name = "ff" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ded41244b729663b1e574f1b4fb731469f69f79c17667b5d776b16cda0479449" +dependencies = [ + "rand_core", + "subtle", +] + +[[package]] +name = "fflonk" +version = "0.1.0" +source = "git+https://github.com/w3f/fflonk#1e854f35e9a65d08b11a86291405cdc95baa0a35" +dependencies = [ + "ark-ec", + "ark-ff 0.4.2", + "ark-poly", + "ark-serialize 0.4.2", + "ark-std 0.4.0", + "merlin", +] + +[[package]] +name = "fiat-crypto" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38793c55593b33412e3ae40c2c9781ffaa6f438f6f8c10f24e71846fbd7ae01e" + +[[package]] +name = "file-per-thread-logger" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "84f2e425d9790201ba4af4630191feac6dcc98765b118d4d18e91d23c2353866" +dependencies = [ + "env_logger", + "log", +] + +[[package]] +name = "filetime" +version = "0.2.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ee447700ac8aa0b2f2bd7bc4462ad686ba06baa6727ac149a2d6277f0d240fd" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "windows-sys 0.52.0", +] + +[[package]] +name = "finality-grandpa" +version = "0.16.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36530797b9bf31cd4ff126dcfee8170f86b00cfdcea3269d73133cc0415945c3" +dependencies = [ + "either", + "futures", + "futures-timer", + "log", + "num-traits", + "parity-scale-codec", + "parking_lot", + "scale-info", +] + +[[package]] +name = "fixed-hash" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "835c052cb0c08c1acf6ffd71c022172e18723949c8282f2b9f27efbc51e64534" +dependencies = [ + "byteorder", + "rand", + "rustc-hex", + "static_assertions", +] + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "form_urlencoded" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "frame-benchmarking" +version = "28.0.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +dependencies = [ + "frame-support", + "frame-support-procedural", + "frame-system", + "linregress", + "log", + "parity-scale-codec", + "paste", + "scale-info", + "serde", + "sp-api", + "sp-application-crypto", + "sp-core", + "sp-io", + "sp-runtime", + "sp-runtime-interface 24.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", + "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", + "sp-storage 19.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", + "static_assertions", +] + +[[package]] +name = "frame-benchmarking-pallet-pov" +version = "18.0.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +dependencies = [ + "frame-benchmarking", + "frame-support", + "frame-system", + "parity-scale-codec", + "scale-info", + "sp-io", + "sp-runtime", + "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", +] + +[[package]] +name = "frame-election-provider-solution-type" +version = "13.0.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +dependencies = [ + "proc-macro-crate 3.1.0", + "proc-macro2", + "quote", + "syn 2.0.77", +] + +[[package]] +name = "frame-election-provider-support" +version = "28.0.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +dependencies = [ + "frame-election-provider-solution-type", + "frame-support", + "frame-system", + "parity-scale-codec", + "scale-info", + "sp-arithmetic", + "sp-core", + "sp-npos-elections", + "sp-runtime", + "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", +] + +[[package]] +name = "frame-executive" +version = "28.0.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +dependencies = [ + "aquamarine", + "frame-support", + "frame-system", + "frame-try-runtime", + "log", + "parity-scale-codec", + "scale-info", + "sp-core", + "sp-io", + "sp-runtime", + "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", + "sp-tracing 16.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", +] + +[[package]] +name = "frame-metadata" +version = "15.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "878babb0b136e731cc77ec2fd883ff02745ff21e6fb662729953d44923df009c" +dependencies = [ + "cfg-if", + "parity-scale-codec", + "scale-info", +] + +[[package]] +name = "frame-metadata" +version = "16.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87cf1549fba25a6fcac22785b61698317d958e96cac72a59102ea45b9ae64692" +dependencies = [ + "cfg-if", + "parity-scale-codec", + "scale-info", + "serde", +] + +[[package]] +name = "frame-metadata-hash-extension" +version = "0.1.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +dependencies = [ + "array-bytes 6.2.2", + "docify", + "frame-support", + "frame-system", + "log", + "parity-scale-codec", + "scale-info", + "sp-runtime", +] + +[[package]] +name = "frame-support" +version = "28.0.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +dependencies = [ + "aquamarine", + "array-bytes 6.2.2", + "bitflags 1.3.2", + "docify", + "environmental", + "frame-metadata 16.0.0", + "frame-support-procedural", + "impl-trait-for-tuples", + "k256", + "log", + "macro_magic", + "parity-scale-codec", + "paste", + "scale-info", + "serde", + "serde_json", + "smallvec", + "sp-api", + "sp-arithmetic", + "sp-core", + "sp-crypto-hashing-proc-macro", + "sp-debug-derive 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", + "sp-genesis-builder", + "sp-inherents", + "sp-io", + "sp-metadata-ir", + "sp-runtime", + "sp-staking", + "sp-state-machine", + "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", + "sp-tracing 16.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", + "sp-weights", + "static_assertions", + "tt-call", +] + +[[package]] +name = "frame-support-procedural" +version = "23.0.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +dependencies = [ + "Inflector", + "cfg-expr", + "derive-syn-parse 0.2.0", + "expander", + "frame-support-procedural-tools", + "itertools 0.11.0", + "macro_magic", + "proc-macro-warning", + "proc-macro2", + "quote", + "sp-crypto-hashing 0.1.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", + "syn 2.0.77", +] + +[[package]] +name = "frame-support-procedural-tools" +version = "10.0.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +dependencies = [ + "frame-support-procedural-tools-derive", + "proc-macro-crate 3.1.0", + "proc-macro2", + "quote", + "syn 2.0.77", +] + +[[package]] +name = "frame-support-procedural-tools-derive" +version = "11.0.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.77", +] + +[[package]] +name = "frame-system" +version = "28.0.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +dependencies = [ + "cfg-if", + "docify", + "frame-support", + "log", + "parity-scale-codec", + "scale-info", + "serde", + "sp-core", + "sp-io", + "sp-runtime", + "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", + "sp-version", + "sp-weights", +] + +[[package]] +name = "frame-system-benchmarking" +version = "28.0.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +dependencies = [ + "frame-benchmarking", + "frame-support", + "frame-system", + "parity-scale-codec", + "scale-info", + "sp-core", + "sp-runtime", + "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", +] + +[[package]] +name = "frame-system-rpc-runtime-api" +version = "26.0.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +dependencies = [ + "docify", + "parity-scale-codec", + "sp-api", +] + +[[package]] +name = "frame-try-runtime" +version = "0.34.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +dependencies = [ + "frame-support", + "parity-scale-codec", + "sp-api", + "sp-runtime", + "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", +] + +[[package]] +name = "fs-err" +version = "2.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88a41f105fe1d5b6b34b2055e3dc59bb79b46b48b2040b9e6c7b4b5de097aa41" +dependencies = [ + "autocfg", +] + +[[package]] +name = "funty" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" + +[[package]] +name = "futures" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "645c6916888f6cb6350d2550b80fb63e734897a8498abe35cfb732b6487804b0" +dependencies = [ + "futures-channel", + "futures-core", + "futures-executor", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-channel" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78" +dependencies = [ + "futures-core", + "futures-sink", +] + +[[package]] +name = "futures-core" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" + +[[package]] +name = "futures-executor" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a576fc72ae164fca6b9db127eaa9a9dda0d61316034f33a0a0d4eda41f02b01d" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", + "num_cpus", +] + +[[package]] +name = "futures-io" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1" + +[[package]] +name = "futures-lite" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52527eb5074e35e9339c6b4e8d12600c7128b68fb25dcb9fa9dec18f7c25f3a5" +dependencies = [ + "fastrand", + "futures-core", + "futures-io", + "parking", + "pin-project-lite", +] + +[[package]] +name = "futures-macro" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.77", +] + +[[package]] +name = "futures-sink" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5" + +[[package]] +name = "futures-task" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004" + +[[package]] +name = "futures-timer" +version = "3.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f288b0a4f20f9a56b5d1da57e2227c661b7b16168e2f72365f57b63326e29b24" + +[[package]] +name = "futures-util" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-macro", + "futures-sink", + "futures-task", + "memchr", + "pin-project-lite", + "pin-utils", + "slab", +] + +[[package]] +name = "fxhash" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c" +dependencies = [ + "byteorder", +] + +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", + "zeroize", +] + +[[package]] +name = "getrandom" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94b22e06ecb0110981051723910cbf0b5f5e09a2062dd7663334ee79a9d1286c" +dependencies = [ + "cfg-if", + "js-sys", + "libc", + "wasi", + "wasm-bindgen", +] + +[[package]] +name = "getrandom_or_panic" +version = "0.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ea1015b5a70616b688dc230cfe50c8af89d972cb132d5a622814d29773b10b9" +dependencies = [ + "rand", + "rand_core", +] + +[[package]] +name = "ghash" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0d8a4362ccb29cb0b265253fb0a2728f592895ee6854fd9bc13f2ffda266ff1" +dependencies = [ + "opaque-debug", + "polyval", +] + +[[package]] +name = "gimli" +version = "0.27.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c80984affa11d98d1b88b66ac8853f143217b399d3c74116778ff8fdb4ed2e" +dependencies = [ + "fallible-iterator 0.2.0", + "indexmap 1.9.3", + "stable_deref_trait", +] + +[[package]] +name = "gimli" +version = "0.28.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" +dependencies = [ + "fallible-iterator 0.3.0", + "stable_deref_trait", +] + +[[package]] +name = "group" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" +dependencies = [ + "ff", + "rand_core", + "subtle", +] + +[[package]] +name = "h2" +version = "0.3.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81fe527a889e1532da5c525686d96d4c2e74cdd345badf8dfef9f6b39dd5f5e8" +dependencies = [ + "bytes", + "fnv", + "futures-core", + "futures-sink", + "futures-util", + "http", + "indexmap 2.2.6", + "slab", + "tokio", + "tokio-util", + "tracing", +] + +[[package]] +name = "half" +version = "1.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b43ede17f21864e81be2fa654110bf1e793774238d86ef8555c37e6519c0403" + +[[package]] +name = "hash-db" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e7d7786361d7425ae2fe4f9e407eb0efaa0840f5212d109cc018c40c35c6ab4" + +[[package]] +name = "hash256-std-hasher" +version = "0.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92c171d55b98633f4ed3860808f004099b36c1cc29c42cfc53aa8591b21efcf2" +dependencies = [ + "crunchy", +] + +[[package]] +name = "hashbrown" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" +dependencies = [ + "ahash 0.7.8", +] + +[[package]] +name = "hashbrown" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e" +dependencies = [ + "ahash 0.8.11", +] + +[[package]] +name = "hashbrown" +version = "0.14.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" +dependencies = [ + "ahash 0.8.11", + "allocator-api2", + "serde", +] + +[[package]] +name = "heck" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" + +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + +[[package]] +name = "hermit-abi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" + +[[package]] +name = "hermit-abi" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fbf6a919d6cf397374f7dfeeea91d974c7c0a7221d0d0f4f20d859d329e53fcc" + +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" + +[[package]] +name = "hex-conservative" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30ed443af458ccb6d81c1e7e661545f94d3176752fb1df2f543b902a1e0f51e2" + +[[package]] +name = "hex-literal" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6fe2267d4ed49bc07b63801559be28c718ea06c4738b7a03c94df7386d2cde46" + +[[package]] +name = "hkdf" +version = "0.12.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b5f8eb2ad728638ea2c7d47a21db23b7b58a72ed6a38256b8a1849f15fbbdf7" +dependencies = [ + "hmac 0.12.1", +] + +[[package]] +name = "hmac" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "126888268dcc288495a26bf004b38c5fdbb31682f992c84ceb046a1f0fe38840" +dependencies = [ + "crypto-mac", + "digest 0.9.0", +] + +[[package]] +name = "hmac" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" +dependencies = [ + "digest 0.10.7", +] + +[[package]] +name = "hmac-drbg" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17ea0a1394df5b6574da6e0c1ade9e78868c9fb0a4e5ef4428e32da4676b85b1" +dependencies = [ + "digest 0.9.0", + "generic-array", + "hmac 0.8.1", +] + +[[package]] +name = "http" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1" +dependencies = [ + "bytes", + "fnv", + "itoa", +] + +[[package]] +name = "http-body" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" +dependencies = [ + "bytes", + "http", + "pin-project-lite", +] + +[[package]] +name = "httparse" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" + +[[package]] +name = "httpdate" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" + +[[package]] +name = "humantime" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" + +[[package]] +name = "hyper" +version = "0.14.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf96e135eb83a2a8ddf766e426a841d8ddd7449d5f00d34ea02b41d2f19eef80" +dependencies = [ + "bytes", + "futures-channel", + "futures-core", + "futures-util", + "h2", + "http", + "http-body", + "httparse", + "httpdate", + "itoa", + "pin-project-lite", + "socket2", + "tokio", + "tower-service", + "tracing", + "want", +] + +[[package]] +name = "hyper-rustls" +version = "0.24.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec3efd23720e2049821a693cbc7e65ea87c72f1c58ff2f9522ff332b1491e590" +dependencies = [ + "futures-util", + "http", + "hyper", + "log", + "rustls 0.21.11", + "rustls-native-certs 0.6.3", + "tokio", + "tokio-rustls 0.24.1", +] + +[[package]] +name = "ident_case" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" + +[[package]] +name = "idna" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" +dependencies = [ + "unicode-bidi", + "unicode-normalization", +] + +[[package]] +name = "impl-codec" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba6a270039626615617f3f36d15fc827041df3b78c439da2cadfa47455a77f2f" +dependencies = [ + "parity-scale-codec", +] + +[[package]] +name = "impl-num-traits" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "951641f13f873bff03d4bf19ae8bec531935ac0ac2cc775f84d7edfdcfed3f17" +dependencies = [ + "integer-sqrt", + "num-traits", + "uint", +] + +[[package]] +name = "impl-rlp" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f28220f89297a075ddc7245cd538076ee98b01f2a9c23a53a4f1105d5a322808" +dependencies = [ + "rlp", +] + +[[package]] +name = "impl-serde" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc88fc67028ae3db0c853baa36269d398d5f45b6982f95549ff5def78c935cd" +dependencies = [ + "serde", +] + +[[package]] +name = "impl-trait-for-tuples" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11d7a9f6330b71fea57921c9b61c47ee6e84f72d394754eff6163ae67e7395eb" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "include_dir" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "18762faeff7122e89e0857b02f7ce6fcc0d101d5e9ad2ad7846cc01d61b7f19e" +dependencies = [ + "include_dir_macros", +] + +[[package]] +name = "include_dir_macros" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b139284b5cf57ecfa712bcc66950bb635b31aff41c188e8a4cfc758eca374a3f" +dependencies = [ + "proc-macro2", + "quote", +] + +[[package]] +name = "indexmap" +version = "1.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" +dependencies = [ + "autocfg", + "hashbrown 0.12.3", + "serde", +] + +[[package]] +name = "indexmap" +version = "2.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "168fb715dda47215e360912c096649d23d58bf392ac62f73919e831745e40f26" +dependencies = [ + "equivalent", + "hashbrown 0.14.3", +] + +[[package]] +name = "indexmap-nostd" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e04e2fd2b8188ea827b32ef11de88377086d690286ab35747ef7f9bf3ccb590" + +[[package]] +name = "indicatif" +version = "0.17.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "763a5a8f45087d6bcea4222e7b72c291a054edf80e4ef6efd2a4979878c7bea3" +dependencies = [ + "console", + "instant", + "number_prefix", + "portable-atomic", + "unicode-width", +] + +[[package]] +name = "inout" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0c10553d664a4d0bcff9f4215d0aac67a639cc68ef660840afe309b807bc9f5" +dependencies = [ + "generic-array", +] + +[[package]] +name = "instability" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b23a0c8dfe501baac4adf6ebbfa6eddf8f0c07f56b058cc1288017e32397846c" +dependencies = [ + "quote", + "syn 2.0.77", +] + +[[package]] +name = "instant" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "integer-sqrt" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "276ec31bcb4a9ee45f58bec6f9ec700ae4cf4f4f8f2fa7e06cb406bd5ffdd770" +dependencies = [ + "num-traits", +] + +[[package]] +name = "io-lifetimes" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eae7b9aee968036d54dce06cebaefd919e4472e753296daccd6d344e3e2df0c2" +dependencies = [ + "hermit-abi 0.3.9", + "libc", + "windows-sys 0.48.0", +] + +[[package]] +name = "is-terminal" +version = "0.4.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "261f68e344040fbd0edea105bef17c66edf46f984ddb1115b775ce31be948f4b" +dependencies = [ + "hermit-abi 0.4.0", + "libc", + "windows-sys 0.52.0", +] + +[[package]] +name = "itertools" +version = "0.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" +dependencies = [ + "either", +] + +[[package]] +name = "itertools" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1c173a5686ce8bfa551b3563d0c2170bf24ca44da99c7ca4bfdab5418c3fe57" +dependencies = [ + "either", +] + +[[package]] +name = "itertools" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" +dependencies = [ + "either", +] + +[[package]] +name = "itertools" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" +dependencies = [ + "either", +] + +[[package]] +name = "itoa" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" + +[[package]] +name = "jobserver" +version = "0.1.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48d1dbcbbeb6a7fec7e059840aa538bd62aaccf972c7346c4d9d2059312853d0" +dependencies = [ + "libc", +] + +[[package]] +name = "js-sys" +version = "0.3.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29c15563dc2726973df627357ce0c9ddddbea194836909d655df6a75d2cf296d" +dependencies = [ + "wasm-bindgen", +] + +[[package]] +name = "jsonrpsee" +version = "0.22.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4b0e68d9af1f066c06d6e2397583795b912d78537d7d907c561e82c13d69fa1" +dependencies = [ + "jsonrpsee-client-transport", + "jsonrpsee-core", + "jsonrpsee-http-client", + "jsonrpsee-types", +] + +[[package]] +name = "jsonrpsee-client-transport" +version = "0.22.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92f254f56af1ae84815b9b1325094743dcf05b92abb5e94da2e81a35cff0cada" +dependencies = [ + "futures-util", + "http", + "jsonrpsee-core", + "pin-project", + "rustls-native-certs 0.7.0", + "rustls-pki-types", + "soketto", + "thiserror", + "tokio", + "tokio-rustls 0.25.0", + "tokio-util", + "tracing", + "url", +] + +[[package]] +name = "jsonrpsee-core" +version = "0.22.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "274d68152c24aa78977243bb56f28d7946e6aa309945b37d33174a3f92d89a3a" +dependencies = [ + "anyhow", + "async-trait", + "beef", + "futures-timer", + "futures-util", + "hyper", + "jsonrpsee-types", + "pin-project", + "rustc-hash", + "serde", + "serde_json", + "thiserror", + "tokio", + "tokio-stream", + "tracing", +] + +[[package]] +name = "jsonrpsee-http-client" +version = "0.22.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac13bc1e44cd00448a5ff485824a128629c945f02077804cb659c07a0ba41395" +dependencies = [ + "async-trait", + "hyper", + "hyper-rustls", + "jsonrpsee-core", + "jsonrpsee-types", + "serde", + "serde_json", + "thiserror", + "tokio", + "tower", + "tracing", + "url", +] + +[[package]] +name = "jsonrpsee-types" +version = "0.22.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3dc828e537868d6b12bbb07ec20324909a22ced6efca0057c825c3e1126b2c6d" +dependencies = [ + "anyhow", + "beef", + "serde", + "serde_json", + "thiserror", +] + +[[package]] +name = "k256" +version = "0.13.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "956ff9b67e26e1a6a866cb758f12c6f8746208489e3e4a4b5580802f2f0a587b" +dependencies = [ + "cfg-if", + "ecdsa", + "elliptic-curve", + "once_cell", + "serdect", + "sha2 0.10.8", +] + +[[package]] +name = "keccak" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ecc2af9a1119c51f12a14607e783cb977bde58bc069ff0c3da1095e635d70654" +dependencies = [ + "cpufeatures", +] + +[[package]] +name = "lazy_static" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" + +[[package]] +name = "libc" +version = "0.2.153" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd" + +[[package]] +name = "libm" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058" + +[[package]] +name = "libredox" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" +dependencies = [ + "bitflags 2.5.0", + "libc", +] + +[[package]] +name = "libsecp256k1" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95b09eff1b35ed3b33b877ced3a691fc7a481919c7e29c53c906226fcf55e2a1" +dependencies = [ + "arrayref", + "base64 0.13.1", + "digest 0.9.0", + "hmac-drbg", + "libsecp256k1-core", + "libsecp256k1-gen-ecmult", + "libsecp256k1-gen-genmult", + "rand", + "serde", + "sha2 0.9.9", + "typenum", +] + +[[package]] +name = "libsecp256k1-core" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5be9b9bb642d8522a44d533eab56c16c738301965504753b03ad1de3425d5451" +dependencies = [ + "crunchy", + "digest 0.9.0", + "subtle", +] + +[[package]] +name = "libsecp256k1-gen-ecmult" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3038c808c55c87e8a172643a7d87187fc6c4174468159cb3090659d55bcb4809" +dependencies = [ + "libsecp256k1-core", +] + +[[package]] +name = "libsecp256k1-gen-genmult" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3db8d6ba2cec9eacc40e6e8ccc98931840301f1006e95647ceb2dd5c3aa06f7c" +dependencies = [ + "libsecp256k1-core", +] + +[[package]] +name = "link-cplusplus" +version = "1.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d240c6f7e1ba3a28b0249f774e6a9dd0175054b52dfbb61b16eb8505c3785c9" +dependencies = [ + "cc", +] + +[[package]] +name = "linregress" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4de04dcecc58d366391f9920245b85ffa684558a5ef6e7736e754347c3aea9c2" +dependencies = [ + "nalgebra", +] + +[[package]] +name = "linux-raw-sys" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f051f77a7c8e6957c0696eac88f26b0117e54f52d3fc682ab19397a8812846a4" + +[[package]] +name = "linux-raw-sys" +version = "0.4.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "01cda141df6706de531b6c46c3a33ecca755538219bd484262fa09410c13539c" + +[[package]] +name = "lock_api" +version = "0.4.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c168f8615b12bc01f9c17e2eb0cc07dcae1940121185446edc3744920e8ef45" +dependencies = [ + "autocfg", + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" + +[[package]] +name = "lru" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6e8aaa3f231bb4bd57b84b2d5dc3ae7f350265df8aa96492e0bc394a1571909" +dependencies = [ + "hashbrown 0.12.3", +] + +[[package]] +name = "lru" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3262e75e648fce39813cb56ac41f3c3e3f65217ebf3844d818d1f9398cfb0dc" +dependencies = [ + "hashbrown 0.14.3", +] + +[[package]] +name = "mach" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b823e83b2affd8f40a9ee8c29dbc56404c1e34cd2710921f2801e2cf29527afa" +dependencies = [ + "libc", +] + +[[package]] +name = "macro_magic" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e03844fc635e92f3a0067e25fa4bf3e3dbf3f2927bf3aa01bb7bc8f1c428949d" +dependencies = [ + "macro_magic_core", + "macro_magic_macros", + "quote", + "syn 2.0.77", +] + +[[package]] +name = "macro_magic_core" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "468155613a44cfd825f1fb0ffa532b018253920d404e6fca1e8d43155198a46d" +dependencies = [ + "const-random", + "derive-syn-parse 0.1.5", + "macro_magic_core_macros", + "proc-macro2", + "quote", + "syn 2.0.77", +] + +[[package]] +name = "macro_magic_core_macros" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ea73aa640dc01d62a590d48c0c3521ed739d53b27f919b25c3551e233481654" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.77", +] + +[[package]] +name = "macro_magic_macros" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef9d79ae96aaba821963320eb2b6e34d17df1e5a83d8a1985c29cc5be59577b3" +dependencies = [ + "macro_magic_core", + "quote", + "syn 2.0.77", +] + +[[package]] +name = "matchers" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558" +dependencies = [ + "regex-automata 0.1.10", +] + +[[package]] +name = "matrixmultiply" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9380b911e3e96d10c1f415da0876389aaf1b56759054eeb0de7df940c456ba1a" +dependencies = [ + "autocfg", + "rawpointer", +] + +[[package]] +name = "memchr" +version = "2.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c8640c5d730cb13ebd907d8d04b52f55ac9a2eec55b440c8892f40d56c76c1d" + +[[package]] +name = "memfd" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2cffa4ad52c6f791f4f8b15f0c05f9824b2ced1160e88cc393d64fff9a8ac64" +dependencies = [ + "rustix 0.38.34", +] + +[[package]] +name = "memoffset" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d61c719bcfbcf5d62b3a09efa6088de8c54bc0bfcd3ea7ae39fcc186108b8de1" +dependencies = [ + "autocfg", +] + +[[package]] +name = "memory-db" +version = "0.32.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "808b50db46293432a45e63bc15ea51e0ab4c0a1647b8eb114e31a3e698dd6fbe" +dependencies = [ + "hash-db", +] + +[[package]] +name = "merlin" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "58c38e2799fc0978b65dfff8023ec7843e2330bb462f19198840b34b6582397d" +dependencies = [ + "byteorder", + "keccak", + "rand_core", + "zeroize", +] + +[[package]] +name = "minimal-lexical" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" + +[[package]] +name = "miniz_oxide" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d811f3e15f28568be3407c8e7fdb6514c1cda3cb30683f15b6a1a1dc4ea14a7" +dependencies = [ + "adler", +] + +[[package]] +name = "mio" +version = "0.8.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4a650543ca06a924e8b371db273b2756685faae30f8487da1b56505a8f78b0c" +dependencies = [ + "libc", + "wasi", + "windows-sys 0.48.0", +] + +[[package]] +name = "mio" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80e04d1dcff3aae0704555fe5fee3bcfaf3d1fdf8a7e521d5b9d2b42acb52cec" +dependencies = [ + "hermit-abi 0.3.9", + "libc", + "log", + "wasi", + "windows-sys 0.52.0", +] + +[[package]] +name = "multi-stash" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "685a9ac4b61f4e728e1d2c6a7844609c16527aeb5e6c865915c08e619c16410f" + +[[package]] +name = "murmur-cli" +version = "0.1.0" +dependencies = [ + "ark-bls12-377", + "ark-ec", + "ark-ff 0.4.2", + "ark-serialize 0.4.2", + "ark-std 0.4.0", + "array-bytes 6.2.2", + "ckb-merkle-mountain-range", + "clap", + "crossterm", + "etf-crypto-primitives 0.2.4 (git+https://github.com/ideal-lab5/etf-sdk/?branch=tony/dev)", + "frame-support", + "getrandom", + "hex", + "indicatif", + "murmur-core", + "node-template-runtime", + "parity-scale-codec", + "rand_chacha", + "rand_core", + "ratatui", + "serde", + "serde_cbor", + "serde_json", + "sha3", + "sp-application-crypto", + "sp-consensus-beefy-etf 13.0.0 (git+https://github.com/ideal-lab5/etf.git?branch=tony/dev)", + "sp-core", + "sp-keyring", + "sp-runtime", + "subxt", + "subxt-signer", + "tokio", + "w3f-bls", +] + +[[package]] +name = "murmur-core" +version = "0.1.0" +dependencies = [ + "ark-bls12-377", + "ark-ff 0.4.2", + "ark-serialize 0.4.2", + "ark-std 0.4.0", + "array-bytes 6.2.2", + "ckb-merkle-mountain-range", + "etf-crypto-primitives 0.2.4 (git+https://github.com/ideal-lab5/etf-sdk/?branch=tony/dev)", + "getrandom", + "hex", + "parity-scale-codec", + "rand_chacha", + "rand_core", + "serde", + "sha3", + "sp-consensus-beefy-etf 13.0.0 (git+https://github.com/ideal-lab5/etf.git?branch=tony/dev)", + "totp-rs", + "w3f-bls", +] + +[[package]] +name = "nalgebra" +version = "0.32.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b5c17de023a86f59ed79891b2e5d5a94c705dbe904a5b5c9c952ea6221b03e4" +dependencies = [ + "approx", + "matrixmultiply", + "nalgebra-macros", + "num-complex", + "num-rational", + "num-traits", + "simba", + "typenum", +] + +[[package]] +name = "nalgebra-macros" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "254a5372af8fc138e36684761d3c0cdb758a4410e938babcff1c860ce14ddbfc" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.77", +] + +[[package]] +name = "no-std-net" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43794a0ace135be66a25d3ae77d41b91615fb68ae937f904090203e81f755b65" + +[[package]] +name = "node-primitives" +version = "2.0.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +dependencies = [ + "sp-core", + "sp-runtime", +] + +[[package]] +name = "node-template-runtime" +version = "0.0.1" +dependencies = [ + "frame-benchmarking", + "frame-benchmarking-pallet-pov", + "frame-election-provider-support", + "frame-executive", + "frame-metadata-hash-extension", + "frame-support", + "frame-system", + "frame-system-benchmarking", + "frame-system-rpc-runtime-api", + "frame-try-runtime", + "log", + "node-primitives", + "pallet-alliance", + "pallet-asset-conversion", + "pallet-asset-conversion-ops", + "pallet-asset-conversion-tx-payment", + "pallet-asset-rate", + "pallet-asset-tx-payment", + "pallet-assets", + "pallet-authority-discovery", + "pallet-authorship", + "pallet-babe", + "pallet-bags-list", + "pallet-balances", + "pallet-beefy-etf", + "pallet-beefy-mmr-etf", + "pallet-bounties", + "pallet-broker", + "pallet-child-bounties", + "pallet-collective", + "pallet-contracts", + "pallet-conviction-voting", + "pallet-core-fellowship", + "pallet-democracy", + "pallet-election-provider-multi-phase", + "pallet-election-provider-support-benchmarking", + "pallet-elections-phragmen", + "pallet-etf", + "pallet-example-mbm", + "pallet-example-tasks", + "pallet-fast-unstake", + "pallet-glutton", + "pallet-grandpa", + "pallet-identity", + "pallet-im-online", + "pallet-indices", + "pallet-insecure-randomness-collective-flip", + "pallet-lottery", + "pallet-membership", + "pallet-message-queue", + "pallet-migrations", + "pallet-mixnet", + "pallet-mmr", + "pallet-multisig", + "pallet-nft-fractionalization", + "pallet-nfts", + "pallet-nfts-runtime-api", + "pallet-nis", + "pallet-nomination-pools", + "pallet-nomination-pools-benchmarking", + "pallet-nomination-pools-runtime-api", + "pallet-offences", + "pallet-offences-benchmarking", + "pallet-otp", + "pallet-parameters", + "pallet-preimage", + "pallet-proxy 28.1.0", + "pallet-randomness-beacon", + "pallet-ranked-collective", + "pallet-recovery", + "pallet-referenda", + "pallet-remark", + "pallet-root-testing", + "pallet-safe-mode", + "pallet-salary", + "pallet-scheduler 4.0.0-dev", + "pallet-session", + "pallet-session-benchmarking", + "pallet-skip-feeless-payment", + "pallet-society", + "pallet-staking", + "pallet-staking-reward-curve", + "pallet-staking-runtime-api", + "pallet-state-trie-migration", + "pallet-statement", + "pallet-sudo", + "pallet-timestamp", + "pallet-tips", + "pallet-transaction-payment", + "pallet-transaction-payment-rpc-runtime-api", + "pallet-transaction-storage", + "pallet-treasury", + "pallet-tx-pause", + "pallet-uniques", + "pallet-utility", + "pallet-vesting", + "pallet-whitelist", + "parity-scale-codec", + "polkadot-sdk", + "polkadot-sdk-frame", + "primitive-types", + "scale-info", + "serde_json", + "sp-api", + "sp-authority-discovery", + "sp-block-builder", + "sp-consensus-babe", + "sp-consensus-beefy-etf 13.0.0", + "sp-consensus-grandpa", + "sp-core", + "sp-genesis-builder", + "sp-inherents", + "sp-io", + "sp-mixnet", + "sp-offchain", + "sp-runtime", + "sp-session", + "sp-staking", + "sp-statement-store", + "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", + "sp-storage 19.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", + "sp-transaction-pool", + "sp-version", + "static_assertions", + "substrate-wasm-builder", +] + +[[package]] +name = "nodrop" +version = "0.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72ef4a56884ca558e5ddb05a1d1e7e1bfd9a68d9ed024c21704cc98872dae1bb" + +[[package]] +name = "nohash-hasher" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2bf50223579dc7cdcfb3bfcacf7069ff68243f8c363f62ffa99cf000a6b9c451" + +[[package]] +name = "nom" +version = "7.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" +dependencies = [ + "memchr", + "minimal-lexical", +] + +[[package]] +name = "nu-ansi-term" +version = "0.46.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" +dependencies = [ + "overload", + "winapi", +] + +[[package]] +name = "num-bigint" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "608e7659b5c3d7cba262d894801b9ec9d00de989e8a82bd4bef91d08da45cdc0" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-complex" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73f88a1307638156682bada9d7604135552957b7818057dcef22705b4d509495" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-conv" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" + +[[package]] +name = "num-derive" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.77", +] + +[[package]] +name = "num-format" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a652d9771a63711fd3c3deb670acfbe5c30a4072e664d7a3bf5a9e1056ac72c3" +dependencies = [ + "arrayvec 0.7.4", + "itoa", +] + +[[package]] +name = "num-integer" +version = "0.1.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-rational" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0638a1c9d0a3c0914158145bc76cff373a75a627e6ecbfb71cbe6f453a5a19b0" +dependencies = [ + "autocfg", + "num-bigint", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-traits" +version = "0.2.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da0df0e5185db44f69b44f26786fe401b6c293d1907744beaa7fa62b2e5a517a" +dependencies = [ + "autocfg", + "libm", +] + +[[package]] +name = "num_cpus" +version = "1.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" +dependencies = [ + "hermit-abi 0.3.9", + "libc", +] + +[[package]] +name = "number_prefix" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "830b246a0e5f20af87141b25c173cd1b609bd7779a4617d6ec582abaf90870f3" + +[[package]] +name = "object" +version = "0.30.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03b4680b86d9cfafba8fc491dc9b6df26b68cf40e9e6cd73909194759a63c385" +dependencies = [ + "crc32fast", + "hashbrown 0.13.2", + "indexmap 1.9.3", + "memchr", +] + +[[package]] +name = "object" +version = "0.32.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6a622008b6e321afc04970976f62ee297fdbaa6f95318ca343e3eebb9648441" +dependencies = [ + "memchr", +] + +[[package]] +name = "once_cell" +version = "1.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" + +[[package]] +name = "opaque-debug" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" + +[[package]] +name = "openssl-probe" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" + +[[package]] +name = "overload" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" + +[[package]] +name = "pallet-alliance" +version = "27.0.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +dependencies = [ + "frame-benchmarking", + "frame-support", + "frame-system", + "log", + "pallet-collective", + "pallet-identity", + "parity-scale-codec", + "scale-info", + "sp-core", + "sp-crypto-hashing 0.1.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", + "sp-io", + "sp-runtime", + "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", +] + +[[package]] +name = "pallet-asset-conversion" +version = "10.0.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +dependencies = [ + "frame-benchmarking", + "frame-support", + "frame-system", + "log", + "parity-scale-codec", + "scale-info", + "sp-api", + "sp-arithmetic", + "sp-core", + "sp-io", + "sp-runtime", + "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", +] + +[[package]] +name = "pallet-asset-conversion-ops" +version = "0.1.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +dependencies = [ + "frame-benchmarking", + "frame-support", + "frame-system", + "log", + "pallet-asset-conversion", + "parity-scale-codec", + "scale-info", + "sp-arithmetic", + "sp-core", + "sp-io", + "sp-runtime", + "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", +] + +[[package]] +name = "pallet-asset-conversion-tx-payment" +version = "10.0.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +dependencies = [ + "frame-support", + "frame-system", + "pallet-asset-conversion", + "pallet-transaction-payment", + "parity-scale-codec", + "scale-info", + "sp-runtime", + "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", +] + +[[package]] +name = "pallet-asset-rate" +version = "7.0.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +dependencies = [ + "frame-benchmarking", + "frame-support", + "frame-system", + "parity-scale-codec", + "scale-info", + "sp-core", + "sp-runtime", + "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", +] + +[[package]] +name = "pallet-asset-tx-payment" +version = "28.0.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +dependencies = [ + "frame-benchmarking", + "frame-support", + "frame-system", + "pallet-transaction-payment", + "parity-scale-codec", + "scale-info", + "serde", + "sp-core", + "sp-io", + "sp-runtime", + "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", +] + +[[package]] +name = "pallet-assets" +version = "29.1.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +dependencies = [ + "frame-benchmarking", + "frame-support", + "frame-system", + "log", + "parity-scale-codec", + "scale-info", + "sp-core", + "sp-runtime", + "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", +] + +[[package]] +name = "pallet-assets-freezer" +version = "0.1.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +dependencies = [ + "frame-benchmarking", + "frame-support", + "frame-system", + "log", + "pallet-assets", + "parity-scale-codec", + "scale-info", + "sp-runtime", +] + +[[package]] +name = "pallet-atomic-swap" +version = "28.0.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +dependencies = [ + "frame-support", + "frame-system", + "parity-scale-codec", + "scale-info", + "sp-core", + "sp-io", + "sp-runtime", + "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", +] + +[[package]] +name = "pallet-aura" +version = "27.0.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +dependencies = [ + "frame-support", + "frame-system", + "log", + "pallet-timestamp", + "parity-scale-codec", + "scale-info", + "sp-application-crypto", + "sp-consensus-aura", + "sp-runtime", + "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", +] + +[[package]] +name = "pallet-authority-discovery" +version = "28.0.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +dependencies = [ + "frame-support", + "frame-system", + "pallet-session", + "parity-scale-codec", + "scale-info", + "sp-application-crypto", + "sp-authority-discovery", + "sp-runtime", + "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", +] + +[[package]] +name = "pallet-authorship" +version = "28.0.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +dependencies = [ + "frame-support", + "frame-system", + "impl-trait-for-tuples", + "parity-scale-codec", + "scale-info", + "sp-runtime", + "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", +] + +[[package]] +name = "pallet-babe" +version = "28.0.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +dependencies = [ + "frame-benchmarking", + "frame-support", + "frame-system", + "log", + "pallet-authorship", + "pallet-session", + "pallet-timestamp", + "parity-scale-codec", + "scale-info", + "sp-application-crypto", + "sp-consensus-babe", + "sp-core", + "sp-io", + "sp-runtime", + "sp-session", + "sp-staking", + "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", +] + +[[package]] +name = "pallet-bags-list" +version = "27.0.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +dependencies = [ + "aquamarine", + "docify", + "frame-benchmarking", + "frame-election-provider-support", + "frame-support", + "frame-system", + "log", + "pallet-balances", + "parity-scale-codec", + "scale-info", + "sp-core", + "sp-io", + "sp-runtime", + "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", + "sp-tracing 16.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", +] + +[[package]] +name = "pallet-balances" +version = "28.0.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +dependencies = [ + "docify", + "frame-benchmarking", + "frame-support", + "frame-system", + "log", + "parity-scale-codec", + "scale-info", + "sp-runtime", + "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", +] + +[[package]] +name = "pallet-beefy" +version = "28.0.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +dependencies = [ + "frame-support", + "frame-system", + "log", + "pallet-authorship", + "pallet-session", + "parity-scale-codec", + "scale-info", + "serde", + "sp-consensus-beefy", + "sp-runtime", + "sp-session", + "sp-staking", + "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", +] + +[[package]] +name = "pallet-beefy-etf" +version = "28.0.0" +dependencies = [ + "ark-bls12-377", + "ark-serialize 0.4.2", + "ark-std 0.4.0", + "frame-support", + "frame-system", + "getrandom", + "log", + "pallet-authorship", + "pallet-etf", + "pallet-session", + "parity-scale-codec", + "scale-info", + "serde", + "sp-consensus-beefy-etf 13.0.0", + "sp-runtime", + "sp-session", + "sp-staking", + "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", +] + +[[package]] +name = "pallet-beefy-mmr" +version = "28.0.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +dependencies = [ + "array-bytes 6.2.2", + "binary-merkle-tree", + "frame-support", + "frame-system", + "log", + "pallet-beefy", + "pallet-mmr", + "pallet-session", + "parity-scale-codec", + "scale-info", + "serde", + "sp-api", + "sp-consensus-beefy", + "sp-core", + "sp-io", + "sp-runtime", + "sp-state-machine", + "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", +] + +[[package]] +name = "pallet-beefy-mmr-etf" +version = "28.0.0" +dependencies = [ + "array-bytes 6.2.2", + "binary-merkle-tree", + "frame-support", + "frame-system", + "log", + "pallet-beefy-etf", + "pallet-mmr", + "pallet-session", + "parity-scale-codec", + "scale-info", + "serde", + "sp-api", + "sp-consensus-beefy-etf 13.0.0", + "sp-core", + "sp-io", + "sp-runtime", + "sp-state-machine", + "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", +] + +[[package]] +name = "pallet-bounties" +version = "27.0.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +dependencies = [ + "frame-benchmarking", + "frame-support", + "frame-system", + "log", + "pallet-treasury", + "parity-scale-codec", + "scale-info", + "sp-core", + "sp-io", + "sp-runtime", + "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", +] + +[[package]] +name = "pallet-bridge-grandpa" +version = "0.7.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +dependencies = [ + "bp-header-chain", + "bp-runtime", + "bp-test-utils", + "finality-grandpa", + "frame-benchmarking", + "frame-support", + "frame-system", + "log", + "parity-scale-codec", + "scale-info", + "sp-consensus-grandpa", + "sp-runtime", + "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", + "sp-trie", +] + +[[package]] +name = "pallet-bridge-messages" +version = "0.7.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +dependencies = [ + "bp-messages", + "bp-runtime", + "frame-benchmarking", + "frame-support", + "frame-system", + "log", + "num-traits", + "parity-scale-codec", + "scale-info", + "sp-runtime", + "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", +] + +[[package]] +name = "pallet-bridge-parachains" +version = "0.7.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +dependencies = [ + "bp-header-chain", + "bp-parachains", + "bp-polkadot-core", + "bp-runtime", + "frame-benchmarking", + "frame-support", + "frame-system", + "log", + "pallet-bridge-grandpa", + "parity-scale-codec", + "scale-info", + "sp-runtime", + "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", + "sp-trie", +] + +[[package]] +name = "pallet-bridge-relayers" +version = "0.7.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +dependencies = [ + "bp-messages", + "bp-relayers", + "bp-runtime", + "frame-benchmarking", + "frame-support", + "frame-system", + "log", + "pallet-bridge-messages", + "parity-scale-codec", + "scale-info", + "sp-arithmetic", + "sp-runtime", + "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", +] + +[[package]] +name = "pallet-broker" +version = "0.6.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +dependencies = [ + "bitvec", + "frame-benchmarking", + "frame-support", + "frame-system", + "log", + "parity-scale-codec", + "scale-info", + "sp-api", + "sp-arithmetic", + "sp-core", + "sp-runtime", + "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", +] + +[[package]] +name = "pallet-child-bounties" +version = "27.0.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +dependencies = [ + "frame-benchmarking", + "frame-support", + "frame-system", + "log", + "pallet-bounties", + "pallet-treasury", + "parity-scale-codec", + "scale-info", + "sp-core", + "sp-io", + "sp-runtime", + "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", +] + +[[package]] +name = "pallet-collator-selection" +version = "9.0.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +dependencies = [ + "frame-benchmarking", + "frame-support", + "frame-system", + "log", + "pallet-authorship", + "pallet-balances", + "pallet-session", + "parity-scale-codec", + "rand", + "scale-info", + "sp-runtime", + "sp-staking", + "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", +] + +[[package]] +name = "pallet-collective" +version = "28.0.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +dependencies = [ + "frame-benchmarking", + "frame-support", + "frame-system", + "log", + "parity-scale-codec", + "scale-info", + "sp-core", + "sp-io", + "sp-runtime", + "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", +] + +[[package]] +name = "pallet-collective-content" +version = "0.6.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +dependencies = [ + "frame-benchmarking", + "frame-support", + "frame-system", + "parity-scale-codec", + "scale-info", + "sp-core", + "sp-runtime", + "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", +] + +[[package]] +name = "pallet-contracts" +version = "27.0.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +dependencies = [ + "bitflags 1.3.2", + "environmental", + "frame-benchmarking", + "frame-support", + "frame-system", + "impl-trait-for-tuples", + "log", + "pallet-balances", + "pallet-contracts-proc-macro", + "pallet-contracts-uapi", + "parity-scale-codec", + "paste", + "rand", + "scale-info", + "serde", + "smallvec", + "sp-api", + "sp-core", + "sp-io", + "sp-runtime", + "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", + "staging-xcm", + "staging-xcm-builder", + "wasm-instrument", + "wasmi 0.32.3", +] + +[[package]] +name = "pallet-contracts-mock-network" +version = "3.0.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +dependencies = [ + "frame-support", + "frame-system", + "pallet-assets", + "pallet-balances", + "pallet-contracts", + "pallet-contracts-proc-macro", + "pallet-contracts-uapi", + "pallet-insecure-randomness-collective-flip", + "pallet-message-queue", + "pallet-proxy 28.0.0", + "pallet-timestamp", + "pallet-utility", + "pallet-xcm", + "parity-scale-codec", + "polkadot-parachain-primitives", + "polkadot-primitives", + "polkadot-runtime-parachains", + "scale-info", + "sp-api", + "sp-core", + "sp-io", + "sp-keystore", + "sp-runtime", + "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", + "sp-tracing 16.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", + "staging-xcm", + "staging-xcm-builder", + "staging-xcm-executor", + "xcm-simulator", +] + +[[package]] +name = "pallet-contracts-proc-macro" +version = "18.0.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.77", +] + +[[package]] +name = "pallet-contracts-uapi" +version = "5.0.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +dependencies = [ + "bitflags 1.3.2", + "parity-scale-codec", + "paste", + "polkavm-derive", + "scale-info", +] + +[[package]] +name = "pallet-conviction-voting" +version = "28.0.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +dependencies = [ + "assert_matches", + "frame-benchmarking", + "frame-support", + "frame-system", + "parity-scale-codec", + "scale-info", + "serde", + "sp-io", + "sp-runtime", + "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", +] + +[[package]] +name = "pallet-core-fellowship" +version = "12.0.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +dependencies = [ + "frame-benchmarking", + "frame-support", + "frame-system", + "log", + "pallet-ranked-collective", + "parity-scale-codec", + "scale-info", + "sp-arithmetic", + "sp-core", + "sp-io", + "sp-runtime", + "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", +] + +[[package]] +name = "pallet-delegated-staking" +version = "1.0.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +dependencies = [ + "frame-support", + "frame-system", + "parity-scale-codec", + "scale-info", + "sp-runtime", + "sp-staking", + "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", +] + +[[package]] +name = "pallet-democracy" +version = "28.0.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +dependencies = [ + "frame-benchmarking", + "frame-support", + "frame-system", + "log", + "parity-scale-codec", + "scale-info", + "serde", + "sp-core", + "sp-io", + "sp-runtime", + "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", +] + +[[package]] +name = "pallet-dev-mode" +version = "10.0.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +dependencies = [ + "frame-support", + "frame-system", + "log", + "pallet-balances", + "parity-scale-codec", + "scale-info", + "sp-io", + "sp-runtime", + "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", +] + +[[package]] +name = "pallet-election-provider-multi-phase" +version = "27.0.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +dependencies = [ + "frame-benchmarking", + "frame-election-provider-support", + "frame-support", + "frame-system", + "log", + "pallet-election-provider-support-benchmarking", + "parity-scale-codec", + "rand", + "scale-info", + "sp-arithmetic", + "sp-core", + "sp-io", + "sp-npos-elections", + "sp-runtime", + "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", + "strum 0.26.3", +] + +[[package]] +name = "pallet-election-provider-support-benchmarking" +version = "27.0.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +dependencies = [ + "frame-benchmarking", + "frame-election-provider-support", + "frame-system", + "parity-scale-codec", + "sp-npos-elections", + "sp-runtime", + "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", +] + +[[package]] +name = "pallet-elections-phragmen" +version = "29.0.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +dependencies = [ + "frame-benchmarking", + "frame-support", + "frame-system", + "log", + "parity-scale-codec", + "scale-info", + "sp-core", + "sp-io", + "sp-npos-elections", + "sp-runtime", + "sp-staking", + "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", +] + +[[package]] +name = "pallet-etf" +version = "28.0.0" +dependencies = [ + "ark-bls12-377", + "ark-serialize 0.4.2", + "ark-std 0.4.0", + "frame-support", + "frame-system", + "getrandom", + "log", + "pallet-authorship", + "pallet-session", + "parity-scale-codec", + "scale-info", + "serde", + "sp-consensus-beefy-etf 13.0.0", + "sp-runtime", + "sp-session", + "sp-staking", + "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", +] + +[[package]] +name = "pallet-example-mbm" +version = "0.1.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +dependencies = [ + "frame-support", + "frame-system", + "log", + "pallet-migrations", + "parity-scale-codec", + "scale-info", + "sp-io", +] + +[[package]] +name = "pallet-example-tasks" +version = "1.0.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +dependencies = [ + "frame-benchmarking", + "frame-support", + "frame-system", + "log", + "parity-scale-codec", + "scale-info", + "sp-core", + "sp-io", + "sp-runtime", + "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", +] + +[[package]] +name = "pallet-fast-unstake" +version = "27.0.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +dependencies = [ + "docify", + "frame-benchmarking", + "frame-election-provider-support", + "frame-support", + "frame-system", + "log", + "parity-scale-codec", + "scale-info", + "sp-io", + "sp-runtime", + "sp-staking", + "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", +] + +[[package]] +name = "pallet-glutton" +version = "14.0.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +dependencies = [ + "blake2", + "frame-benchmarking", + "frame-support", + "frame-system", + "log", + "parity-scale-codec", + "scale-info", + "sp-core", + "sp-inherents", + "sp-io", + "sp-runtime", + "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", +] + +[[package]] +name = "pallet-grandpa" +version = "28.0.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +dependencies = [ + "frame-benchmarking", + "frame-support", + "frame-system", + "log", + "pallet-authorship", + "pallet-session", + "parity-scale-codec", + "scale-info", + "sp-application-crypto", + "sp-consensus-grandpa", + "sp-core", + "sp-io", + "sp-runtime", + "sp-session", + "sp-staking", + "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", +] + +[[package]] +name = "pallet-identity" +version = "29.0.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +dependencies = [ + "enumflags2", + "frame-benchmarking", + "frame-support", + "frame-system", + "log", + "parity-scale-codec", + "scale-info", + "sp-io", + "sp-runtime", + "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", +] + +[[package]] +name = "pallet-im-online" +version = "27.0.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +dependencies = [ + "frame-benchmarking", + "frame-support", + "frame-system", + "log", + "pallet-authorship", + "parity-scale-codec", + "scale-info", + "sp-application-crypto", + "sp-core", + "sp-io", + "sp-runtime", + "sp-staking", + "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", +] + +[[package]] +name = "pallet-indices" +version = "28.0.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +dependencies = [ + "frame-benchmarking", + "frame-support", + "frame-system", + "parity-scale-codec", + "scale-info", + "sp-core", + "sp-io", + "sp-keyring", + "sp-runtime", + "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", +] + +[[package]] +name = "pallet-insecure-randomness-collective-flip" +version = "16.0.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +dependencies = [ + "frame-support", + "frame-system", + "parity-scale-codec", + "safe-mix", + "scale-info", + "sp-runtime", + "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", +] + +[[package]] +name = "pallet-lottery" +version = "28.0.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +dependencies = [ + "frame-benchmarking", + "frame-support", + "frame-system", + "parity-scale-codec", + "scale-info", + "sp-runtime", + "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", +] + +[[package]] +name = "pallet-membership" +version = "28.0.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +dependencies = [ + "frame-benchmarking", + "frame-support", + "frame-system", + "log", + "parity-scale-codec", + "scale-info", + "sp-core", + "sp-io", + "sp-runtime", + "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", +] + +[[package]] +name = "pallet-message-queue" +version = "31.0.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +dependencies = [ + "environmental", + "frame-benchmarking", + "frame-support", + "frame-system", + "log", + "parity-scale-codec", + "scale-info", + "sp-arithmetic", + "sp-core", + "sp-io", + "sp-runtime", + "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", + "sp-weights", +] + +[[package]] +name = "pallet-migrations" +version = "1.0.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +dependencies = [ + "docify", + "frame-benchmarking", + "frame-support", + "frame-system", + "impl-trait-for-tuples", + "log", + "parity-scale-codec", + "scale-info", + "sp-core", + "sp-runtime", + "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", +] + +[[package]] +name = "pallet-mixnet" +version = "0.4.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +dependencies = [ + "frame-benchmarking", + "frame-support", + "frame-system", + "log", + "parity-scale-codec", + "scale-info", + "serde", + "sp-application-crypto", + "sp-arithmetic", + "sp-io", + "sp-mixnet", + "sp-runtime", + "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", +] + +[[package]] +name = "pallet-mmr" +version = "27.0.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +dependencies = [ + "frame-benchmarking", + "frame-support", + "frame-system", + "log", + "parity-scale-codec", + "scale-info", + "sp-core", + "sp-io", + "sp-mmr-primitives", + "sp-runtime", + "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", +] + +[[package]] +name = "pallet-multisig" +version = "28.0.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +dependencies = [ + "frame-benchmarking", + "frame-support", + "frame-system", + "log", + "parity-scale-codec", + "scale-info", + "sp-io", + "sp-runtime", + "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", +] + +[[package]] +name = "pallet-nft-fractionalization" +version = "10.0.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +dependencies = [ + "frame-benchmarking", + "frame-support", + "frame-system", + "log", + "pallet-assets", + "pallet-nfts", + "parity-scale-codec", + "scale-info", + "sp-runtime", + "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", +] + +[[package]] +name = "pallet-nfts" +version = "22.0.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +dependencies = [ + "enumflags2", + "frame-benchmarking", + "frame-support", + "frame-system", + "log", + "parity-scale-codec", + "scale-info", + "sp-core", + "sp-io", + "sp-runtime", + "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", +] + +[[package]] +name = "pallet-nfts-runtime-api" +version = "14.0.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +dependencies = [ + "pallet-nfts", + "parity-scale-codec", + "sp-api", + "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", +] + +[[package]] +name = "pallet-nis" +version = "28.0.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +dependencies = [ + "frame-benchmarking", + "frame-support", + "frame-system", + "parity-scale-codec", + "scale-info", + "sp-arithmetic", + "sp-core", + "sp-runtime", + "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", +] + +[[package]] +name = "pallet-node-authorization" +version = "28.0.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +dependencies = [ + "frame-support", + "frame-system", + "log", + "parity-scale-codec", + "scale-info", + "sp-core", + "sp-io", + "sp-runtime", + "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", +] + +[[package]] +name = "pallet-nomination-pools" +version = "25.0.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +dependencies = [ + "frame-support", + "frame-system", + "log", + "pallet-balances", + "parity-scale-codec", + "scale-info", + "sp-core", + "sp-io", + "sp-runtime", + "sp-staking", + "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", + "sp-tracing 16.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", +] + +[[package]] +name = "pallet-nomination-pools-benchmarking" +version = "26.0.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +dependencies = [ + "frame-benchmarking", + "frame-election-provider-support", + "frame-support", + "frame-system", + "pallet-bags-list", + "pallet-delegated-staking", + "pallet-nomination-pools", + "pallet-staking", + "parity-scale-codec", + "scale-info", + "sp-runtime", + "sp-runtime-interface 24.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", + "sp-staking", + "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", +] + +[[package]] +name = "pallet-nomination-pools-runtime-api" +version = "23.0.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +dependencies = [ + "pallet-nomination-pools", + "parity-scale-codec", + "sp-api", + "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", +] + +[[package]] +name = "pallet-offences" +version = "27.0.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +dependencies = [ + "frame-support", + "frame-system", + "log", + "pallet-balances", + "parity-scale-codec", + "scale-info", + "serde", + "sp-runtime", + "sp-staking", + "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", +] + +[[package]] +name = "pallet-offences-benchmarking" +version = "28.0.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +dependencies = [ + "frame-benchmarking", + "frame-election-provider-support", + "frame-support", + "frame-system", + "log", + "pallet-babe", + "pallet-balances", + "pallet-grandpa", + "pallet-im-online", + "pallet-offences", + "pallet-session", + "pallet-staking", + "parity-scale-codec", + "scale-info", + "sp-runtime", + "sp-staking", + "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", +] + +[[package]] +name = "pallet-otp" +version = "4.0.0-dev" +dependencies = [ + "ark-bls12-381", + "ark-serialize 0.4.2", + "array-bytes 4.2.0", + "ckb-merkle-mountain-range", + "frame-benchmarking", + "frame-support", + "frame-system", + "log", + "pallet-proxy 28.1.0", + "pallet-randomness-beacon", + "parity-scale-codec", + "primitive-types", + "scale-info", + "serde", + "sha3", + "sp-core", + "sp-runtime", + "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", +] + +[[package]] +name = "pallet-paged-list" +version = "0.6.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +dependencies = [ + "docify", + "frame-benchmarking", + "frame-support", + "frame-system", + "parity-scale-codec", + "scale-info", + "sp-core", + "sp-io", + "sp-metadata-ir", + "sp-runtime", + "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", +] + +[[package]] +name = "pallet-parameters" +version = "0.1.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +dependencies = [ + "docify", + "frame-benchmarking", + "frame-support", + "frame-system", + "parity-scale-codec", + "paste", + "scale-info", + "serde", + "sp-core", + "sp-runtime", + "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", +] + +[[package]] +name = "pallet-preimage" +version = "28.0.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +dependencies = [ + "frame-benchmarking", + "frame-support", + "frame-system", + "log", + "parity-scale-codec", + "scale-info", + "sp-core", + "sp-io", + "sp-runtime", + "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", +] + +[[package]] +name = "pallet-proxy" +version = "28.0.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +dependencies = [ + "frame-benchmarking", + "frame-support", + "frame-system", + "parity-scale-codec", + "scale-info", + "sp-io", + "sp-runtime", + "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", +] + +[[package]] +name = "pallet-proxy" +version = "28.1.0" +dependencies = [ + "frame-benchmarking", + "frame-support", + "frame-system", + "parity-scale-codec", + "scale-info", + "sp-io", + "sp-runtime", + "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", +] + +[[package]] +name = "pallet-randomness-beacon" +version = "28.0.0" +dependencies = [ + "ark-bls12-377", + "ark-ff 0.4.2", + "ark-serialize 0.4.2", + "ark-std 0.4.0", + "array-bytes 6.2.2", + "etf-crypto-primitives 0.2.4 (git+https://github.com/ideal-lab5/etf-sdk.git?branch=dev)", + "frame-support", + "frame-system", + "log", + "pallet-authorship", + "pallet-beefy-etf", + "pallet-etf", + "pallet-session", + "parity-scale-codec", + "scale-info", + "serde", + "sha2 0.10.8", + "sha3", + "sp-consensus-beefy-etf 13.0.0", + "sp-runtime", + "sp-session", + "sp-staking", + "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", + "w3f-bls", +] + +[[package]] +name = "pallet-ranked-collective" +version = "28.0.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +dependencies = [ + "frame-benchmarking", + "frame-support", + "frame-system", + "impl-trait-for-tuples", + "log", + "parity-scale-codec", + "scale-info", + "sp-arithmetic", + "sp-core", + "sp-io", + "sp-runtime", + "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", +] + +[[package]] +name = "pallet-recovery" +version = "28.0.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +dependencies = [ + "frame-benchmarking", + "frame-support", + "frame-system", + "parity-scale-codec", + "scale-info", + "sp-io", + "sp-runtime", + "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", +] + +[[package]] +name = "pallet-referenda" +version = "28.0.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +dependencies = [ + "frame-benchmarking", + "frame-support", + "frame-system", + "log", + "parity-scale-codec", + "scale-info", + "serde", + "sp-arithmetic", + "sp-io", + "sp-runtime", + "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", +] + +[[package]] +name = "pallet-remark" +version = "28.0.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +dependencies = [ + "frame-benchmarking", + "frame-support", + "frame-system", + "parity-scale-codec", + "scale-info", + "serde", + "sp-core", + "sp-io", + "sp-runtime", + "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", +] + +[[package]] +name = "pallet-root-offences" +version = "25.0.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +dependencies = [ + "frame-support", + "frame-system", + "pallet-session", + "pallet-staking", + "parity-scale-codec", + "scale-info", + "sp-runtime", + "sp-staking", +] + +[[package]] +name = "pallet-root-testing" +version = "4.0.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +dependencies = [ + "frame-support", + "frame-system", + "parity-scale-codec", + "scale-info", + "sp-core", + "sp-io", + "sp-runtime", + "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", +] + +[[package]] +name = "pallet-safe-mode" +version = "9.0.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +dependencies = [ + "docify", + "frame-benchmarking", + "frame-support", + "frame-system", + "pallet-balances", + "pallet-proxy 28.0.0", + "pallet-utility", + "parity-scale-codec", + "scale-info", + "sp-arithmetic", + "sp-runtime", + "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", +] + +[[package]] +name = "pallet-salary" +version = "13.0.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +dependencies = [ + "frame-benchmarking", + "frame-support", + "frame-system", + "log", + "pallet-ranked-collective", + "parity-scale-codec", + "scale-info", + "sp-arithmetic", + "sp-core", + "sp-io", + "sp-runtime", + "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", +] + +[[package]] +name = "pallet-scheduler" +version = "4.0.0-dev" +dependencies = [ + "docify", + "frame-benchmarking", + "frame-support", + "frame-system", + "log", + "pallet-randomness-beacon", + "parity-scale-codec", + "scale-info", + "sp-io", + "sp-runtime", + "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", + "sp-weights", +] + +[[package]] +name = "pallet-scheduler" +version = "29.0.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +dependencies = [ + "docify", + "frame-benchmarking", + "frame-support", + "frame-system", + "log", + "parity-scale-codec", + "scale-info", + "sp-io", + "sp-runtime", + "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", + "sp-weights", +] + +[[package]] +name = "pallet-scored-pool" +version = "28.0.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +dependencies = [ + "frame-support", + "frame-system", + "parity-scale-codec", + "scale-info", + "sp-io", + "sp-runtime", + "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", +] + +[[package]] +name = "pallet-session" +version = "28.0.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +dependencies = [ + "frame-support", + "frame-system", + "impl-trait-for-tuples", + "log", + "pallet-timestamp", + "parity-scale-codec", + "scale-info", + "sp-core", + "sp-io", + "sp-runtime", + "sp-session", + "sp-staking", + "sp-state-machine", + "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", + "sp-trie", +] + +[[package]] +name = "pallet-session-benchmarking" +version = "28.0.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +dependencies = [ + "frame-benchmarking", + "frame-support", + "frame-system", + "pallet-session", + "pallet-staking", + "parity-scale-codec", + "rand", + "sp-runtime", + "sp-session", + "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", +] + +[[package]] +name = "pallet-skip-feeless-payment" +version = "3.0.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +dependencies = [ + "frame-support", + "frame-system", + "parity-scale-codec", + "scale-info", + "sp-runtime", + "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", +] + +[[package]] +name = "pallet-society" +version = "28.0.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +dependencies = [ + "frame-benchmarking", + "frame-support", + "frame-system", + "log", + "parity-scale-codec", + "rand_chacha", + "scale-info", + "sp-arithmetic", + "sp-io", + "sp-runtime", + "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", +] + +[[package]] +name = "pallet-staking" +version = "28.0.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +dependencies = [ + "frame-benchmarking", + "frame-election-provider-support", + "frame-support", + "frame-system", + "log", + "pallet-authorship", + "pallet-session", + "parity-scale-codec", + "scale-info", + "serde", + "sp-application-crypto", + "sp-io", + "sp-runtime", + "sp-staking", + "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", +] + +[[package]] +name = "pallet-staking-reward-curve" +version = "11.0.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +dependencies = [ + "proc-macro-crate 3.1.0", + "proc-macro2", + "quote", + "syn 2.0.77", +] + +[[package]] +name = "pallet-staking-reward-fn" +version = "19.0.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +dependencies = [ + "log", + "sp-arithmetic", +] + +[[package]] +name = "pallet-staking-runtime-api" +version = "14.0.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +dependencies = [ + "parity-scale-codec", + "sp-api", + "sp-staking", +] + +[[package]] +name = "pallet-state-trie-migration" +version = "29.0.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +dependencies = [ + "frame-benchmarking", + "frame-support", + "frame-system", + "log", + "parity-scale-codec", + "scale-info", + "sp-core", + "sp-io", + "sp-runtime", + "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", +] + +[[package]] +name = "pallet-statement" +version = "10.0.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +dependencies = [ + "frame-support", + "frame-system", + "log", + "parity-scale-codec", + "scale-info", + "sp-api", + "sp-core", + "sp-io", + "sp-runtime", + "sp-statement-store", + "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", +] + +[[package]] +name = "pallet-sudo" +version = "28.0.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +dependencies = [ + "docify", + "frame-benchmarking", + "frame-support", + "frame-system", + "parity-scale-codec", + "scale-info", + "sp-io", + "sp-runtime", + "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", +] + +[[package]] +name = "pallet-timestamp" +version = "27.0.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +dependencies = [ + "docify", + "frame-benchmarking", + "frame-support", + "frame-system", + "log", + "parity-scale-codec", + "scale-info", + "sp-inherents", + "sp-io", + "sp-runtime", + "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", + "sp-storage 19.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", + "sp-timestamp", +] + +[[package]] +name = "pallet-tips" +version = "27.0.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +dependencies = [ + "frame-benchmarking", + "frame-support", + "frame-system", + "log", + "pallet-treasury", + "parity-scale-codec", + "scale-info", + "serde", + "sp-core", + "sp-io", + "sp-runtime", + "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", +] + +[[package]] +name = "pallet-transaction-payment" +version = "28.0.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +dependencies = [ + "frame-support", + "frame-system", + "parity-scale-codec", + "scale-info", + "serde", + "sp-core", + "sp-io", + "sp-runtime", + "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", +] + +[[package]] +name = "pallet-transaction-payment-rpc-runtime-api" +version = "28.0.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +dependencies = [ + "pallet-transaction-payment", + "parity-scale-codec", + "sp-api", + "sp-runtime", + "sp-weights", +] + +[[package]] +name = "pallet-transaction-storage" +version = "27.0.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +dependencies = [ + "frame-benchmarking", + "frame-support", + "frame-system", + "log", + "pallet-balances", + "parity-scale-codec", + "scale-info", + "serde", + "sp-inherents", + "sp-io", + "sp-runtime", + "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", + "sp-transaction-storage-proof", +] + +[[package]] +name = "pallet-treasury" +version = "27.0.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +dependencies = [ + "docify", + "frame-benchmarking", + "frame-support", + "frame-system", + "impl-trait-for-tuples", + "pallet-balances", + "parity-scale-codec", + "scale-info", + "serde", + "sp-core", + "sp-runtime", + "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", +] + +[[package]] +name = "pallet-tx-pause" +version = "9.0.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +dependencies = [ + "docify", + "frame-benchmarking", + "frame-support", + "frame-system", + "pallet-balances", + "pallet-proxy 28.0.0", + "pallet-utility", + "parity-scale-codec", + "scale-info", + "sp-runtime", + "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", +] + +[[package]] +name = "pallet-uniques" +version = "28.0.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +dependencies = [ + "frame-benchmarking", + "frame-support", + "frame-system", + "log", + "parity-scale-codec", + "scale-info", + "sp-runtime", + "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", +] + +[[package]] +name = "pallet-utility" +version = "28.0.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +dependencies = [ + "frame-benchmarking", + "frame-support", + "frame-system", + "parity-scale-codec", + "scale-info", + "sp-core", + "sp-io", + "sp-runtime", + "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", +] + +[[package]] +name = "pallet-vesting" +version = "28.0.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +dependencies = [ + "frame-benchmarking", + "frame-support", + "frame-system", + "log", + "parity-scale-codec", + "scale-info", + "sp-runtime", + "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", +] + +[[package]] +name = "pallet-whitelist" +version = "27.0.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +dependencies = [ + "frame-benchmarking", + "frame-support", + "frame-system", + "parity-scale-codec", + "scale-info", + "sp-api", + "sp-runtime", + "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", +] + +[[package]] +name = "pallet-xcm" +version = "7.0.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +dependencies = [ + "bounded-collections", + "frame-benchmarking", + "frame-support", + "frame-system", + "log", + "pallet-balances", + "parity-scale-codec", + "scale-info", + "serde", + "sp-core", + "sp-io", + "sp-runtime", + "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", + "staging-xcm", + "staging-xcm-builder", + "staging-xcm-executor", + "xcm-fee-payment-runtime-api", ] [[package]] -name = "hashbrown" -version = "0.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e" +name = "pallet-xcm-benchmarks" +version = "7.0.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" dependencies = [ - "ahash", + "frame-benchmarking", + "frame-support", + "frame-system", + "log", + "parity-scale-codec", + "scale-info", + "sp-io", + "sp-runtime", + "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", + "staging-xcm", + "staging-xcm-builder", + "staging-xcm-executor", ] [[package]] -name = "hashbrown" -version = "0.14.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" +name = "pallet-xcm-bridge-hub" +version = "0.2.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" dependencies = [ - "ahash", - "allocator-api2", - "serde", + "bp-messages", + "bp-runtime", + "bp-xcm-bridge-hub", + "bridge-runtime-common", + "frame-support", + "frame-system", + "log", + "pallet-bridge-messages", + "parity-scale-codec", + "scale-info", + "sp-core", + "sp-runtime", + "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", + "staging-xcm", + "staging-xcm-builder", + "staging-xcm-executor", ] [[package]] -name = "heck" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" - -[[package]] -name = "heck" +name = "pallet-xcm-bridge-hub-router" version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +dependencies = [ + "bp-xcm-bridge-hub-router", + "frame-benchmarking", + "frame-support", + "frame-system", + "log", + "parity-scale-codec", + "scale-info", + "sp-core", + "sp-runtime", + "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", + "staging-xcm", + "staging-xcm-builder", +] [[package]] -name = "hermit-abi" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" +name = "parachains-common" +version = "7.0.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +dependencies = [ + "cumulus-primitives-core", + "cumulus-primitives-utility", + "frame-support", + "frame-system", + "log", + "pallet-asset-tx-payment", + "pallet-assets", + "pallet-authorship", + "pallet-balances", + "pallet-collator-selection", + "pallet-message-queue", + "pallet-xcm", + "parity-scale-codec", + "polkadot-primitives", + "scale-info", + "sp-consensus-aura", + "sp-core", + "sp-io", + "sp-runtime", + "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", + "staging-parachain-info", + "staging-xcm", + "staging-xcm-executor", + "substrate-wasm-builder", +] [[package]] -name = "hex" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" +name = "parachains-runtimes-test-utils" +version = "7.0.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +dependencies = [ + "cumulus-pallet-parachain-system", + "cumulus-pallet-xcmp-queue", + "cumulus-primitives-core", + "cumulus-primitives-parachain-inherent", + "cumulus-test-relay-sproof-builder", + "frame-support", + "frame-system", + "pallet-balances", + "pallet-collator-selection", + "pallet-session", + "pallet-timestamp", + "pallet-xcm", + "parity-scale-codec", + "polkadot-parachain-primitives", + "sp-consensus-aura", + "sp-core", + "sp-io", + "sp-runtime", + "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", + "sp-tracing 16.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", + "staging-parachain-info", + "staging-xcm", + "staging-xcm-executor", + "substrate-wasm-builder", +] [[package]] -name = "hex-conservative" -version = "0.1.1" +name = "parity-bip39" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30ed443af458ccb6d81c1e7e661545f94d3176752fb1df2f543b902a1e0f51e2" +checksum = "4e69bf016dc406eff7d53a7d3f7cf1c2e72c82b9088aac1118591e36dd2cd3e9" +dependencies = [ + "bitcoin_hashes 0.13.0", + "rand", + "rand_core", + "serde", + "unicode-normalization", +] [[package]] -name = "hmac" -version = "0.8.1" +name = "parity-bytes" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "126888268dcc288495a26bf004b38c5fdbb31682f992c84ceb046a1f0fe38840" -dependencies = [ - "crypto-mac", - "digest 0.9.0", -] +checksum = "16b56e3a2420138bdb970f84dfb9c774aea80fa0e7371549eedec0d80c209c67" [[package]] -name = "hmac" -version = "0.12.1" +name = "parity-scale-codec" +version = "3.6.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" +checksum = "306800abfa29c7f16596b5970a588435e3d5b3149683d00c12b699cc19f895ee" dependencies = [ - "digest 0.10.7", + "arrayvec 0.7.4", + "bitvec", + "byte-slice-cast", + "bytes", + "impl-trait-for-tuples", + "parity-scale-codec-derive", + "serde", ] [[package]] -name = "hmac-drbg" -version = "0.3.0" +name = "parity-scale-codec-derive" +version = "3.6.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17ea0a1394df5b6574da6e0c1ade9e78868c9fb0a4e5ef4428e32da4676b85b1" +checksum = "d830939c76d294956402033aee57a6da7b438f2294eb94864c37b0569053a42c" dependencies = [ - "digest 0.9.0", - "generic-array", - "hmac 0.8.1", + "proc-macro-crate 3.1.0", + "proc-macro2", + "quote", + "syn 1.0.109", ] [[package]] -name = "http" -version = "0.2.12" +name = "parity-util-mem" +version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1" +checksum = "0d32c34f4f5ca7f9196001c0aba5a1f9a5a12382c8944b8b0f90233282d1e8f8" dependencies = [ - "bytes", - "fnv", - "itoa", + "cfg-if", + "ethereum-types", + "hashbrown 0.12.3", + "impl-trait-for-tuples", + "lru 0.8.1", + "parity-util-mem-derive", + "parking_lot", + "primitive-types", + "smallvec", + "winapi", ] [[package]] -name = "http-body" -version = "0.4.6" +name = "parity-util-mem-derive" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" +checksum = "f557c32c6d268a07c921471619c0295f5efad3a0e76d4f97a05c091a51d110b2" dependencies = [ - "bytes", - "http", - "pin-project-lite", + "proc-macro2", + "syn 1.0.109", + "synstructure", ] [[package]] -name = "httparse" -version = "1.8.0" +name = "parity-wasm" +version = "0.45.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" +checksum = "e1ad0aff30c1da14b1254fcb2af73e1fa9a28670e584a626f53a369d0e157304" [[package]] -name = "httpdate" -version = "1.0.3" +name = "parking" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" +checksum = "bb813b8af86854136c6922af0598d719255ecb2179515e6e7730d468f05c9cae" [[package]] -name = "hyper" -version = "0.14.28" +name = "parking_lot" +version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf96e135eb83a2a8ddf766e426a841d8ddd7449d5f00d34ea02b41d2f19eef80" +checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" dependencies = [ - "bytes", - "futures-channel", - "futures-core", - "futures-util", - "h2", - "http", - "http-body", - "httparse", - "httpdate", - "itoa", - "pin-project-lite", - "socket2", - "tokio", - "tower-service", - "tracing", - "want", + "lock_api", + "parking_lot_core", ] [[package]] -name = "hyper-rustls" -version = "0.24.2" +name = "parking_lot_core" +version = "0.9.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec3efd23720e2049821a693cbc7e65ea87c72f1c58ff2f9522ff332b1491e590" +checksum = "4c42a9226546d68acdd9c0a280d17ce19bfe27a46bf68784e4066115788d008e" dependencies = [ - "futures-util", - "http", - "hyper", - "log", - "rustls 0.21.11", - "rustls-native-certs 0.6.3", - "tokio", - "tokio-rustls 0.24.1", + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-targets 0.48.5", ] [[package]] -name = "ident_case" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" - -[[package]] -name = "idna" +name = "password-hash" version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" +checksum = "346f04948ba92c43e8469c1ee6736c7563d71012b17d40745260fe106aac2166" dependencies = [ - "unicode-bidi", - "unicode-normalization", + "base64ct", + "rand_core", + "subtle", ] [[package]] -name = "impl-codec" -version = "0.6.0" +name = "paste" +version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba6a270039626615617f3f36d15fc827041df3b78c439da2cadfa47455a77f2f" -dependencies = [ - "parity-scale-codec", -] +checksum = "de3145af08024dea9fa9914f381a17b8fc6034dfb00f3a84013f7ff43f29ed4c" [[package]] -name = "impl-serde" -version = "0.4.0" +name = "pbkdf2" +version = "0.12.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebc88fc67028ae3db0c853baa36269d398d5f45b6982f95549ff5def78c935cd" +checksum = "f8ed6a7761f76e3b9f92dfb0a60a6a6477c61024b775147ff0973a02653abaf2" dependencies = [ - "serde", + "digest 0.10.7", + "password-hash", ] [[package]] -name = "impl-trait-for-tuples" -version = "0.2.2" +name = "percent-encoding" +version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11d7a9f6330b71fea57921c9b61c47ee6e84f72d394754eff6163ae67e7395eb" +checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" + +[[package]] +name = "pest" +version = "2.7.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c73c26c01b8c87956cea613c907c9d6ecffd8d18a2a5908e5de0adfaa185cea" dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", + "memchr", + "thiserror", + "ucd-trie", ] [[package]] -name = "include_dir" -version = "0.7.3" +name = "pin-project" +version = "1.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18762faeff7122e89e0857b02f7ce6fcc0d101d5e9ad2ad7846cc01d61b7f19e" +checksum = "b6bf43b791c5b9e34c3d182969b4abb522f9343702850a2e57f460d00d09b4b3" dependencies = [ - "include_dir_macros", + "pin-project-internal", ] [[package]] -name = "include_dir_macros" -version = "0.7.3" +name = "pin-project-internal" +version = "1.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b139284b5cf57ecfa712bcc66950bb635b31aff41c188e8a4cfc758eca374a3f" +checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" dependencies = [ "proc-macro2", "quote", + "syn 2.0.77", ] [[package]] -name = "indexmap" -version = "2.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "168fb715dda47215e360912c096649d23d58bf392ac62f73919e831745e40f26" -dependencies = [ - "equivalent", - "hashbrown 0.14.3", -] - -[[package]] -name = "indexmap-nostd" -version = "0.4.0" +name = "pin-project-lite" +version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e04e2fd2b8188ea827b32ef11de88377086d690286ab35747ef7f9bf3ccb590" +checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02" [[package]] -name = "indicatif" -version = "0.17.8" +name = "pin-utils" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "763a5a8f45087d6bcea4222e7b72c291a054edf80e4ef6efd2a4979878c7bea3" -dependencies = [ - "console", - "instant", - "number_prefix", - "portable-atomic", - "unicode-width", -] +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" [[package]] -name = "inout" -version = "0.1.3" +name = "piper" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0c10553d664a4d0bcff9f4215d0aac67a639cc68ef660840afe309b807bc9f5" +checksum = "668d31b1c4eba19242f2088b2bf3316b82ca31082a8335764db4e083db7485d4" dependencies = [ - "generic-array", + "atomic-waker", + "fastrand", + "futures-io", ] [[package]] -name = "instant" -version = "0.1.12" +name = "pkcs8" +version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" +checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" dependencies = [ - "cfg-if", + "der", + "spki", ] [[package]] -name = "integer-sqrt" -version = "0.1.5" +name = "pkg-config" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "276ec31bcb4a9ee45f58bec6f9ec700ae4cf4f4f8f2fa7e06cb406bd5ffdd770" -dependencies = [ - "num-traits", -] +checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec" [[package]] -name = "itertools" -version = "0.10.5" +name = "polkadot-ckb-merkle-mountain-range" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" +checksum = "a4b44320e5f7ce2c18227537a3032ae5b2c476a7e8eddba45333e1011fc31b92" dependencies = [ - "either", + "cfg-if", + "itertools 0.10.5", ] [[package]] -name = "itertools" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1c173a5686ce8bfa551b3563d0c2170bf24ca44da99c7ca4bfdab5418c3fe57" +name = "polkadot-core-primitives" +version = "7.0.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" dependencies = [ - "either", + "parity-scale-codec", + "scale-info", + "sp-core", + "sp-runtime", + "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", ] [[package]] -name = "itertools" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" +name = "polkadot-parachain-primitives" +version = "6.0.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" dependencies = [ - "either", + "bounded-collections", + "derive_more", + "parity-scale-codec", + "polkadot-core-primitives", + "scale-info", + "serde", + "sp-core", + "sp-runtime", + "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", + "sp-weights", ] [[package]] -name = "itoa" -version = "1.0.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" - -[[package]] -name = "js-sys" -version = "0.3.69" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29c15563dc2726973df627357ce0c9ddddbea194836909d655df6a75d2cf296d" +name = "polkadot-primitives" +version = "7.0.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" dependencies = [ - "wasm-bindgen", + "bitvec", + "hex-literal", + "log", + "parity-scale-codec", + "polkadot-core-primitives", + "polkadot-parachain-primitives", + "scale-info", + "serde", + "sp-api", + "sp-application-crypto", + "sp-arithmetic", + "sp-authority-discovery", + "sp-consensus-slots", + "sp-core", + "sp-inherents", + "sp-io", + "sp-keystore", + "sp-runtime", + "sp-staking", + "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", ] [[package]] -name = "jsonrpsee" -version = "0.22.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4b0e68d9af1f066c06d6e2397583795b912d78537d7d907c561e82c13d69fa1" +name = "polkadot-runtime-common" +version = "7.0.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" dependencies = [ - "jsonrpsee-client-transport", - "jsonrpsee-core", - "jsonrpsee-http-client", - "jsonrpsee-types", + "bitvec", + "frame-benchmarking", + "frame-election-provider-support", + "frame-support", + "frame-system", + "impl-trait-for-tuples", + "libsecp256k1", + "log", + "pallet-asset-rate", + "pallet-authorship", + "pallet-balances", + "pallet-broker", + "pallet-election-provider-multi-phase", + "pallet-fast-unstake", + "pallet-identity", + "pallet-session", + "pallet-staking", + "pallet-staking-reward-fn", + "pallet-timestamp", + "pallet-transaction-payment", + "pallet-treasury", + "pallet-vesting", + "parity-scale-codec", + "polkadot-primitives", + "polkadot-runtime-parachains", + "rustc-hex", + "scale-info", + "serde", + "serde_derive", + "slot-range-helper", + "sp-api", + "sp-core", + "sp-inherents", + "sp-io", + "sp-npos-elections", + "sp-runtime", + "sp-session", + "sp-staking", + "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", + "staging-xcm", + "staging-xcm-builder", + "staging-xcm-executor", + "static_assertions", ] [[package]] -name = "jsonrpsee-client-transport" -version = "0.22.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92f254f56af1ae84815b9b1325094743dcf05b92abb5e94da2e81a35cff0cada" +name = "polkadot-runtime-metrics" +version = "7.0.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" dependencies = [ - "futures-util", - "http", - "jsonrpsee-core", - "pin-project", - "rustls-native-certs 0.7.0", - "rustls-pki-types", - "soketto", - "thiserror", - "tokio", - "tokio-rustls 0.25.0", - "tokio-util", - "tracing", - "url", + "bs58", + "frame-benchmarking", + "parity-scale-codec", + "polkadot-primitives", + "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", + "sp-tracing 16.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", ] [[package]] -name = "jsonrpsee-core" -version = "0.22.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "274d68152c24aa78977243bb56f28d7946e6aa309945b37d33174a3f92d89a3a" +name = "polkadot-runtime-parachains" +version = "7.0.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" dependencies = [ - "anyhow", - "async-trait", - "beef", - "futures-timer", - "futures-util", - "hyper", - "jsonrpsee-types", - "pin-project", - "rustc-hash", + "bitflags 1.3.2", + "bitvec", + "derive_more", + "frame-benchmarking", + "frame-support", + "frame-system", + "impl-trait-for-tuples", + "log", + "pallet-authority-discovery", + "pallet-authorship", + "pallet-babe", + "pallet-balances", + "pallet-broker", + "pallet-message-queue", + "pallet-session", + "pallet-staking", + "pallet-timestamp", + "pallet-vesting", + "parity-scale-codec", + "polkadot-core-primitives", + "polkadot-parachain-primitives", + "polkadot-primitives", + "polkadot-runtime-metrics", + "rand", + "rand_chacha", + "rustc-hex", + "scale-info", "serde", - "serde_json", - "thiserror", - "tokio", - "tokio-stream", - "tracing", + "sp-api", + "sp-application-crypto", + "sp-arithmetic", + "sp-core", + "sp-inherents", + "sp-io", + "sp-keystore", + "sp-runtime", + "sp-session", + "sp-staking", + "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", + "staging-xcm", + "staging-xcm-executor", ] [[package]] -name = "jsonrpsee-http-client" -version = "0.22.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac13bc1e44cd00448a5ff485824a128629c945f02077804cb659c07a0ba41395" +name = "polkadot-sdk" +version = "0.1.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" dependencies = [ - "async-trait", - "hyper", - "hyper-rustls", - "jsonrpsee-core", - "jsonrpsee-types", - "serde", - "serde_json", - "thiserror", - "tokio", - "tower", - "tracing", - "url", + "asset-test-utils", + "assets-common", + "binary-merkle-tree", + "bp-asset-hub-rococo", + "bp-asset-hub-westend", + "bp-bridge-hub-cumulus", + "bp-bridge-hub-kusama", + "bp-bridge-hub-polkadot", + "bp-bridge-hub-rococo", + "bp-bridge-hub-westend", + "bp-header-chain", + "bp-kusama", + "bp-messages", + "bp-parachains", + "bp-polkadot", + "bp-polkadot-bulletin", + "bp-polkadot-core", + "bp-relayers", + "bp-rococo", + "bp-runtime", + "bp-test-utils", + "bp-westend", + "bp-xcm-bridge-hub", + "bp-xcm-bridge-hub-router", + "bridge-hub-common", + "bridge-hub-test-utils", + "bridge-runtime-common", + "cumulus-pallet-aura-ext", + "cumulus-pallet-dmp-queue", + "cumulus-pallet-parachain-system", + "cumulus-pallet-parachain-system-proc-macro", + "cumulus-pallet-session-benchmarking", + "cumulus-pallet-solo-to-para", + "cumulus-pallet-xcm", + "cumulus-pallet-xcmp-queue", + "cumulus-ping", + "cumulus-primitives-aura", + "cumulus-primitives-core", + "cumulus-primitives-parachain-inherent", + "cumulus-primitives-proof-size-hostfunction", + "cumulus-primitives-storage-weight-reclaim", + "cumulus-primitives-timestamp", + "cumulus-primitives-utility", + "cumulus-test-relay-sproof-builder", + "frame-benchmarking", + "frame-benchmarking-pallet-pov", + "frame-election-provider-support", + "frame-executive", + "frame-metadata-hash-extension", + "frame-support", + "frame-support-procedural", + "frame-system", + "frame-system-benchmarking", + "frame-system-rpc-runtime-api", + "frame-try-runtime", + "pallet-alliance", + "pallet-asset-conversion", + "pallet-asset-conversion-ops", + "pallet-asset-conversion-tx-payment", + "pallet-asset-rate", + "pallet-asset-tx-payment", + "pallet-assets", + "pallet-assets-freezer", + "pallet-atomic-swap", + "pallet-aura", + "pallet-authority-discovery", + "pallet-authorship", + "pallet-babe", + "pallet-bags-list", + "pallet-balances", + "pallet-beefy", + "pallet-beefy-mmr", + "pallet-bounties", + "pallet-bridge-grandpa", + "pallet-bridge-messages", + "pallet-bridge-parachains", + "pallet-bridge-relayers", + "pallet-broker", + "pallet-child-bounties", + "pallet-collator-selection", + "pallet-collective", + "pallet-collective-content", + "pallet-contracts", + "pallet-contracts-mock-network", + "pallet-conviction-voting", + "pallet-core-fellowship", + "pallet-delegated-staking", + "pallet-democracy", + "pallet-dev-mode", + "pallet-election-provider-multi-phase", + "pallet-election-provider-support-benchmarking", + "pallet-elections-phragmen", + "pallet-fast-unstake", + "pallet-glutton", + "pallet-grandpa", + "pallet-identity", + "pallet-im-online", + "pallet-indices", + "pallet-insecure-randomness-collective-flip", + "pallet-lottery", + "pallet-membership", + "pallet-message-queue", + "pallet-migrations", + "pallet-mixnet", + "pallet-mmr", + "pallet-multisig", + "pallet-nft-fractionalization", + "pallet-nfts", + "pallet-nfts-runtime-api", + "pallet-nis", + "pallet-node-authorization", + "pallet-nomination-pools", + "pallet-nomination-pools-benchmarking", + "pallet-nomination-pools-runtime-api", + "pallet-offences", + "pallet-offences-benchmarking", + "pallet-paged-list", + "pallet-parameters", + "pallet-preimage", + "pallet-proxy 28.0.0", + "pallet-ranked-collective", + "pallet-recovery", + "pallet-referenda", + "pallet-remark", + "pallet-root-offences", + "pallet-root-testing", + "pallet-safe-mode", + "pallet-salary", + "pallet-scheduler 29.0.0", + "pallet-scored-pool", + "pallet-session", + "pallet-session-benchmarking", + "pallet-skip-feeless-payment", + "pallet-society", + "pallet-staking", + "pallet-staking-reward-fn", + "pallet-staking-runtime-api", + "pallet-state-trie-migration", + "pallet-statement", + "pallet-sudo", + "pallet-timestamp", + "pallet-tips", + "pallet-transaction-payment", + "pallet-transaction-payment-rpc-runtime-api", + "pallet-transaction-storage", + "pallet-treasury", + "pallet-tx-pause", + "pallet-uniques", + "pallet-utility", + "pallet-vesting", + "pallet-whitelist", + "pallet-xcm", + "pallet-xcm-benchmarks", + "pallet-xcm-bridge-hub", + "pallet-xcm-bridge-hub-router", + "parachains-common", + "parachains-runtimes-test-utils", + "polkadot-core-primitives", + "polkadot-parachain-primitives", + "polkadot-primitives", + "polkadot-runtime-common", + "polkadot-runtime-metrics", + "polkadot-runtime-parachains", + "polkadot-sdk-frame", + "rococo-runtime-constants", + "sc-executor", + "slot-range-helper", + "snowbridge-beacon-primitives", + "snowbridge-core", + "snowbridge-ethereum", + "snowbridge-outbound-queue-merkle-tree", + "snowbridge-outbound-queue-runtime-api", + "snowbridge-pallet-ethereum-client", + "snowbridge-pallet-ethereum-client-fixtures", + "snowbridge-pallet-inbound-queue", + "snowbridge-pallet-inbound-queue-fixtures", + "snowbridge-pallet-outbound-queue", + "snowbridge-pallet-system", + "snowbridge-router-primitives", + "snowbridge-runtime-common", + "snowbridge-runtime-test-common", + "snowbridge-system-runtime-api", + "sp-api", + "sp-api-proc-macro", + "sp-application-crypto", + "sp-arithmetic", + "sp-authority-discovery", + "sp-block-builder", + "sp-consensus-aura", + "sp-consensus-babe", + "sp-consensus-beefy", + "sp-consensus-grandpa", + "sp-consensus-pow", + "sp-consensus-slots", + "sp-core", + "sp-core-hashing", + "sp-crypto-ec-utils 0.10.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", + "sp-crypto-hashing 0.1.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", + "sp-debug-derive 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", + "sp-externalities 0.25.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", + "sp-genesis-builder", + "sp-inherents", + "sp-io", + "sp-keyring", + "sp-keystore", + "sp-metadata-ir", + "sp-mixnet", + "sp-mmr-primitives", + "sp-npos-elections", + "sp-offchain", + "sp-runtime", + "sp-runtime-interface 24.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", + "sp-session", + "sp-staking", + "sp-state-machine", + "sp-statement-store", + "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", + "sp-storage 19.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", + "sp-timestamp", + "sp-tracing 16.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", + "sp-transaction-pool", + "sp-transaction-storage-proof", + "sp-trie", + "sp-version", + "sp-wasm-interface 20.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", + "sp-weights", + "staging-parachain-info", + "staging-xcm", + "staging-xcm-builder", + "staging-xcm-executor", + "substrate-bip39", + "testnet-parachains-constants", + "westend-runtime-constants", + "xcm-fee-payment-runtime-api", ] [[package]] -name = "jsonrpsee-types" -version = "0.22.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3dc828e537868d6b12bbb07ec20324909a22ced6efca0057c825c3e1126b2c6d" +name = "polkadot-sdk-frame" +version = "0.1.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" dependencies = [ - "anyhow", - "beef", - "serde", - "serde_json", - "thiserror", + "docify", + "frame-benchmarking", + "frame-executive", + "frame-support", + "frame-system", + "frame-system-benchmarking", + "frame-system-rpc-runtime-api", + "frame-try-runtime", + "log", + "parity-scale-codec", + "scale-info", + "sp-api", + "sp-arithmetic", + "sp-block-builder", + "sp-consensus-aura", + "sp-consensus-grandpa", + "sp-core", + "sp-inherents", + "sp-io", + "sp-offchain", + "sp-runtime", + "sp-session", + "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", + "sp-storage 19.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", + "sp-transaction-pool", + "sp-version", ] [[package]] -name = "k256" -version = "0.13.3" +name = "polkavm" +version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "956ff9b67e26e1a6a866cb758f12c6f8746208489e3e4a4b5580802f2f0a587b" +checksum = "8a3693e5efdb2bf74e449cd25fd777a28bd7ed87e41f5d5da75eb31b4de48b94" dependencies = [ - "cfg-if", - "ecdsa", - "elliptic-curve", - "once_cell", - "serdect", - "sha2 0.10.8", + "libc", + "log", + "polkavm-assembler", + "polkavm-common", + "polkavm-linux-raw", ] [[package]] -name = "keccak" -version = "0.1.5" +name = "polkavm-assembler" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ecc2af9a1119c51f12a14607e783cb977bde58bc069ff0c3da1095e635d70654" +checksum = "1fa96d6d868243acc12de813dd48e756cbadcc8e13964c70d272753266deadc1" dependencies = [ - "cpufeatures", + "log", ] [[package]] -name = "lazy_static" -version = "1.4.0" +name = "polkavm-common" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" +checksum = "1d9428a5cfcc85c5d7b9fc4b6a18c4b802d0173d768182a51cc7751640f08b92" +dependencies = [ + "log", +] [[package]] -name = "libc" -version = "0.2.153" +name = "polkavm-derive" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd" +checksum = "ae8c4bea6f3e11cd89bb18bcdddac10bd9a24015399bd1c485ad68a985a19606" +dependencies = [ + "polkavm-derive-impl-macro", +] [[package]] -name = "libm" -version = "0.2.8" +name = "polkavm-derive-impl" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058" +checksum = "5c4fdfc49717fb9a196e74a5d28e0bc764eb394a2c803eb11133a31ac996c60c" +dependencies = [ + "polkavm-common", + "proc-macro2", + "quote", + "syn 2.0.77", +] [[package]] -name = "libsecp256k1" -version = "0.7.1" +name = "polkavm-derive-impl-macro" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95b09eff1b35ed3b33b877ced3a691fc7a481919c7e29c53c906226fcf55e2a1" +checksum = "8ba81f7b5faac81e528eb6158a6f3c9e0bb1008e0ffa19653bc8dea925ecb429" dependencies = [ - "arrayref", - "base64 0.13.1", - "digest 0.9.0", - "hmac-drbg", - "libsecp256k1-core", - "libsecp256k1-gen-ecmult", - "libsecp256k1-gen-genmult", - "rand", - "serde", - "sha2 0.9.9", - "typenum", + "polkavm-derive-impl", + "syn 2.0.77", ] [[package]] -name = "libsecp256k1-core" -version = "0.3.0" +name = "polkavm-linker" +version = "0.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5be9b9bb642d8522a44d533eab56c16c738301965504753b03ad1de3425d5451" +checksum = "9c7be503e60cf56c0eb785f90aaba4b583b36bff00e93997d93fef97f9553c39" dependencies = [ - "crunchy", - "digest 0.9.0", - "subtle", + "gimli 0.28.1", + "hashbrown 0.14.3", + "log", + "object 0.32.2", + "polkavm-common", + "regalloc2 0.9.3", + "rustc-demangle", ] [[package]] -name = "libsecp256k1-gen-ecmult" -version = "0.3.0" +name = "polkavm-linux-raw" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3038c808c55c87e8a172643a7d87187fc6c4174468159cb3090659d55bcb4809" -dependencies = [ - "libsecp256k1-core", -] +checksum = "26e85d3456948e650dff0cfc85603915847faf893ed1e66b020bb82ef4557120" [[package]] -name = "libsecp256k1-gen-genmult" -version = "0.3.0" +name = "polling" +version = "3.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3db8d6ba2cec9eacc40e6e8ccc98931840301f1006e95647ceb2dd5c3aa06f7c" +checksum = "645493cf344456ef24219d02a768cf1fb92ddf8c92161679ae3d91b91a637be3" dependencies = [ - "libsecp256k1-core", + "cfg-if", + "concurrent-queue", + "hermit-abi 0.3.9", + "pin-project-lite", + "rustix 0.38.34", + "tracing", + "windows-sys 0.52.0", ] [[package]] -name = "linux-raw-sys" -version = "0.4.13" +name = "poly1305" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01cda141df6706de531b6c46c3a33ecca755538219bd484262fa09410c13539c" +checksum = "8159bd90725d2df49889a078b54f4f79e87f1f8a8444194cdca81d38f5393abf" +dependencies = [ + "cpufeatures", + "opaque-debug", + "universal-hash", +] [[package]] -name = "lock_api" -version = "0.4.11" +name = "polyval" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c168f8615b12bc01f9c17e2eb0cc07dcae1940121185446edc3744920e8ef45" +checksum = "9d1fe60d06143b2430aa532c94cfe9e29783047f06c0d7fd359a9a51b729fa25" dependencies = [ - "autocfg", - "scopeguard", + "cfg-if", + "cpufeatures", + "opaque-debug", + "universal-hash", ] [[package]] -name = "log" -version = "0.4.21" +name = "portable-atomic" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90ed8c1e510134f979dbc4f070f87d4313098b704861a105fe34231c70a3901c" +checksum = "7170ef9988bc169ba16dd36a7fa041e5c4cbeb6a35b76d4c03daded371eae7c0" [[package]] -name = "lru" -version = "0.12.3" +name = "powerfmt" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3262e75e648fce39813cb56ac41f3c3e3f65217ebf3844d818d1f9398cfb0dc" -dependencies = [ - "hashbrown 0.14.3", -] +checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" [[package]] -name = "macro_magic" -version = "0.5.0" +name = "ppv-lite86" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e03844fc635e92f3a0067e25fa4bf3e3dbf3f2927bf3aa01bb7bc8f1c428949d" -dependencies = [ - "macro_magic_core", - "macro_magic_macros", - "quote", - "syn 2.0.60", -] +checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" [[package]] -name = "macro_magic_core" -version = "0.5.0" +name = "prettier-please" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "468155613a44cfd825f1fb0ffa532b018253920d404e6fca1e8d43155198a46d" +checksum = "22020dfcf177fcc7bf5deaf7440af371400c67c0de14c399938d8ed4fb4645d3" dependencies = [ - "const-random", - "derive-syn-parse 0.1.5", - "macro_magic_core_macros", "proc-macro2", - "quote", - "syn 2.0.60", + "syn 2.0.77", ] [[package]] -name = "macro_magic_core_macros" -version = "0.5.0" +name = "primitive-types" +version = "0.12.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ea73aa640dc01d62a590d48c0c3521ed739d53b27f919b25c3551e233481654" +checksum = "0b34d9fd68ae0b74a41b21c03c2f62847aa0ffea044eee893b4c140b37e244e2" dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.60", + "fixed-hash", + "impl-codec", + "impl-num-traits", + "impl-rlp", + "impl-serde", + "scale-info", + "uint", ] [[package]] -name = "macro_magic_macros" -version = "0.5.0" +name = "proc-macro-crate" +version = "1.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef9d79ae96aaba821963320eb2b6e34d17df1e5a83d8a1985c29cc5be59577b3" +checksum = "7f4c021e1093a56626774e81216a4ce732a735e5bad4868a03f3ed65ca0c3919" dependencies = [ - "macro_magic_core", - "quote", - "syn 2.0.60", + "once_cell", + "toml_edit 0.19.15", ] [[package]] -name = "matchers" -version = "0.1.0" +name = "proc-macro-crate" +version = "3.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558" +checksum = "6d37c51ca738a55da99dc0c4a34860fd675453b8b36209178c2249bb13651284" dependencies = [ - "regex-automata 0.1.10", + "toml_edit 0.21.1", ] [[package]] -name = "memchr" -version = "2.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c8640c5d730cb13ebd907d8d04b52f55ac9a2eec55b440c8892f40d56c76c1d" - -[[package]] -name = "memory-db" -version = "0.32.0" +name = "proc-macro-error" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "808b50db46293432a45e63bc15ea51e0ab4c0a1647b8eb114e31a3e698dd6fbe" +checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" dependencies = [ - "hash-db", + "proc-macro-error-attr", + "proc-macro2", + "quote", + "syn 1.0.109", + "version_check", ] [[package]] -name = "merlin" -version = "3.0.0" +name = "proc-macro-error-attr" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "58c38e2799fc0978b65dfff8023ec7843e2330bb462f19198840b34b6582397d" +checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" dependencies = [ - "byteorder", - "keccak", - "rand_core", - "zeroize", + "proc-macro2", + "quote", + "version_check", ] [[package]] -name = "minimal-lexical" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" - -[[package]] -name = "miniz_oxide" -version = "0.7.2" +name = "proc-macro-warning" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d811f3e15f28568be3407c8e7fdb6514c1cda3cb30683f15b6a1a1dc4ea14a7" +checksum = "834da187cfe638ae8abb0203f0b33e5ccdb02a28e7199f2f47b3e2754f50edca" dependencies = [ - "adler", + "proc-macro2", + "quote", + "syn 2.0.77", ] [[package]] -name = "mio" -version = "0.8.11" +name = "proc-macro2" +version = "1.0.86" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4a650543ca06a924e8b371db273b2756685faae30f8487da1b56505a8f78b0c" +checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77" dependencies = [ - "libc", - "wasi", - "windows-sys 0.48.0", + "unicode-ident", ] [[package]] -name = "murmur-cli" -version = "0.1.0" +name = "proptest" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4c2511913b88df1637da85cc8d96ec8e43a3f8bb8ccb71ee1ac240d6f3df58d" dependencies = [ - "ark-bls12-377", - "ark-ec", - "ark-ff", - "ark-serialize", - "ark-std", - "array-bytes", - "ckb-merkle-mountain-range", - "clap", - "etf-crypto-primitives 0.2.4 (git+https://github.com/ideal-lab5/etf-sdk/?branch=tony/dev)", - "frame-support", - "getrandom", - "hex", - "indicatif", - "murmur-core", - "parity-scale-codec", + "bit-set", + "bit-vec", + "bitflags 2.5.0", + "lazy_static", + "num-traits", + "rand", "rand_chacha", - "rand_core", - "serde", - "serde_cbor", - "serde_json", - "sha3", - "sp-application-crypto", - "sp-consensus-beefy-etf", - "sp-core", - "sp-keyring", - "sp-runtime", - "subxt", - "subxt-signer", - "tokio", - "w3f-bls", + "rand_xorshift", + "regex-syntax 0.8.3", + "rusty-fork", + "tempfile", + "unarray", ] [[package]] -name = "murmur-core" -version = "0.1.0" +name = "psm" +version = "0.1.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa37f80ca58604976033fae9515a8a2989fc13797d953f7c04fb8fa36a11f205" dependencies = [ - "ark-bls12-377", - "ark-ec", - "ark-ff", - "ark-serialize", - "ark-std", - "array-bytes", - "ckb-merkle-mountain-range", - "clap", - "etf-crypto-primitives 0.2.4 (git+https://github.com/ideal-lab5/etf-sdk/?branch=tony/dev)", - "frame-support", - "getrandom", - "hex", - "indicatif", - "parity-scale-codec", - "rand_chacha", - "rand_core", - "serde", - "serde_cbor", - "serde_json", - "sha3", - "sp-application-crypto", - "sp-consensus-beefy-etf", - "sp-core", - "sp-keyring", - "sp-runtime", - "subxt", - "subxt-signer", - "tokio", - "totp-rs", - "w3f-bls", + "cc", ] [[package]] -name = "no-std-net" -version = "0.6.0" +name = "quick-error" +version = "1.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43794a0ace135be66a25d3ae77d41b91615fb68ae937f904090203e81f755b65" +checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" [[package]] -name = "nodrop" -version = "0.1.14" +name = "quote" +version = "1.0.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72ef4a56884ca558e5ddb05a1d1e7e1bfd9a68d9ed024c21704cc98872dae1bb" +checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af" +dependencies = [ + "proc-macro2", +] [[package]] -name = "nohash-hasher" -version = "0.2.0" +name = "radium" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2bf50223579dc7cdcfb3bfcacf7069ff68243f8c363f62ffa99cf000a6b9c451" +checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" [[package]] -name = "nom" -version = "7.1.3" +name = "rand" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" dependencies = [ - "memchr", - "minimal-lexical", + "libc", + "rand_chacha", + "rand_core", ] [[package]] -name = "nu-ansi-term" -version = "0.46.0" +name = "rand_chacha" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" dependencies = [ - "overload", - "winapi", + "ppv-lite86", + "rand_core", ] [[package]] -name = "num-bigint" -version = "0.4.4" +name = "rand_core" +version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "608e7659b5c3d7cba262d894801b9ec9d00de989e8a82bd4bef91d08da45cdc0" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" dependencies = [ - "autocfg", - "num-integer", - "num-traits", + "getrandom", ] [[package]] -name = "num-format" -version = "0.4.4" +name = "rand_xorshift" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a652d9771a63711fd3c3deb670acfbe5c30a4072e664d7a3bf5a9e1056ac72c3" +checksum = "d25bf25ec5ae4a3f1b92f929810509a2f53d7dca2f50b794ff57e3face536c8f" dependencies = [ - "arrayvec 0.7.4", - "itoa", + "rand_core", ] [[package]] -name = "num-integer" -version = "0.1.46" +name = "ratatui" +version = "0.28.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" +checksum = "fdef7f9be5c0122f890d58bdf4d964349ba6a6161f705907526d891efabba57d" dependencies = [ - "num-traits", + "bitflags 2.5.0", + "cassowary", + "compact_str", + "crossterm", + "instability", + "itertools 0.13.0", + "lru 0.12.3", + "paste", + "strum 0.26.3", + "strum_macros 0.26.4", + "unicode-segmentation", + "unicode-truncate", + "unicode-width", ] [[package]] -name = "num-rational" -version = "0.4.1" +name = "rawpointer" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0638a1c9d0a3c0914158145bc76cff373a75a627e6ecbfb71cbe6f453a5a19b0" -dependencies = [ - "autocfg", - "num-bigint", - "num-integer", - "num-traits", -] +checksum = "60a357793950651c4ed0f3f52338f53b2f809f32d83a07f72909fa13e4c6c1e3" [[package]] -name = "num-traits" -version = "0.2.18" +name = "rayon" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da0df0e5185db44f69b44f26786fe401b6c293d1907744beaa7fa62b2e5a517a" +checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa" dependencies = [ - "autocfg", + "either", + "rayon-core", ] [[package]] -name = "num_cpus" -version = "1.16.0" +name = "rayon-core" +version = "1.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" +checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2" dependencies = [ - "hermit-abi", - "libc", + "crossbeam-deque", + "crossbeam-utils", ] [[package]] -name = "number_prefix" -version = "0.4.0" +name = "redox_syscall" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "830b246a0e5f20af87141b25c173cd1b609bd7779a4617d6ec582abaf90870f3" +checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" +dependencies = [ + "bitflags 1.3.2", +] [[package]] -name = "object" -version = "0.32.2" +name = "redox_users" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6a622008b6e321afc04970976f62ee297fdbaa6f95318ca343e3eebb9648441" +checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" dependencies = [ - "memchr", + "getrandom", + "libredox", + "thiserror", ] [[package]] -name = "once_cell" -version = "1.19.0" +name = "ref-cast" +version = "1.0.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" +checksum = "ccf0a6f84d5f1d581da8b41b47ec8600871962f2a528115b542b362d4b744931" +dependencies = [ + "ref-cast-impl", +] [[package]] -name = "opaque-debug" -version = "0.3.1" +name = "ref-cast-impl" +version = "1.0.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" +checksum = "bcc303e793d3734489387d205e9b186fac9c6cfacedd98cbb2e8a5943595f3e6" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.77", +] [[package]] -name = "openssl-probe" -version = "0.1.5" +name = "regalloc2" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" +checksum = "80535183cae11b149d618fbd3c37e38d7cda589d82d7769e196ca9a9042d7621" +dependencies = [ + "fxhash", + "log", + "slice-group-by", + "smallvec", +] [[package]] -name = "overload" -version = "0.1.1" +name = "regalloc2" +version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" +checksum = "ad156d539c879b7a24a363a2016d77961786e71f48f2e2fc8302a92abd2429a6" +dependencies = [ + "hashbrown 0.13.2", + "log", + "rustc-hash", + "slice-group-by", + "smallvec", +] [[package]] -name = "parity-bip39" -version = "2.0.1" +name = "regex" +version = "1.10.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e69bf016dc406eff7d53a7d3f7cf1c2e72c82b9088aac1118591e36dd2cd3e9" +checksum = "c117dbdfde9c8308975b6a18d71f3f385c89461f7b3fb054288ecf2a2058ba4c" dependencies = [ - "bitcoin_hashes 0.13.0", - "rand", - "rand_core", - "serde", - "unicode-normalization", + "aho-corasick", + "memchr", + "regex-automata 0.4.6", + "regex-syntax 0.8.3", ] [[package]] -name = "parity-scale-codec" -version = "3.6.12" +name = "regex-automata" +version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "306800abfa29c7f16596b5970a588435e3d5b3149683d00c12b699cc19f895ee" +checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" dependencies = [ - "arrayvec 0.7.4", - "bitvec", - "byte-slice-cast", - "bytes", - "impl-trait-for-tuples", - "parity-scale-codec-derive", - "serde", + "regex-syntax 0.6.29", ] [[package]] -name = "parity-scale-codec-derive" -version = "3.6.12" +name = "regex-automata" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d830939c76d294956402033aee57a6da7b438f2294eb94864c37b0569053a42c" +checksum = "86b83b8b9847f9bf95ef68afb0b8e6cdb80f498442f5179a29fad448fcc1eaea" dependencies = [ - "proc-macro-crate 3.1.0", - "proc-macro2", - "quote", - "syn 1.0.109", + "aho-corasick", + "memchr", + "regex-syntax 0.8.3", ] [[package]] -name = "parity-wasm" -version = "0.45.0" +name = "regex-syntax" +version = "0.6.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" + +[[package]] +name = "regex-syntax" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1ad0aff30c1da14b1254fcb2af73e1fa9a28670e584a626f53a369d0e157304" +checksum = "adad44e29e4c806119491a7f06f03de4d1af22c3a680dd47f1e6e179439d1f56" [[package]] -name = "parking" -version = "2.2.0" +name = "rfc6979" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb813b8af86854136c6922af0598d719255ecb2179515e6e7730d468f05c9cae" +checksum = "f8dd2a808d456c4a54e300a23e9f5a67e122c3024119acbfd73e3bf664491cb2" +dependencies = [ + "hmac 0.12.1", + "subtle", +] [[package]] -name = "parking_lot" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" +name = "ring" +version = "0.1.0" +source = "git+https://github.com/w3f/ring-proof#31658d1f5b88e106c969557c36c821aff46b2236" dependencies = [ - "lock_api", - "parking_lot_core", + "ark-ec", + "ark-ff 0.4.2", + "ark-poly", + "ark-serialize 0.4.2", + "ark-std 0.4.0", + "ark-transcript 0.0.2 (git+https://github.com/w3f/ring-vrf)", + "arrayvec 0.7.4", + "blake2", + "common", + "fflonk", ] [[package]] -name = "parking_lot_core" -version = "0.9.9" +name = "ring" +version = "0.17.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c42a9226546d68acdd9c0a280d17ce19bfe27a46bf68784e4066115788d008e" +checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d" dependencies = [ + "cc", "cfg-if", + "getrandom", "libc", - "redox_syscall", - "smallvec", - "windows-targets 0.48.5", + "spin", + "untrusted", + "windows-sys 0.52.0", ] [[package]] -name = "password-hash" -version = "0.5.0" +name = "rlp" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "346f04948ba92c43e8469c1ee6736c7563d71012b17d40745260fe106aac2166" +checksum = "bb919243f34364b6bd2fc10ef797edbfa75f33c252e7998527479c6d6b47e1ec" dependencies = [ - "base64ct", - "rand_core", - "subtle", + "bytes", + "rustc-hex", ] [[package]] -name = "paste" -version = "1.0.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de3145af08024dea9fa9914f381a17b8fc6034dfb00f3a84013f7ff43f29ed4c" - -[[package]] -name = "pbkdf2" -version = "0.12.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8ed6a7761f76e3b9f92dfb0a60a6a6477c61024b775147ff0973a02653abaf2" +name = "rococo-runtime-constants" +version = "7.0.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" dependencies = [ - "digest 0.10.7", - "password-hash", + "frame-support", + "polkadot-primitives", + "polkadot-runtime-common", + "smallvec", + "sp-core", + "sp-runtime", + "sp-weights", + "staging-xcm", + "staging-xcm-builder", ] [[package]] -name = "percent-encoding" -version = "2.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" - -[[package]] -name = "pin-project" -version = "1.1.5" +name = "ruint" +version = "1.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6bf43b791c5b9e34c3d182969b4abb522f9343702850a2e57f460d00d09b4b3" +checksum = "2c3cc4c2511671f327125da14133d0c5c5d137f006a1017a16f557bc85b16286" dependencies = [ - "pin-project-internal", + "alloy-rlp", + "ark-ff 0.3.0", + "ark-ff 0.4.2", + "bytes", + "fastrlp", + "num-bigint", + "num-traits", + "parity-scale-codec", + "primitive-types", + "proptest", + "rand", + "rlp", + "ruint-macro", + "serde", + "valuable", + "zeroize", ] [[package]] -name = "pin-project-internal" -version = "1.1.5" +name = "ruint-macro" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.60", -] +checksum = "48fd7bd8a6377e15ad9d42a8ec25371b94ddc67abe7c8b9127bec79bebaaae18" [[package]] -name = "pin-project-lite" -version = "0.2.14" +name = "rustc-demangle" +version = "0.1.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02" +checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" [[package]] -name = "pin-utils" -version = "0.1.0" +name = "rustc-hash" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" +checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" [[package]] -name = "piper" -version = "0.2.1" +name = "rustc-hex" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "668d31b1c4eba19242f2088b2bf3316b82ca31082a8335764db4e083db7485d4" -dependencies = [ - "atomic-waker", - "fastrand", - "futures-io", -] +checksum = "3e75f6a532d0fd9f7f13144f392b6ad56a32696bfcd9c78f797f16bbb6f072d6" [[package]] -name = "pkcs8" -version = "0.10.2" +name = "rustc_version" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" +checksum = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a" dependencies = [ - "der", - "spki", + "semver 0.9.0", ] [[package]] -name = "platforms" -version = "3.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db23d408679286588f4d4644f965003d056e3dd5abcaaa938116871d7ce2fee7" - -[[package]] -name = "polkadot-ckb-merkle-mountain-range" -version = "0.7.0" +name = "rustc_version" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4b44320e5f7ce2c18227537a3032ae5b2c476a7e8eddba45333e1011fc31b92" +checksum = "f0dfe2087c51c460008730de8b57e6a320782fbfb312e1f4d520e6c6fae155ee" dependencies = [ - "cfg-if", - "itertools 0.10.5", + "semver 0.11.0", ] [[package]] -name = "polkavm-common" -version = "0.9.0" +name = "rustc_version" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d9428a5cfcc85c5d7b9fc4b6a18c4b802d0173d768182a51cc7751640f08b92" +checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" +dependencies = [ + "semver 1.0.22", +] [[package]] -name = "polkavm-derive" -version = "0.9.1" +name = "rustix" +version = "0.36.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae8c4bea6f3e11cd89bb18bcdddac10bd9a24015399bd1c485ad68a985a19606" +checksum = "305efbd14fde4139eb501df5f136994bb520b033fa9fbdce287507dc23b8c7ed" dependencies = [ - "polkavm-derive-impl-macro", + "bitflags 1.3.2", + "errno", + "io-lifetimes", + "libc", + "linux-raw-sys 0.1.4", + "windows-sys 0.45.0", ] [[package]] -name = "polkavm-derive-impl" -version = "0.9.0" +name = "rustix" +version = "0.38.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c4fdfc49717fb9a196e74a5d28e0bc764eb394a2c803eb11133a31ac996c60c" +checksum = "70dc5ec042f7a43c4a73241207cecc9873a06d45debb38b329f8541d85c2730f" dependencies = [ - "polkavm-common", - "proc-macro2", - "quote", - "syn 2.0.60", + "bitflags 2.5.0", + "errno", + "libc", + "linux-raw-sys 0.4.13", + "windows-sys 0.52.0", ] [[package]] -name = "polkavm-derive-impl-macro" -version = "0.9.0" +name = "rustls" +version = "0.21.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ba81f7b5faac81e528eb6158a6f3c9e0bb1008e0ffa19653bc8dea925ecb429" +checksum = "7fecbfb7b1444f477b345853b1fce097a2c6fb637b2bfb87e6bc5db0f043fae4" dependencies = [ - "polkavm-derive-impl", - "syn 2.0.60", + "log", + "ring 0.17.8", + "rustls-webpki 0.101.7", + "sct", ] [[package]] -name = "polling" -version = "3.7.0" +name = "rustls" +version = "0.22.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "645493cf344456ef24219d02a768cf1fb92ddf8c92161679ae3d91b91a637be3" +checksum = "bf4ef73721ac7bcd79b2b315da7779d8fc09718c6b3d2d1b2d94850eb8c18432" dependencies = [ - "cfg-if", - "concurrent-queue", - "hermit-abi", - "pin-project-lite", - "rustix", - "tracing", - "windows-sys 0.52.0", + "log", + "ring 0.17.8", + "rustls-pki-types", + "rustls-webpki 0.102.3", + "subtle", + "zeroize", ] [[package]] -name = "poly1305" -version = "0.8.0" +name = "rustls-native-certs" +version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8159bd90725d2df49889a078b54f4f79e87f1f8a8444194cdca81d38f5393abf" +checksum = "a9aace74cb666635c918e9c12bc0d348266037aa8eb599b5cba565709a8dff00" dependencies = [ - "cpufeatures", - "opaque-debug", - "universal-hash", + "openssl-probe", + "rustls-pemfile 1.0.4", + "schannel", + "security-framework", ] [[package]] -name = "polyval" -version = "0.6.2" +name = "rustls-native-certs" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d1fe60d06143b2430aa532c94cfe9e29783047f06c0d7fd359a9a51b729fa25" +checksum = "8f1fb85efa936c42c6d5fc28d2629bb51e4b2f4b8a5211e297d599cc5a093792" dependencies = [ - "cfg-if", - "cpufeatures", - "opaque-debug", - "universal-hash", + "openssl-probe", + "rustls-pemfile 2.1.2", + "rustls-pki-types", + "schannel", + "security-framework", ] [[package]] -name = "portable-atomic" -version = "1.6.0" +name = "rustls-pemfile" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7170ef9988bc169ba16dd36a7fa041e5c4cbeb6a35b76d4c03daded371eae7c0" +checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" +dependencies = [ + "base64 0.21.7", +] [[package]] -name = "ppv-lite86" -version = "0.2.17" +name = "rustls-pemfile" +version = "2.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" +checksum = "29993a25686778eb88d4189742cd713c9bce943bc54251a33509dc63cbacf73d" +dependencies = [ + "base64 0.22.0", + "rustls-pki-types", +] [[package]] -name = "prettier-please" -version = "0.2.0" +name = "rustls-pki-types" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22020dfcf177fcc7bf5deaf7440af371400c67c0de14c399938d8ed4fb4645d3" -dependencies = [ - "proc-macro2", - "syn 2.0.60", -] +checksum = "beb461507cee2c2ff151784c52762cf4d9ff6a61f3e80968600ed24fa837fa54" [[package]] -name = "primitive-types" -version = "0.12.2" +name = "rustls-webpki" +version = "0.101.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b34d9fd68ae0b74a41b21c03c2f62847aa0ffea044eee893b4c140b37e244e2" +checksum = "8b6275d1ee7a1cd780b64aca7726599a1dbc893b1e64144529e55c3c2f745765" dependencies = [ - "fixed-hash", - "impl-codec", - "impl-serde", - "scale-info", - "uint", + "ring 0.17.8", + "untrusted", ] [[package]] -name = "proc-macro-crate" -version = "1.3.1" +name = "rustls-webpki" +version = "0.102.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f4c021e1093a56626774e81216a4ce732a735e5bad4868a03f3ed65ca0c3919" +checksum = "f3bce581c0dd41bce533ce695a1437fa16a7ab5ac3ccfa99fe1a620a7885eabf" dependencies = [ - "once_cell", - "toml_edit 0.19.15", + "ring 0.17.8", + "rustls-pki-types", + "untrusted", ] [[package]] -name = "proc-macro-crate" -version = "3.1.0" +name = "rustversion" +version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d37c51ca738a55da99dc0c4a34860fd675453b8b36209178c2249bb13651284" -dependencies = [ - "toml_edit 0.21.1", -] +checksum = "80af6f9131f277a45a3fba6ce8e2258037bb0477a67e610d3c1fe046ab31de47" [[package]] -name = "proc-macro-error" -version = "1.0.4" +name = "rusty-fork" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" +checksum = "cb3dcc6e454c328bb824492db107ab7c0ae8fcffe4ad210136ef014458c1bc4f" dependencies = [ - "proc-macro-error-attr", - "proc-macro2", - "quote", - "syn 1.0.109", - "version_check", + "fnv", + "quick-error", + "tempfile", + "wait-timeout", ] [[package]] -name = "proc-macro-error-attr" -version = "1.0.4" +name = "ruzstd" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" +checksum = "58c4eb8a81997cf040a091d1f7e1938aeab6749d3a0dfa73af43cdc32393483d" dependencies = [ - "proc-macro2", - "quote", - "version_check", + "byteorder", + "derive_more", + "twox-hash", ] [[package]] -name = "proc-macro-warning" -version = "1.0.2" +name = "ryu" +version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "834da187cfe638ae8abb0203f0b33e5ccdb02a28e7199f2f47b3e2754f50edca" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.60", -] +checksum = "e86697c916019a8588c99b5fac3cead74ec0b4b819707a682fd4d23fa0ce1ba1" [[package]] -name = "proc-macro2" -version = "1.0.81" +name = "safe-mix" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d1597b0c024618f09a9c3b8655b7e430397a36d23fdafec26d6965e9eec3eba" +checksum = "6d3d055a2582e6b00ed7a31c1524040aa391092bf636328350813f3a0605215c" dependencies = [ - "unicode-ident", + "rustc_version 0.2.3", ] [[package]] -name = "quote" -version = "1.0.36" +name = "safe_arch" +version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7" +checksum = "c3460605018fdc9612bce72735cba0d27efbcd9904780d44c7e3a9948f96148a" dependencies = [ - "proc-macro2", + "bytemuck", ] [[package]] -name = "radium" -version = "0.7.0" +name = "same-file" +version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] [[package]] -name = "rand" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +name = "sc-allocator" +version = "23.0.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" dependencies = [ - "libc", - "rand_chacha", - "rand_core", + "log", + "sp-core", + "sp-wasm-interface 20.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", + "thiserror", ] [[package]] -name = "rand_chacha" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +name = "sc-executor" +version = "0.32.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" dependencies = [ - "ppv-lite86", - "rand_core", + "parity-scale-codec", + "parking_lot", + "sc-executor-common", + "sc-executor-polkavm", + "sc-executor-wasmtime", + "schnellru", + "sp-api", + "sp-core", + "sp-externalities 0.25.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", + "sp-io", + "sp-panic-handler", + "sp-runtime-interface 24.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", + "sp-trie", + "sp-version", + "sp-wasm-interface 20.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", + "tracing", ] [[package]] -name = "rand_core" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +name = "sc-executor-common" +version = "0.29.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" dependencies = [ - "getrandom", + "polkavm", + "sc-allocator", + "sp-maybe-compressed-blob", + "sp-wasm-interface 20.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", + "thiserror", + "wasm-instrument", ] [[package]] -name = "rayon" -version = "1.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa" +name = "sc-executor-polkavm" +version = "0.29.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" dependencies = [ - "either", - "rayon-core", + "log", + "polkavm", + "sc-executor-common", + "sp-wasm-interface 20.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", ] [[package]] -name = "rayon-core" -version = "1.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2" +name = "sc-executor-wasmtime" +version = "0.29.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" dependencies = [ - "crossbeam-deque", - "crossbeam-utils", + "anyhow", + "cfg-if", + "libc", + "log", + "parking_lot", + "rustix 0.36.17", + "sc-allocator", + "sc-executor-common", + "sp-runtime-interface 24.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", + "sp-wasm-interface 20.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", + "wasmtime", ] [[package]] -name = "redox_syscall" -version = "0.4.1" +name = "scale-bits" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" +checksum = "662d10dcd57b1c2a3c41c9cf68f71fb09747ada1ea932ad961aca7e2ca28315f" dependencies = [ - "bitflags 1.3.2", + "parity-scale-codec", + "scale-info", + "scale-type-resolver", + "serde", ] [[package]] -name = "ref-cast" -version = "1.0.22" +name = "scale-decode" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4846d4c50d1721b1a3bef8af76924eef20d5e723647333798c1b519b3a9473f" +checksum = "afc79ba56a1c742f5aeeed1f1801f3edf51f7e818f0a54582cac6f131364ea7b" dependencies = [ - "ref-cast-impl", + "derive_more", + "parity-scale-codec", + "primitive-types", + "scale-bits", + "scale-decode-derive", + "scale-type-resolver", + "smallvec", ] [[package]] -name = "ref-cast-impl" -version = "1.0.22" +name = "scale-decode-derive" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5fddb4f8d99b0a2ebafc65a87a69a7b9875e4b1ae1f00db265d300ef7f28bccc" +checksum = "5398fdb3c7bea3cb419bac4983aadacae93fe1a7b5f693f4ebd98c3821aad7a5" dependencies = [ + "darling 0.14.4", "proc-macro2", "quote", - "syn 2.0.60", + "syn 1.0.109", ] [[package]] -name = "regex" -version = "1.10.4" +name = "scale-encode" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c117dbdfde9c8308975b6a18d71f3f385c89461f7b3fb054288ecf2a2058ba4c" +checksum = "628800925a33794fb5387781b883b5e14d130fece9af5a63613867b8de07c5c7" dependencies = [ - "aho-corasick", - "memchr", - "regex-automata 0.4.6", - "regex-syntax 0.8.3", + "derive_more", + "parity-scale-codec", + "primitive-types", + "scale-bits", + "scale-encode-derive", + "scale-type-resolver", + "smallvec", ] [[package]] -name = "regex-automata" -version = "0.1.10" +name = "scale-encode-derive" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" +checksum = "7a304e1af7cdfbe7a24e08b012721456cc8cecdedadc14b3d10513eada63233c" dependencies = [ - "regex-syntax 0.6.29", + "darling 0.14.4", + "proc-macro-crate 1.3.1", + "proc-macro2", + "quote", + "syn 1.0.109", ] [[package]] -name = "regex-automata" -version = "0.4.6" +name = "scale-info" +version = "2.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86b83b8b9847f9bf95ef68afb0b8e6cdb80f498442f5179a29fad448fcc1eaea" +checksum = "7c453e59a955f81fb62ee5d596b450383d699f152d350e9d23a0db2adb78e4c0" dependencies = [ - "aho-corasick", - "memchr", - "regex-syntax 0.8.3", + "bitvec", + "cfg-if", + "derive_more", + "parity-scale-codec", + "scale-info-derive", + "serde", ] [[package]] -name = "regex-syntax" -version = "0.6.29" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" - -[[package]] -name = "regex-syntax" -version = "0.8.3" +name = "scale-info-derive" +version = "2.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adad44e29e4c806119491a7f06f03de4d1af22c3a680dd47f1e6e179439d1f56" +checksum = "18cf6c6447f813ef19eb450e985bcce6705f9ce7660db221b59093d15c79c4b7" +dependencies = [ + "proc-macro-crate 1.3.1", + "proc-macro2", + "quote", + "syn 1.0.109", +] [[package]] -name = "rfc6979" -version = "0.4.0" +name = "scale-type-resolver" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8dd2a808d456c4a54e300a23e9f5a67e122c3024119acbfd73e3bf664491cb2" +checksum = "10b800069bfd43374e0f96f653e0d46882a2cb16d6d961ac43bea80f26c76843" dependencies = [ - "hmac 0.12.1", - "subtle", + "scale-info", + "smallvec", ] [[package]] -name = "ring" -version = "0.1.0" -source = "git+https://github.com/w3f/ring-proof#b273d33f9981e2bb3375ab45faeb537f7ee35224" -dependencies = [ - "ark-ec", - "ark-ff", - "ark-poly", - "ark-serialize", - "ark-std", - "blake2", - "common", - "fflonk", - "merlin", +name = "scale-typegen" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d470fa75e71b12b3244a4113adc4bc49891f3daba2054703cacd06256066397e" +dependencies = [ + "proc-macro2", + "quote", + "scale-info", + "syn 2.0.77", + "thiserror", ] [[package]] -name = "ring" -version = "0.17.8" +name = "scale-value" +version = "0.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d" +checksum = "c07ccfee963104335c971aaf8b7b0e749be8569116322df23f1f75c4ca9e4a28" dependencies = [ - "cc", - "cfg-if", - "getrandom", - "libc", - "spin", - "untrusted", - "windows-sys 0.52.0", + "base58", + "blake2", + "derive_more", + "either", + "frame-metadata 15.1.0", + "parity-scale-codec", + "scale-bits", + "scale-decode", + "scale-encode", + "scale-info", + "scale-type-resolver", + "serde", + "yap", ] [[package]] -name = "rustc-demangle" +name = "schannel" version = "0.1.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" +checksum = "fbc91545643bcf3a0bbb6569265615222618bdf33ce4ffbbd13c4bbd4c093534" +dependencies = [ + "windows-sys 0.52.0", +] [[package]] -name = "rustc-hash" -version = "1.1.0" +name = "schnellru" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" +checksum = "772575a524feeb803e5b0fcbc6dd9f367e579488197c94c6e4023aad2305774d" +dependencies = [ + "ahash 0.8.11", + "cfg-if", + "hashbrown 0.13.2", +] [[package]] -name = "rustc-hex" -version = "2.1.0" +name = "schnorrkel" +version = "0.11.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e75f6a532d0fd9f7f13144f392b6ad56a32696bfcd9c78f797f16bbb6f072d6" +checksum = "8de18f6d8ba0aad7045f5feae07ec29899c1112584a38509a84ad7b04451eaa0" +dependencies = [ + "aead", + "arrayref", + "arrayvec 0.7.4", + "curve25519-dalek", + "getrandom_or_panic", + "merlin", + "rand_core", + "serde_bytes", + "sha2 0.10.8", + "subtle", + "zeroize", +] [[package]] -name = "rustc_version" -version = "0.4.0" +name = "scopeguard" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" -dependencies = [ - "semver", -] +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" [[package]] -name = "rustix" -version = "0.38.34" +name = "scratch" +version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70dc5ec042f7a43c4a73241207cecc9873a06d45debb38b329f8541d85c2730f" -dependencies = [ - "bitflags 2.5.0", - "errno", - "libc", - "linux-raw-sys", - "windows-sys 0.52.0", -] +checksum = "a3cf7c11c38cb994f3d40e8a8cde3bbd1f72a435e4c49e85d6553d8312306152" [[package]] -name = "rustls" -version = "0.21.11" +name = "sct" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fecbfb7b1444f477b345853b1fce097a2c6fb637b2bfb87e6bc5db0f043fae4" +checksum = "da046153aa2352493d6cb7da4b6e5c0c057d8a1d0a9aa8560baffdd945acd414" dependencies = [ - "log", "ring 0.17.8", - "rustls-webpki 0.101.7", - "sct", + "untrusted", ] [[package]] -name = "rustls" -version = "0.22.4" +name = "sec1" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf4ef73721ac7bcd79b2b315da7779d8fc09718c6b3d2d1b2d94850eb8c18432" +checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc" dependencies = [ - "log", - "ring 0.17.8", - "rustls-pki-types", - "rustls-webpki 0.102.3", + "base16ct", + "der", + "generic-array", + "pkcs8", + "serdect", "subtle", "zeroize", ] [[package]] -name = "rustls-native-certs" -version = "0.6.3" +name = "secp256k1" +version = "0.28.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9aace74cb666635c918e9c12bc0d348266037aa8eb599b5cba565709a8dff00" +checksum = "d24b59d129cdadea20aea4fb2352fa053712e5d713eee47d700cd4b2bc002f10" dependencies = [ - "openssl-probe", - "rustls-pemfile 1.0.4", - "schannel", - "security-framework", + "secp256k1-sys", ] [[package]] -name = "rustls-native-certs" -version = "0.7.0" +name = "secp256k1-sys" +version = "0.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f1fb85efa936c42c6d5fc28d2629bb51e4b2f4b8a5211e297d599cc5a093792" +checksum = "e5d1746aae42c19d583c3c1a8c646bfad910498e2051c551a7f2e3c0c9fbb7eb" dependencies = [ - "openssl-probe", - "rustls-pemfile 2.1.2", - "rustls-pki-types", - "schannel", - "security-framework", + "cc", ] [[package]] -name = "rustls-pemfile" -version = "1.0.4" +name = "secrecy" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" +checksum = "9bd1c54ea06cfd2f6b63219704de0b9b4f72dcc2b8fdef820be6cd799780e91e" dependencies = [ - "base64 0.21.7", + "zeroize", ] [[package]] -name = "rustls-pemfile" -version = "2.1.2" +name = "security-framework" +version = "2.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29993a25686778eb88d4189742cd713c9bce943bc54251a33509dc63cbacf73d" +checksum = "770452e37cad93e0a50d5abc3990d2bc351c36d0328f86cefec2f2fb206eaef6" dependencies = [ - "base64 0.22.0", - "rustls-pki-types", + "bitflags 1.3.2", + "core-foundation", + "core-foundation-sys", + "libc", + "security-framework-sys", ] [[package]] -name = "rustls-pki-types" -version = "1.5.0" +name = "security-framework-sys" +version = "2.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "beb461507cee2c2ff151784c52762cf4d9ff6a61f3e80968600ed24fa837fa54" +checksum = "41f3cc463c0ef97e11c3461a9d3787412d30e8e7eb907c79180c4a57bf7c04ef" +dependencies = [ + "core-foundation-sys", + "libc", +] [[package]] -name = "rustls-webpki" -version = "0.101.7" +name = "semver" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b6275d1ee7a1cd780b64aca7726599a1dbc893b1e64144529e55c3c2f745765" +checksum = "7a3186ec9e65071a2095434b1f5bb24838d4e8e130f584c790f6033c79943537" dependencies = [ - "ring 0.17.8", - "untrusted", + "semver-parser 0.7.0", ] [[package]] -name = "rustls-webpki" -version = "0.102.3" +name = "semver" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3bce581c0dd41bce533ce695a1437fa16a7ab5ac3ccfa99fe1a620a7885eabf" +checksum = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403" dependencies = [ - "ring 0.17.8", - "rustls-pki-types", - "untrusted", + "semver-parser 0.7.0", ] [[package]] -name = "rustversion" -version = "1.0.15" +name = "semver" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80af6f9131f277a45a3fba6ce8e2258037bb0477a67e610d3c1fe046ab31de47" +checksum = "f301af10236f6df4160f7c3f04eec6dbc70ace82d23326abad5edee88801c6b6" +dependencies = [ + "semver-parser 0.10.2", +] [[package]] -name = "ruzstd" -version = "0.5.0" +name = "semver" +version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "58c4eb8a81997cf040a091d1f7e1938aeab6749d3a0dfa73af43cdc32393483d" +checksum = "92d43fe69e652f3df9bdc2b85b2854a0825b86e4fb76bc44d945137d053639ca" dependencies = [ - "byteorder", - "derive_more", - "twox-hash", + "serde", ] [[package]] -name = "ryu" -version = "1.0.17" +name = "semver-parser" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e86697c916019a8588c99b5fac3cead74ec0b4b819707a682fd4d23fa0ce1ba1" +checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" [[package]] -name = "same-file" -version = "1.0.6" +name = "semver-parser" +version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +checksum = "00b0bef5b7f9e0df16536d3961cfb6e84331c065b4066afb39768d0e319411f7" dependencies = [ - "winapi-util", + "pest", ] [[package]] -name = "scale-bits" -version = "0.5.0" +name = "serde" +version = "1.0.210" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "662d10dcd57b1c2a3c41c9cf68f71fb09747ada1ea932ad961aca7e2ca28315f" +checksum = "c8e3592472072e6e22e0a54d5904d9febf8508f65fb8552499a1abc7d1078c3a" dependencies = [ - "parity-scale-codec", - "scale-info", - "scale-type-resolver", - "serde", + "serde_derive", ] [[package]] -name = "scale-decode" -version = "0.11.1" +name = "serde-big-array" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "afc79ba56a1c742f5aeeed1f1801f3edf51f7e818f0a54582cac6f131364ea7b" +checksum = "cd31f59f6fe2b0c055371bb2f16d7f0aa7d8881676c04a55b1596d1a17cd10a4" dependencies = [ - "derive_more", - "parity-scale-codec", - "primitive-types", - "scale-bits", - "scale-decode-derive", - "scale-type-resolver", - "smallvec", + "serde", ] [[package]] -name = "scale-decode-derive" -version = "0.11.1" +name = "serde_bytes" +version = "0.11.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5398fdb3c7bea3cb419bac4983aadacae93fe1a7b5f693f4ebd98c3821aad7a5" +checksum = "8b8497c313fd43ab992087548117643f6fcd935cbf36f176ffda0aacf9591734" dependencies = [ - "darling 0.14.4", - "proc-macro2", - "quote", - "syn 1.0.109", + "serde", ] [[package]] -name = "scale-encode" -version = "0.6.0" +name = "serde_cbor" +version = "0.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "628800925a33794fb5387781b883b5e14d130fece9af5a63613867b8de07c5c7" +checksum = "2bef2ebfde456fb76bbcf9f59315333decc4fda0b2b44b420243c11e0f5ec1f5" dependencies = [ - "derive_more", - "parity-scale-codec", - "primitive-types", - "scale-bits", - "scale-encode-derive", - "scale-type-resolver", - "smallvec", + "half", + "serde", ] -[[package]] -name = "scale-encode-derive" -version = "0.6.0" +[[package]] +name = "serde_derive" +version = "1.0.210" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a304e1af7cdfbe7a24e08b012721456cc8cecdedadc14b3d10513eada63233c" +checksum = "243902eda00fad750862fc144cea25caca5e20d615af0a81bee94ca738f1df1f" dependencies = [ - "darling 0.14.4", - "proc-macro-crate 1.3.1", "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.77", ] [[package]] -name = "scale-info" -version = "2.11.2" +name = "serde_json" +version = "1.0.116" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c453e59a955f81fb62ee5d596b450383d699f152d350e9d23a0db2adb78e4c0" +checksum = "3e17db7126d17feb94eb3fad46bf1a96b034e8aacbc2e775fe81505f8b0b2813" dependencies = [ - "bitvec", - "cfg-if", - "derive_more", - "parity-scale-codec", - "scale-info-derive", + "itoa", + "ryu", "serde", ] [[package]] -name = "scale-info-derive" -version = "2.11.2" +name = "serde_spanned" +version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18cf6c6447f813ef19eb450e985bcce6705f9ce7660db221b59093d15c79c4b7" +checksum = "eb3622f419d1296904700073ea6cc23ad690adbd66f13ea683df73298736f0c1" dependencies = [ - "proc-macro-crate 1.3.1", - "proc-macro2", - "quote", - "syn 1.0.109", + "serde", ] [[package]] -name = "scale-type-resolver" -version = "0.1.1" +name = "serdect" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10b800069bfd43374e0f96f653e0d46882a2cb16d6d961ac43bea80f26c76843" +checksum = "a84f14a19e9a014bb9f4512488d9829a68e04ecabffb0f9904cd1ace94598177" dependencies = [ - "scale-info", - "smallvec", + "base16ct", + "serde", ] [[package]] -name = "scale-typegen" -version = "0.2.1" +name = "sha-1" +version = "0.9.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d470fa75e71b12b3244a4113adc4bc49891f3daba2054703cacd06256066397e" +checksum = "99cd6713db3cf16b6c84e06321e049a9b9f699826e16096d23bbcc44d15d51a6" dependencies = [ - "proc-macro2", - "quote", - "scale-info", - "syn 2.0.60", - "thiserror", + "block-buffer 0.9.0", + "cfg-if", + "cpufeatures", + "digest 0.9.0", + "opaque-debug", ] [[package]] -name = "scale-value" -version = "0.14.1" +name = "sha1" +version = "0.10.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c07ccfee963104335c971aaf8b7b0e749be8569116322df23f1f75c4ca9e4a28" +checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" dependencies = [ - "base58", - "blake2", - "derive_more", - "either", - "frame-metadata 15.1.0", - "parity-scale-codec", - "scale-bits", - "scale-decode", - "scale-encode", - "scale-info", - "scale-type-resolver", - "serde", - "yap", + "cfg-if", + "cpufeatures", + "digest 0.10.7", ] [[package]] -name = "schannel" -version = "0.1.23" +name = "sha2" +version = "0.9.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbc91545643bcf3a0bbb6569265615222618bdf33ce4ffbbd13c4bbd4c093534" +checksum = "4d58a1e1bf39749807d89cf2d98ac2dfa0ff1cb3faa38fbb64dd88ac8013d800" dependencies = [ - "windows-sys 0.52.0", + "block-buffer 0.9.0", + "cfg-if", + "cpufeatures", + "digest 0.9.0", + "opaque-debug", ] [[package]] -name = "schnellru" -version = "0.2.1" +name = "sha2" +version = "0.10.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "772575a524feeb803e5b0fcbc6dd9f367e579488197c94c6e4023aad2305774d" +checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" dependencies = [ - "ahash", "cfg-if", - "hashbrown 0.13.2", + "cpufeatures", + "digest 0.10.7", ] [[package]] -name = "schnorrkel" -version = "0.11.4" +name = "sha3" +version = "0.10.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8de18f6d8ba0aad7045f5feae07ec29899c1112584a38509a84ad7b04451eaa0" +checksum = "75872d278a8f37ef87fa0ddbda7802605cb18344497949862c0d4dcb291eba60" dependencies = [ - "aead", - "arrayref", - "arrayvec 0.7.4", - "curve25519-dalek", - "getrandom_or_panic", - "merlin", - "rand_core", - "serde_bytes", - "sha2 0.10.8", - "subtle", - "zeroize", + "digest 0.10.7", + "keccak", ] [[package]] -name = "scopeguard" -version = "1.2.0" +name = "sharded-slab" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" +checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" +dependencies = [ + "lazy_static", +] [[package]] -name = "sct" -version = "0.7.1" +name = "signal-hook" +version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da046153aa2352493d6cb7da4b6e5c0c057d8a1d0a9aa8560baffdd945acd414" +checksum = "8621587d4798caf8eb44879d42e56b9a93ea5dcd315a6487c357130095b62801" dependencies = [ - "ring 0.17.8", - "untrusted", + "libc", + "signal-hook-registry", ] [[package]] -name = "sec1" -version = "0.7.3" +name = "signal-hook-mio" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc" +checksum = "34db1a06d485c9142248b7a054f034b349b212551f3dfd19c94d45a754a217cd" dependencies = [ - "base16ct", - "der", - "generic-array", - "pkcs8", - "serdect", - "subtle", - "zeroize", + "libc", + "mio 1.0.2", + "signal-hook", ] [[package]] -name = "secp256k1" -version = "0.28.2" +name = "signal-hook-registry" +version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d24b59d129cdadea20aea4fb2352fa053712e5d713eee47d700cd4b2bc002f10" +checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1" dependencies = [ - "secp256k1-sys", + "libc", ] [[package]] -name = "secp256k1-sys" -version = "0.9.2" +name = "signature" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5d1746aae42c19d583c3c1a8c646bfad910498e2051c551a7f2e3c0c9fbb7eb" +checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" dependencies = [ - "cc", + "digest 0.10.7", + "rand_core", ] [[package]] -name = "secrecy" -version = "0.8.0" +name = "simba" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9bd1c54ea06cfd2f6b63219704de0b9b4f72dcc2b8fdef820be6cd799780e91e" +checksum = "061507c94fc6ab4ba1c9a0305018408e312e17c041eb63bef8aa726fa33aceae" dependencies = [ - "zeroize", + "approx", + "num-complex", + "num-traits", + "paste", + "wide", ] [[package]] -name = "security-framework" -version = "2.10.0" +name = "simple-mermaid" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "770452e37cad93e0a50d5abc3990d2bc351c36d0328f86cefec2f2fb206eaef6" +checksum = "620a1d43d70e142b1d46a929af51d44f383db9c7a2ec122de2cd992ccfcf3c18" + +[[package]] +name = "siphasher" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56199f7ddabf13fe5074ce809e7d3f42b42ae711800501b5b16ea82ad029c39d" + +[[package]] +name = "slab" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" dependencies = [ - "bitflags 1.3.2", - "core-foundation", - "core-foundation-sys", - "libc", - "security-framework-sys", + "autocfg", ] [[package]] -name = "security-framework-sys" -version = "2.10.0" +name = "slice-group-by" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41f3cc463c0ef97e11c3461a9d3787412d30e8e7eb907c79180c4a57bf7c04ef" +checksum = "826167069c09b99d56f31e9ae5c99049e932a98c9dc2dac47645b08dbbf76ba7" + +[[package]] +name = "slot-range-helper" +version = "7.0.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" dependencies = [ - "core-foundation-sys", - "libc", + "enumn", + "parity-scale-codec", + "paste", + "sp-runtime", + "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", ] [[package]] -name = "semver" -version = "1.0.22" +name = "smallvec" +version = "1.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92d43fe69e652f3df9bdc2b85b2854a0825b86e4fb76bc44d945137d053639ca" +checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" [[package]] -name = "serde" -version = "1.0.198" +name = "smol" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9846a40c979031340571da2545a4e5b7c4163bdae79b301d5f86d03979451fcc" +checksum = "e635339259e51ef85ac7aa29a1cd991b957047507288697a690e80ab97d07cad" dependencies = [ - "serde_derive", + "async-channel", + "async-executor", + "async-fs", + "async-io", + "async-lock", + "async-net", + "async-process", + "blocking", + "futures-lite", ] [[package]] -name = "serde_bytes" -version = "0.11.14" +name = "smoldot" +version = "0.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b8497c313fd43ab992087548117643f6fcd935cbf36f176ffda0aacf9591734" +checksum = "e6d1eaa97d77be4d026a1e7ffad1bb3b78448763b357ea6f8188d3e6f736a9b9" dependencies = [ + "arrayvec 0.7.4", + "async-lock", + "atomic-take", + "base64 0.21.7", + "bip39", + "blake2-rfc", + "bs58", + "chacha20", + "crossbeam-queue", + "derive_more", + "ed25519-zebra", + "either", + "event-listener 4.0.3", + "fnv", + "futures-lite", + "futures-util", + "hashbrown 0.14.3", + "hex", + "hmac 0.12.1", + "itertools 0.12.1", + "libm", + "libsecp256k1", + "merlin", + "no-std-net", + "nom", + "num-bigint", + "num-rational", + "num-traits", + "pbkdf2", + "pin-project", + "poly1305", + "rand", + "rand_chacha", + "ruzstd", + "schnorrkel", "serde", + "serde_json", + "sha2 0.10.8", + "sha3", + "siphasher", + "slab", + "smallvec", + "soketto", + "twox-hash", + "wasmi 0.31.2", + "x25519-dalek", + "zeroize", ] [[package]] -name = "serde_cbor" -version = "0.11.2" +name = "smoldot-light" +version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2bef2ebfde456fb76bbcf9f59315333decc4fda0b2b44b420243c11e0f5ec1f5" +checksum = "5496f2d116b7019a526b1039ec2247dd172b8670633b1a64a614c9ea12c9d8c7" dependencies = [ - "half", + "async-channel", + "async-lock", + "base64 0.21.7", + "blake2-rfc", + "derive_more", + "either", + "event-listener 4.0.3", + "fnv", + "futures-channel", + "futures-lite", + "futures-util", + "hashbrown 0.14.3", + "hex", + "itertools 0.12.1", + "log", + "lru 0.12.3", + "no-std-net", + "parking_lot", + "pin-project", + "rand", + "rand_chacha", "serde", + "serde_json", + "siphasher", + "slab", + "smol", + "smoldot", + "zeroize", ] [[package]] -name = "serde_derive" -version = "1.0.198" +name = "snowbridge-amcl" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e88edab869b01783ba905e7d0153f9fc1a6505a96e4ad3018011eedb838566d9" +checksum = "460a9ed63cdf03c1b9847e8a12a5f5ba19c4efd5869e4a737e05be25d7c427e5" dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.60", + "parity-scale-codec", + "scale-info", ] [[package]] -name = "serde_json" -version = "1.0.116" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e17db7126d17feb94eb3fad46bf1a96b034e8aacbc2e775fe81505f8b0b2813" +name = "snowbridge-beacon-primitives" +version = "0.2.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" dependencies = [ - "itoa", - "ryu", + "byte-slice-cast", + "frame-support", + "hex", + "parity-scale-codec", + "rlp", + "scale-info", "serde", + "snowbridge-ethereum", + "snowbridge-milagro-bls", + "sp-core", + "sp-io", + "sp-runtime", + "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", + "ssz_rs", + "ssz_rs_derive", ] [[package]] -name = "serde_spanned" -version = "0.6.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb3622f419d1296904700073ea6cc23ad690adbd66f13ea683df73298736f0c1" +name = "snowbridge-core" +version = "0.2.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" dependencies = [ + "ethabi-decode", + "frame-support", + "frame-system", + "hex-literal", + "parity-scale-codec", + "polkadot-parachain-primitives", + "scale-info", "serde", + "snowbridge-beacon-primitives", + "sp-arithmetic", + "sp-core", + "sp-io", + "sp-runtime", + "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", + "staging-xcm", + "staging-xcm-builder", ] [[package]] -name = "serdect" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a84f14a19e9a014bb9f4512488d9829a68e04ecabffb0f9904cd1ace94598177" +name = "snowbridge-ethereum" +version = "0.3.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" dependencies = [ - "base16ct", + "ethabi-decode", + "ethbloom", + "ethereum-types", + "hex-literal", + "parity-bytes", + "parity-scale-codec", + "rlp", + "scale-info", "serde", + "serde-big-array", + "sp-io", + "sp-runtime", + "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", ] [[package]] -name = "sha-1" -version = "0.9.8" +name = "snowbridge-milagro-bls" +version = "1.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99cd6713db3cf16b6c84e06321e049a9b9f699826e16096d23bbcc44d15d51a6" +checksum = "026aa8638f690a53e3f7676024b9e913b1cab0111d1b7b92669d40a188f9d7e6" dependencies = [ - "block-buffer 0.9.0", - "cfg-if", - "cpufeatures", - "digest 0.9.0", - "opaque-debug", + "hex", + "lazy_static", + "parity-scale-codec", + "rand", + "scale-info", + "snowbridge-amcl", + "zeroize", ] [[package]] -name = "sha1" -version = "0.10.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" +name = "snowbridge-outbound-queue-merkle-tree" +version = "0.3.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" dependencies = [ - "cfg-if", - "cpufeatures", - "digest 0.10.7", + "parity-scale-codec", + "scale-info", + "sp-core", + "sp-runtime", ] [[package]] -name = "sha2" -version = "0.9.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d58a1e1bf39749807d89cf2d98ac2dfa0ff1cb3faa38fbb64dd88ac8013d800" +name = "snowbridge-outbound-queue-runtime-api" +version = "0.2.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" dependencies = [ - "block-buffer 0.9.0", - "cfg-if", - "cpufeatures", - "digest 0.9.0", - "opaque-debug", + "frame-support", + "parity-scale-codec", + "snowbridge-core", + "snowbridge-outbound-queue-merkle-tree", + "sp-api", + "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", ] [[package]] -name = "sha2" -version = "0.10.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" +name = "snowbridge-pallet-ethereum-client" +version = "0.2.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" dependencies = [ - "cfg-if", - "cpufeatures", - "digest 0.10.7", + "frame-benchmarking", + "frame-support", + "frame-system", + "log", + "pallet-timestamp", + "parity-scale-codec", + "scale-info", + "serde", + "snowbridge-beacon-primitives", + "snowbridge-core", + "snowbridge-ethereum", + "snowbridge-pallet-ethereum-client-fixtures", + "sp-core", + "sp-io", + "sp-runtime", + "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", + "static_assertions", ] [[package]] -name = "sha3" -version = "0.10.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75872d278a8f37ef87fa0ddbda7802605cb18344497949862c0d4dcb291eba60" +name = "snowbridge-pallet-ethereum-client-fixtures" +version = "0.9.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" dependencies = [ - "digest 0.10.7", - "keccak", + "hex-literal", + "snowbridge-beacon-primitives", + "snowbridge-core", + "sp-core", + "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", ] [[package]] -name = "sharded-slab" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" +name = "snowbridge-pallet-inbound-queue" +version = "0.2.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" dependencies = [ - "lazy_static", + "alloy-primitives", + "alloy-sol-types", + "frame-benchmarking", + "frame-support", + "frame-system", + "log", + "pallet-balances", + "parity-scale-codec", + "scale-info", + "serde", + "snowbridge-beacon-primitives", + "snowbridge-core", + "snowbridge-pallet-inbound-queue-fixtures", + "snowbridge-router-primitives", + "sp-core", + "sp-io", + "sp-runtime", + "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", + "staging-xcm", + "staging-xcm-executor", ] [[package]] -name = "signal-hook-registry" -version = "1.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1" +name = "snowbridge-pallet-inbound-queue-fixtures" +version = "0.10.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" dependencies = [ - "libc", + "hex-literal", + "snowbridge-beacon-primitives", + "snowbridge-core", + "sp-core", + "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", ] [[package]] -name = "signature" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" +name = "snowbridge-pallet-outbound-queue" +version = "0.2.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" dependencies = [ - "digest 0.10.7", - "rand_core", + "bridge-hub-common", + "ethabi-decode", + "frame-benchmarking", + "frame-support", + "frame-system", + "parity-scale-codec", + "scale-info", + "serde", + "snowbridge-core", + "snowbridge-outbound-queue-merkle-tree", + "sp-arithmetic", + "sp-core", + "sp-io", + "sp-runtime", + "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", ] [[package]] -name = "simple-mermaid" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "620a1d43d70e142b1d46a929af51d44f383db9c7a2ec122de2cd992ccfcf3c18" - -[[package]] -name = "siphasher" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56199f7ddabf13fe5074ce809e7d3f42b42ae711800501b5b16ea82ad029c39d" - -[[package]] -name = "slab" -version = "0.4.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" +name = "snowbridge-pallet-system" +version = "0.2.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" dependencies = [ - "autocfg", + "frame-benchmarking", + "frame-support", + "frame-system", + "log", + "parity-scale-codec", + "scale-info", + "snowbridge-core", + "sp-core", + "sp-io", + "sp-runtime", + "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", + "staging-xcm", + "staging-xcm-executor", ] [[package]] -name = "smallvec" -version = "1.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" +name = "snowbridge-router-primitives" +version = "0.9.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +dependencies = [ + "frame-support", + "hex-literal", + "log", + "parity-scale-codec", + "scale-info", + "snowbridge-core", + "sp-core", + "sp-io", + "sp-runtime", + "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", + "staging-xcm", + "staging-xcm-executor", +] [[package]] -name = "smol" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e635339259e51ef85ac7aa29a1cd991b957047507288697a690e80ab97d07cad" +name = "snowbridge-runtime-common" +version = "0.2.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" dependencies = [ - "async-channel", - "async-executor", - "async-fs", - "async-io", - "async-lock", - "async-net", - "async-process", - "blocking", - "futures-lite", + "frame-support", + "log", + "parity-scale-codec", + "snowbridge-core", + "sp-arithmetic", + "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", + "staging-xcm", + "staging-xcm-builder", + "staging-xcm-executor", ] [[package]] -name = "smoldot" -version = "0.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6d1eaa97d77be4d026a1e7ffad1bb3b78448763b357ea6f8188d3e6f736a9b9" +name = "snowbridge-runtime-test-common" +version = "0.2.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" dependencies = [ - "arrayvec 0.7.4", - "async-lock", - "atomic-take", - "base64 0.21.7", - "bip39", - "blake2-rfc", - "bs58", - "chacha20", - "crossbeam-queue", - "derive_more", - "ed25519-zebra", - "either", - "event-listener 4.0.3", - "fnv", - "futures-lite", - "futures-util", - "hashbrown 0.14.3", - "hex", - "hmac 0.12.1", - "itertools 0.12.1", - "libm", - "libsecp256k1", - "merlin", - "no-std-net", - "nom", - "num-bigint", - "num-rational", - "num-traits", - "pbkdf2", - "pin-project", - "poly1305", - "rand", - "rand_chacha", - "ruzstd", - "schnorrkel", - "serde", - "serde_json", - "sha2 0.10.8", - "sha3", - "siphasher", - "slab", - "smallvec", - "soketto", - "twox-hash", - "wasmi", - "x25519-dalek", - "zeroize", + "cumulus-pallet-parachain-system", + "frame-support", + "frame-system", + "pallet-balances", + "pallet-collator-selection", + "pallet-message-queue", + "pallet-session", + "pallet-timestamp", + "pallet-utility", + "pallet-xcm", + "parachains-runtimes-test-utils", + "parity-scale-codec", + "snowbridge-core", + "snowbridge-pallet-ethereum-client", + "snowbridge-pallet-ethereum-client-fixtures", + "snowbridge-pallet-outbound-queue", + "snowbridge-pallet-system", + "sp-core", + "sp-io", + "sp-keyring", + "sp-runtime", + "staging-parachain-info", + "staging-xcm", + "staging-xcm-executor", ] [[package]] -name = "smoldot-light" -version = "0.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5496f2d116b7019a526b1039ec2247dd172b8670633b1a64a614c9ea12c9d8c7" +name = "snowbridge-system-runtime-api" +version = "0.2.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" dependencies = [ - "async-channel", - "async-lock", - "base64 0.21.7", - "blake2-rfc", - "derive_more", - "either", - "event-listener 4.0.3", - "fnv", - "futures-channel", - "futures-lite", - "futures-util", - "hashbrown 0.14.3", - "hex", - "itertools 0.12.1", - "log", - "lru", - "no-std-net", - "parking_lot", - "pin-project", - "rand", - "rand_chacha", - "serde", - "serde_json", - "siphasher", - "slab", - "smol", - "smoldot", - "zeroize", + "parity-scale-codec", + "snowbridge-core", + "sp-api", + "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", + "staging-xcm", ] [[package]] @@ -4212,7 +9606,7 @@ dependencies = [ "proc-macro-crate 3.1.0", "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.77", ] [[package]] @@ -4249,7 +9643,7 @@ version = "0.4.2" source = "git+https://github.com/paritytech/arkworks-substrate#caa2eed74beb885dd07c7db5f916f2281dad818f" dependencies = [ "ark-bls12-381-ext", - "sp-crypto-ec-utils", + "sp-crypto-ec-utils 0.10.0 (git+https://github.com/paritytech/polkadot-sdk)", ] [[package]] @@ -4258,7 +9652,102 @@ version = "0.4.2" source = "git+https://github.com/paritytech/arkworks-substrate#caa2eed74beb885dd07c7db5f916f2281dad818f" dependencies = [ "ark-ed-on-bls12-381-bandersnatch-ext", - "sp-crypto-ec-utils", + "sp-crypto-ec-utils 0.10.0 (git+https://github.com/paritytech/polkadot-sdk)", +] + +[[package]] +name = "sp-authority-discovery" +version = "26.0.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +dependencies = [ + "parity-scale-codec", + "scale-info", + "sp-api", + "sp-application-crypto", + "sp-runtime", +] + +[[package]] +name = "sp-block-builder" +version = "26.0.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +dependencies = [ + "sp-api", + "sp-inherents", + "sp-runtime", +] + +[[package]] +name = "sp-consensus-aura" +version = "0.32.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +dependencies = [ + "async-trait", + "parity-scale-codec", + "scale-info", + "sp-api", + "sp-application-crypto", + "sp-consensus-slots", + "sp-inherents", + "sp-runtime", + "sp-timestamp", +] + +[[package]] +name = "sp-consensus-babe" +version = "0.32.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +dependencies = [ + "async-trait", + "parity-scale-codec", + "scale-info", + "serde", + "sp-api", + "sp-application-crypto", + "sp-consensus-slots", + "sp-core", + "sp-inherents", + "sp-runtime", + "sp-timestamp", +] + +[[package]] +name = "sp-consensus-beefy" +version = "13.0.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +dependencies = [ + "lazy_static", + "parity-scale-codec", + "scale-info", + "serde", + "sp-api", + "sp-application-crypto", + "sp-core", + "sp-crypto-hashing 0.1.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", + "sp-io", + "sp-keystore", + "sp-mmr-primitives", + "sp-runtime", + "strum 0.26.3", +] + +[[package]] +name = "sp-consensus-beefy-etf" +version = "13.0.0" +dependencies = [ + "lazy_static", + "parity-scale-codec", + "scale-info", + "serde", + "sp-api", + "sp-application-crypto", + "sp-core", + "sp-crypto-hashing 0.1.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", + "sp-io", + "sp-keystore", + "sp-mmr-primitives", + "sp-runtime", + "strum 0.24.1", ] [[package]] @@ -4281,13 +9770,52 @@ dependencies = [ "strum 0.24.1", ] +[[package]] +name = "sp-consensus-grandpa" +version = "13.0.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +dependencies = [ + "finality-grandpa", + "log", + "parity-scale-codec", + "scale-info", + "serde", + "sp-api", + "sp-application-crypto", + "sp-core", + "sp-keystore", + "sp-runtime", +] + +[[package]] +name = "sp-consensus-pow" +version = "0.32.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +dependencies = [ + "parity-scale-codec", + "sp-api", + "sp-core", + "sp-runtime", +] + +[[package]] +name = "sp-consensus-slots" +version = "0.32.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +dependencies = [ + "parity-scale-codec", + "scale-info", + "serde", + "sp-timestamp", +] + [[package]] name = "sp-core" version = "28.0.0" source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" dependencies = [ - "ark-serialize", - "array-bytes", + "ark-serialize 0.4.2", + "array-bytes 6.2.2", "bandersnatch_vrfs", "bitflags 1.3.2", "blake2", @@ -4320,20 +9848,48 @@ dependencies = [ "sp-debug-derive 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", "sp-externalities 0.25.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", "sp-runtime-interface 24.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", - "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", - "sp-storage 19.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", - "ss58-registry", - "substrate-bip39", - "thiserror", - "tracing", - "w3f-bls", - "zeroize", + "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", + "sp-storage 19.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", + "ss58-registry", + "substrate-bip39", + "thiserror", + "tracing", + "w3f-bls", + "zeroize", +] + +[[package]] +name = "sp-core-hashing" +version = "15.0.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +dependencies = [ + "sp-crypto-hashing 0.1.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", +] + +[[package]] +name = "sp-crypto-ec-utils" +version = "0.10.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +dependencies = [ + "ark-bls12-377", + "ark-bls12-377-ext", + "ark-bls12-381", + "ark-bls12-381-ext", + "ark-bw6-761", + "ark-bw6-761-ext", + "ark-ec", + "ark-ed-on-bls12-377", + "ark-ed-on-bls12-377-ext", + "ark-ed-on-bls12-381-bandersnatch", + "ark-ed-on-bls12-381-bandersnatch-ext", + "ark-scale", + "sp-runtime-interface 24.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", ] [[package]] name = "sp-crypto-ec-utils" version = "0.10.0" -source = "git+https://github.com/paritytech/polkadot-sdk#dd5b06e622c6c5c301a1554286ec1f4995c7daca" +source = "git+https://github.com/paritytech/polkadot-sdk#d887804b235003282b26d4202f40c79fb302f16c" dependencies = [ "ark-bls12-377", "ark-bls12-377-ext", @@ -4384,7 +9940,7 @@ source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1 dependencies = [ "quote", "sp-crypto-hashing 0.1.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", - "syn 2.0.60", + "syn 2.0.77", ] [[package]] @@ -4394,17 +9950,17 @@ source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1 dependencies = [ "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.77", ] [[package]] name = "sp-debug-derive" version = "14.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk#dd5b06e622c6c5c301a1554286ec1f4995c7daca" +source = "git+https://github.com/paritytech/polkadot-sdk#d887804b235003282b26d4202f40c79fb302f16c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.77", ] [[package]] @@ -4420,7 +9976,7 @@ dependencies = [ [[package]] name = "sp-externalities" version = "0.25.0" -source = "git+https://github.com/paritytech/polkadot-sdk#dd5b06e622c6c5c301a1554286ec1f4995c7daca" +source = "git+https://github.com/paritytech/polkadot-sdk#d887804b235003282b26d4202f40c79fb302f16c" dependencies = [ "environmental", "parity-scale-codec", @@ -4500,6 +10056,15 @@ dependencies = [ "sp-externalities 0.25.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", ] +[[package]] +name = "sp-maybe-compressed-blob" +version = "11.0.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +dependencies = [ + "thiserror", + "zstd 0.12.4", +] + [[package]] name = "sp-metadata-ir" version = "0.6.0" @@ -4510,6 +10075,17 @@ dependencies = [ "scale-info", ] +[[package]] +name = "sp-mixnet" +version = "0.4.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +dependencies = [ + "parity-scale-codec", + "scale-info", + "sp-api", + "sp-application-crypto", +] + [[package]] name = "sp-mmr-primitives" version = "26.0.0" @@ -4527,6 +10103,29 @@ dependencies = [ "thiserror", ] +[[package]] +name = "sp-npos-elections" +version = "26.0.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +dependencies = [ + "parity-scale-codec", + "scale-info", + "serde", + "sp-arithmetic", + "sp-core", + "sp-runtime", +] + +[[package]] +name = "sp-offchain" +version = "26.0.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +dependencies = [ + "sp-api", + "sp-core", + "sp-runtime", +] + [[package]] name = "sp-panic-handler" version = "13.0.0" @@ -4584,7 +10183,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface" version = "24.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk#dd5b06e622c6c5c301a1554286ec1f4995c7daca" +source = "git+https://github.com/paritytech/polkadot-sdk#d887804b235003282b26d4202f40c79fb302f16c" dependencies = [ "bytes", "impl-trait-for-tuples", @@ -4610,20 +10209,34 @@ dependencies = [ "proc-macro-crate 3.1.0", "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.77", ] [[package]] name = "sp-runtime-interface-proc-macro" version = "17.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk#dd5b06e622c6c5c301a1554286ec1f4995c7daca" +source = "git+https://github.com/paritytech/polkadot-sdk#d887804b235003282b26d4202f40c79fb302f16c" dependencies = [ "Inflector", "expander", "proc-macro-crate 3.1.0", "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.77", +] + +[[package]] +name = "sp-session" +version = "27.0.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +dependencies = [ + "parity-scale-codec", + "scale-info", + "sp-api", + "sp-core", + "sp-keystore", + "sp-runtime", + "sp-staking", ] [[package]] @@ -4659,6 +10272,30 @@ dependencies = [ "trie-db", ] +[[package]] +name = "sp-statement-store" +version = "10.0.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +dependencies = [ + "aes-gcm", + "curve25519-dalek", + "ed25519-dalek", + "hkdf", + "parity-scale-codec", + "rand", + "scale-info", + "sha2 0.10.8", + "sp-api", + "sp-application-crypto", + "sp-core", + "sp-crypto-hashing 0.1.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", + "sp-externalities 0.25.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", + "sp-runtime", + "sp-runtime-interface 24.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", + "thiserror", + "x25519-dalek", +] + [[package]] name = "sp-std" version = "14.0.0" @@ -4667,7 +10304,7 @@ source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1 [[package]] name = "sp-std" version = "14.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk#dd5b06e622c6c5c301a1554286ec1f4995c7daca" +source = "git+https://github.com/paritytech/polkadot-sdk#d887804b235003282b26d4202f40c79fb302f16c" [[package]] name = "sp-storage" @@ -4684,7 +10321,7 @@ dependencies = [ [[package]] name = "sp-storage" version = "19.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk#dd5b06e622c6c5c301a1554286ec1f4995c7daca" +source = "git+https://github.com/paritytech/polkadot-sdk#d887804b235003282b26d4202f40c79fb302f16c" dependencies = [ "impl-serde", "parity-scale-codec", @@ -4693,6 +10330,18 @@ dependencies = [ "sp-debug-derive 14.0.0 (git+https://github.com/paritytech/polkadot-sdk)", ] +[[package]] +name = "sp-timestamp" +version = "26.0.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +dependencies = [ + "async-trait", + "parity-scale-codec", + "sp-inherents", + "sp-runtime", + "thiserror", +] + [[package]] name = "sp-tracing" version = "16.0.0" @@ -4707,7 +10356,7 @@ dependencies = [ [[package]] name = "sp-tracing" version = "16.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk#dd5b06e622c6c5c301a1554286ec1f4995c7daca" +source = "git+https://github.com/paritytech/polkadot-sdk#d887804b235003282b26d4202f40c79fb302f16c" dependencies = [ "parity-scale-codec", "tracing", @@ -4715,12 +10364,35 @@ dependencies = [ "tracing-subscriber", ] +[[package]] +name = "sp-transaction-pool" +version = "26.0.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +dependencies = [ + "sp-api", + "sp-runtime", +] + +[[package]] +name = "sp-transaction-storage-proof" +version = "26.0.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +dependencies = [ + "async-trait", + "parity-scale-codec", + "scale-info", + "sp-core", + "sp-inherents", + "sp-runtime", + "sp-trie", +] + [[package]] name = "sp-trie" version = "29.0.0" source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" dependencies = [ - "ahash", + "ahash 0.8.11", "hash-db", "lazy_static", "memory-db", @@ -4763,7 +10435,7 @@ dependencies = [ "parity-scale-codec", "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.77", ] [[package]] @@ -4771,16 +10443,19 @@ name = "sp-wasm-interface" version = "20.0.0" source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" dependencies = [ + "anyhow", "impl-trait-for-tuples", "log", "parity-scale-codec", + "wasmtime", ] [[package]] name = "sp-wasm-interface" version = "20.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk#dd5b06e622c6c5c301a1554286ec1f4995c7daca" +source = "git+https://github.com/paritytech/polkadot-sdk#d887804b235003282b26d4202f40c79fb302f16c" dependencies = [ + "anyhow", "impl-trait-for-tuples", "log", "parity-scale-codec", @@ -4831,12 +10506,127 @@ dependencies = [ "unicode-xid", ] +[[package]] +name = "ssz_rs" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "057291e5631f280978fa9c8009390663ca4613359fc1318e36a8c24c392f6d1f" +dependencies = [ + "bitvec", + "num-bigint", + "sha2 0.9.9", + "ssz_rs_derive", +] + +[[package]] +name = "ssz_rs_derive" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f07d54c4d01a1713eb363b55ba51595da15f6f1211435b71466460da022aa140" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "stable_deref_trait" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" + +[[package]] +name = "staging-parachain-info" +version = "0.7.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +dependencies = [ + "cumulus-primitives-core", + "frame-support", + "frame-system", + "parity-scale-codec", + "scale-info", + "sp-runtime", + "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", +] + +[[package]] +name = "staging-xcm" +version = "7.0.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +dependencies = [ + "array-bytes 6.2.2", + "bounded-collections", + "derivative", + "environmental", + "impl-trait-for-tuples", + "log", + "parity-scale-codec", + "scale-info", + "serde", + "sp-weights", + "xcm-procedural", +] + +[[package]] +name = "staging-xcm-builder" +version = "7.0.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +dependencies = [ + "frame-support", + "frame-system", + "impl-trait-for-tuples", + "log", + "pallet-transaction-payment", + "parity-scale-codec", + "polkadot-parachain-primitives", + "scale-info", + "sp-arithmetic", + "sp-io", + "sp-runtime", + "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", + "sp-weights", + "staging-xcm", + "staging-xcm-executor", +] + +[[package]] +name = "staging-xcm-executor" +version = "7.0.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +dependencies = [ + "environmental", + "frame-benchmarking", + "frame-support", + "impl-trait-for-tuples", + "log", + "parity-scale-codec", + "scale-info", + "sp-arithmetic", + "sp-core", + "sp-io", + "sp-runtime", + "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", + "sp-weights", + "staging-xcm", +] + [[package]] name = "static_assertions" version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" +[[package]] +name = "string-interner" +version = "0.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c6a0d765f5807e98a091107bae0a56ea3799f66a5de47b2c84c94a39c09974e" +dependencies = [ + "cfg-if", + "hashbrown 0.14.3", + "serde", +] + [[package]] name = "strsim" version = "0.10.0" @@ -4890,7 +10680,7 @@ dependencies = [ "proc-macro2", "quote", "rustversion", - "syn 2.0.60", + "syn 2.0.77", ] [[package]] @@ -4905,6 +10695,25 @@ dependencies = [ "zeroize", ] +[[package]] +name = "substrate-wasm-builder" +version = "17.0.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +dependencies = [ + "build-helper", + "cargo_metadata", + "console", + "filetime", + "parity-wasm", + "polkavm-linker", + "sp-maybe-compressed-blob", + "strum 0.26.3", + "tempfile", + "toml 0.8.12", + "walkdir", + "wasm-opt", +] + [[package]] name = "subtle" version = "2.5.0" @@ -4963,7 +10772,7 @@ dependencies = [ "scale-info", "scale-typegen", "subxt-metadata", - "syn 2.0.60", + "syn 2.0.77", "thiserror", "tokio", ] @@ -4997,7 +10806,7 @@ dependencies = [ "quote", "scale-typegen", "subxt-codegen", - "syn 2.0.60", + "syn 2.0.77", ] [[package]] @@ -5050,21 +10859,64 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.60" +version = "2.0.77" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "909518bc7b1c9b779f1bbf07f2929d35af9f0f37e47c6e9ef7f9dddc1e1821f3" +checksum = "9f35bcdf61fd8e7be6caf75f429fdca8beb3ed76584befb503b1569faee373ed" dependencies = [ "proc-macro2", "quote", "unicode-ident", ] +[[package]] +name = "syn-solidity" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86b837ef12ab88835251726eb12237655e61ec8dc8a280085d1961cdc3dfd047" +dependencies = [ + "paste", + "proc-macro2", + "quote", + "syn 2.0.77", +] + +[[package]] +name = "synstructure" +version = "0.12.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f36bdaa60a83aca3921b5259d5400cbf5e90fc51931376a9bd4a0eb79aa7210f" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", + "unicode-xid", +] + [[package]] name = "tap" version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" +[[package]] +name = "target-lexicon" +version = "0.12.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1" + +[[package]] +name = "tempfile" +version = "3.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8fcd239983515c23a32fb82099f97d0b11b8c72f654ed659363a95c3dad7a53" +dependencies = [ + "cfg-if", + "fastrand", + "once_cell", + "rustix 0.38.34", + "windows-sys 0.52.0", +] + [[package]] name = "termcolor" version = "1.4.1" @@ -5074,6 +10926,21 @@ dependencies = [ "winapi-util", ] +[[package]] +name = "testnet-parachains-constants" +version = "1.0.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +dependencies = [ + "cumulus-primitives-core", + "frame-support", + "polkadot-core-primitives", + "rococo-runtime-constants", + "smallvec", + "sp-runtime", + "staging-xcm", + "westend-runtime-constants", +] + [[package]] name = "thiserror" version = "1.0.59" @@ -5091,7 +10958,7 @@ checksum = "d1cd413b5d558b4c5bf3680e324a6fa5014e7b7c067a51e69dbdf47eb7148b66" dependencies = [ "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.77", ] [[package]] @@ -5104,6 +10971,37 @@ dependencies = [ "once_cell", ] +[[package]] +name = "time" +version = "0.3.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5dfd88e563464686c916c7e46e623e520ddc6d79fa6641390f2e3fa86e83e885" +dependencies = [ + "deranged", + "itoa", + "num-conv", + "powerfmt", + "serde", + "time-core", + "time-macros", +] + +[[package]] +name = "time-core" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" + +[[package]] +name = "time-macros" +version = "0.2.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f252a68540fde3a3877aeea552b832b40ab9a69e318efd078774a01ddee1ccf" +dependencies = [ + "num-conv", + "time-core", +] + [[package]] name = "tiny-keccak" version = "2.0.2" @@ -5137,7 +11035,7 @@ dependencies = [ "backtrace", "bytes", "libc", - "mio", + "mio 0.8.11", "num_cpus", "pin-project-lite", "socket2", @@ -5153,7 +11051,7 @@ checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.77", ] [[package]] @@ -5203,6 +11101,15 @@ dependencies = [ "tracing", ] +[[package]] +name = "toml" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4f7f0dd8d50a853a531c426359045b1998f04219d88799810762cd4ad314234" +dependencies = [ + "serde", +] + [[package]] name = "toml" version = "0.8.12" @@ -5230,7 +11137,7 @@ version = "0.19.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" dependencies = [ - "indexmap", + "indexmap 2.2.6", "toml_datetime", "winnow 0.5.40", ] @@ -5241,7 +11148,7 @@ version = "0.21.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a8534fd7f78b5405e860340ad6575217ce99f38d4d5c8f2442cb5ecb50090e1" dependencies = [ - "indexmap", + "indexmap 2.2.6", "toml_datetime", "winnow 0.5.40", ] @@ -5252,7 +11159,7 @@ version = "0.22.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d3328d4f68a705b2a4498da1d580585d39a6510f98318a2cec3018a7ec61ddef" dependencies = [ - "indexmap", + "indexmap 2.2.6", "serde", "serde_spanned", "toml_datetime", @@ -5319,7 +11226,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.77", ] [[package]] @@ -5356,6 +11263,7 @@ dependencies = [ "sharded-slab", "smallvec", "thread_local", + "time", "tracing", "tracing-core", "tracing-log", @@ -5394,6 +11302,12 @@ version = "1.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f4f195fd851901624eee5a58c4bb2b4f06399148fcd0ed336e6f1cb60a9881df" +[[package]] +name = "tuplex" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "676ac81d5454c4dcf37955d34fa8626ede3490f744b86ca14a7b90168d2a08aa" + [[package]] name = "twox-hash" version = "1.6.3" @@ -5412,6 +11326,12 @@ version = "1.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" +[[package]] +name = "ucd-trie" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed646292ffc8188ef8ea4d1e0e0150fb15a5c2e12ad9b8fc191ae7a8a7f3c4b9" + [[package]] name = "uint" version = "0.9.5" @@ -5424,6 +11344,12 @@ dependencies = [ "static_assertions", ] +[[package]] +name = "unarray" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eaea85b334db583fe3274d12b4cd1880032beab409c0d774be044d4480ab9a94" + [[package]] name = "unicode-bidi" version = "0.3.15" @@ -5445,11 +11371,28 @@ dependencies = [ "tinyvec", ] +[[package]] +name = "unicode-segmentation" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4c87d22b6e3f4a18d4d40ef354e97c90fcb14dd91d7dc0aa9d8a1172ebf7202" + +[[package]] +name = "unicode-truncate" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b3644627a5af5fa321c95b9b235a72fd24cd29c648c2c379431e6628655627bf" +dependencies = [ + "itertools 0.13.0", + "unicode-segmentation", + "unicode-width", +] + [[package]] name = "unicode-width" -version = "0.1.11" +version = "0.1.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e51733f11c9c4f72aa0c160008246859e340b00807569a0da0e7a1079b27ba85" +checksum = "0336d538f7abc86d282a4189614dfaa90810dfc2c6f6427eaf88e16311dd225d" [[package]] name = "unicode-xid" @@ -5485,164 +11428,493 @@ dependencies = [ ] [[package]] -name = "utf8parse" -version = "0.2.1" +name = "utf8parse" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" + +[[package]] +name = "valuable" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" + +[[package]] +name = "version_check" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" + +[[package]] +name = "w3f-bls" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7335e4c132c28cc43caef6adb339789e599e39adbe78da0c4d547fad48cbc331" +dependencies = [ + "ark-bls12-377", + "ark-bls12-381", + "ark-ec", + "ark-ff 0.4.2", + "ark-serialize 0.4.2", + "ark-serialize-derive", + "arrayref", + "constcat", + "digest 0.10.7", + "rand", + "rand_chacha", + "rand_core", + "sha2 0.10.8", + "sha3", + "thiserror", + "zeroize", +] + +[[package]] +name = "wait-timeout" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f200f5b12eb75f8c1ed65abd4b2db8a6e1b138a20de009dacee265a2498f3f6" +dependencies = [ + "libc", +] + +[[package]] +name = "walkdir" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" +dependencies = [ + "same-file", + "winapi-util", +] + +[[package]] +name = "want" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" +dependencies = [ + "try-lock", +] + +[[package]] +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" + +[[package]] +name = "wasm-bindgen" +version = "0.2.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4be2531df63900aeb2bca0daaaddec08491ee64ceecbee5076636a3b026795a8" +dependencies = [ + "cfg-if", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "614d787b966d3989fa7bb98a654e369c762374fd3213d212cfc0251257e747da" +dependencies = [ + "bumpalo", + "log", + "once_cell", + "proc-macro2", + "quote", + "syn 2.0.77", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1f8823de937b71b9460c0c34e25f3da88250760bec0ebac694b49997550d726" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.77", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af190c94f2773fdb3729c55b007a722abb5384da03bc0986df4c289bf5567e96" + +[[package]] +name = "wasm-instrument" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a47ecb37b9734d1085eaa5ae1a81e60801fd8c28d4cabdd8aedb982021918bc" +dependencies = [ + "parity-wasm", +] + +[[package]] +name = "wasm-opt" +version = "0.116.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2fd87a4c135535ffed86123b6fb0f0a5a0bc89e50416c942c5f0662c645f679c" +dependencies = [ + "anyhow", + "libc", + "strum 0.24.1", + "strum_macros 0.24.3", + "tempfile", + "thiserror", + "wasm-opt-cxx-sys", + "wasm-opt-sys", +] + +[[package]] +name = "wasm-opt-cxx-sys" +version = "0.116.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c57b28207aa724318fcec6575fe74803c23f6f266fce10cbc9f3f116762f12e" +dependencies = [ + "anyhow", + "cxx", + "cxx-build", + "wasm-opt-sys", +] + +[[package]] +name = "wasm-opt-sys" +version = "0.116.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a1cce564dc768dacbdb718fc29df2dba80bd21cb47d8f77ae7e3d95ceb98cbe" +dependencies = [ + "anyhow", + "cc", + "cxx", + "cxx-build", +] + +[[package]] +name = "wasmi" +version = "0.31.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77a8281d1d660cdf54c76a3efa9ddd0c270cada1383a995db3ccb43d166456c7" +dependencies = [ + "smallvec", + "spin", + "wasmi_arena", + "wasmi_core 0.13.0", + "wasmparser-nostd", +] + +[[package]] +name = "wasmi" +version = "0.32.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50386c99b9c32bd2ed71a55b6dd4040af2580530fae8bdb9a6576571a80d0cca" +dependencies = [ + "arrayvec 0.7.4", + "multi-stash", + "num-derive", + "num-traits", + "smallvec", + "spin", + "wasmi_collections", + "wasmi_core 0.32.3", + "wasmparser-nostd", +] + +[[package]] +name = "wasmi_arena" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "104a7f73be44570cac297b3035d76b169d6599637631cf37a1703326a0727073" + +[[package]] +name = "wasmi_collections" +version = "0.32.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c128c039340ffd50d4195c3f8ce31aac357f06804cfc494c8b9508d4b30dca4" +dependencies = [ + "ahash 0.8.11", + "hashbrown 0.14.3", + "string-interner", +] + +[[package]] +name = "wasmi_core" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcf1a7db34bff95b85c261002720c00c3a6168256dcb93041d3fa2054d19856a" +dependencies = [ + "downcast-rs", + "libm", + "num-traits", + "paste", +] + +[[package]] +name = "wasmi_core" +version = "0.32.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" +checksum = "a23b3a7f6c8c3ceeec6b83531ee61f0013c56e51cbf2b14b0f213548b23a4b41" +dependencies = [ + "downcast-rs", + "libm", + "num-traits", + "paste", +] [[package]] -name = "valuable" -version = "0.1.0" +name = "wasmparser" +version = "0.102.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" +checksum = "48134de3d7598219ab9eaf6b91b15d8e50d31da76b8519fe4ecfcec2cf35104b" +dependencies = [ + "indexmap 1.9.3", + "url", +] [[package]] -name = "version_check" -version = "0.9.4" +name = "wasmparser-nostd" +version = "0.100.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" +checksum = "d5a015fe95f3504a94bb1462c717aae75253e39b9dd6c3fb1062c934535c64aa" +dependencies = [ + "indexmap-nostd", +] [[package]] -name = "w3f-bls" -version = "0.1.3" +name = "wasmtime" +version = "8.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7335e4c132c28cc43caef6adb339789e599e39adbe78da0c4d547fad48cbc331" +checksum = "f907fdead3153cb9bfb7a93bbd5b62629472dc06dee83605358c64c52ed3dda9" dependencies = [ - "ark-bls12-377", - "ark-bls12-381", - "ark-ec", - "ark-ff", - "ark-serialize", - "ark-serialize-derive", - "arrayref", - "constcat", - "digest 0.10.7", - "rand", - "rand_chacha", - "rand_core", - "sha2 0.10.8", - "sha3", - "thiserror", - "zeroize", + "anyhow", + "bincode", + "cfg-if", + "indexmap 1.9.3", + "libc", + "log", + "object 0.30.4", + "once_cell", + "paste", + "psm", + "rayon", + "serde", + "target-lexicon", + "wasmparser", + "wasmtime-cache", + "wasmtime-cranelift", + "wasmtime-environ", + "wasmtime-jit", + "wasmtime-runtime", + "windows-sys 0.45.0", ] [[package]] -name = "walkdir" -version = "2.5.0" +name = "wasmtime-asm-macros" +version = "8.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" +checksum = "d3b9daa7c14cd4fa3edbf69de994408d5f4b7b0959ac13fa69d465f6597f810d" dependencies = [ - "same-file", - "winapi-util", + "cfg-if", ] [[package]] -name = "want" -version = "0.3.1" +name = "wasmtime-cache" +version = "8.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" +checksum = "c86437fa68626fe896e5afc69234bb2b5894949083586535f200385adfd71213" dependencies = [ - "try-lock", + "anyhow", + "base64 0.21.7", + "bincode", + "directories-next", + "file-per-thread-logger", + "log", + "rustix 0.36.17", + "serde", + "sha2 0.10.8", + "toml 0.5.11", + "windows-sys 0.45.0", + "zstd 0.11.2+zstd.1.5.2", ] [[package]] -name = "wasi" -version = "0.11.0+wasi-snapshot-preview1" +name = "wasmtime-cranelift" +version = "8.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" +checksum = "b1cefde0cce8cb700b1b21b6298a3837dba46521affd7b8c38a9ee2c869eee04" +dependencies = [ + "anyhow", + "cranelift-codegen", + "cranelift-entity", + "cranelift-frontend", + "cranelift-native", + "cranelift-wasm", + "gimli 0.27.3", + "log", + "object 0.30.4", + "target-lexicon", + "thiserror", + "wasmparser", + "wasmtime-cranelift-shared", + "wasmtime-environ", +] [[package]] -name = "wasm-bindgen" -version = "0.2.92" +name = "wasmtime-cranelift-shared" +version = "8.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4be2531df63900aeb2bca0daaaddec08491ee64ceecbee5076636a3b026795a8" +checksum = "cd041e382ef5aea1b9fc78442394f1a4f6d676ce457e7076ca4cb3f397882f8b" dependencies = [ - "cfg-if", - "wasm-bindgen-macro", + "anyhow", + "cranelift-codegen", + "cranelift-native", + "gimli 0.27.3", + "object 0.30.4", + "target-lexicon", + "wasmtime-environ", ] [[package]] -name = "wasm-bindgen-backend" -version = "0.2.92" +name = "wasmtime-environ" +version = "8.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "614d787b966d3989fa7bb98a654e369c762374fd3213d212cfc0251257e747da" +checksum = "a990198cee4197423045235bf89d3359e69bd2ea031005f4c2d901125955c949" dependencies = [ - "bumpalo", + "anyhow", + "cranelift-entity", + "gimli 0.27.3", + "indexmap 1.9.3", "log", - "once_cell", - "proc-macro2", - "quote", - "syn 2.0.60", - "wasm-bindgen-shared", + "object 0.30.4", + "serde", + "target-lexicon", + "thiserror", + "wasmparser", + "wasmtime-types", ] [[package]] -name = "wasm-bindgen-macro" -version = "0.2.92" +name = "wasmtime-jit" +version = "8.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1f8823de937b71b9460c0c34e25f3da88250760bec0ebac694b49997550d726" +checksum = "0de48df552cfca1c9b750002d3e07b45772dd033b0b206d5c0968496abf31244" dependencies = [ - "quote", - "wasm-bindgen-macro-support", + "addr2line 0.19.0", + "anyhow", + "bincode", + "cfg-if", + "cpp_demangle", + "gimli 0.27.3", + "log", + "object 0.30.4", + "rustc-demangle", + "serde", + "target-lexicon", + "wasmtime-environ", + "wasmtime-jit-debug", + "wasmtime-jit-icache-coherence", + "wasmtime-runtime", + "windows-sys 0.45.0", ] [[package]] -name = "wasm-bindgen-macro-support" -version = "0.2.92" +name = "wasmtime-jit-debug" +version = "8.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" +checksum = "6e0554b84c15a27d76281d06838aed94e13a77d7bf604bbbaf548aa20eb93846" dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.60", - "wasm-bindgen-backend", - "wasm-bindgen-shared", + "object 0.30.4", + "once_cell", + "rustix 0.36.17", ] [[package]] -name = "wasm-bindgen-shared" -version = "0.2.92" +name = "wasmtime-jit-icache-coherence" +version = "8.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af190c94f2773fdb3729c55b007a722abb5384da03bc0986df4c289bf5567e96" +checksum = "aecae978b13f7f67efb23bd827373ace4578f2137ec110bbf6a4a7cde4121bbd" +dependencies = [ + "cfg-if", + "libc", + "windows-sys 0.45.0", +] [[package]] -name = "wasmi" -version = "0.31.2" +name = "wasmtime-runtime" +version = "8.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77a8281d1d660cdf54c76a3efa9ddd0c270cada1383a995db3ccb43d166456c7" +checksum = "658cf6f325232b6760e202e5255d823da5e348fdea827eff0a2a22319000b441" dependencies = [ - "smallvec", - "spin", - "wasmi_arena", - "wasmi_core", - "wasmparser-nostd", + "anyhow", + "cc", + "cfg-if", + "indexmap 1.9.3", + "libc", + "log", + "mach", + "memfd", + "memoffset", + "paste", + "rand", + "rustix 0.36.17", + "wasmtime-asm-macros", + "wasmtime-environ", + "wasmtime-jit-debug", + "windows-sys 0.45.0", ] [[package]] -name = "wasmi_arena" -version = "0.4.1" +name = "wasmtime-types" +version = "8.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "104a7f73be44570cac297b3035d76b169d6599637631cf37a1703326a0727073" +checksum = "a4f6fffd2a1011887d57f07654dd112791e872e3ff4a2e626aee8059ee17f06f" +dependencies = [ + "cranelift-entity", + "serde", + "thiserror", + "wasmparser", +] [[package]] -name = "wasmi_core" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcf1a7db34bff95b85c261002720c00c3a6168256dcb93041d3fa2054d19856a" +name = "westend-runtime-constants" +version = "7.0.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" dependencies = [ - "downcast-rs", - "libm", - "num-traits", - "paste", + "frame-support", + "polkadot-primitives", + "polkadot-runtime-common", + "smallvec", + "sp-core", + "sp-runtime", + "sp-weights", + "staging-xcm", + "staging-xcm-builder", ] [[package]] -name = "wasmparser-nostd" -version = "0.100.2" +name = "wide" +version = "0.7.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5a015fe95f3504a94bb1462c717aae75253e39b9dd6c3fb1062c934535c64aa" +checksum = "b828f995bf1e9622031f8009f8481a85406ce1f4d4588ff746d872043e855690" dependencies = [ - "indexmap-nostd", + "bytemuck", + "safe_arch", ] [[package]] @@ -5676,6 +11948,15 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" +[[package]] +name = "windows-sys" +version = "0.45.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" +dependencies = [ + "windows-targets 0.42.2", +] + [[package]] name = "windows-sys" version = "0.48.0" @@ -5694,6 +11975,21 @@ dependencies = [ "windows-targets 0.52.5", ] +[[package]] +name = "windows-targets" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" +dependencies = [ + "windows_aarch64_gnullvm 0.42.2", + "windows_aarch64_msvc 0.42.2", + "windows_i686_gnu 0.42.2", + "windows_i686_msvc 0.42.2", + "windows_x86_64_gnu 0.42.2", + "windows_x86_64_gnullvm 0.42.2", + "windows_x86_64_msvc 0.42.2", +] + [[package]] name = "windows-targets" version = "0.48.5" @@ -5725,6 +12021,12 @@ dependencies = [ "windows_x86_64_msvc 0.52.5", ] +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" + [[package]] name = "windows_aarch64_gnullvm" version = "0.48.5" @@ -5737,6 +12039,12 @@ version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7088eed71e8b8dda258ecc8bac5fb1153c5cffaf2578fc8ff5d61e23578d3263" +[[package]] +name = "windows_aarch64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" + [[package]] name = "windows_aarch64_msvc" version = "0.48.5" @@ -5749,6 +12057,12 @@ version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9985fd1504e250c615ca5f281c3f7a6da76213ebd5ccc9561496568a2752afb6" +[[package]] +name = "windows_i686_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" + [[package]] name = "windows_i686_gnu" version = "0.48.5" @@ -5767,6 +12081,12 @@ version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "87f4261229030a858f36b459e748ae97545d6f1ec60e5e0d6a3d32e0dc232ee9" +[[package]] +name = "windows_i686_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" + [[package]] name = "windows_i686_msvc" version = "0.48.5" @@ -5779,6 +12099,12 @@ version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "db3c2bf3d13d5b658be73463284eaf12830ac9a26a90c717b7f771dfe97487bf" +[[package]] +name = "windows_x86_64_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" + [[package]] name = "windows_x86_64_gnu" version = "0.48.5" @@ -5791,6 +12117,12 @@ version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4e4246f76bdeff09eb48875a0fd3e2af6aada79d409d33011886d3e1581517d9" +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" + [[package]] name = "windows_x86_64_gnullvm" version = "0.48.5" @@ -5803,6 +12135,12 @@ version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "852298e482cd67c356ddd9570386e2862b5673c85bd5f88df9ab6802b334c596" +[[package]] +name = "windows_x86_64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" + [[package]] name = "windows_x86_64_msvc" version = "0.48.5" @@ -5854,6 +12192,54 @@ dependencies = [ "zeroize", ] +[[package]] +name = "xcm-fee-payment-runtime-api" +version = "0.1.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +dependencies = [ + "frame-support", + "parity-scale-codec", + "scale-info", + "sp-api", + "sp-runtime", + "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", + "sp-weights", + "staging-xcm", +] + +[[package]] +name = "xcm-procedural" +version = "7.0.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +dependencies = [ + "Inflector", + "proc-macro2", + "quote", + "syn 2.0.77", +] + +[[package]] +name = "xcm-simulator" +version = "7.0.0" +source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +dependencies = [ + "frame-support", + "frame-system", + "parity-scale-codec", + "paste", + "polkadot-core-primitives", + "polkadot-parachain-primitives", + "polkadot-primitives", + "polkadot-runtime-parachains", + "scale-info", + "sp-io", + "sp-runtime", + "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", + "staging-xcm", + "staging-xcm-builder", + "staging-xcm-executor", +] + [[package]] name = "yap" version = "0.11.0" @@ -5877,7 +12263,7 @@ checksum = "9ce1b18ccd8e73a9321186f97e46f9f04b778851177567b1975109d26a08d2a6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.77", ] [[package]] @@ -5897,5 +12283,53 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.77", +] + +[[package]] +name = "zstd" +version = "0.11.2+zstd.1.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20cc960326ece64f010d2d2107537f26dc589a6573a316bd5b1dba685fa5fde4" +dependencies = [ + "zstd-safe 5.0.2+zstd.1.5.2", +] + +[[package]] +name = "zstd" +version = "0.12.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a27595e173641171fc74a1232b7b1c7a7cb6e18222c11e9dfb9888fa424c53c" +dependencies = [ + "zstd-safe 6.0.6", +] + +[[package]] +name = "zstd-safe" +version = "5.0.2+zstd.1.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d2a5585e04f9eea4b2a3d1eca508c4dee9592a89ef6f450c11719da0726f4db" +dependencies = [ + "libc", + "zstd-sys", +] + +[[package]] +name = "zstd-safe" +version = "6.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee98ffd0b48ee95e6c5168188e44a54550b1564d9d530ee21d5f0eaed1069581" +dependencies = [ + "libc", + "zstd-sys", +] + +[[package]] +name = "zstd-sys" +version = "2.0.13+zstd.1.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38ff0f21cfee8f97d94cef41359e0c89aa6113028ab0291aa8ca0038995a95aa" +dependencies = [ + "cc", + "pkg-config", ] diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..d70a3dd --- /dev/null +++ b/LICENSE @@ -0,0 +1,52 @@ +Apache License +Version 2.0, January 2004 +http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + +"License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. + +"Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. + +"Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. + +"You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. + +"Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. + +"Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. + +"Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). + +"Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. + +"Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." + +"Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: + + You must give any other recipients of the Work or Derivative Works a copy of this License; and + You must cause any modified files to carry prominent notices stating that You changed the files; and + You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and + If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. + +You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS diff --git a/README.md b/README.md index 3f5a720..f4972e3 100644 --- a/README.md +++ b/README.md @@ -23,7 +23,7 @@ cargo test ## Usage ``` shell -murmur-cli new --seed [] --name [] --schedule 100 101 209... +./target/debug/murmur-cli new --name test --seed my_secret_key --schedule 100 110 120 ``` ## Generating metadata for the chain diff --git a/cli/Cargo.toml b/cli/Cargo.toml index 9ff7517..1b727df 100644 --- a/cli/Cargo.toml +++ b/cli/Cargo.toml @@ -23,7 +23,7 @@ serde_json = "1.0.108" indicatif = "0.17.8" sp-keyring = { git = "https://github.com/ideal-lab5/polkadot-sdk.git", branch = "testing" } frame-support = { git = "https://github.com/ideal-lab5/polkadot-sdk.git", branch = "testing" } -# node-runtime = { path = "../etf/runtime" } +node-template-runtime = { path = "../../etf/runtime" } codec = { package = "parity-scale-codec", version = "3.6.12", features = [ "derive", ] } @@ -42,4 +42,6 @@ w3f-bls = "0.1.3" getrandom = { version = "0.2", features = ["js"] } rand_core = { version = "0.6.4", features = ["getrandom"] } hex = "0.4.3" -array-bytes = "6.1" \ No newline at end of file +array-bytes = "6.1" +ratatui = "0.28.1" +crossterm = "0.28.1" diff --git a/cli/artifacts/metadata.scale b/cli/artifacts/metadata.scale index 04e41c674517bb5d4053a279da0626e3c7540b44..7f6844edf2000f3b86ef856c11003fa10259cb49 100644 GIT binary patch delta 63 zcmdo0SoO?f)rJF7M3ln3yU}v7zOeYb5mm(r%&)^mzsX0h*g|bpg6NCwf%At RD-g2*G5hw*MI3Mb0RZ!h80!E4 delta 57 zcmX@}Sattn)rJF7M3ln3yU~q7zOeYb5mm(r_c3fmzsX0h*iA(MG-3yvjH*t L_7_DQPyPV_fKeB4 diff --git a/cli/src/main.rs b/cli/src/main.rs index 7163248..5d0abca 100644 --- a/cli/src/main.rs +++ b/cli/src/main.rs @@ -1,3 +1,19 @@ +/* + * Copyright 2024 by Ideal Labs, LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + #![allow(missing_docs)] use subxt::{ client::OnlineClient, @@ -31,6 +47,16 @@ use rand_chacha::{ rand_core::SeedableRng, }; +use std::io; + +// use ratatui::{ +// crossterm::event::{self, KeyCode, KeyEventKind}, +// style::Stylize, +// widgets::Paragraph, +// DefaultTerminal, +// }; + +use node_template_runtime::{self, OtpCall, RuntimeCall, BalancesCall}; use subxt::ext::codec::Encode; use beefy::{known_payloads, Payload, Commitment, VersionedFinalityProof}; @@ -90,101 +116,114 @@ struct WalletCreationDetails { #[derive(Parser)] struct WalletExecuteDetails { - #[arg()] + #[arg(long)] name: String, - #[arg()] - password: String, #[arg(long)] - block_number: u64, + seed: String, + #[arg(long)] + when: BlockNumber, #[arg(short, long)] amount: String, } -use sha3::Digest; +pub enum CLIError { -/// read an MMR from a file -fn load_leaves() -> Vec<(u64, Leaf)> { - let mmr_store_file = File::open("mmr_store") - .expect("Unable to open file"); - let leaves: Vec<(u64, Leaf)> = serde_cbor::from_reader(mmr_store_file) - .unwrap(); - leaves } -/// Write the MMR to a file -fn write_leaves(leaves: &[(BlockNumber, Leaf)]) { - let mut mmr_store_file = File::create("mmr_store") - .expect("should be ok"); - serde_cbor::to_writer(mmr_store_file, &leaves) - .unwrap(); -} +// use sha3::Digest; + +// fn main() -> io::Result<()> { +// let mut terminal = ratatui::init(); +// terminal.clear()?; +// let app_result = run(terminal); +// ratatui::restore(); +// app_result +// } + +// fn run(mut terminal: DefaultTerminal) -> io::Result<()> { +// loop { +// terminal.draw(|frame| { +// let greeting = Paragraph::new("Hello Ratatui! (press 'q' to quit)") +// .white() +// .on_blue(); +// frame.render_widget(greeting, frame.area()); +// })?; + +// if let event::Event::Key(key) = event::read()? { +// if key.kind == KeyEventKind::Press && key.code == KeyCode::Char('q') { +// return Ok(()); +// } +// } +// } +// } #[tokio::main] async fn main() -> Result<(), Box> { - let cli = Cli::parse(); - let before = Instant::now(); - match &cli.commands { - Commands::New(args) => { - // first we need to connect to a node and fetch the round key and current block number - println!("🎲 Connecting to Ideal network (local node)"); - - let rpc_client = RpcClient::from_url("ws://localhost:9944").await?; - let client = OnlineClient::::from_rpc_client(rpc_client.clone()).await?; - println!("🔗 RPC Client: connection established"); + // first we need to connect to a node and fetch the round key and current block number + println!("🎲 Connecting to Ideal network (local node)"); - // fetch the round public key from etf runtime storage - let round_key_query = subxt::dynamic::storage("Etf", "RoundPublic", ()); - let result = client - .storage() - .at_latest() - .await? - .fetch(&round_key_query) - .await?; - let round_pubkey_bytes = result.unwrap().as_type::>()?; - - let round_pubkey = DoublePublicKey::::from_bytes(&round_pubkey_bytes).unwrap(); - println!("🔑 Successfully retrieved the round public key."); - let current_block = client.blocks().at_latest().await?; - let current_block_number = current_block.header().number; + let rpc_client = RpcClient::from_url("ws://localhost:9944").await?; + let client = OnlineClient::::from_rpc_client(rpc_client.clone()).await?; + println!("🔗 RPC Client: connection established"); + + // fetch the round public key from etf runtime storage + let round_key_query = subxt::dynamic::storage("Etf", "RoundPublic", ()); + let result = client + .storage() + .at_latest() + .await? + .fetch(&round_key_query) + .await?; + let round_pubkey_bytes = result.unwrap().as_type::>()?; - println!("🧊 Current block number: #{:?}", current_block_number); - println!("🭠Murmur: Generating Merkle mountain range"); + let round_pubkey = DoublePublicKey::::from_bytes(&round_pubkey_bytes).unwrap(); + println!("🔑 Successfully retrieved the round public key."); + let current_block = client.blocks().at_latest().await?; + let current_block_number = current_block.header().number; + + println!("🧊 Current block number: #{:?}", current_block_number); + let etf = OnlineClient::::new().await?; - let etf = OnlineClient::::new().await?; + // let mut mmr_store_file = File::create("mmr_store").unwrap(); + let store = MemStore::default(); + let mut mmr = MemMMR::<_, MergeLeaves>::new(0, store); - let mut mmr_store_file = File::create("mmr_store").unwrap(); - let store = MemStore::default(); - let mut mmr = MemMMR::<_, MergeLeaves>::new(0, store); + // TODO: HKDF? just hash the seed? + let ephem_msk = [1;32]; - // TODO: HKDF? just hash the seed? - let ephem_msk = [1;32]; + match &cli.commands { + Commands::New(args) => { + println!("🭠Murmur: Generating Merkle mountain range"); + // create leaves let leaves = murmur::create::( args.seed.clone().into(), args.schedule.clone(), ephem_msk, round_pubkey, ); - + // populate MMR leaves.iter().for_each(|leaf| { // TODO: error handling mmr.push(leaf.1.clone()).unwrap(); }); + println!("Write leaves {:?}", leaves.len()); write_leaves(&leaves); let root = mmr.get_root() .expect("The MMR root should be calculable"); - let name = args.name.as_bytes().to_vec(); + // prepare and send tx from 'alice' account (for now) + // should be configurable let create_anon_tx = etf::tx() .otp() .create( root.0.into(), etf::runtime_types::bounded_collections::bounded_vec::BoundedVec(name)); - // TODO: make the origin a parameter + // TODO: make the origin configurable let from = dev::alice(); let events = etf .tx() @@ -192,65 +231,139 @@ async fn main() -> Result<(), Box> { .await?; println!("✅ MMR proxy account creation successful!"); - } + }, + Commands::Execute(args) => { + + // build balance transfer + let bob = AccountKeyring::Bob.to_account_id().into(); + // get the value argument + let v: u128 = args.amount + .split_whitespace() + .map(|r| r.replace('_', "").parse().unwrap()) + .collect::>()[0]; + let balance_transfer_call = RuntimeCall::Balances( + BalancesCall::transfer_allow_death { + dest: bob, + value: v, + }); + handle_execute::( + etf.clone(), + args.name.clone().as_bytes().to_vec(), + args.seed.clone().as_bytes().to_vec(), + args.when.clone(), + ephem_msk, + round_pubkey, + balance_transfer_call, + ).await; + }, _ => panic!("Hey, don't do that!"), } println!("Elapsed time: {:.2?}", before.elapsed()); Ok(()) } +fn handle_create() { -/// construct the encoded commitment for the round in which block_number h -async fn get_validator_set_id( - client: OnlineClient, - block_number: BlockNumber, -) -> Result> { - let epoch_index_query = subxt::dynamic::storage("Beefy", "ValidatorSetId", ()); - let result = client.storage() - .at_latest() - .await? - .fetch(&epoch_index_query) - .await?; - let epoch_index = result.unwrap().as_type::()?; +} + +async fn handle_execute( + etf: OnlineClient, + name: Vec, + seed: Vec, + when: BlockNumber, + ephemeral_msk: [u8;32], + pk: DoublePublicKey, + call: RuntimeCall, +) -> Option<()> { + println!("Murmur: Execute Wallet Balance Transfer"); + let mut rng = ChaCha20Rng::seed_from_u64(1); + + let leaves: Vec<(BlockNumber, Leaf)> = load_leaves(); + + let call_data = call.encode(); + let params = murmur::execute::( + seed, + when, + call_data, + leaves.clone(), + ).map_err(|e| println!("Murmur execution failed due to {:?}", e)).unwrap(); + + let root: Leaf = params.0; + let hash: Vec = params.1; + let proof: MerkleProof = params.2; + let target_leaf: Leaf = params.3; + let pos: u64 = params.4; + + let proof_items: Vec> = proof.proof_items().iter() + .map(|leaf| leaf.0.to_vec().clone()) + .collect::>(); + + let bounded = >>::truncate_from(name); + + + let proxy_call = RuntimeCall::Otp(OtpCall::proxy { + name: bounded, + position: pos, + size: leaves.len() as u64, + ciphertext_bytes: target_leaf.0, + proof: proof_items, + call: Box::new(call), + when, + hash, + }); + + // let proxy_call = etf::tx().otp().proxy( + // bounded, + // pos, + // leaves.len() as u64, + // target_leaf.0, + // hash, + // proof_items, + // Box::new(call), + // when, + // ); + + let proxy_call_bytes: &[u8] = &proxy_call.encode(); + + // then construct a scheduled transaction for "when" + // 1. tlock + let timelocked_proxy_call = murmur::timelock_encrypt::( + when, + pk.1, + ephemeral_msk, + proxy_call_bytes, + ); + let bounded_ciphertext = etf::runtime_types::bounded_collections::bounded_vec::BoundedVec(timelocked_proxy_call); + // 2. build tx + let sealed_tx = etf::tx() + .scheduler() + .schedule_sealed(when, 127, bounded_ciphertext); + // 3. submit tx - Ok(epoch_index) + let events = etf + .tx() + .sign_and_submit_then_watch_default(&sealed_tx, &dev::alice()) + .await; + None + } -/// perform timelock encryption over BLS12-377 -async fn tlock_encrypt( - client: OnlineClient, - round_pubkey: E::PublicKeyGroup, - message: Vec, - target: BlockNumber, -) -> Result, Box> { - println!("🔒 Encrypting the message for target block #{:?}", target); - // let msk = SecretKey(E::Scalar::rand(&mut OsRng)); - let epoch_index = get_validator_set_id(client.clone(), target).await?; - let payload = Payload::from_single_entry(known_payloads::ETF_SIGNATURE, Vec::new()); - let commitment = Commitment { payload, block_number: target, validator_set_id: epoch_index }; - // validators sign the SCALE encoded commitment, so that becomes our identity for TLE as well - let id = Identity::new(&commitment.encode()); - // generate a random secret key - let sk: [u8;32] = [1;32]; - // 2) tlock for encoded commitment (TODO: error handling) - let ciphertext = tle( - round_pubkey, - sk, - &message, - id, - OsRng, - ).unwrap(); - Ok(ciphertext) +/// read an MMR from a file +fn load_leaves() -> Vec<(BlockNumber, Leaf)> { + let mmr_store_file = File::open("mmr_store") + .expect("Unable to open file"); + let leaves: Vec<(BlockNumber, Leaf)> = + serde_cbor::from_reader(mmr_store_file).unwrap(); + leaves } -// /// perform timelock encryption over BLS12-377 -// async fn tlock_decrypt( -// ciphertext: TLECiphertext, -// signatures: Vec>, -// ) -> Result, Box> { -// let result = ciphertext.decrypt(signatures).unwrap(); -// Ok(result.message) -// } +/// Write the MMR to a file +fn write_leaves(leaves: &[(BlockNumber, Leaf)]) { + let mut mmr_store_file = File::create("mmr_store") + .expect("should be ok"); + serde_cbor::to_writer(mmr_store_file, &leaves) + .unwrap(); +} #[cfg(test)] mod tests { diff --git a/cli/src/mmr_store b/cli/src/mmr_store new file mode 100644 index 0000000..15cf57c --- /dev/null +++ b/cli/src/mmr_store @@ -0,0 +1 @@ +ƒ‚–˜ p5^¬ÇKg–ÔŠý竤›ù¤©7ÔÇÉG©˜Bð‚¯˜ V'+(é‘C§L)@¡.šR¹Æ¢còÔõ8sçÁ+,­‚Ș ’•Gxë'!ƒÓ‡h1±Ëw×l¼Çüé+™D©BÉ \ No newline at end of file diff --git a/core/Cargo.toml b/core/Cargo.toml index f88e5c2..6e4374e 100644 --- a/core/Cargo.toml +++ b/core/Cargo.toml @@ -15,40 +15,29 @@ workspace = true targets = ["x86_64-unknown-linux-gnu"] [dependencies] -subxt = "0.35.2" -subxt-signer = "0.35.2" -tokio = { version = "1.35", features = ["macros", "time", "rt-multi-thread"] } totp-rs = "5.5.1" -etf-crypto-primitives = { git = "https://github.com/ideal-lab5/etf-sdk/", branch = "tony/dev" } -# etf-crypto-primitives = { path = "../etf-sdk/etf-crypto-primitives" } -clap = { version = "4.1.1", features = ["derive"] } +codec = { package = "parity-scale-codec", version = "3.6.12", features = ["derive"], default-features = false } +etf-crypto-primitives = { git = "https://github.com/ideal-lab5/etf-sdk/", branch = "tony/dev", default-features = false} rand_chacha = "0.3.1" ckb-merkle-mountain-range = "0.5.2" -# blake2b = "0.10.6" sha3 = "0.10.8" -serde_cbor = "0.11.2" -# bytes = "1.4.0" -serde_json = "1.0.108" -indicatif = "0.17.8" -sp-keyring = { git = "https://github.com/ideal-lab5/polkadot-sdk.git", branch = "testing" } -frame-support = { git = "https://github.com/ideal-lab5/polkadot-sdk.git", branch = "testing" } -# node-runtime = { path = "../etf/runtime" } -codec = { package = "parity-scale-codec", version = "3.6.12", features = [ - "derive", -] } -serde = { version = "1.0.188", features = ["alloc", "derive"] } -sp-core = { git = "https://github.com/ideal-lab5/polkadot-sdk.git", branch = "testing", features = ["bls-experimental"] } -sp-runtime = { git = "https://github.com/ideal-lab5/polkadot-sdk.git", branch = "testing" } +# serde_cbor = "0.11.2" +# serde_json = "1.0.108" +serde = { version = "1.0.188", features = ["alloc", "derive"], default-features = false} beefy = { package = "sp-consensus-beefy-etf", git = "https://github.com/ideal-lab5/etf.git", branch = "tony/dev", features = ["bls-experimental"] } -sp-application-crypto = { git = "https://github.com/ideal-lab5/polkadot-sdk.git", branch = "testing", features = ["bls-experimental"] } +ark-bls12-377 = { version = "0.4.0", default-features = false } +ark-std = { version = "0.4.0", default-features = false } +ark-ff = { version = "0.4.0", default-features = false } +ark-serialize = { version = "0.4.0", default-features = false } +w3f-bls = { version = "0.1.3", default-features = false } +getrandom = { version = "0.2", features = ["js"], default-features = false } +rand_core = { version = "0.6.4", features = ["getrandom"], default-features = false } +hex = { version = "0.4.3" } +array-bytes = { version = "6.1" } +# add zeroize +# 1.8.1 -ark-bls12-377 = "0.4.0" -ark-std = "0.4.0" -ark-ec = "0.4.0" -ark-ff = "0.4.0" -ark-serialize = "0.4.0" -w3f-bls = "0.1.3" -getrandom = { version = "0.2", features = ["js"] } -rand_core = { version = "0.6.4", features = ["getrandom"] } -hex = "0.4.3" -array-bytes = "6.1" \ No newline at end of file +[features] +default = ["std"] +std = ["ark-std/std", "getrandom/std", "rand_core/std", "serde/std", "sha3/std", "codec/std"] +no_std = [] \ No newline at end of file diff --git a/core/src/lib.rs b/core/src/lib.rs index ada4513..c690d49 100644 --- a/core/src/lib.rs +++ b/core/src/lib.rs @@ -1,4 +1,23 @@ -// the murmur core library +/* + * Copyright 2024 by Ideal Labs, LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#![no_std] +//! the murmur core library + +extern crate alloc; + mod otp; pub mod murmur; pub mod types; \ No newline at end of file diff --git a/core/src/murmur.rs b/core/src/murmur.rs index c3e2cef..2732ed4 100644 --- a/core/src/murmur.rs +++ b/core/src/murmur.rs @@ -1,17 +1,32 @@ +/* + * Copyright 2024 by Ideal Labs, LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + //! The murmur protocol implementation //! -// mod otp; +use alloc::{vec, vec::Vec}; use crate::otp::BOTPGenerator; use crate::types::*; use etf_crypto_primitives::{ ibe::fullident::Identity, encryption::tlock::* }; -use w3f_bls::{DoublePublicKey, EngineBLS, TinyBLS377}; +use w3f_bls::{DoublePublicKey, EngineBLS}; use ckb_merkle_mountain_range::{ MerkleProof, - MMR, Merge, Result as MMRResult, MMRStore, util::{ MemMMR, MemStore @@ -21,13 +36,13 @@ use ark_serialize::CanonicalSerialize; use beefy::{ known_payloads, Payload, - Commitment, - VersionedFinalityProof + Commitment, }; -use codec::{Decode, Encode}; +use codec::Encode; use rand_core::OsRng; use sha3::Digest; +#[derive(Debug)] pub enum Error { ExecuteError } @@ -55,24 +70,6 @@ pub fn create( ephemeral_msk, otp_code.as_bytes(), ); - // build encoded commitment (the message signed by ETF PFG) - // let payload = Payload::from_single_entry(known_payloads::ETF_SIGNATURE, Vec::new()); - // let commitment = Commitment { - // payload, - // block_number: *i, - // validator_set_id: 1, // TODO: how to ensure correct validator set ID is used? could just always set to 1 for now, else set input param. - // }; - - // let ciphertext = tle::( - // pk.clone(), - // ephemeral_msk.clone(), - // otp_code.as_bytes(), - // Identity::new(&commitment.encode()), - // OsRng, // TODO - // ).unwrap(); // TODO: Error Handling - // // serialize ciphertext to bytes TODO: can optimize ct_bytes w/ upper bound (as slice) - // let mut ct_bytes = Vec::new(); - // ciphertext.serialize_compressed(&mut ct_bytes).unwrap(); let leaf = Leaf::from(ct_bytes); leaves.push((*i, leaf)); } @@ -82,28 +79,17 @@ pub fn create( /// computes parameters needed to execute a transaction at the specified block number /// outputs (ciphertext, hash, merkle proof, position/index) +/// TODO: create a new struct to represent return type pub fn execute( seed: Vec, when: BlockNumber, - ephemeral_msk: [u8;32], - pk: DoublePublicKey, call_data: Vec, leaves: Vec<(BlockNumber, Leaf)>, ) -> Result<(Leaf, Vec, MerkleProof, Leaf, u64), Error> { - let botp = build_generator(&seed.clone()); - let otp_code = botp.generate(when); - let ct: Vec = timelock_encrypt::( - when, - pk.1, - ephemeral_msk, - otp_code.as_bytes(), - ); - // now generate a merkle proof // rebuild the MMR and search for the position of the leaf for the given block number let store = MemStore::default(); let mut mmr = MemMMR::<_, MergeLeaves>::new(0, store); - // let mut target_leaf = Vec::new(); let mut target_pos: u64 = 0; let mut target_leaf: Leaf = Leaf::default(); @@ -122,14 +108,10 @@ pub fn execute( .expect("The MMR root should be calculable"); let proof = mmr.gen_proof(vec![target_pos]) .expect("should be ok"); - // sanity check - // proof.verify(root, vec![(target_pos, Leaf::from(ct_bytes))]).unwrap(); - - // let proof_items: Vec> = proof.proof_items().iter() - // .map(|leaf| leaf.0.to_vec().clone()) - // .collect::>(); - // hash(otp || call) + // hash(otp || AUX_DATA) + let botp = build_generator(&seed.clone()); + let otp_code = botp.generate(when); let mut hasher = sha3::Sha3_256::default(); hasher.update(otp_code.as_bytes()); hasher.update(&call_data); @@ -138,7 +120,8 @@ pub fn execute( Ok((root, hash, proof, target_leaf, target_pos)) } -fn timelock_encrypt( +/// timelock encryption function +pub fn timelock_encrypt( when: BlockNumber, pk: E::PublicKeyGroup, ephemeral_msk: [u8;32], @@ -148,7 +131,7 @@ fn timelock_encrypt( let commitment = Commitment { payload, block_number: when, - validator_set_id: 1, // TODO: how to ensure correct validator set ID is used? could just always set to 1 for now, else set input param. + validator_set_id: 0, // TODO: how to ensure correct validator set ID is used? could just always set to 1 for now, else set input param. }; let ciphertext = tle::( pk.clone(), @@ -172,10 +155,9 @@ fn build_generator(seed: &[u8]) -> BOTPGenerator { mod tests { - + use super::*; - use ark_ff::UniformRand; - use w3f_bls::DoublePublicKeyScheme; + use w3f_bls::{DoublePublicKey, DoublePublicKeyScheme, TinyBLS377}; #[test] pub fn it_can_generate_leaves() { @@ -220,29 +202,41 @@ mod tests { let leaves = create::( seed.clone(), - schedule, + schedule.clone(), ephem_msk, double_public, ); - let later = 2; - // let expected_hash = '0x0123'; + let later = 1; // generate execution parameters if let Ok(result) = execute::( seed, later, - ephem_msk, - double_public_again, - vec![], + vec![1,2,3], // aux data (call data in practice) leaves, ) { let root: Leaf = result.0; let hash: Vec = result.1; - let proof: MerkleProof = result.2; + let original_proof: MerkleProof = result.2; let target_leaf: Leaf = result.3; let pos: u64 = result.4; - // verify the merkle proof is valid - match proof.verify(root, vec![(pos, target_leaf)]) { + + + // experiment w/ serialization + let proof_items: Vec> = original_proof.proof_items().iter() + .map(|leaf| leaf.0.to_vec().clone()) + .collect::>(); + // convert to leaves + let leaves: Vec = proof_items.clone().into_iter().map(|p| Leaf(p)).collect::>(); + assert_eq!(leaves, original_proof.proof_items().to_vec()); + + let proof = MerkleProof::::new(schedule.clone().len() as u64, leaves); + assert_eq!(proof.proof_items(), original_proof.proof_items()); + // let root = Leaf::from(proxy_details.root); + let target = vec![(pos, target_leaf.clone())]; + let new_root = proof.calculate_root(target.clone()).unwrap(); + + match proof.verify(new_root, target.clone()) { Ok(validity) => { assert!(validity); }, diff --git a/core/src/otp.rs b/core/src/otp.rs index f08c4f2..2f8c887 100644 --- a/core/src/otp.rs +++ b/core/src/otp.rs @@ -1,12 +1,28 @@ -//! # #[cfg(not(feature = "otpauth"))] { -//! use etf_otp::{BOTPGenerator}; -//! -//! let totp = BOTPGenerator::new(b"123456789123456789123456".to_vec()); -//! let otp = totp.generate(1); -//! +/* + * Copyright 2024 by Ideal Labs, LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + use totp_rs::{Secret, TOTP, Algorithm}; +use alloc::{ + vec::Vec, + string::String, +}; +/// a block based otp generator pub struct BOTPGenerator { + /// the time-based otp generator totp: TOTP } @@ -25,6 +41,7 @@ impl BOTPGenerator { BOTPGenerator { totp } } + /// generate an otp code pub fn generate(&self, block_height: u32) -> String { self.totp.generate(block_height as u64) } diff --git a/core/src/types.rs b/core/src/types.rs index fd4f912..82aed48 100644 --- a/core/src/types.rs +++ b/core/src/types.rs @@ -1,15 +1,29 @@ -use ckb_merkle_mountain_range::{ - MerkleProof, - MMR, Merge, Result as MMRResult, MMRStore, - util::{ - MemMMR, - MemStore - }, -}; +/* + * Copyright 2024 by Ideal Labs, LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +use ckb_merkle_mountain_range::{Merge, Result as MMRResult}; +use codec::{Decode, Encode}; use sha3::Digest; +use alloc::vec::Vec; +/// the type to represent a block number pub type BlockNumber = u32; +/// A leaf in the MMR +/// the payload is an opaque, any-length vec #[derive( Eq, PartialEq, Clone, Debug, Default, serde::Serialize, serde::Deserialize @@ -24,8 +38,9 @@ impl From> for Leaf { } } +/// merge leaves together with a sha256 hasher +#[derive(Debug)] pub struct MergeLeaves; - impl Merge for MergeLeaves { type Item = Leaf; fn merge(lhs: &Self::Item, rhs: &Self::Item) -> MMRResult { diff --git a/mmr_store b/mmr_store index b6aa2ee..5485fe0 100644 --- a/mmr_store +++ b/mmr_store @@ -1 +1 @@ -‚˜ ŒT—æjgš|‰£3ky)ø´[)½ÊLÑ8†§ÿð*J \ No newline at end of file +ƒ‚˜ ªdŸ¨þ)±Ðt …³dÌ˪z‚ˆÂÄò”Añd¡9-0w‚#˜ >ž/%°c¾£÷Gåv¦ïáQ˜Yþ ;‰È: T¬ý‚]‚-˜ ¤)»v/q%å±N42Zy>¨ž\ìÙ¶îEüã+­ \ No newline at end of file diff --git a/test b/test new file mode 100644 index 0000000..d409212 --- /dev/null +++ b/test @@ -0,0 +1 @@ +adsfadsfasdfasdfasdf \ No newline at end of file From 0eb833788394ea3087c54293ca569d33fbf3b51d Mon Sep 17 00:00:00 2001 From: driemworks Date: Fri, 13 Sep 2024 14:37:09 -0500 Subject: [PATCH 03/20] verify works --- Cargo.lock | 50 +++++------ README.md | 8 +- cli/src/main.rs | 34 +++----- core/Cargo.toml | 2 - core/README.md | 17 +++- core/src/murmur.rs | 201 ++++++++++++++++++++++++++++++++------------- core/src/types.rs | 20 ++++- 7 files changed, 217 insertions(+), 115 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 8aae826..4ecad34 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4712,6 +4712,7 @@ dependencies = [ "pallet-mixnet", "pallet-mmr", "pallet-multisig", + "pallet-murmur", "pallet-nft-fractionalization", "pallet-nfts", "pallet-nfts-runtime-api", @@ -4721,7 +4722,6 @@ dependencies = [ "pallet-nomination-pools-runtime-api", "pallet-offences", "pallet-offences-benchmarking", - "pallet-otp", "pallet-parameters", "pallet-preimage", "pallet-proxy 28.1.0", @@ -6034,6 +6034,30 @@ dependencies = [ "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", ] +[[package]] +name = "pallet-murmur" +version = "4.0.0-dev" +dependencies = [ + "ark-bls12-381", + "ark-serialize 0.4.2", + "array-bytes 4.2.0", + "ckb-merkle-mountain-range", + "frame-benchmarking", + "frame-support", + "frame-system", + "log", + "pallet-proxy 28.1.0", + "pallet-randomness-beacon", + "parity-scale-codec", + "primitive-types", + "scale-info", + "serde", + "sha3", + "sp-core", + "sp-runtime", + "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", +] + [[package]] name = "pallet-nft-fractionalization" version = "10.0.0" @@ -6204,30 +6228,6 @@ dependencies = [ "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", ] -[[package]] -name = "pallet-otp" -version = "4.0.0-dev" -dependencies = [ - "ark-bls12-381", - "ark-serialize 0.4.2", - "array-bytes 4.2.0", - "ckb-merkle-mountain-range", - "frame-benchmarking", - "frame-support", - "frame-system", - "log", - "pallet-proxy 28.1.0", - "pallet-randomness-beacon", - "parity-scale-codec", - "primitive-types", - "scale-info", - "serde", - "sha3", - "sp-core", - "sp-runtime", - "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", -] - [[package]] name = "pallet-paged-list" version = "0.6.0" diff --git a/README.md b/README.md index f4972e3..e475c01 100644 --- a/README.md +++ b/README.md @@ -1,12 +1,6 @@ # Murmur -Murmur is a framework for building web3 applications. It enables on-chain, time-based event clocks. - -An OTP Wallet Client - -This is an experimental keyless crytpo wallet client for OTP proxies on the ETF Network. - -This client allows users to authenticate with a pure proxy by using an OTP code. It uses timelock encryption and time-based OTP generation +Murmur is an air-gapped keyless crypto wallet protocol that runs on the Ideal Network. It is based on the [Hours of Horus]() protocol, where it enables keyless crypto wallets that require knowledge of future OTP codes rather than signatures in order to execute calls. ## Setup diff --git a/cli/src/main.rs b/cli/src/main.rs index 5d0abca..4e7919a 100644 --- a/cli/src/main.rs +++ b/cli/src/main.rs @@ -56,7 +56,7 @@ use std::io; // DefaultTerminal, // }; -use node_template_runtime::{self, OtpCall, RuntimeCall, BalancesCall}; +use node_template_runtime::{self, MurmurCall, RuntimeCall, BalancesCall}; use subxt::ext::codec::Encode; use beefy::{known_payloads, Payload, Commitment, VersionedFinalityProof}; @@ -281,18 +281,18 @@ async fn handle_execute( let leaves: Vec<(BlockNumber, Leaf)> = load_leaves(); let call_data = call.encode(); - let params = murmur::execute::( + let payload = murmur::execute::( seed, when, call_data, leaves.clone(), ).map_err(|e| println!("Murmur execution failed due to {:?}", e)).unwrap(); - let root: Leaf = params.0; - let hash: Vec = params.1; - let proof: MerkleProof = params.2; - let target_leaf: Leaf = params.3; - let pos: u64 = params.4; + let root: Leaf = payload.root; + let hash: Vec = payload.hash; + let proof: MerkleProof = payload.proof; + let target_leaf: Leaf = payload.target; + let pos: u64 = payload.pos; let proof_items: Vec> = proof.proof_items().iter() .map(|leaf| leaf.0.to_vec().clone()) @@ -301,34 +301,22 @@ async fn handle_execute( let bounded = >>::truncate_from(name); - let proxy_call = RuntimeCall::Otp(OtpCall::proxy { + let proxy_call = RuntimeCall::Murmur(MurmurCall::proxy { name: bounded, position: pos, - size: leaves.len() as u64, - ciphertext_bytes: target_leaf.0, + target_leaf: target_leaf.0, proof: proof_items, call: Box::new(call), when, hash, }); - // let proxy_call = etf::tx().otp().proxy( - // bounded, - // pos, - // leaves.len() as u64, - // target_leaf.0, - // hash, - // proof_items, - // Box::new(call), - // when, - // ); - let proxy_call_bytes: &[u8] = &proxy_call.encode(); - // then construct a scheduled transaction for "when" // 1. tlock + let identity = murmur::build_identity(when); let timelocked_proxy_call = murmur::timelock_encrypt::( - when, + identity, pk.1, ephemeral_msk, proxy_call_bytes, diff --git a/core/Cargo.toml b/core/Cargo.toml index 6e4374e..8aadff3 100644 --- a/core/Cargo.toml +++ b/core/Cargo.toml @@ -21,8 +21,6 @@ etf-crypto-primitives = { git = "https://github.com/ideal-lab5/etf-sdk/", branch rand_chacha = "0.3.1" ckb-merkle-mountain-range = "0.5.2" sha3 = "0.10.8" -# serde_cbor = "0.11.2" -# serde_json = "1.0.108" serde = { version = "1.0.188", features = ["alloc", "derive"], default-features = false} beefy = { package = "sp-consensus-beefy-etf", git = "https://github.com/ideal-lab5/etf.git", branch = "tony/dev", features = ["bls-experimental"] } ark-bls12-377 = { version = "0.4.0", default-features = false } diff --git a/core/README.md b/core/README.md index db26cce..b9c2820 100644 --- a/core/README.md +++ b/core/README.md @@ -1,3 +1,18 @@ # Murmur Core -The core implementation of the murmur protocol +The core implementation of the murmur protocol. This library enables each step of the Murmur protocol, including implementations of the following: + +- `create -> (root, mmr_leaves_to_bn = {(1, Leaf(0x0123...)), (3, Leaf(0x12301...)), ...})` +- `execute -> ` +- `verify -> true/false` + +## Build +``` shell +cargo build +``` + +## Test + +``` shell +cargo test +``` \ No newline at end of file diff --git a/core/src/murmur.rs b/core/src/murmur.rs index 2732ed4..f759c38 100644 --- a/core/src/murmur.rs +++ b/core/src/murmur.rs @@ -17,7 +17,7 @@ //! The murmur protocol implementation //! -use alloc::{vec, vec::Vec}; +use alloc::{string::String, vec, vec::Vec}; use crate::otp::BOTPGenerator; use crate::types::*; use etf_crypto_primitives::{ @@ -33,14 +33,10 @@ use ckb_merkle_mountain_range::{ }, }; use ark_serialize::CanonicalSerialize; -use beefy::{ - known_payloads, - Payload, - Commitment, -}; use codec::Encode; use rand_core::OsRng; use sha3::Digest; +use beefy::{known_payloads, Payload, Commitment, VersionedFinalityProof}; #[derive(Debug)] pub enum Error { @@ -64,8 +60,9 @@ pub fn create( for i in &block_schedule { let otp_code = totp.generate(*i); + let identity = build_identity(*i); let ct_bytes = timelock_encrypt::( - *i, + identity, pk.1, ephemeral_msk, otp_code.as_bytes(), @@ -78,14 +75,13 @@ pub fn create( } /// computes parameters needed to execute a transaction at the specified block number -/// outputs (ciphertext, hash, merkle proof, position/index) -/// TODO: create a new struct to represent return type +/// outputs a payload containing: (ciphertext, hash, merkle proof, position/index) pub fn execute( seed: Vec, when: BlockNumber, - call_data: Vec, + aux_data: Vec, leaves: Vec<(BlockNumber, Leaf)>, -) -> Result<(Leaf, Vec, MerkleProof, Leaf, u64), Error> { +) -> Result { // rebuild the MMR and search for the position of the leaf for the given block number let store = MemStore::default(); let mut mmr = MemMMR::<_, MergeLeaves>::new(0, store); @@ -114,30 +110,62 @@ pub fn execute( let otp_code = botp.generate(when); let mut hasher = sha3::Sha3_256::default(); hasher.update(otp_code.as_bytes()); - hasher.update(&call_data); + hasher.update(&aux_data); let hash = hasher.finalize().to_vec(); - Ok((root, hash, proof, target_leaf, target_pos)) + let payload = ExecutionPayload { + root, + proof, + target: target_leaf, + pos: target_pos, + hash, + sk: Vec::new(), + }; + Ok(payload) +} + +/// verify the correctness of a proof +/// e.g. would be called by the pallet/runtime +pub fn verify( + root: Leaf, + otp: String, + aux_data: Vec, + payload: ExecutionPayload +) -> bool { + // verify the merkle proof + let proof = payload.proof; + let pos = payload.pos; + let target = payload.target; + + let mut validity = proof.verify(root, vec![(pos, target)]) + .unwrap_or(false); + + if validity { + // verify the hash + let mut hasher = sha3::Sha3_256::default(); + hasher.update(otp.as_bytes().to_vec()); + hasher.update(aux_data); + let hash = hasher.finalize(); + + validity = validity + && hash.to_vec() == payload.hash; + } + + validity } /// timelock encryption function pub fn timelock_encrypt( - when: BlockNumber, + identity: Identity, pk: E::PublicKeyGroup, ephemeral_msk: [u8;32], message: &[u8], ) -> Vec { - let payload = Payload::from_single_entry(known_payloads::ETF_SIGNATURE, Vec::new()); - let commitment = Commitment { - payload, - block_number: when, - validator_set_id: 0, // TODO: how to ensure correct validator set ID is used? could just always set to 1 for now, else set input param. - }; let ciphertext = tle::( pk.clone(), ephemeral_msk.clone(), message, - Identity::new(&commitment.encode()), + identity, OsRng, // TODO ).unwrap(); // TODO: Error Handling let mut ct_bytes = Vec::new(); @@ -145,6 +173,20 @@ pub fn timelock_encrypt( ct_bytes } + +/// build an identity based on the block number +/// in the future we can consider abstracting this functionality to work with identities constructed in different ways +/// e.g. if we want to support multiple beacons +pub fn build_identity(when: BlockNumber) -> Identity { + let payload = Payload::from_single_entry(known_payloads::ETF_SIGNATURE, Vec::new()); + let commitment = Commitment { + payload, + block_number: when, + validator_set_id: 0, // TODO: how to ensure correct validator set ID is used? could just always set to 1 for now, else set input param. + }; + Identity::new(&commitment.encode()) +} + /// build a block-otp generator from the seed fn build_generator(seed: &[u8]) -> BOTPGenerator { let mut hasher = sha3::Sha3_256::default(); @@ -152,7 +194,6 @@ fn build_generator(seed: &[u8]) -> BOTPGenerator { let hash = hasher.finalize(); BOTPGenerator::new(hash.to_vec()) } - mod tests { @@ -183,7 +224,65 @@ mod tests { } #[test] - pub fn it_can_generate_valid_merkle_proofs_and_hashes() { + pub fn it_can_generate_valid_output_and_verify_it() { + let keypair = w3f_bls::KeypairVT::::generate(&mut OsRng); + // let msk = keypair.secret.0; // can destroy this + let double_public: DoublePublicKey = DoublePublicKey( + keypair.into_public_key_in_signature_group().0, + keypair.public.0, + ); + + let double_public_again: DoublePublicKey = DoublePublicKey( + keypair.into_public_key_in_signature_group().0, + keypair.public.0, + ); + + let ephem_msk = [1;32]; + let seed = vec![1,2,3]; + let schedule = vec![1,2,3]; + + let leaves = create::( + seed.clone(), + schedule.clone(), + ephem_msk, + double_public, + ); + + // precompute a root here + // this is the expected root when we attempt to call verify + let store = MemStore::default(); + let mut mmr = MemMMR::<_, MergeLeaves>::new(0, store); + + leaves.clone().into_iter().for_each(|leaf_data| { + mmr.push(leaf_data.1.clone()).unwrap(); + }); + + // prepare merkle proof + let expected_root = mmr.get_root().expect("The MMR root should be calculable"); + let aux_data = vec![1,2,3]; + + let later = 1; + // generate execution parameters + if let Ok(payload) = execute::( + seed.clone(), + later, + aux_data.clone(), + leaves, + ) { + // we will recalculate the otp code here + // in practice, the verify function would get the OTP code by using timelock decryption + // where the ciphertext is provided in the execution payload + let botp = build_generator(&seed.clone()); + let otp_code = botp.generate(later); + + assert!(verify(expected_root, otp_code, aux_data, payload)); + } else { + panic!("The test should pass"); + } + } + + #[test] + pub fn it_fails_on_verify_bad_aux_data() { let keypair = w3f_bls::KeypairVT::::generate(&mut OsRng); // let msk = keypair.secret.0; // can destroy this let double_public: DoublePublicKey = DoublePublicKey( @@ -207,44 +306,34 @@ mod tests { double_public, ); + // precompute a root here + // this is the expected root when we attempt to call verify + let store = MemStore::default(); + let mut mmr = MemMMR::<_, MergeLeaves>::new(0, store); + + leaves.clone().into_iter().for_each(|leaf_data| { + mmr.push(leaf_data.1.clone()).unwrap(); + }); + + // prepare merkle proof + let expected_root = mmr.get_root().expect("The MMR root should be calculable"); + let aux_data = vec![1,2,3]; + let later = 1; // generate execution parameters - if let Ok(result) = execute::( - seed, + if let Ok(payload) = execute::( + seed.clone(), later, - vec![1,2,3], // aux data (call data in practice) + aux_data.clone(), leaves, ) { - let root: Leaf = result.0; - let hash: Vec = result.1; - let original_proof: MerkleProof = result.2; - let target_leaf: Leaf = result.3; - let pos: u64 = result.4; - - - // experiment w/ serialization - let proof_items: Vec> = original_proof.proof_items().iter() - .map(|leaf| leaf.0.to_vec().clone()) - .collect::>(); - // convert to leaves - let leaves: Vec = proof_items.clone().into_iter().map(|p| Leaf(p)).collect::>(); - assert_eq!(leaves, original_proof.proof_items().to_vec()); - - let proof = MerkleProof::::new(schedule.clone().len() as u64, leaves); - assert_eq!(proof.proof_items(), original_proof.proof_items()); - // let root = Leaf::from(proxy_details.root); - let target = vec![(pos, target_leaf.clone())]; - let new_root = proof.calculate_root(target.clone()).unwrap(); - - match proof.verify(new_root, target.clone()) { - Ok(validity) => { - assert!(validity); - }, - Err(e) => { - panic!("The test failed with error: {:?}", e); - } - } - // then we verify the hash + // we will recalculate the otp code here + // in practice, the verify function would get the OTP code by using timelock decryption + // where the ciphertext is provided in the execution payload + let botp = build_generator(&seed.clone()); + let otp_code = botp.generate(later); + let bad_aux_data = vec![2,3,4,5,4,3]; + assert!(!verify(expected_root, otp_code, bad_aux_data, payload)); } else { panic!("The test should pass"); } diff --git a/core/src/types.rs b/core/src/types.rs index 82aed48..b0429d9 100644 --- a/core/src/types.rs +++ b/core/src/types.rs @@ -14,7 +14,7 @@ * limitations under the License. */ -use ckb_merkle_mountain_range::{Merge, Result as MMRResult}; +use ckb_merkle_mountain_range::{Merge, Result as MMRResult, MerkleProof}; use codec::{Decode, Encode}; use sha3::Digest; use alloc::vec::Vec; @@ -50,4 +50,22 @@ impl Merge for MergeLeaves { let hash = hasher.finalize(); Ok(Leaf(hash.to_vec().into())) } +} + +/// an execution payload to represent knowledge of a future otp code +#[derive(Debug)] +pub struct ExecutionPayload { + /// the root of the mmr + pub root: Leaf, + /// the merkle proof for the target leaf + pub proof: MerkleProof, + /// the target leaf (contains ciphertext) + pub target: Leaf, + /// the position of the target leaf in the mmr + pub pos: u64, + /// hash(OTP || CALL_DATA) + pub hash: Vec, + /// the secret key that can be used to decrypt the target + /// can be empty + pub sk: Vec, } \ No newline at end of file From 49746247aed5e75347ba357ec40e0ce2b761a3d5 Mon Sep 17 00:00:00 2001 From: driemworks Date: Fri, 13 Sep 2024 15:11:16 -0500 Subject: [PATCH 04/20] add back beefy dep --- Cargo.lock | 61 +++---- cli/Cargo.toml | 3 +- cli/src/_main copy.rs | 368 ------------------------------------------ core/src/murmur.rs | 4 + 4 files changed, 31 insertions(+), 405 deletions(-) delete mode 100644 cli/src/_main copy.rs diff --git a/Cargo.lock b/Cargo.lock index 4ecad34..57e0423 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4579,7 +4579,7 @@ dependencies = [ "serde_json", "sha3", "sp-application-crypto", - "sp-consensus-beefy-etf 13.0.0 (git+https://github.com/ideal-lab5/etf.git?branch=tony/dev)", + "sp-consensus-beefy-etf", "sp-core", "sp-keyring", "sp-runtime", @@ -4607,7 +4607,7 @@ dependencies = [ "rand_core", "serde", "sha3", - "sp-consensus-beefy-etf 13.0.0 (git+https://github.com/ideal-lab5/etf.git?branch=tony/dev)", + "sp-consensus-beefy-etf", "totp-rs", "w3f-bls", ] @@ -4657,6 +4657,7 @@ dependencies = [ [[package]] name = "node-template-runtime" version = "0.0.1" +source = "git+https://github.com/ideal-lab5/etf.git?branch=tony/dev#1d5a47f0628c3591a58d0ce9e56ee911b3512ed8" dependencies = [ "frame-benchmarking", "frame-benchmarking-pallet-pov", @@ -4765,7 +4766,7 @@ dependencies = [ "sp-authority-discovery", "sp-block-builder", "sp-consensus-babe", - "sp-consensus-beefy-etf 13.0.0", + "sp-consensus-beefy-etf", "sp-consensus-grandpa", "sp-core", "sp-genesis-builder", @@ -5240,6 +5241,7 @@ dependencies = [ [[package]] name = "pallet-beefy-etf" version = "28.0.0" +source = "git+https://github.com/ideal-lab5/etf.git?branch=tony/dev#1d5a47f0628c3591a58d0ce9e56ee911b3512ed8" dependencies = [ "ark-bls12-377", "ark-serialize 0.4.2", @@ -5254,7 +5256,7 @@ dependencies = [ "parity-scale-codec", "scale-info", "serde", - "sp-consensus-beefy-etf 13.0.0", + "sp-consensus-beefy-etf", "sp-runtime", "sp-session", "sp-staking", @@ -5289,6 +5291,7 @@ dependencies = [ [[package]] name = "pallet-beefy-mmr-etf" version = "28.0.0" +source = "git+https://github.com/ideal-lab5/etf.git?branch=tony/dev#1d5a47f0628c3591a58d0ce9e56ee911b3512ed8" dependencies = [ "array-bytes 6.2.2", "binary-merkle-tree", @@ -5302,7 +5305,7 @@ dependencies = [ "scale-info", "serde", "sp-api", - "sp-consensus-beefy-etf 13.0.0", + "sp-consensus-beefy-etf", "sp-core", "sp-io", "sp-runtime", @@ -5731,6 +5734,7 @@ dependencies = [ [[package]] name = "pallet-etf" version = "28.0.0" +source = "git+https://github.com/ideal-lab5/etf.git?branch=tony/dev#1d5a47f0628c3591a58d0ce9e56ee911b3512ed8" dependencies = [ "ark-bls12-377", "ark-serialize 0.4.2", @@ -5744,7 +5748,7 @@ dependencies = [ "parity-scale-codec", "scale-info", "serde", - "sp-consensus-beefy-etf 13.0.0", + "sp-consensus-beefy-etf", "sp-runtime", "sp-session", "sp-staking", @@ -6037,6 +6041,7 @@ dependencies = [ [[package]] name = "pallet-murmur" version = "4.0.0-dev" +source = "git+https://github.com/ideal-lab5/etf.git?branch=tony/dev#1d5a47f0628c3591a58d0ce9e56ee911b3512ed8" dependencies = [ "ark-bls12-381", "ark-serialize 0.4.2", @@ -6299,6 +6304,7 @@ dependencies = [ [[package]] name = "pallet-proxy" version = "28.1.0" +source = "git+https://github.com/ideal-lab5/etf.git?branch=tony/dev#1d5a47f0628c3591a58d0ce9e56ee911b3512ed8" dependencies = [ "frame-benchmarking", "frame-support", @@ -6313,6 +6319,7 @@ dependencies = [ [[package]] name = "pallet-randomness-beacon" version = "28.0.0" +source = "git+https://github.com/ideal-lab5/etf.git?branch=tony/dev#1d5a47f0628c3591a58d0ce9e56ee911b3512ed8" dependencies = [ "ark-bls12-377", "ark-ff 0.4.2", @@ -6332,7 +6339,7 @@ dependencies = [ "serde", "sha2 0.10.8", "sha3", - "sp-consensus-beefy-etf 13.0.0", + "sp-consensus-beefy-etf", "sp-runtime", "sp-session", "sp-staking", @@ -6480,6 +6487,7 @@ dependencies = [ [[package]] name = "pallet-scheduler" version = "4.0.0-dev" +source = "git+https://github.com/ideal-lab5/etf.git?branch=tony/dev#1d5a47f0628c3591a58d0ce9e56ee911b3512ed8" dependencies = [ "docify", "frame-benchmarking", @@ -9734,26 +9742,7 @@ dependencies = [ [[package]] name = "sp-consensus-beefy-etf" version = "13.0.0" -dependencies = [ - "lazy_static", - "parity-scale-codec", - "scale-info", - "serde", - "sp-api", - "sp-application-crypto", - "sp-core", - "sp-crypto-hashing 0.1.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", - "sp-io", - "sp-keystore", - "sp-mmr-primitives", - "sp-runtime", - "strum 0.24.1", -] - -[[package]] -name = "sp-consensus-beefy-etf" -version = "13.0.0" -source = "git+https://github.com/ideal-lab5/etf.git?branch=tony/dev#75415649dd95ba9d201a2a2201e5b3c917f9e1b2" +source = "git+https://github.com/ideal-lab5/etf.git?branch=tony/dev#1d5a47f0628c3591a58d0ce9e56ee911b3512ed8" dependencies = [ "lazy_static", "parity-scale-codec", @@ -9889,7 +9878,7 @@ dependencies = [ [[package]] name = "sp-crypto-ec-utils" version = "0.10.0" -source = "git+https://github.com/paritytech/polkadot-sdk#d887804b235003282b26d4202f40c79fb302f16c" +source = "git+https://github.com/paritytech/polkadot-sdk#51f336711a0391987db69d6281c9b57bfe49d925" dependencies = [ "ark-bls12-377", "ark-bls12-377-ext", @@ -9956,7 +9945,7 @@ dependencies = [ [[package]] name = "sp-debug-derive" version = "14.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk#d887804b235003282b26d4202f40c79fb302f16c" +source = "git+https://github.com/paritytech/polkadot-sdk#51f336711a0391987db69d6281c9b57bfe49d925" dependencies = [ "proc-macro2", "quote", @@ -9976,7 +9965,7 @@ dependencies = [ [[package]] name = "sp-externalities" version = "0.25.0" -source = "git+https://github.com/paritytech/polkadot-sdk#d887804b235003282b26d4202f40c79fb302f16c" +source = "git+https://github.com/paritytech/polkadot-sdk#51f336711a0391987db69d6281c9b57bfe49d925" dependencies = [ "environmental", "parity-scale-codec", @@ -10183,7 +10172,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface" version = "24.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk#d887804b235003282b26d4202f40c79fb302f16c" +source = "git+https://github.com/paritytech/polkadot-sdk#51f336711a0391987db69d6281c9b57bfe49d925" dependencies = [ "bytes", "impl-trait-for-tuples", @@ -10215,7 +10204,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface-proc-macro" version = "17.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk#d887804b235003282b26d4202f40c79fb302f16c" +source = "git+https://github.com/paritytech/polkadot-sdk#51f336711a0391987db69d6281c9b57bfe49d925" dependencies = [ "Inflector", "expander", @@ -10304,7 +10293,7 @@ source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1 [[package]] name = "sp-std" version = "14.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk#d887804b235003282b26d4202f40c79fb302f16c" +source = "git+https://github.com/paritytech/polkadot-sdk#51f336711a0391987db69d6281c9b57bfe49d925" [[package]] name = "sp-storage" @@ -10321,7 +10310,7 @@ dependencies = [ [[package]] name = "sp-storage" version = "19.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk#d887804b235003282b26d4202f40c79fb302f16c" +source = "git+https://github.com/paritytech/polkadot-sdk#51f336711a0391987db69d6281c9b57bfe49d925" dependencies = [ "impl-serde", "parity-scale-codec", @@ -10356,7 +10345,7 @@ dependencies = [ [[package]] name = "sp-tracing" version = "16.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk#d887804b235003282b26d4202f40c79fb302f16c" +source = "git+https://github.com/paritytech/polkadot-sdk#51f336711a0391987db69d6281c9b57bfe49d925" dependencies = [ "parity-scale-codec", "tracing", @@ -10453,7 +10442,7 @@ dependencies = [ [[package]] name = "sp-wasm-interface" version = "20.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk#d887804b235003282b26d4202f40c79fb302f16c" +source = "git+https://github.com/paritytech/polkadot-sdk#51f336711a0391987db69d6281c9b57bfe49d925" dependencies = [ "anyhow", "impl-trait-for-tuples", diff --git a/cli/Cargo.toml b/cli/Cargo.toml index 1b727df..df053a1 100644 --- a/cli/Cargo.toml +++ b/cli/Cargo.toml @@ -23,7 +23,8 @@ serde_json = "1.0.108" indicatif = "0.17.8" sp-keyring = { git = "https://github.com/ideal-lab5/polkadot-sdk.git", branch = "testing" } frame-support = { git = "https://github.com/ideal-lab5/polkadot-sdk.git", branch = "testing" } -node-template-runtime = { path = "../../etf/runtime" } +# node-template-runtime = { path = "../../etf/runtime" } +node-template-runtime = { git = "https://github.com/ideal-lab5/etf.git", branch = "tony/dev" } codec = { package = "parity-scale-codec", version = "3.6.12", features = [ "derive", ] } diff --git a/cli/src/_main copy.rs b/cli/src/_main copy.rs deleted file mode 100644 index 10f4118..0000000 --- a/cli/src/_main copy.rs +++ /dev/null @@ -1,368 +0,0 @@ -#![allow(missing_docs)] -use subxt::{OnlineClient, PolkadotConfig, config::Header}; -use subxt_signer::sr25519::dev; - -// Generate an interface that we can use from the node's metadata. -#[subxt::subxt(runtime_metadata_path = "./artifacts/metadata.scale")] -pub mod etf {} - -mod otp; - - -use std::io::{Read, Write, BufRead, BufReader}; -use std::fs::File; -use std::time::Duration; -use std::collections::HashMap; - -use clap::{Args, Parser, Subcommand}; - -use ckb_merkle_mountain_range::{ - MerkleProof, - MMR, Merge, Result as MMRResult, MMRStore, - util::{ MemMMR, MemStore }, -}; - -use rand_chacha::{ - ChaCha20Rng, - rand_core::SeedableRng, -}; - -use etf_crypto_primitives::{ - ibe::fullident::BfIbe, - client::etf_client::{AesIbeCt, DefaultEtfClient, EtfClient}, - utils::{convert_to_bytes, hash_to_g1}, - -}; - -use sp_keyring::AccountKeyring; -use node_runtime::{self, BalancesCall, OtpCall, RuntimeCall, pallet_etf::Ciphertext}; -use frame_support::{BoundedVec, traits::ConstU32}; - -use std::time::Instant; -use indicatif::ProgressBar; - -use codec::{Decode, Encode}; - -/// Command line -#[derive(Parser)] -#[command(author, version, about, long_about = None)] -#[command(propagate_version = true)] -struct Cli { - #[command(subcommand)] - commands: Commands, -} - -#[derive(Subcommand)] -enum Commands { - /// create a new OTP wallet - New(WalletCreationDetails), - /// dispatch (proxy) a call to an OTP wallet - Execute(WalletExecuteDetails), -} - -#[derive(Parser)] -struct WalletCreationDetails { - #[arg()] - name: String, - #[arg()] - password: String, -// min: u32, -// max: u32, -} - -#[derive(Parser)] -struct WalletExecuteDetails { - #[arg()] - name: String, - #[arg()] - password: String, - #[arg(long)] - delay: u64, - #[arg(short, long)] - amount: String, -} - -use sp_core::Bytes; -use sha3::Digest; - -#[derive(Eq, PartialEq, Clone, Debug, Default, serde::Serialize, serde::Deserialize)] -struct Leaf(pub Vec); -impl From> for Leaf { - fn from(data: Vec) -> Self { - let mut hasher = sha3::Sha3_256::default(); - hasher.update(&data); - let hash = hasher.finalize(); - Leaf(hash.to_vec().into()) - } -} - -struct MergeLeaves; - -impl Merge for MergeLeaves { - type Item = Leaf; - fn merge(lhs: &Self::Item, rhs: &Self::Item) -> MMRResult { - let mut hasher = sha3::Sha3_256::default(); - hasher.update(&lhs.0); - hasher.update(&rhs.0); - let hash = hasher.finalize(); - Ok(Leaf(hash.to_vec().into())) - } -} - - -fn load_leaves() -> Vec<(u64, Leaf)> { - let mmr_store_file = File::open("mmr_store").expect("Unable to open file"); - let leaves: Vec<(u64, Leaf)> = serde_cbor::from_reader(mmr_store_file).unwrap(); - leaves -} - -// Write the ciphertext to a file -fn write_leaves(leaves: &[(u64, Leaf)]) { - let mut mmr_store_file = File::create("mmr_store").expect("should be ok"); - serde_cbor::to_writer(mmr_store_file, &leaves).unwrap(); -} - - -// /// the runtime call type -// type Call = runtime_types::node::RuntimeCall; -// /// the balances call type -// type BalancesCall = runtime_types::pallet_balances::pallet::Call; -// /// the proxy call type -// type ProxyCall = runtime_types::pallet_proxy::pallet::Call; - -#[tokio::main] -async fn main() -> Result<(), Box> { - - let cli = Cli::parse(); - - let before = Instant::now(); - match &cli.commands { - Commands::New(args) => { - println!("OTP Wallet Client: Create new wallet"); - - let bar = ProgressBar::new_spinner(); - bar.enable_steady_tick(Duration::from_millis(100)); - - // TODO: should probably use sha256 instead - let mut hasher = sha3::Sha3_256::default(); - hasher.update(args.password.as_bytes()); - let hash = hasher.finalize(); - - let totp = otp::BOTPGenerator::new(hash.to_vec()); - let etf = OnlineClient::::new().await?; - let current_block = etf.blocks().at_latest().await?; - let current_slot_number: u64 = current_block.storage() - .fetch(&etf::storage().aura().current_slot()) - .await?.unwrap().0; - let ibe_params = current_block.storage() - .fetch(&etf::storage().etf().ibe_params()) - .await?.unwrap(); - - let mut rng = ChaCha20Rng::seed_from_u64(1); - - // write MMR leaves to a file - let mut mmr_store_file = File::create("mmr_store").unwrap(); - - let store = MemStore::default(); - let mut mmr = MemMMR::<_, MergeLeaves>::new(0, store); - - println!("Generating MMR"); - let mut leaf_data = Vec::new(); - for i in 1..101 { - let id = (current_slot_number + i).to_string().as_bytes().to_vec(); - let otp_code = totp.generate((current_slot_number + i) as u32); - // TODO: Do we need to encrypt the entire otp code or just a hash of it? - // AesIbeCt - // let ct = DefaultEtfClient::::encrypt( - // ibe_params.1.clone(), - // ibe_params.2.clone(), - // &otp_code.as_bytes(), - // vec![id.clone()], - // 1, - // &mut rng, - // ).unwrap(); - - - // let s = Ciphertext { - // ciphertext: >>::truncate_from(ct.aes_ct.ciphertext), - // nonce: >>::truncate_from(ct.aes_ct.nonce), - // capsule: >>::truncate_from(ct.etf_ct[0].clone()), - // }; - - let leaf = Leaf::from(otp_code.as_bytes().to_vec()); - // TODO: error handling - let pos = mmr.push(leaf.clone()).unwrap(); - leaf_data.push((current_block.header().number() as u64 + i, leaf)); - } - - write_leaves(&leaf_data); - let root = mmr.get_root().expect("The MMR root should be calculable"); - println!("MMR ROOT {:?}", root); - - let name = args.name.as_bytes().to_vec(); - - let create_anon_tx = etf::tx() - .otp() - .create( - root.0.into(), - etf::runtime_types::bounded_collections::bounded_vec::BoundedVec(name)); - let from = dev::alice(); - let events = etf - .tx() - .sign_and_submit_then_watch_default(&create_anon_tx, &from) - .await?; - println!("OTP wallet creation successful!"); - bar.finish(); - // TODO: get the wallet address - // Find a Transfer event and print it. - // let transfer_event = events.find_first::()?; - // if let Some(_event) = transfer_event { - // println!("OTP wallet creation successful!"); - // bar.finish(); - // } - }, - Commands::Execute(args) => { - println!("OTP Wallet Client: Execute Wallet Balance Transfer"); - - let bar = ProgressBar::new_spinner(); - bar.enable_steady_tick(Duration::from_millis(100)); - let mut hasher = sha3::Sha3_256::default(); - hasher.update(args.password.as_bytes()); - let hash = hasher.finalize(); - let totp = otp::BOTPGenerator::new(hash.to_vec()); - let etf = OnlineClient::::new().await?; - - let mut rng = ChaCha20Rng::seed_from_u64(1); - let mut block_subscription = etf.blocks().subscribe_all().await?; - if let Some(Ok(current_block)) = block_subscription.next().await { - // get data from runtime storage - let current_slot_number: u64 = current_block.storage() - .fetch(&etf::storage().aura().current_slot()) - .await?.unwrap().0; - println!("current slot no {:?}", current_slot_number); - let ibe_params = current_block.storage() - .fetch(&etf::storage().etf().ibe_params()) - .await?.unwrap(); - - // build balance transfer - let bob = AccountKeyring::Bob.to_account_id().into(); - // get the value argument - let v: u128 = args.amount - .split_whitespace() - .map(|r| r.replace('_', "").parse().unwrap()) - .collect::>()[0]; - let balance_transfer_call = RuntimeCall::Balances( - BalancesCall::transfer_allow_death { - dest: bob, - value: v, - }); - - let id = (current_slot_number + args.delay).to_string().as_bytes().to_vec(); - - // calculate the OTP code we need - let otp_code = totp.generate((current_slot_number + args.delay - 1) as u32); - println!("Will execute at {:?} using code {:?} ", current_block.header().number + (args.delay as u32), otp_code); - - let expected_otp_ciphertext = DefaultEtfClient::::encrypt( - ibe_params.1.clone(), - ibe_params.2.clone(), - &otp_code.as_bytes(), - vec![id.clone()], - 1, - &mut rng, - ).unwrap(); - - let expected_otp_ct = Ciphertext { - ciphertext: >>::truncate_from(expected_otp_ciphertext.aes_ct.ciphertext), - nonce: >>::truncate_from(expected_otp_ciphertext.aes_ct.nonce), - capsule: >>::truncate_from(expected_otp_ciphertext.etf_ct[0].clone()), - }; - - let bounded = >>::truncate_from(args.name.as_bytes().to_vec()); - - let target_block_number: u64 = (current_block.header().number + 2) as u64; - let leaves: Vec<(u64, Leaf)> = load_leaves(); - - // rebuild the MMR and search for the position of the leaf for the given block number - let store = MemStore::default(); - let mut mmr = MemMMR::<_, MergeLeaves>::new(0, store); - let mut target_pos: u64 = 0; - leaves.into_iter().for_each(|leaf_data| { - let leaf = leaf_data.1; - let block_num = leaf_data.0; - let pos = mmr.push(leaf.clone()).unwrap(); - if block_num == target_block_number { - target_pos = pos; - } - }); - - // prepare merkle proof - let root = mmr.get_root().expect("The MMR root should be calculable"); - let proof = mmr.gen_proof(vec![target_pos]).expect("should be ok"); - proof.verify(root, vec![(target_pos, Leaf::from(expected_otp_hash.to_vec()))]).unwrap(), - - let proof_items: Vec> = proof.proof_items().iter() - .map(|leaf| leaf.0.to_vec().clone()) - .collect::>(); - - // build proxy call - let proxy_call = RuntimeCall::OTP(OtpCall::proxy { - name: bounded, - otp: otp_code - .as_bytes() - .to_vec() - .as_slice() - .try_into() - .expect("should be 6 digit OTP code"), - position: target_pos, - ciphertext: expected_otp_ct, - proof: proof_items, - call: Box::new(balance_transfer_call), - }); - - let timelocked_proxy_call = DefaultEtfClient::::encrypt( - ibe_params.1.clone(), - ibe_params.2.clone(), - &proxy_call.encode(), - vec![id], - 1, - &mut rng, - ).unwrap(); - - let at: u32 = current_block.header().number + args.delay as u32; - let ct = etf::runtime_types::pallet_etf::Ciphertext { - ciphertext: - etf::runtime_types::bounded_collections::bounded_vec::BoundedVec(timelocked_proxy_call.aes_ct.ciphertext), - nonce: - etf::runtime_types::bounded_collections::bounded_vec::BoundedVec(timelocked_proxy_call.aes_ct.nonce), - capsule: - etf::runtime_types::bounded_collections::bounded_vec::BoundedVec(timelocked_proxy_call.etf_ct[0].clone()) - }; - - // println!("ct {:?}", ct); - - let sealed_tx = etf::tx() - .scheduler() - .schedule_sealed(at, 127, ct); - - let events = etf - .tx() - .sign_and_submit_then_watch_default(&sealed_tx, &dev::alice()) - .await?; - } - bar.finish(); - println!("Done!"); - - } - _ => panic!("Hey, don't do that!"), - } - println!("Elapsed time: {:.2?}", before.elapsed()); - Ok(()) -} - -#[cfg(test)] -mod tests { - // pub fn test_can_read_write_leaves() { - - // } -} \ No newline at end of file diff --git a/core/src/murmur.rs b/core/src/murmur.rs index f759c38..b7aeb5e 100644 --- a/core/src/murmur.rs +++ b/core/src/murmur.rs @@ -43,6 +43,10 @@ pub enum Error { ExecuteError } +// TODO: create an 'identity builder' trait and inject into the create function +// then remove the dependency on beefy here +// and implement an identity builder in the cli component + /// creates the leaves needed to generate an MMR /// This function generates otp codes for the given block schedule /// then it encrypts the resulting codes and constructs leaves From 297702fc68fde522d86a74c3239f6864e85e99b8 Mon Sep 17 00:00:00 2001 From: driemworks Date: Mon, 16 Sep 2024 21:03:49 -0500 Subject: [PATCH 05/20] real time usage works --- Cargo.lock | 42 +++++--- README.md | 8 +- cli/Cargo.toml | 6 +- cli/README.md | 23 +++++ cli/artifacts/metadata.scale | Bin 618956 -> 619031 bytes cli/src/main.rs | 188 ++++++++++++++++++++++++++++++----- core/Cargo.toml | 40 ++++++-- core/src/lib.rs | 8 +- core/src/murmur.rs | 62 ++++++------ core/src/types.rs | 7 +- mmr_store | Bin 203 -> 3368 bytes 11 files changed, 289 insertions(+), 95 deletions(-) create mode 100644 cli/README.md diff --git a/Cargo.lock b/Cargo.lock index 57e0423..d2b4e86 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4579,7 +4579,7 @@ dependencies = [ "serde_json", "sha3", "sp-application-crypto", - "sp-consensus-beefy-etf", + "sp-consensus-beefy-etf 13.0.0 (git+https://github.com/ideal-lab5/etf.git?branch=tony/dev)", "sp-core", "sp-keyring", "sp-runtime", @@ -4603,11 +4603,9 @@ dependencies = [ "getrandom", "hex", "parity-scale-codec", - "rand_chacha", "rand_core", "serde", "sha3", - "sp-consensus-beefy-etf", "totp-rs", "w3f-bls", ] @@ -4657,7 +4655,6 @@ dependencies = [ [[package]] name = "node-template-runtime" version = "0.0.1" -source = "git+https://github.com/ideal-lab5/etf.git?branch=tony/dev#1d5a47f0628c3591a58d0ce9e56ee911b3512ed8" dependencies = [ "frame-benchmarking", "frame-benchmarking-pallet-pov", @@ -4766,7 +4763,7 @@ dependencies = [ "sp-authority-discovery", "sp-block-builder", "sp-consensus-babe", - "sp-consensus-beefy-etf", + "sp-consensus-beefy-etf 13.0.0", "sp-consensus-grandpa", "sp-core", "sp-genesis-builder", @@ -5241,7 +5238,6 @@ dependencies = [ [[package]] name = "pallet-beefy-etf" version = "28.0.0" -source = "git+https://github.com/ideal-lab5/etf.git?branch=tony/dev#1d5a47f0628c3591a58d0ce9e56ee911b3512ed8" dependencies = [ "ark-bls12-377", "ark-serialize 0.4.2", @@ -5256,7 +5252,7 @@ dependencies = [ "parity-scale-codec", "scale-info", "serde", - "sp-consensus-beefy-etf", + "sp-consensus-beefy-etf 13.0.0", "sp-runtime", "sp-session", "sp-staking", @@ -5291,7 +5287,6 @@ dependencies = [ [[package]] name = "pallet-beefy-mmr-etf" version = "28.0.0" -source = "git+https://github.com/ideal-lab5/etf.git?branch=tony/dev#1d5a47f0628c3591a58d0ce9e56ee911b3512ed8" dependencies = [ "array-bytes 6.2.2", "binary-merkle-tree", @@ -5305,7 +5300,7 @@ dependencies = [ "scale-info", "serde", "sp-api", - "sp-consensus-beefy-etf", + "sp-consensus-beefy-etf 13.0.0", "sp-core", "sp-io", "sp-runtime", @@ -5734,7 +5729,6 @@ dependencies = [ [[package]] name = "pallet-etf" version = "28.0.0" -source = "git+https://github.com/ideal-lab5/etf.git?branch=tony/dev#1d5a47f0628c3591a58d0ce9e56ee911b3512ed8" dependencies = [ "ark-bls12-377", "ark-serialize 0.4.2", @@ -5748,7 +5742,7 @@ dependencies = [ "parity-scale-codec", "scale-info", "serde", - "sp-consensus-beefy-etf", + "sp-consensus-beefy-etf 13.0.0", "sp-runtime", "sp-session", "sp-staking", @@ -6041,7 +6035,6 @@ dependencies = [ [[package]] name = "pallet-murmur" version = "4.0.0-dev" -source = "git+https://github.com/ideal-lab5/etf.git?branch=tony/dev#1d5a47f0628c3591a58d0ce9e56ee911b3512ed8" dependencies = [ "ark-bls12-381", "ark-serialize 0.4.2", @@ -6051,6 +6044,7 @@ dependencies = [ "frame-support", "frame-system", "log", + "murmur-core", "pallet-proxy 28.1.0", "pallet-randomness-beacon", "parity-scale-codec", @@ -6304,7 +6298,6 @@ dependencies = [ [[package]] name = "pallet-proxy" version = "28.1.0" -source = "git+https://github.com/ideal-lab5/etf.git?branch=tony/dev#1d5a47f0628c3591a58d0ce9e56ee911b3512ed8" dependencies = [ "frame-benchmarking", "frame-support", @@ -6319,7 +6312,6 @@ dependencies = [ [[package]] name = "pallet-randomness-beacon" version = "28.0.0" -source = "git+https://github.com/ideal-lab5/etf.git?branch=tony/dev#1d5a47f0628c3591a58d0ce9e56ee911b3512ed8" dependencies = [ "ark-bls12-377", "ark-ff 0.4.2", @@ -6339,7 +6331,7 @@ dependencies = [ "serde", "sha2 0.10.8", "sha3", - "sp-consensus-beefy-etf", + "sp-consensus-beefy-etf 13.0.0", "sp-runtime", "sp-session", "sp-staking", @@ -6487,7 +6479,6 @@ dependencies = [ [[package]] name = "pallet-scheduler" version = "4.0.0-dev" -source = "git+https://github.com/ideal-lab5/etf.git?branch=tony/dev#1d5a47f0628c3591a58d0ce9e56ee911b3512ed8" dependencies = [ "docify", "frame-benchmarking", @@ -9739,6 +9730,25 @@ dependencies = [ "strum 0.26.3", ] +[[package]] +name = "sp-consensus-beefy-etf" +version = "13.0.0" +dependencies = [ + "lazy_static", + "parity-scale-codec", + "scale-info", + "serde", + "sp-api", + "sp-application-crypto", + "sp-core", + "sp-crypto-hashing 0.1.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", + "sp-io", + "sp-keystore", + "sp-mmr-primitives", + "sp-runtime", + "strum 0.24.1", +] + [[package]] name = "sp-consensus-beefy-etf" version = "13.0.0" diff --git a/README.md b/README.md index e475c01..bd3b017 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # Murmur -Murmur is an air-gapped keyless crypto wallet protocol that runs on the Ideal Network. It is based on the [Hours of Horus]() protocol, where it enables keyless crypto wallets that require knowledge of future OTP codes rather than signatures in order to execute calls. +Murmur is an air-gapped keyless crypto wallet protocol that runs on the Ideal Network. It is based on the [Hours of Horus](https://eprint.iacr.org/2021/715) protocol, where it enables keyless crypto wallets that require knowledge of future OTP codes rather than signatures in order to execute calls. ## Setup @@ -14,12 +14,6 @@ cargo build cargo test ``` -## Usage - -``` shell -./target/debug/murmur-cli new --name test --seed my_secret_key --schedule 100 110 120 -``` - ## Generating metadata for the chain ``` shell diff --git a/cli/Cargo.toml b/cli/Cargo.toml index df053a1..543171d 100644 --- a/cli/Cargo.toml +++ b/cli/Cargo.toml @@ -9,7 +9,7 @@ edition = "2021" subxt = "0.35.2" subxt-signer = "0.35.2" tokio = { version = "1.35", features = ["macros", "time", "rt-multi-thread"] } -murmur-core = { package = "murmur-core", path = "../core/" } +murmur-core = { package = "murmur-core", path = "../core/", features = ["client"] } etf-crypto-primitives = { git = "https://github.com/ideal-lab5/etf-sdk/", branch = "tony/dev" } # etf-crypto-primitives = { path = "../etf-sdk/etf-crypto-primitives" } clap = { version = "4.1.1", features = ["derive"] } @@ -23,8 +23,8 @@ serde_json = "1.0.108" indicatif = "0.17.8" sp-keyring = { git = "https://github.com/ideal-lab5/polkadot-sdk.git", branch = "testing" } frame-support = { git = "https://github.com/ideal-lab5/polkadot-sdk.git", branch = "testing" } -# node-template-runtime = { path = "../../etf/runtime" } -node-template-runtime = { git = "https://github.com/ideal-lab5/etf.git", branch = "tony/dev" } +node-template-runtime = { path = "../../etf/runtime" } +# node-template-runtime = { git = "https://github.com/ideal-lab5/etf.git", branch = "tony/dev" } codec = { package = "parity-scale-codec", version = "3.6.12", features = [ "derive", ] } diff --git a/cli/README.md b/cli/README.md new file mode 100644 index 0000000..ed4123d --- /dev/null +++ b/cli/README.md @@ -0,0 +1,23 @@ +# Murmur-CLI + +A basic CLI to use a murmur wallet. + +## Setup + +To setup a dev environment: +- run an IDN node +- + +### Build + +`cargo build` + +### Usage + +``` shell +./target/debug/murmur-cli new --name test --seed my_secret_key --schedule 100 110 120 +``` + +## Test + +`cargo test` \ No newline at end of file diff --git a/cli/artifacts/metadata.scale b/cli/artifacts/metadata.scale index 7f6844edf2000f3b86ef856c11003fa10259cb49..3462e8094d338def9ca2997f314cb615b359053b 100644 GIT binary patch delta 376 zcmX@}Satdn)eXVIQWCzUMY*L#EDWq1j3ot$IXS5%@jyNhHKz-2PZwr15aEKWF`dq+ z#+bkgmTuEvY|~(B(_n7XVA-a@%IoE4f}&jl!V_=?n#sZv!obKOkzACTSdz-aC{UE2 zUt+;16PB86Q)*$yz$j3hS(R$Q$Wv-&0_5Z+=BCCnPM_<|F2!kVWM{{~AkgAGJ+Fv0 zmq({0u_ztr!kpB^wCO*KSf_KT6lbRAC6<&HrA}Yy%PP8kLNV*d3O-b)wD-JW-QM$t ztvLowV!D(kyBs6WbW2ZmbvYDQFwEuSK`~@{V=bHT_C`vZm7&G#KNV zfhya1G#G)H35c12m}NVU1}m?Zss=)@1cWKz3^a{}C4_;ILn65-HL)a>W4dDztMK&1 zB32E?u<2bzthv)y>a+6*F*+n?7G$Irm84db#3xmjq!v$SE@qv+eP=Q2#|myFliPQ^ zVcovt4O?>zvgmYAPj)#*j_Dbm?CSgsbNP6XbZlSe$-dbd>czQy$X;x(Ze`zI-OAy% RloRAfMi8<6f)=N{I{*Y`Ts;5) diff --git a/cli/src/main.rs b/cli/src/main.rs index 4e7919a..47ebb4c 100644 --- a/cli/src/main.rs +++ b/cli/src/main.rs @@ -67,6 +67,7 @@ use murmur_core::{ BlockNumber, Leaf, MergeLeaves, + IdentityBuilder, }, murmur, }; @@ -98,9 +99,11 @@ struct Cli { #[derive(Subcommand)] enum Commands { - /// create a new OTP wallet + /// create a new murmur wallet New(WalletCreationDetails), - /// dispatch (proxy) a call to an OTP wallet + /// dispatch (proxy) a call to a murmur wallet in the future + ScheduleExecute(WalletExecuteDetails), + /// dispatch (proxy) a call to a murmur wallet Execute(WalletExecuteDetails), } @@ -110,8 +113,10 @@ struct WalletCreationDetails { name: String, #[arg(long)] seed: String, - #[clap(short, long, value_delimiter = ' ', num_args = 1..)] - schedule: Vec, + #[clap(long)] + interval: u32, + #[clap(long)] + max: u32, } #[derive(Parser)] @@ -157,6 +162,20 @@ pub enum CLIError { // } // } +#[derive(Debug)] +pub struct BasicIdBuilder; +impl IdentityBuilder for BasicIdBuilder { + fn build_identity(when: BlockNumber) -> Identity { + let payload = Payload::from_single_entry(known_payloads::ETF_SIGNATURE, Vec::new()); + let commitment = Commitment { + payload, + block_number: when, + validator_set_id: 0, // TODO: how to ensure correct validator set ID is used? could just always set to 1 for now, else set input param. + }; + Identity::new(&commitment.encode()) + } +} + #[tokio::main] async fn main() -> Result<(), Box> { let cli = Cli::parse(); @@ -184,6 +203,8 @@ async fn main() -> Result<(), Box> { let current_block_number = current_block.header().number; println!("🧊 Current block number: #{:?}", current_block_number); + + // why do I have two clients?? let etf = OnlineClient::::new().await?; // let mut mmr_store_file = File::create("mmr_store").unwrap(); @@ -196,10 +217,16 @@ async fn main() -> Result<(), Box> { match &cli.commands { Commands::New(args) => { println!("🭠Murmur: Generating Merkle mountain range"); + let mut schedule: Vec = Vec::new(); + for i in 0..args.max { + // wallet is 'active' in 2 blocks + let next_block = current_block_number.clone() + 2 + i * args.interval.clone(); + schedule.push(next_block); + } // create leaves - let leaves = murmur::create::( + let leaves = murmur::create::( args.seed.clone().into(), - args.schedule.clone(), + schedule.clone(), ephem_msk, round_pubkey, ); @@ -219,9 +246,10 @@ async fn main() -> Result<(), Box> { // prepare and send tx from 'alice' account (for now) // should be configurable let create_anon_tx = etf::tx() - .otp() + .murmur() .create( - root.0.into(), + root.0.into(), + leaves.len() as u64, etf::runtime_types::bounded_collections::bounded_vec::BoundedVec(name)); // TODO: make the origin configurable let from = dev::alice(); @@ -232,7 +260,7 @@ async fn main() -> Result<(), Box> { println!("✅ MMR proxy account creation successful!"); }, - Commands::Execute(args) => { + Commands::ScheduleExecute(args) => { // build balance transfer let bob = AccountKeyring::Bob.to_account_id().into(); @@ -246,16 +274,65 @@ async fn main() -> Result<(), Box> { dest: bob, value: v, }); - handle_execute::( + let call = prepare_execution_payload_for_proxy::( etf.clone(), args.name.clone().as_bytes().to_vec(), args.seed.clone().as_bytes().to_vec(), args.when.clone(), + balance_transfer_call, + ).await; + // sign and send the tx (with the alice wallet for now) + dispatch_sealed_tx::( + etf, + args.when, ephem_msk, round_pubkey, + call, + ).await; + }, + Commands::Execute(args) => { + // build balance transfer + let bob = dev::alice().public_key(); + // get the value argument + let v: u128 = args.amount + .split_whitespace() + .map(|r| r.replace('_', "").parse().unwrap()) + .collect::>()[0]; + // TODO: cleanup type defs + let balance_transfer_call = etf::runtime_types::node_template_runtime::RuntimeCall::Balances( + etf::balances::Call::transfer_allow_death { + dest: subxt::utils::MultiAddress::<_, u32>::from(bob), + value: v, + } + ); + + // let balance_transfer_call = etf::tx().balances().transfer_allow_death( + // bob, + // v, + // ); + + // instead of the 'when' argument, we need the next etf-pfg block number + // let latest_pfg_block_query = subxt::dynamic::storage("RandomnessBeacon", "Height", ()); + // let latest_pfg_block_result = client + // .storage() + // .at_latest() + // .await? + // .fetch(&latest_pfg_block_query) + // .await?; + // let latest_pfg_block = latest_pfg_block_result.unwrap().as_type::()?; + // println!("Executing with latest pfg block {:?}", (latest_pfg_block.clone() + 1).clone()); + execute::( + etf.clone(), + args.name.clone().as_bytes().to_vec(), + args.seed.clone().as_bytes().to_vec(), + current_block_number, balance_transfer_call, ).await; - }, + // sign and send the tx (with the alice wallet for now) + // dispatch_tx::( + // etf, call, + // ).await; + }, _ => panic!("Hey, don't do that!"), } println!("Elapsed time: {:.2?}", before.elapsed()); @@ -263,24 +340,21 @@ async fn main() -> Result<(), Box> { } fn handle_create() { - + // todo } -async fn handle_execute( +/// prepare the proxy call for a scheduled transaction +async fn prepare_execution_payload_for_proxy( etf: OnlineClient, name: Vec, seed: Vec, when: BlockNumber, - ephemeral_msk: [u8;32], - pk: DoublePublicKey, call: RuntimeCall, -) -> Option<()> { - println!("Murmur: Execute Wallet Balance Transfer"); - let mut rng = ChaCha20Rng::seed_from_u64(1); - +) -> RuntimeCall { let leaves: Vec<(BlockNumber, Leaf)> = load_leaves(); let call_data = call.encode(); + // prepare the proof required to used the mmr wallet at the specific block height let payload = murmur::execute::( seed, when, @@ -288,7 +362,7 @@ async fn handle_execute( leaves.clone(), ).map_err(|e| println!("Murmur execution failed due to {:?}", e)).unwrap(); - let root: Leaf = payload.root; + // let root: Leaf = payload.root; let hash: Vec = payload.hash; let proof: MerkleProof = payload.proof; let target_leaf: Leaf = payload.target; @@ -299,7 +373,6 @@ async fn handle_execute( .collect::>(); let bounded = >>::truncate_from(name); - let proxy_call = RuntimeCall::Murmur(MurmurCall::proxy { name: bounded, @@ -309,12 +382,81 @@ async fn handle_execute( call: Box::new(call), when, hash, + signature: None, }); + proxy_call +} + +/// prepare the call for immediate execution +async fn execute( + etf: OnlineClient, + name: Vec, + seed: Vec, + when: BlockNumber, + call: etf::runtime_types::node_template_runtime::RuntimeCall, +) { + let leaves: Vec<(BlockNumber, Leaf)> = load_leaves(); + + let call_data = call.encode(); + // prepare the proof required to used the mmr wallet at the specific block height + let payload = murmur::execute::( + seed, + when, + call_data, + leaves.clone(), + ).map_err(|e| println!("Murmur execution failed due to {:?}", e)).unwrap(); + + // let root: Leaf = payload.root; + let hash: Vec = payload.hash; + let proof: MerkleProof = payload.proof; + let target_leaf: Leaf = payload.target; + let pos: u64 = payload.pos; + + let proof_items: Vec> = proof.proof_items().iter() + .map(|leaf| leaf.0.to_vec().clone()) + .collect::>(); + + let bounded = etf::runtime_types::bounded_collections::bounded_vec::BoundedVec(name); + + let tx = etf::tx().murmur().proxy( + bounded, + pos, + target_leaf.0, + hash, + proof_items, + call, + when, + None, + ); + etf.tx() + .sign_and_submit_then_watch_default(&tx, &dev::alice()) + .await; +} + +// /// dispatch the transaction for the next block +// async fn dispatch_tx>( +// etf: OnlineClient, +// proxy_call: RuntimeCall, +// ) { +// let events = etf +// .tx() +// .sign_and_submit_then_watch_default(&subxt::tx::Payload(proxy_call), &dev::alice()) +// .await; +// } + +/// dispatch a shielded (timelocked) transaction for a future block +async fn dispatch_sealed_tx>( + etf: OnlineClient, + when: BlockNumber, + ephemeral_msk: [u8;32], + pk: DoublePublicKey, + proxy_call: RuntimeCall, +) { let proxy_call_bytes: &[u8] = &proxy_call.encode(); // then construct a scheduled transaction for "when" // 1. tlock - let identity = murmur::build_identity(when); + let identity = I::build_identity(when); let timelocked_proxy_call = murmur::timelock_encrypt::( identity, pk.1, @@ -332,8 +474,6 @@ async fn handle_execute( .tx() .sign_and_submit_then_watch_default(&sealed_tx, &dev::alice()) .await; - None - } /// read an MMR from a file diff --git a/core/Cargo.toml b/core/Cargo.toml index 8aadff3..72a9638 100644 --- a/core/Cargo.toml +++ b/core/Cargo.toml @@ -15,27 +15,45 @@ workspace = true targets = ["x86_64-unknown-linux-gnu"] [dependencies] -totp-rs = "5.5.1" +totp-rs = { version = "5.5.1", default-features = false, optional = true } +getrandom = { version = "0.2", features = ["js"], default-features = false, optional = true } +rand_core = { version = "0.6.4", features = ["getrandom"], default-features = false, optional = true } + codec = { package = "parity-scale-codec", version = "3.6.12", features = ["derive"], default-features = false } etf-crypto-primitives = { git = "https://github.com/ideal-lab5/etf-sdk/", branch = "tony/dev", default-features = false} -rand_chacha = "0.3.1" -ckb-merkle-mountain-range = "0.5.2" -sha3 = "0.10.8" +ckb-merkle-mountain-range = { version = "0.5.2", default-features = false } +sha3 = { version = "0.10.8", default-features = false } serde = { version = "1.0.188", features = ["alloc", "derive"], default-features = false} -beefy = { package = "sp-consensus-beefy-etf", git = "https://github.com/ideal-lab5/etf.git", branch = "tony/dev", features = ["bls-experimental"] } ark-bls12-377 = { version = "0.4.0", default-features = false } ark-std = { version = "0.4.0", default-features = false } ark-ff = { version = "0.4.0", default-features = false } ark-serialize = { version = "0.4.0", default-features = false } w3f-bls = { version = "0.1.3", default-features = false } -getrandom = { version = "0.2", features = ["js"], default-features = false } -rand_core = { version = "0.6.4", features = ["getrandom"], default-features = false } -hex = { version = "0.4.3" } -array-bytes = { version = "6.1" } +hex = { version = "0.4.3", default-features = false } +array-bytes = { version = "6.1", default-features = false } # add zeroize # 1.8.1 [features] default = ["std"] -std = ["ark-std/std", "getrandom/std", "rand_core/std", "serde/std", "sha3/std", "codec/std"] -no_std = [] \ No newline at end of file +std = [ + "ark-std/std", + "ark-serialize/std", + "ark-bls12-377/std", + "ark-ff/std", + "w3f-bls/std", + # "getrandom/std", + # "rand_core/std", + "serde/std", + "codec/std", + "etf-crypto-primitives/std", + "sha3/std", + "ckb-merkle-mountain-range/std", + "hex/std", +] +no_std = [] +client = [ + "totp-rs", + "getrandom", + "rand_core", +] \ No newline at end of file diff --git a/core/src/lib.rs b/core/src/lib.rs index c690d49..882ca5b 100644 --- a/core/src/lib.rs +++ b/core/src/lib.rs @@ -15,9 +15,13 @@ */ #![no_std] //! the murmur core library - extern crate alloc; +// extern crate allocation; +// extern crate core; +// extern crate +#[cfg(feature = "client")] mod otp; + pub mod murmur; -pub mod types; \ No newline at end of file +pub mod types; diff --git a/core/src/murmur.rs b/core/src/murmur.rs index b7aeb5e..f99d445 100644 --- a/core/src/murmur.rs +++ b/core/src/murmur.rs @@ -18,7 +18,13 @@ //! use alloc::{string::String, vec, vec::Vec}; + +#[cfg(feature = "client")] use crate::otp::BOTPGenerator; + +#[cfg(feature = "client")] +use rand_core::OsRng; + use crate::types::*; use etf_crypto_primitives::{ ibe::fullident::Identity, @@ -34,37 +40,32 @@ use ckb_merkle_mountain_range::{ }; use ark_serialize::CanonicalSerialize; use codec::Encode; -use rand_core::OsRng; use sha3::Digest; -use beefy::{known_payloads, Payload, Commitment, VersionedFinalityProof}; #[derive(Debug)] pub enum Error { ExecuteError } -// TODO: create an 'identity builder' trait and inject into the create function -// then remove the dependency on beefy here -// and implement an identity builder in the cli component - /// creates the leaves needed to generate an MMR /// This function generates otp codes for the given block schedule /// then it encrypts the resulting codes and constructs leaves /// the leaves can be used to generate an MMR /// -pub fn create( +#[cfg(feature = "client")] +pub fn create>( seed: Vec, block_schedule: Vec, ephemeral_msk: [u8;32], pk: DoublePublicKey, -) -> Vec<(BlockNumber, Leaf)> { +) -> Vec<(BlockNumber, Leaf)> { let totp = build_generator(&seed.clone()); let mut leaves = Vec::new(); for i in &block_schedule { let otp_code = totp.generate(*i); - let identity = build_identity(*i); + let identity = I::build_identity(*i); let ct_bytes = timelock_encrypt::( identity, pk.1, @@ -80,6 +81,7 @@ pub fn create( /// computes parameters needed to execute a transaction at the specified block number /// outputs a payload containing: (ciphertext, hash, merkle proof, position/index) +#[cfg(feature = "client")] pub fn execute( seed: Vec, when: BlockNumber, @@ -132,7 +134,7 @@ pub fn execute( /// e.g. would be called by the pallet/runtime pub fn verify( root: Leaf, - otp: String, + otp: Vec, aux_data: Vec, payload: ExecutionPayload ) -> bool { @@ -147,7 +149,7 @@ pub fn verify( if validity { // verify the hash let mut hasher = sha3::Sha3_256::default(); - hasher.update(otp.as_bytes().to_vec()); + hasher.update(otp); hasher.update(aux_data); let hash = hasher.finalize(); @@ -158,6 +160,7 @@ pub fn verify( validity } +#[cfg(feature = "client")] /// timelock encryption function pub fn timelock_encrypt( identity: Identity, @@ -177,21 +180,8 @@ pub fn timelock_encrypt( ct_bytes } - -/// build an identity based on the block number -/// in the future we can consider abstracting this functionality to work with identities constructed in different ways -/// e.g. if we want to support multiple beacons -pub fn build_identity(when: BlockNumber) -> Identity { - let payload = Payload::from_single_entry(known_payloads::ETF_SIGNATURE, Vec::new()); - let commitment = Commitment { - payload, - block_number: when, - validator_set_id: 0, // TODO: how to ensure correct validator set ID is used? could just always set to 1 for now, else set input param. - }; - Identity::new(&commitment.encode()) -} - /// build a block-otp generator from the seed +#[cfg(feature = "client")] fn build_generator(seed: &[u8]) -> BOTPGenerator { let mut hasher = sha3::Sha3_256::default(); hasher.update(seed); @@ -204,6 +194,14 @@ mod tests { use super::*; use w3f_bls::{DoublePublicKey, DoublePublicKeyScheme, TinyBLS377}; + pub struct DummyIdBuilder; + impl IdentityBuilder for DummyIdBuilder { + fn build_identity(at: BlockNumber) -> Identity { + Identity::new(&[at as u8]) + } + } + + #[cfg(feature = "client")] #[test] pub fn it_can_generate_leaves() { let keypair = w3f_bls::KeypairVT::::generate(&mut OsRng); @@ -217,7 +215,7 @@ mod tests { let seed = vec![1,2,3]; let schedule = vec![1,2,3]; - let leaves = create::( + let leaves = create::( seed.clone(), schedule, ephem_msk, @@ -227,6 +225,7 @@ mod tests { assert!(leaves.len() == 3); } + #[cfg(feature = "client")] #[test] pub fn it_can_generate_valid_output_and_verify_it() { let keypair = w3f_bls::KeypairVT::::generate(&mut OsRng); @@ -245,7 +244,7 @@ mod tests { let seed = vec![1,2,3]; let schedule = vec![1,2,3]; - let leaves = create::( + let leaves = create::( seed.clone(), schedule.clone(), ephem_msk, @@ -279,12 +278,13 @@ mod tests { let botp = build_generator(&seed.clone()); let otp_code = botp.generate(later); - assert!(verify(expected_root, otp_code, aux_data, payload)); + assert!(verify(expected_root, otp_code.as_bytes().to_vec(), aux_data, payload)); } else { panic!("The test should pass"); } } + #[cfg(feature = "client")] #[test] pub fn it_fails_on_verify_bad_aux_data() { let keypair = w3f_bls::KeypairVT::::generate(&mut OsRng); @@ -303,7 +303,7 @@ mod tests { let seed = vec![1,2,3]; let schedule = vec![1,2,3]; - let leaves = create::( + let leaves = create::( seed.clone(), schedule.clone(), ephem_msk, @@ -325,7 +325,7 @@ mod tests { let later = 1; // generate execution parameters - if let Ok(payload) = execute::( + if let Ok(payload) = execute::( seed.clone(), later, aux_data.clone(), @@ -337,7 +337,7 @@ mod tests { let botp = build_generator(&seed.clone()); let otp_code = botp.generate(later); let bad_aux_data = vec![2,3,4,5,4,3]; - assert!(!verify(expected_root, otp_code, bad_aux_data, payload)); + assert!(!verify(expected_root, otp_code.as_bytes().to_vec(), bad_aux_data, payload)); } else { panic!("The test should pass"); } diff --git a/core/src/types.rs b/core/src/types.rs index b0429d9..ef7fce8 100644 --- a/core/src/types.rs +++ b/core/src/types.rs @@ -15,6 +15,7 @@ */ use ckb_merkle_mountain_range::{Merge, Result as MMRResult, MerkleProof}; +pub use etf_crypto_primitives::ibe::fullident::Identity; use codec::{Decode, Encode}; use sha3::Digest; use alloc::vec::Vec; @@ -66,6 +67,10 @@ pub struct ExecutionPayload { /// hash(OTP || CALL_DATA) pub hash: Vec, /// the secret key that can be used to decrypt the target - /// can be empty + /// can be empty, only needed in forced, early-decryption scenarios pub sk: Vec, +} + +pub trait IdentityBuilder { + fn build_identity(at: BlockNumber) -> Identity; } \ No newline at end of file diff --git a/mmr_store b/mmr_store index 5485fe0f539e77dc1e5de2b8f618bfa1d6ef034e..914421b5285763a95b235c29403ad025bf6150ec 100644 GIT binary patch literal 3368 zcmW-j3tY~38^-H#O5>rTu3F6#YUPkEa>x)ivv;AkIc#sDC@JQ{uz5G9w!-jX89kjW zy zr~!JS$LgmZ+N;6(Om*t14SWLhFKyBmJ?G9cEmy1_>XIgFR!a@C*LV6Aj7?zlR-$sX z%vq6Ipz}K3+Cg8cS~s;-tF=@gE0`dCv{_TN!@$qe%GU$E1LjQ-l0g`w8H(3ErP>?x zNgD+b)J@~n)j^*6w??Z%cQswNbrLX7h00IA>Vm%37cKyp%_bvg@3Q7&ZC9#;3Q4#- zX_u%-*X2r}(`;H|LlQ@{Mmd_KFWV{KK)s;=q>zD0S?qS#D23@P%jamn&S;69>Sb24 zjuO^eQ6Tlue2`~qhxX_#!WHYj5sXwYc2U(Ztx}ra)JK}A27RkItFwmPP9ln}+k7{xI-nX>*Krk~33{p76w^bmB9N=P!Q43VPIK1h z)H4^54715zkF=0TK{l$gBh3h{MBF)gUC$sR)J0thnWsD~Jcq7fdZCdl8^xo(fcyYR99Fraow`c$ zc@WoMzCgUhhW^^9f1vXBcx5>Rg#gwaD}RVSm-Q7QXX!C0nV^heMIN5a(?G24qf$ya z4)4X-VHsC>P`H3{Pbft{@gx-6SLu!&0UPB5$QD4tok_YD`l6|NG?;6k?uq^hHB;Nd zP99eILrE0!m4Z59$jeAJoW^=xK|o{yQAQ>G^ETROVgwtqgRM5!%E&$B| z!vaPi>{epAeb~B3d%V>gzmx`ltrLp;%;hko!65 z##xv<{T*pe%>pB+}Ue@>sp5Ceoh_Iq$(( zA$Nx$@M01x(jl^mWv4GHRe&;pXnvsV0HwD)k**&7YIKben;hwJg88=mbk|a2FEexniIZ(>f0#bA%xCAr)qlD zpRzNMeyhsB$TOP^M%Eo*>eW%kJ_33%!mbjsn%@~vQKRF|_-;P_s5RiF495LYh)vK_ z5O$KqdYZF8pG;`XW5+R`{YKZkO96HCT{$v`F`T9_#sah!XEZhUnFGaSDISnrfHWZG zEg(i%XOBB!Oeiq~ZlYAv7K<*Ux+9psrZwfwK^rqY^MvOm8VW`}7#EolWy)5#y;8B~ zLP)9CHfPL{gtC3mxE?-(bBb*ZgslXX05&_oAcODjTuOV#Dq>bR{4kLQeMYP_kS0@56A6cbu@?+?>(Q78_I=_dBI#g`+Nu0*BKLTRyQWWY z&vg3ePsTx`fq5E)-gStR2uLX)@q`TldW?fcIU<>tjyTetkr<(##j%XnGU8^Tek4cf z0GyOg9ZQ)NU4hsKLfjri_1@7 zgy6RAWH=Bnp2i|MOqP4FTc*ETp!#jl{-W0&Ti;~fV?6whWqlY%mJS*QMmZSO0QO*C zAM*2{;V)sI*283+jT`;#b7zeX!qAiAPxdig;0Ji8DJ@7e31pY3bti5+@#AZxfzNy)u54nxxu?d-(%-1ZC;S1fXaLt;9!+ZQh$1UrJ}FJLgH^S_oS1*kg~l`eu& z0Y*l90!357dXgCmdk^W+7^N6VJGmWp-NC(Z-k4%+*;PXomWH{WU@T9Bcs!tK^gewE@#zhQuD!{)wsYHfGPkA>7|*3UcywJhCi|}Z!&)E$LO`N zCs~i2Rnf|-ls9%T%cDhmz7wqP)JH)$kGI0<wx=Dri{-1A2=^t9J$mw^WyOK- z$j&S%DA`Tq!&r8zXvU3ZTHm=}RYN{`$HTQ hZG|(8CacQkZP*LF7d~|vqnJ1MK2?l;n45}5*Z*1|J?H=c From 8fdbbfe173a89b7ea90867e0250c94c48e4d5fb6 Mon Sep 17 00:00:00 2001 From: driemworks Date: Tue, 17 Sep 2024 12:09:50 -0500 Subject: [PATCH 06/20] remove sk from execution type --- cli/artifacts/metadata.scale | Bin 619031 -> 618973 bytes cli/src/main.rs | 57 +++++------------------------------ core/src/murmur.rs | 21 +++++++++++-- core/src/types.rs | 3 -- mmr_store | Bin 3368 -> 6607 bytes 5 files changed, 26 insertions(+), 55 deletions(-) diff --git a/cli/artifacts/metadata.scale b/cli/artifacts/metadata.scale index 3462e8094d338def9ca2997f314cb615b359053b..28126a595858a430f5310cf6f7610936cc6a7653 100644 GIT binary patch delta 49 zcmbRKMD^}t)rJF7M3lndy5z)rpFhts!xAf#5${eXE7@fvjH*t_MOEXasL4P CPZYEO delta 82 zcmccnSatdn)rJF7M3lndy5zqrpFhts!xAf#5!y8hBj##mEz3wyu^~yqSU)= kj5huSC7JnoHespBHl-GJ?KQ=$K+Fcj?AvRKITHT?066m>+W-In diff --git a/cli/src/main.rs b/cli/src/main.rs index 47ebb4c..f7fb15b 100644 --- a/cli/src/main.rs +++ b/cli/src/main.rs @@ -114,9 +114,7 @@ struct WalletCreationDetails { #[arg(long)] seed: String, #[clap(long)] - interval: u32, - #[clap(long)] - max: u32, + valid_for: u8, } #[derive(Parser)] @@ -212,15 +210,15 @@ async fn main() -> Result<(), Box> { let mut mmr = MemMMR::<_, MergeLeaves>::new(0, store); // TODO: HKDF? just hash the seed? - let ephem_msk = [1;32]; + let ephem_msk = [1;32]; match &cli.commands { Commands::New(args) => { println!("🭠Murmur: Generating Merkle mountain range"); let mut schedule: Vec = Vec::new(); - for i in 0..args.max { + for i in 2..args.valid_for + 2 { // wallet is 'active' in 2 blocks - let next_block = current_block_number.clone() + 2 + i * args.interval.clone(); + let next_block = current_block_number.clone() + i as u32; schedule.push(next_block); } // create leaves @@ -261,7 +259,6 @@ async fn main() -> Result<(), Box> { }, Commands::ScheduleExecute(args) => { - // build balance transfer let bob = AccountKeyring::Bob.to_account_id().into(); // get the value argument @@ -305,22 +302,6 @@ async fn main() -> Result<(), Box> { value: v, } ); - - // let balance_transfer_call = etf::tx().balances().transfer_allow_death( - // bob, - // v, - // ); - - // instead of the 'when' argument, we need the next etf-pfg block number - // let latest_pfg_block_query = subxt::dynamic::storage("RandomnessBeacon", "Height", ()); - // let latest_pfg_block_result = client - // .storage() - // .at_latest() - // .await? - // .fetch(&latest_pfg_block_query) - // .await?; - // let latest_pfg_block = latest_pfg_block_result.unwrap().as_type::()?; - // println!("Executing with latest pfg block {:?}", (latest_pfg_block.clone() + 1).clone()); execute::( etf.clone(), args.name.clone().as_bytes().to_vec(), @@ -328,10 +309,6 @@ async fn main() -> Result<(), Box> { current_block_number, balance_transfer_call, ).await; - // sign and send the tx (with the alice wallet for now) - // dispatch_tx::( - // etf, call, - // ).await; }, _ => panic!("Hey, don't do that!"), } @@ -374,18 +351,14 @@ async fn prepare_execution_payload_for_proxy( let bounded = >>::truncate_from(name); - let proxy_call = RuntimeCall::Murmur(MurmurCall::proxy { + RuntimeCall::Murmur(MurmurCall::proxy { name: bounded, position: pos, target_leaf: target_leaf.0, proof: proof_items, call: Box::new(call), - when, hash, - signature: None, - }); - - proxy_call + }) } /// prepare the call for immediate execution @@ -426,25 +399,12 @@ async fn execute( hash, proof_items, call, - when, - None, ); etf.tx() .sign_and_submit_then_watch_default(&tx, &dev::alice()) .await; } -// /// dispatch the transaction for the next block -// async fn dispatch_tx>( -// etf: OnlineClient, -// proxy_call: RuntimeCall, -// ) { -// let events = etf -// .tx() -// .sign_and_submit_then_watch_default(&subxt::tx::Payload(proxy_call), &dev::alice()) -// .await; -// } - /// dispatch a shielded (timelocked) transaction for a future block async fn dispatch_sealed_tx>( etf: OnlineClient, @@ -469,7 +429,6 @@ async fn dispatch_sealed_tx>( .scheduler() .schedule_sealed(when, 127, bounded_ciphertext); // 3. submit tx - let events = etf .tx() .sign_and_submit_then_watch_default(&sealed_tx, &dev::alice()) @@ -495,7 +454,5 @@ fn write_leaves(leaves: &[(BlockNumber, Leaf)]) { #[cfg(test)] mod tests { - // pub fn test_can_read_write_leaves() { - - // } + // pub fn test_can_read_write_leaves() { } } \ No newline at end of file diff --git a/core/src/murmur.rs b/core/src/murmur.rs index f99d445..3b787cf 100644 --- a/core/src/murmur.rs +++ b/core/src/murmur.rs @@ -125,7 +125,6 @@ pub fn execute( target: target_leaf, pos: target_pos, hash, - sk: Vec::new(), }; Ok(payload) } @@ -270,7 +269,7 @@ mod tests { seed.clone(), later, aux_data.clone(), - leaves, + leaves.clone(), ) { // we will recalculate the otp code here // in practice, the verify function would get the OTP code by using timelock decryption @@ -278,6 +277,24 @@ mod tests { let botp = build_generator(&seed.clone()); let otp_code = botp.generate(later); + // lets check if we can serialize/deserialize the proof and still verify it + let proof_items: Vec> = payload.proof.proof_items().iter() + .map(|leaf| leaf.0.to_vec().clone()) + .collect::>(); + let proof_leaves: Vec = proof_items.clone().into_iter().map(|p| Leaf(p)).collect::>(); + // rebuild the proofs + let merkle_proof = MerkleProof::::new(leaves.len() as u64, proof_leaves); + + let execution_payload = ExecutionPayload { + root: expected_root.clone(), + proof: merkle_proof, + target: payload.target.clone(), + pos: payload.pos.clone(), + hash: payload.hash.clone(), + }; + + let validity = verify(expected_root.clone(), otp_code.as_bytes().to_vec(), aux_data.clone(), execution_payload); + assert!(validity); assert!(verify(expected_root, otp_code.as_bytes().to_vec(), aux_data, payload)); } else { panic!("The test should pass"); diff --git a/core/src/types.rs b/core/src/types.rs index ef7fce8..259dc11 100644 --- a/core/src/types.rs +++ b/core/src/types.rs @@ -66,9 +66,6 @@ pub struct ExecutionPayload { pub pos: u64, /// hash(OTP || CALL_DATA) pub hash: Vec, - /// the secret key that can be used to decrypt the target - /// can be empty, only needed in forced, early-decryption scenarios - pub sk: Vec, } pub trait IdentityBuilder { diff --git a/mmr_store b/mmr_store index 914421b5285763a95b235c29403ad025bf6150ec..6d87d5731afc2ecd160a25950da1b48ca5772dba 100644 GIT binary patch literal 6607 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 CgaSwa literal 3368 zcmW-j3tY~38^-H#O5>rTu3F6#YUPkEa>x)ivv;AkIc#sDC@JQ{uz5G9w!-jX89kjW zy zr~!JS$LgmZ+N;6(Om*t14SWLhFKyBmJ?G9cEmy1_>XIgFR!a@C*LV6Aj7?zlR-$sX z%vq6Ipz}K3+Cg8cS~s;-tF=@gE0`dCv{_TN!@$qe%GU$E1LjQ-l0g`w8H(3ErP>?x zNgD+b)J@~n)j^*6w??Z%cQswNbrLX7h00IA>Vm%37cKyp%_bvg@3Q7&ZC9#;3Q4#- zX_u%-*X2r}(`;H|LlQ@{Mmd_KFWV{KK)s;=q>zD0S?qS#D23@P%jamn&S;69>Sb24 zjuO^eQ6Tlue2`~qhxX_#!WHYj5sXwYc2U(Ztx}ra)JK}A27RkItFwmPP9ln}+k7{xI-nX>*Krk~33{p76w^bmB9N=P!Q43VPIK1h z)H4^54715zkF=0TK{l$gBh3h{MBF)gUC$sR)J0thnWsD~Jcq7fdZCdl8^xo(fcyYR99Fraow`c$ zc@WoMzCgUhhW^^9f1vXBcx5>Rg#gwaD}RVSm-Q7QXX!C0nV^heMIN5a(?G24qf$ya z4)4X-VHsC>P`H3{Pbft{@gx-6SLu!&0UPB5$QD4tok_YD`l6|NG?;6k?uq^hHB;Nd zP99eILrE0!m4Z59$jeAJoW^=xK|o{yQAQ>G^ETROVgwtqgRM5!%E&$B| z!vaPi>{epAeb~B3d%V>gzmx`ltrLp;%;hko!65 z##xv<{T*pe%>pB+}Ue@>sp5Ceoh_Iq$(( zA$Nx$@M01x(jl^mWv4GHRe&;pXnvsV0HwD)k**&7YIKben;hwJg88=mbk|a2FEexniIZ(>f0#bA%xCAr)qlD zpRzNMeyhsB$TOP^M%Eo*>eW%kJ_33%!mbjsn%@~vQKRF|_-;P_s5RiF495LYh)vK_ z5O$KqdYZF8pG;`XW5+R`{YKZkO96HCT{$v`F`T9_#sah!XEZhUnFGaSDISnrfHWZG zEg(i%XOBB!Oeiq~ZlYAv7K<*Ux+9psrZwfwK^rqY^MvOm8VW`}7#EolWy)5#y;8B~ zLP)9CHfPL{gtC3mxE?-(bBb*ZgslXX05&_oAcODjTuOV#Dq>bR{4kLQeMYP_kS0@56A6cbu@?+?>(Q78_I=_dBI#g`+Nu0*BKLTRyQWWY z&vg3ePsTx`fq5E)-gStR2uLX)@q`TldW?fcIU<>tjyTetkr<(##j%XnGU8^Tek4cf z0GyOg9ZQ)NU4hsKLfjri_1@7 zgy6RAWH=Bnp2i|MOqP4FTc*ETp!#jl{-W0&Ti;~fV?6whWqlY%mJS*QMmZSO0QO*C zAM*2{;V)sI*283+jT`;#b7zeX!qAiAPxdig;0Ji8DJ@7e31pY3bti5+@#AZxfzNy)u54nxxu?d-(%-1ZC;S1fXaLt;9!+ZQh$1UrJ}FJLgH^S_oS1*kg~l`eu& z0Y*l90!357dXgCmdk^W+7^N6VJGmWp-NC(Z-k4%+*;PXomWH{WU@T9Bcs!tK^gewE@#zhQuD!{)wsYHfGPkA>7|*3UcywJhCi|}Z!&)E$LO`N zCs~i2Rnf|-ls9%T%cDhmz7wqP)JH)$kGI0 Date: Wed, 18 Sep 2024 21:31:59 -0500 Subject: [PATCH 07/20] create murmurstore struct, refactor to use stuct --- Cargo.lock | 20 +- README.md | 22 -- cli/README.md | 31 ++- cli/artifacts/metadata.scale | Bin 618973 -> 619314 bytes cli/src/main.rs | 348 +++++++++++++++++--------------- core/README.md | 11 +- core/src/murmur.rs | 380 +++++++++++++++++------------------ core/src/types.rs | 2 + mmr_store | Bin 6607 -> 89937 bytes 9 files changed, 419 insertions(+), 395 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index d2b4e86..3b3f2c5 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -9752,7 +9752,7 @@ dependencies = [ [[package]] name = "sp-consensus-beefy-etf" version = "13.0.0" -source = "git+https://github.com/ideal-lab5/etf.git?branch=tony/dev#1d5a47f0628c3591a58d0ce9e56ee911b3512ed8" +source = "git+https://github.com/ideal-lab5/etf.git?branch=tony/dev#eede7b8f5fc6c7f853e1e087ef92b272d9098574" dependencies = [ "lazy_static", "parity-scale-codec", @@ -9888,7 +9888,7 @@ dependencies = [ [[package]] name = "sp-crypto-ec-utils" version = "0.10.0" -source = "git+https://github.com/paritytech/polkadot-sdk#51f336711a0391987db69d6281c9b57bfe49d925" +source = "git+https://github.com/paritytech/polkadot-sdk#310ef5ce1086affdc522c4d1736211de2a7dd99e" dependencies = [ "ark-bls12-377", "ark-bls12-377-ext", @@ -9955,7 +9955,7 @@ dependencies = [ [[package]] name = "sp-debug-derive" version = "14.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk#51f336711a0391987db69d6281c9b57bfe49d925" +source = "git+https://github.com/paritytech/polkadot-sdk#310ef5ce1086affdc522c4d1736211de2a7dd99e" dependencies = [ "proc-macro2", "quote", @@ -9975,7 +9975,7 @@ dependencies = [ [[package]] name = "sp-externalities" version = "0.25.0" -source = "git+https://github.com/paritytech/polkadot-sdk#51f336711a0391987db69d6281c9b57bfe49d925" +source = "git+https://github.com/paritytech/polkadot-sdk#310ef5ce1086affdc522c4d1736211de2a7dd99e" dependencies = [ "environmental", "parity-scale-codec", @@ -10182,7 +10182,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface" version = "24.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk#51f336711a0391987db69d6281c9b57bfe49d925" +source = "git+https://github.com/paritytech/polkadot-sdk#310ef5ce1086affdc522c4d1736211de2a7dd99e" dependencies = [ "bytes", "impl-trait-for-tuples", @@ -10214,7 +10214,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface-proc-macro" version = "17.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk#51f336711a0391987db69d6281c9b57bfe49d925" +source = "git+https://github.com/paritytech/polkadot-sdk#310ef5ce1086affdc522c4d1736211de2a7dd99e" dependencies = [ "Inflector", "expander", @@ -10303,7 +10303,7 @@ source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1 [[package]] name = "sp-std" version = "14.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk#51f336711a0391987db69d6281c9b57bfe49d925" +source = "git+https://github.com/paritytech/polkadot-sdk#310ef5ce1086affdc522c4d1736211de2a7dd99e" [[package]] name = "sp-storage" @@ -10320,7 +10320,7 @@ dependencies = [ [[package]] name = "sp-storage" version = "19.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk#51f336711a0391987db69d6281c9b57bfe49d925" +source = "git+https://github.com/paritytech/polkadot-sdk#310ef5ce1086affdc522c4d1736211de2a7dd99e" dependencies = [ "impl-serde", "parity-scale-codec", @@ -10355,7 +10355,7 @@ dependencies = [ [[package]] name = "sp-tracing" version = "16.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk#51f336711a0391987db69d6281c9b57bfe49d925" +source = "git+https://github.com/paritytech/polkadot-sdk#310ef5ce1086affdc522c4d1736211de2a7dd99e" dependencies = [ "parity-scale-codec", "tracing", @@ -10452,7 +10452,7 @@ dependencies = [ [[package]] name = "sp-wasm-interface" version = "20.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk#51f336711a0391987db69d6281c9b57bfe49d925" +source = "git+https://github.com/paritytech/polkadot-sdk#310ef5ce1086affdc522c4d1736211de2a7dd99e" dependencies = [ "anyhow", "impl-trait-for-tuples", diff --git a/README.md b/README.md index bd3b017..3a5dcd9 100644 --- a/README.md +++ b/README.md @@ -14,25 +14,3 @@ cargo build cargo test ``` -## Generating metadata for the chain - -``` shell -# clone and build the node -git clone git@github.com:ideal-lab5/etf.git -cd etf -cargo +stable build -# run a local node -./target/debug/node --tmp --dev --alice --unsafe-rpc-external --rpc-cors all -# use subxt to prepare metadata -cd /path/to/otp-wallet/ -mkdir artifacts -cargo install subxt-cli -# Download and save all of the metadata: -subxt metadata > ./artifacts/metadata.scale -``` - -## TODOs - -- [ ] pass mmr_store path as a parameter -- [ ] error handling -- [ ] add dry run option (e.g. to check if username is a duplicate) e.g. add the '-x' flag to indicate if the call should be executed: `otp-wallet-client execute ... -x` \ No newline at end of file diff --git a/cli/README.md b/cli/README.md index ed4123d..7bb97dd 100644 --- a/cli/README.md +++ b/cli/README.md @@ -1,6 +1,8 @@ # Murmur-CLI -A basic CLI to use a murmur wallet. +An implementation of the Murmur protocol as a CLI. + +It allows for the creation and exeuction of ephemeral 'murmur' wallets for use on the Ideal Network. ## Setup @@ -15,9 +17,32 @@ To setup a dev environment: ### Usage ``` shell -./target/debug/murmur-cli new --name test --seed my_secret_key --schedule 100 110 120 +# generate a wallet valid for the next 1000 blocks +./target/debug/murmur-cli new --name test --seed my_secret_key --valid-for 1000 +# send a balance transfer now +./target/debug/murmur-cli execute --name test --seed my_secret_key --amount 100 +# schedule a balance transfer +./target/debug/murmur-cli schedule-execute --name test --seed my_secret_key --when 100 --amount 100 ``` ## Test -`cargo test` \ No newline at end of file +`cargo test` + +## Generating metadata for the chain + +``` shell +# clone and build the node +git clone git@github.com:ideal-lab5/etf.git +cd etf +cargo +stable build +# run a local node +./target/debug/node --tmp --dev --alice --unsafe-rpc-external --rpc-cors all +# use subxt to prepare metadata +cd /path/to/otp-wallet/ +mkdir artifacts +cargo install subxt-cli +# Download and save all of the metadata: +subxt metadata > ./artifacts/metadata.scale +``` + diff --git a/cli/artifacts/metadata.scale b/cli/artifacts/metadata.scale index 28126a595858a430f5310cf6f7610936cc6a7653..d74dc51ccac22fc54aa26eb62afbdef16c8504e1 100644 GIT binary patch delta 436 zcmYjNze~eF7){#7)=jq#89tPvcIsvk5eiz&P%Tni?U8(K4wGECTuZyyB8C0~LjH&1 zBtriMSHZzS!5`pgM+Y6es|^Tu@b2Ti_q}(|?}eL>!f>RIQls=Jb8CEYbHyc*Th`4} zw0Aq@Jx$-VY3L#s*b{NLomr2!BjYe#x~|8Uk?}UTDnc_LJ~nrt;UaXX1FQu?Lchc1 zfsnIa|3|Vy7EwW2uwW)npuwD8tDPiD3~b&H1v+rtsDsTMypwuCcpJr;horTzkduKN zff|8B1c85Hw_c=1m67BMC;);fRFs#L)BwZ zOez1ufM=@JG)hWfFGO1fmu-f{_~J2@cf=xFh)tyjkrVN54t>FGhw$73s7HA_~| kB_4I^>YucX26M1~bf6hpeE)5%jb~O?-rRI%Eq`wO0`Tmc<^TWy delta 109 zcmdn=O!e+#)rJF7M3ln--~2*N)n6GQ%mA=QWMiG7-hmzlWj^Z>=+mYG7^h3 zrkAC&C{H&lX7ykeSyM2*v6%JI^oPleZtagtS+_qfWxI2QQDFK3FLt--i_O@T+FiWa NftX{vi#O*xbpXmyC`14N diff --git a/cli/src/main.rs b/cli/src/main.rs index f7fb15b..15d9765 100644 --- a/cli/src/main.rs +++ b/cli/src/main.rs @@ -26,6 +26,8 @@ use subxt_signer::sr25519::dev; #[subxt::subxt(runtime_metadata_path = "artifacts/metadata.scale")] pub mod etf {} +use std::collections::BTreeMap; +use std::ops::Index; use std::io::{Read, Write, BufRead, BufReader}; use std::fs::File; use std::time::Duration; @@ -34,6 +36,7 @@ use std::collections::HashMap; use clap::{Args, Parser, Subcommand}; use ckb_merkle_mountain_range::{ + helper::leaf_index_to_pos, MerkleProof, MMR, Merge, Result as MMRResult, MMRStore, util::{ @@ -68,8 +71,9 @@ use murmur_core::{ Leaf, MergeLeaves, IdentityBuilder, + Ciphertext, }, - murmur, + murmur::MurmurStore, }; use etf_crypto_primitives::{ ibe::fullident::{IBESecret, Identity}, @@ -132,34 +136,6 @@ struct WalletExecuteDetails { pub enum CLIError { } - -// use sha3::Digest; - -// fn main() -> io::Result<()> { -// let mut terminal = ratatui::init(); -// terminal.clear()?; -// let app_result = run(terminal); -// ratatui::restore(); -// app_result -// } - -// fn run(mut terminal: DefaultTerminal) -> io::Result<()> { -// loop { -// terminal.draw(|frame| { -// let greeting = Paragraph::new("Hello Ratatui! (press 'q' to quit)") -// .white() -// .on_blue(); -// frame.render_widget(greeting, frame.area()); -// })?; - -// if let event::Event::Key(key) = event::read()? { -// if key.kind == KeyEventKind::Press && key.code == KeyCode::Char('q') { -// return Ok(()); -// } -// } -// } -// } - #[derive(Debug)] pub struct BasicIdBuilder; impl IdentityBuilder for BasicIdBuilder { @@ -221,33 +197,28 @@ async fn main() -> Result<(), Box> { let next_block = current_block_number.clone() + i as u32; schedule.push(next_block); } - // create leaves - let leaves = murmur::create::( + // create MMRDataStore + let store: MurmurStore = MurmurStore::new::( args.seed.clone().into(), schedule.clone(), ephem_msk, round_pubkey, ); - // populate MMR - leaves.iter().for_each(|leaf| { - // TODO: error handling - mmr.push(leaf.1.clone()).unwrap(); - }); - println!("Write leaves {:?}", leaves.len()); - write_leaves(&leaves); + store.to_mmr(&mut mmr).unwrap(); + // println!("Write leaves {:?} to disk", data.len()); + write_mmr_store(store.data.clone()); - let root = mmr.get_root() + let root = mmr.get_root().clone() .expect("The MMR root should be calculable"); let name = args.name.as_bytes().to_vec(); - // prepare and send tx from 'alice' account (for now) // should be configurable let create_anon_tx = etf::tx() .murmur() .create( root.0.into(), - leaves.len() as u64, + store.data.len() as u64, etf::runtime_types::bounded_collections::bounded_vec::BoundedVec(name)); // TODO: make the origin configurable let from = dev::alice(); @@ -258,35 +229,35 @@ async fn main() -> Result<(), Box> { println!("✅ MMR proxy account creation successful!"); }, - Commands::ScheduleExecute(args) => { - // build balance transfer - let bob = AccountKeyring::Bob.to_account_id().into(); - // get the value argument - let v: u128 = args.amount - .split_whitespace() - .map(|r| r.replace('_', "").parse().unwrap()) - .collect::>()[0]; - let balance_transfer_call = RuntimeCall::Balances( - BalancesCall::transfer_allow_death { - dest: bob, - value: v, - }); - let call = prepare_execution_payload_for_proxy::( - etf.clone(), - args.name.clone().as_bytes().to_vec(), - args.seed.clone().as_bytes().to_vec(), - args.when.clone(), - balance_transfer_call, - ).await; - // sign and send the tx (with the alice wallet for now) - dispatch_sealed_tx::( - etf, - args.when, - ephem_msk, - round_pubkey, - call, - ).await; - }, + // Commands::ScheduleExecute(args) => { + // // build balance transfer + // let bob = AccountKeyring::Bob.to_account_id().into(); + // // get the value argument + // let v: u128 = args.amount + // .split_whitespace() + // .map(|r| r.replace('_', "").parse().unwrap()) + // .collect::>()[0]; + // let balance_transfer_call = RuntimeCall::Balances( + // BalancesCall::transfer_allow_death { + // dest: bob, + // value: v, + // }); + // let call = prepare_execution_payload_for_proxy::( + // etf.clone(), + // args.name.clone().as_bytes().to_vec(), + // args.seed.clone().as_bytes().to_vec(), + // args.when.clone(), + // balance_transfer_call, + // ).await; + // // sign and send the tx (with the alice wallet for now) + // dispatch_sealed_tx::( + // etf, + // args.when, + // ephem_msk, + // round_pubkey, + // call, + // ).await; + // }, Commands::Execute(args) => { // build balance transfer let bob = dev::alice().public_key(); @@ -300,13 +271,14 @@ async fn main() -> Result<(), Box> { etf::balances::Call::transfer_allow_death { dest: subxt::utils::MultiAddress::<_, u32>::from(bob), value: v, - } - ); + }); + execute::( etf.clone(), args.name.clone().as_bytes().to_vec(), args.seed.clone().as_bytes().to_vec(), current_block_number, + mmr, balance_transfer_call, ).await; }, @@ -316,75 +288,39 @@ async fn main() -> Result<(), Box> { Ok(()) } -fn handle_create() { - // todo -} - -/// prepare the proxy call for a scheduled transaction -async fn prepare_execution_payload_for_proxy( - etf: OnlineClient, - name: Vec, - seed: Vec, - when: BlockNumber, - call: RuntimeCall, -) -> RuntimeCall { - let leaves: Vec<(BlockNumber, Leaf)> = load_leaves(); - let call_data = call.encode(); - // prepare the proof required to used the mmr wallet at the specific block height - let payload = murmur::execute::( - seed, - when, - call_data, - leaves.clone(), - ).map_err(|e| println!("Murmur execution failed due to {:?}", e)).unwrap(); - - // let root: Leaf = payload.root; - let hash: Vec = payload.hash; - let proof: MerkleProof = payload.proof; - let target_leaf: Leaf = payload.target; - let pos: u64 = payload.pos; - - let proof_items: Vec> = proof.proof_items().iter() - .map(|leaf| leaf.0.to_vec().clone()) - .collect::>(); - - let bounded = >>::truncate_from(name); - - RuntimeCall::Murmur(MurmurCall::proxy { - name: bounded, - position: pos, - target_leaf: target_leaf.0, - proof: proof_items, - call: Box::new(call), - hash, - }) +fn get_key_index(b: &BTreeMap, key: &K) -> Option { + b.keys().position(|k| k == key) } /// prepare the call for immediate execution +/// Note to self: in the future, we can consider ways to prune the murmurstore as OTP codes are consumed +/// for example, we can take the next values from the map, reducing storage to 0 over time +/// However, to do this we need to think of a way to prove it with a merkle proof +/// my though is that we would have a subtree, so first we prove that the subtree is indeed in the parent MMR +/// then we prove that the specific leaf is in the subtree. +/// We could potentially use that idea as a way to optimize the execute function in general. Rather than +/// loading the entire MMR into memory, we really only need to load a minimal subtree containing the leaf we want to consume +/// -> add this to the 'future work' section later async fn execute( etf: OnlineClient, name: Vec, seed: Vec, when: BlockNumber, + mut mmr: MemMMR::, call: etf::runtime_types::node_template_runtime::RuntimeCall, ) { - let leaves: Vec<(BlockNumber, Leaf)> = load_leaves(); - + let store: MurmurStore = load_mmr_store(seed); let call_data = call.encode(); - // prepare the proof required to used the mmr wallet at the specific block height - let payload = murmur::execute::( - seed, - when, - call_data, - leaves.clone(), - ).map_err(|e| println!("Murmur execution failed due to {:?}", e)).unwrap(); - - // let root: Leaf = payload.root; - let hash: Vec = payload.hash; - let proof: MerkleProof = payload.proof; - let target_leaf: Leaf = payload.target; - let pos: u64 = payload.pos; + let hash = store.commit(when, &call_data); + store.to_mmr(&mut mmr).unwrap(); + + let ciphertext = store.get(when).unwrap(); + let pos = get_key_index(&store.data, &when).unwrap() as u64; + // let pos: u64 = leaf_index_to_pos(idx as u64); + + let proof = mmr.gen_proof(vec![pos]) + .expect("todo: handle error"); let proof_items: Vec> = proof.proof_items().iter() .map(|leaf| leaf.0.to_vec().clone()) @@ -395,8 +331,8 @@ async fn execute( let tx = etf::tx().murmur().proxy( bounded, pos, - target_leaf.0, hash, + ciphertext, proof_items, call, ); @@ -405,54 +341,132 @@ async fn execute( .await; } -/// dispatch a shielded (timelocked) transaction for a future block -async fn dispatch_sealed_tx>( - etf: OnlineClient, - when: BlockNumber, - ephemeral_msk: [u8;32], - pk: DoublePublicKey, - proxy_call: RuntimeCall, -) { - let proxy_call_bytes: &[u8] = &proxy_call.encode(); - // then construct a scheduled transaction for "when" - // 1. tlock - let identity = I::build_identity(when); - let timelocked_proxy_call = murmur::timelock_encrypt::( - identity, - pk.1, - ephemeral_msk, - proxy_call_bytes, - ); - let bounded_ciphertext = etf::runtime_types::bounded_collections::bounded_vec::BoundedVec(timelocked_proxy_call); - // 2. build tx - let sealed_tx = etf::tx() - .scheduler() - .schedule_sealed(when, 127, bounded_ciphertext); - // 3. submit tx - let events = etf - .tx() - .sign_and_submit_then_watch_default(&sealed_tx, &dev::alice()) - .await; -} +// /// prepare the proxy call for a scheduled transaction +// async fn prepare_execution_payload_for_proxy( +// etf: OnlineClient, +// name: Vec, +// seed: Vec, +// when: BlockNumber, +// call: RuntimeCall, +// ) -> RuntimeCall { +// let data: Vec<(BlockNumber, Ciphertext)> = load_mmr_store(); +// let ciphertext = data.iter().filter(|d| d.0 == when).collect().unwrap()[0]; + +// let call_data = call.encode(); +// // prepare the proof required to used the mmr wallet at the specific block height +// let payload = murmur::execute::( +// seed, +// when, +// call_data, +// leaves.clone(), +// ).map_err(|e| println!("Murmur execution failed due to {:?}", e)).unwrap(); + +// // let root: Leaf = payload.root; +// let hash: Vec = payload.hash; +// let proof: MerkleProof = payload.proof; +// let target_leaf: Leaf = payload.target; +// let pos: u64 = payload.pos; + +// let proof_items: Vec> = proof.proof_items().iter() +// .map(|leaf| leaf.0.to_vec().clone()) +// .collect::>(); + +// let bounded = >>::truncate_from(name); + +// RuntimeCall::Murmur(MurmurCall::proxy { +// name: bounded, +// position: pos, +// target_leaf: target_leaf.0, +// proof: proof_items, +// ciphertext, +// call: Box::new(call), +// hash, +// }) +// } + + + +// /// dispatch a shielded (timelocked) transaction for a future block +// async fn dispatch_sealed_tx>( +// etf: OnlineClient, +// when: BlockNumber, +// ephemeral_msk: [u8;32], +// pk: DoublePublicKey, +// proxy_call: RuntimeCall, +// ) { +// let proxy_call_bytes: &[u8] = &proxy_call.encode(); +// // then construct a scheduled transaction for "when" +// // 1. tlock +// let identity = I::build_identity(when); +// let timelocked_proxy_call = murmur::timelock_encrypt::( +// identity, +// pk.1, +// ephemeral_msk, +// proxy_call_bytes, +// ); +// let bounded_ciphertext = etf::runtime_types::bounded_collections::bounded_vec::BoundedVec(timelocked_proxy_call); +// // 2. build tx +// let sealed_tx = etf::tx() +// .scheduler() +// .schedule_sealed(when, 127, bounded_ciphertext); +// // 3. submit tx +// let events = etf +// .tx() +// .sign_and_submit_then_watch_default(&sealed_tx, &dev::alice()) +// .await; +// } /// read an MMR from a file -fn load_leaves() -> Vec<(BlockNumber, Leaf)> { +fn load_mmr_store(seed: Vec) -> MurmurStore { let mmr_store_file = File::open("mmr_store") .expect("Unable to open file"); - let leaves: Vec<(BlockNumber, Leaf)> = + let data: BTreeMap = serde_cbor::from_reader(mmr_store_file).unwrap(); - leaves + + MurmurStore::from(seed, data) } -/// Write the MMR to a file -fn write_leaves(leaves: &[(BlockNumber, Leaf)]) { +/// Write the MMR data to a file (no seed) +fn write_mmr_store(mmr_store: BTreeMap) { let mut mmr_store_file = File::create("mmr_store") .expect("should be ok"); - serde_cbor::to_writer(mmr_store_file, &leaves) + // TODO: error handling + serde_cbor::to_writer(mmr_store_file, &mmr_store) .unwrap(); } #[cfg(test)] mod tests { - // pub fn test_can_read_write_leaves() { } -} \ No newline at end of file + // pub fn test_can_read_write_mmr_store() { } +} + + + + + +// use sha3::Digest; + +// fn main() -> io::Result<()> { +// let mut terminal = ratatui::init(); +// terminal.clear()?; +// let app_result = run(terminal); +// ratatui::restore(); +// app_result +// } + +// fn run(mut terminal: DefaultTerminal) -> io::Result<()> { +// loop { +// terminal.draw(|frame| { +// let greeting = Paragraph::new("Hello Ratatui! (press 'q' to quit)") +// .white() +// .on_blue(); +// frame.render_widget(greeting, frame.area()); +// })?; + +// if let event::Event::Key(key) = event::read()? { +// if key.kind == KeyEventKind::Press && key.code == KeyCode::Char('q') { +// return Ok(()); +// } +// } +// } +// } diff --git a/core/README.md b/core/README.md index b9c2820..73a5a2c 100644 --- a/core/README.md +++ b/core/README.md @@ -2,8 +2,15 @@ The core implementation of the murmur protocol. This library enables each step of the Murmur protocol, including implementations of the following: -- `create -> (root, mmr_leaves_to_bn = {(1, Leaf(0x0123...)), (3, Leaf(0x12301...)), ...})` -- `execute -> ` +### Functions + +#### Create +$\{(b_i, ct_i)\}_{i \in [n]} \leftarrow Murmur.Create(seed, \{b_0, ..., b_n\}) $ + +#### PrepareExecute +$h_b \leftarrow PrepareExecute(seed, AUX, b)$ + +#### Verify - `verify -> true/false` ## Build diff --git a/core/src/murmur.rs b/core/src/murmur.rs index 3b787cf..58dd0f4 100644 --- a/core/src/murmur.rs +++ b/core/src/murmur.rs @@ -16,8 +16,11 @@ //! The murmur protocol implementation //! - -use alloc::{string::String, vec, vec::Vec}; +use alloc::{ + string::String, vec, + vec::Vec, + collections::BTreeMap, +}; #[cfg(feature = "client")] use crate::otp::BOTPGenerator; @@ -44,121 +47,101 @@ use sha3::Digest; #[derive(Debug)] pub enum Error { - ExecuteError + ExecuteError, + MMRError, } -/// creates the leaves needed to generate an MMR -/// This function generates otp codes for the given block schedule -/// then it encrypts the resulting codes and constructs leaves -/// the leaves can be used to generate an MMR -/// #[cfg(feature = "client")] -pub fn create>( +#[derive(Debug)] +pub struct MurmurStore { + /// the seed used to create the store (should we even keep it here?) probably not... seed: Vec, - block_schedule: Vec, - ephemeral_msk: [u8;32], - pk: DoublePublicKey, -) -> Vec<(BlockNumber, Leaf)> { - let totp = build_generator(&seed.clone()); - - let mut leaves = Vec::new(); - - for i in &block_schedule { - let otp_code = totp.generate(*i); - let identity = I::build_identity(*i); - let ct_bytes = timelock_encrypt::( - identity, - pk.1, - ephemeral_msk, - otp_code.as_bytes(), - ); - let leaf = Leaf::from(ct_bytes); - leaves.push((*i, leaf)); - } - - leaves + /// a store of block numbers to ciphertexts (encrypted OTP codes) + /// Q: how large is each ciphertext? + pub data: BTreeMap, } -/// computes parameters needed to execute a transaction at the specified block number -/// outputs a payload containing: (ciphertext, hash, merkle proof, position/index) #[cfg(feature = "client")] -pub fn execute( - seed: Vec, - when: BlockNumber, - aux_data: Vec, - leaves: Vec<(BlockNumber, Leaf)>, -) -> Result { - // rebuild the MMR and search for the position of the leaf for the given block number - let store = MemStore::default(); - let mut mmr = MemMMR::<_, MergeLeaves>::new(0, store); - - let mut target_pos: u64 = 0; - let mut target_leaf: Leaf = Leaf::default(); - - leaves.into_iter().for_each(|leaf_data| { - let leaf = leaf_data.1; - let block_num = leaf_data.0; - let pos = mmr.push(leaf.clone()).unwrap(); - if block_num == when { - target_pos = pos; - target_leaf = leaf; +impl MurmurStore { + + pub fn from( + seed: Vec, + data: BTreeMap + ) -> Self { + MurmurStore { + seed, + data, } - }); + } - // prepare merkle proof - let root = mmr.get_root() - .expect("The MMR root should be calculable"); - let proof = mmr.gen_proof(vec![target_pos]) - .expect("should be ok"); + /// creates the leaves needed to generate an MMR + /// This function generates otp codes for the given block schedule + /// then it encrypts the resulting codes and constructs leaves + /// the leaves can be used to generate an MMR + /// + #[cfg(feature = "client")] + pub fn new>( + seed: Vec, + block_schedule: Vec, + ephemeral_msk: [u8;32], + pk: DoublePublicKey, + ) -> Self { + let totp = build_generator(&seed.clone()); + + let mut mmr_store = BTreeMap::new(); + + for i in &block_schedule { + let otp_code = totp.generate(*i); + let identity = I::build_identity(*i); + let ct_bytes = timelock_encrypt::( + identity, + pk.1, + ephemeral_msk, + otp_code.as_bytes(), + ); + mmr_store.insert(*i, ct_bytes); + } + + MurmurStore { + seed, + data: mmr_store, + } + } - // hash(otp || AUX_DATA) - let botp = build_generator(&seed.clone()); - let otp_code = botp.generate(when); - let mut hasher = sha3::Sha3_256::default(); - hasher.update(otp_code.as_bytes()); - hasher.update(&aux_data); - let hash = hasher.finalize().to_vec(); - - let payload = ExecutionPayload { - root, - proof, - target: target_leaf, - pos: target_pos, - hash, - }; - Ok(payload) -} + pub fn get(&self, when: BlockNumber) -> Option { + self.data.get(&when).cloned() + } -/// verify the correctness of a proof -/// e.g. would be called by the pallet/runtime -pub fn verify( - root: Leaf, - otp: Vec, - aux_data: Vec, - payload: ExecutionPayload -) -> bool { - // verify the merkle proof - let proof = payload.proof; - let pos = payload.pos; - let target = payload.target; + /// use the seed to commit to some data at a specific block number + /// i.e. this commit cannot be verified until there is a signature + /// output from IDN for `when` + pub fn commit(&self, when: BlockNumber, data: &[u8]) -> Vec { + let botp = build_generator(&self.seed); + let otp_code = botp.generate(when); - let mut validity = proof.verify(root, vec![(pos, target)]) - .unwrap_or(false); - - if validity { - // verify the hash let mut hasher = sha3::Sha3_256::default(); - hasher.update(otp); - hasher.update(aux_data); - let hash = hasher.finalize(); - - validity = validity - && hash.to_vec() == payload.hash; + hasher.update(otp_code.as_bytes()); + hasher.update(data); + hasher.finalize().to_vec() } - validity + // builds an mmr from the mmr store + /// + /// * `mmr`: a MemMMR instance + /// + pub fn to_mmr(&self, mmr: &mut MemMMR::) -> Result<(), Error> { + self.data.iter().for_each(|elem| { + let leaf = Leaf::from(elem.1.clone()); + mmr.push(leaf).map_err(|e| { + return Error::MMRError; + }); + }); + + Ok(()) + } } + #[cfg(feature = "client")] /// timelock encryption function pub fn timelock_encrypt( @@ -188,10 +171,44 @@ fn build_generator(seed: &[u8]) -> BOTPGenerator { BOTPGenerator::new(hash.to_vec()) } +// verify the correctness of execution parameters +// e.g. would be called by the pallet/runtime +// this function assumes that the otp is the timelock decryption result +// of decrypting the ciphertext +// I don't know if I like this design, could move decryption +// inside this function maybe? not sure... +pub fn verify( + root: Leaf, + proof: MerkleProof, + hash: Vec, + ciphertext: Vec, + otp: Vec, + aux_data: Vec, + pos: u64, +) -> bool { + + let mut validity = proof.verify(root, vec![(pos, Leaf::from(ciphertext))]) + .unwrap_or(false); + + if validity { + // verify the hash + let mut hasher = sha3::Sha3_256::default(); + hasher.update(otp); + hasher.update(aux_data); + let expected_hash = hasher.finalize(); + + validity = validity && + expected_hash.to_vec() == hash; + } + + validity +} + mod tests { use super::*; use w3f_bls::{DoublePublicKey, DoublePublicKeyScheme, TinyBLS377}; + use ckb_merkle_mountain_range::helper::leaf_index_to_pos; pub struct DummyIdBuilder; impl IdentityBuilder for DummyIdBuilder { @@ -200,9 +217,13 @@ mod tests { } } + fn get_key_index(b: &BTreeMap, key: &K) -> Option { + b.keys().position(|k| k == key) + } + #[cfg(feature = "client")] #[test] - pub fn it_can_generate_leaves() { + pub fn it_can_generate_mmr_data_store() { let keypair = w3f_bls::KeypairVT::::generate(&mut OsRng); // let msk = keypair.secret.0; // can destroy this let double_public: DoublePublicKey = DoublePublicKey( @@ -214,14 +235,17 @@ mod tests { let seed = vec![1,2,3]; let schedule = vec![1,2,3]; - let leaves = create::( + let datastore = MurmurStore::new::( seed.clone(), - schedule, + schedule.clone(), ephem_msk, double_public, ); - assert!(leaves.len() == 3); + assert!(datastore.data.len() == 3); + assert!(datastore.data.get(&schedule.clone()[0]).is_some()); + assert!(datastore.data.get(&schedule.clone()[1]).is_some()); + assert!(datastore.data.get(&schedule.clone()[2]).is_some()); } #[cfg(feature = "client")] @@ -234,71 +258,48 @@ mod tests { keypair.public.0, ); - let double_public_again: DoublePublicKey = DoublePublicKey( - keypair.into_public_key_in_signature_group().0, - keypair.public.0, - ); - let ephem_msk = [1;32]; let seed = vec![1,2,3]; let schedule = vec![1,2,3]; + let aux_data = vec![3,4,3]; + let when = 2; - let leaves = create::( + let datastore = MurmurStore::new::( seed.clone(), schedule.clone(), ephem_msk, double_public, ); - // precompute a root here - // this is the expected root when we attempt to call verify + let hash = datastore.commit(when, &aux_data); + let store = MemStore::default(); let mut mmr = MemMMR::<_, MergeLeaves>::new(0, store); - - leaves.clone().into_iter().for_each(|leaf_data| { - mmr.push(leaf_data.1.clone()).unwrap(); - }); - - // prepare merkle proof - let expected_root = mmr.get_root().expect("The MMR root should be calculable"); - let aux_data = vec![1,2,3]; - - let later = 1; - // generate execution parameters - if let Ok(payload) = execute::( - seed.clone(), - later, - aux_data.clone(), - leaves.clone(), - ) { - // we will recalculate the otp code here - // in practice, the verify function would get the OTP code by using timelock decryption - // where the ciphertext is provided in the execution payload - let botp = build_generator(&seed.clone()); - let otp_code = botp.generate(later); - - // lets check if we can serialize/deserialize the proof and still verify it - let proof_items: Vec> = payload.proof.proof_items().iter() - .map(|leaf| leaf.0.to_vec().clone()) - .collect::>(); - let proof_leaves: Vec = proof_items.clone().into_iter().map(|p| Leaf(p)).collect::>(); - // rebuild the proofs - let merkle_proof = MerkleProof::::new(leaves.len() as u64, proof_leaves); - - let execution_payload = ExecutionPayload { - root: expected_root.clone(), - proof: merkle_proof, - target: payload.target.clone(), - pos: payload.pos.clone(), - hash: payload.hash.clone(), - }; - - let validity = verify(expected_root.clone(), otp_code.as_bytes().to_vec(), aux_data.clone(), execution_payload); - assert!(validity); - assert!(verify(expected_root, otp_code.as_bytes().to_vec(), aux_data, payload)); - } else { - panic!("The test should pass"); - } + datastore.to_mmr(&mut mmr).unwrap(); + + let ciphertext = datastore.get(when).unwrap(); + let pos: u64 = get_key_index(&datastore.data, &when).unwrap() as u64; + // let pos: u64 = leaf_index_to_pos(idx as u64); + + let proof = mmr.gen_proof(vec![pos]) + .expect("todo: handle error"); + + let root = mmr.get_root().expect("the root should be able to be calculated"); + + // in practice, the otp code would be timelock decrypted + // but for testing purposes, we will just calculate the expected one now + let botp = build_generator(&seed.clone()); + let otp_code = botp.generate(when); + + assert!(verify( + root, + proof, + hash, + ciphertext, + otp_code.as_bytes().to_vec(), + aux_data, + pos, + )); } #[cfg(feature = "client")] @@ -311,52 +312,49 @@ mod tests { keypair.public.0, ); - let double_public_again: DoublePublicKey = DoublePublicKey( - keypair.into_public_key_in_signature_group().0, - keypair.public.0, - ); - let ephem_msk = [1;32]; let seed = vec![1,2,3]; let schedule = vec![1,2,3]; + let aux_data = vec![3,4,3]; + let when = 2; - let leaves = create::( + let datastore = MurmurStore::new::( seed.clone(), schedule.clone(), ephem_msk, double_public, ); - // precompute a root here - // this is the expected root when we attempt to call verify + let hash = datastore.commit(when, &aux_data); + let store = MemStore::default(); let mut mmr = MemMMR::<_, MergeLeaves>::new(0, store); - - leaves.clone().into_iter().for_each(|leaf_data| { - mmr.push(leaf_data.1.clone()).unwrap(); - }); - - // prepare merkle proof - let expected_root = mmr.get_root().expect("The MMR root should be calculable"); - let aux_data = vec![1,2,3]; + datastore.to_mmr(&mut mmr).unwrap(); - let later = 1; - // generate execution parameters - if let Ok(payload) = execute::( - seed.clone(), - later, - aux_data.clone(), - leaves, - ) { - // we will recalculate the otp code here - // in practice, the verify function would get the OTP code by using timelock decryption - // where the ciphertext is provided in the execution payload - let botp = build_generator(&seed.clone()); - let otp_code = botp.generate(later); - let bad_aux_data = vec![2,3,4,5,4,3]; - assert!(!verify(expected_root, otp_code.as_bytes().to_vec(), bad_aux_data, payload)); - } else { - panic!("The test should pass"); - } + let ciphertext = datastore.get(when).unwrap(); + let pos: u64 = get_key_index(&datastore.data, &when).unwrap() as u64; + // let pos: u64 = leaf_index_to_pos(idx as u64); + + let proof = mmr.gen_proof(vec![pos]) + .expect("todo: handle error"); + + let root = mmr.get_root().expect("the root should be able to be calculated"); + + // in practice, the otp code would be timelock decrypted + // but for testing purposes, we will just calculate the expected one now + let botp = build_generator(&seed.clone()); + let otp_code = botp.generate(when); + + let bad_aux = vec![4,4,4,4,4,4]; + + assert!(!verify( + root, + proof, + hash, + ciphertext, + otp_code.as_bytes().to_vec(), + bad_aux, + pos, + )); } } \ No newline at end of file diff --git a/core/src/types.rs b/core/src/types.rs index 259dc11..a295fa1 100644 --- a/core/src/types.rs +++ b/core/src/types.rs @@ -23,6 +23,8 @@ use alloc::vec::Vec; /// the type to represent a block number pub type BlockNumber = u32; +pub type Ciphertext = Vec; + /// A leaf in the MMR /// the payload is an opaque, any-length vec #[derive( diff --git a/mmr_store b/mmr_store index 6d87d5731afc2ecd160a25950da1b48ca5772dba..92feef3d3c39a6f12058ab98d3dcb6596b40948e 100644 GIT binary patch literal 89937 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


8s8(iaL+SV08V5XBW`SzAHs+rVfua!VkypB@Oe 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%0D}R3T z`*MBiM{`z6X@K{s2mPftMW>I-zG~xx1z)0rZD-5-_(=`v?dr{N&s91RNOLdVmCk~^ zsqQFtzkJryR>v5;4SCO(d+M_<ZkAx7)C$!_`ADIWi!$8vk zLPzqh!gjOCGbw9zxIhg6faSM{jxUNu6)NUs4j|mn%$J3zS>3x;gL6NRN@-ZUm!u zo+To;H3&>?T)%0yG;J>^9y12lqsSIO1hR8s|j^JM_sEz>!1bP;8 z{(!ycBS}t@XinbH@8!uUTOA>_GzjUHo-2v49~(|K=q>Ama6!(@Rz|P)O}PxD(?gNnkvi5I+K(US2)enfdh_jGFOcG;;_1WiXt~^$x$8`pw(1MG;`PBGPD`)2DC%z8rk0~23a5kF#|jO191G5DHaq;`jj?#?6c zBFUHQHF%zrUiUr@i7mwCCV)*M`@E614wSk+6m~llMZo`8ru(AtFxWP!?ZRFskbV)$ z@hAI_q<=nOe2as?AtF~2nRdbjIs5i@O zV-S7B@_Bc<2p6PX#%0b^Lcvs~UN_&}n_&;3&gI~|5PTQ1zzpTz`USi@Nn?vGi;hYp z-_{N7aBU=Y^PEZ2V6`Oy<`GPA7lXT{lU~xtQQjv1(QI@bCeI?WU5vs9=Y1v2mDEnd z!7C;k2KlGiPOtlZ%iw=Mr=j-`WVNl&eXnmz&k99c`uQ?X5tmSRfW3~X&zJO`l;{hD z+MAN(f(pKdOv(lrvs+TA-=x;l(StRGK7Uw`%P!L6T9aiuG#Evm88{k^lTGFl6j|Yk zpj(mRZz6vt=T$5JnZSbj?G}@e!4Mql9;uE6sUH-C-hnb3y!AnH7ie}l;H?f2=mIaj zm#I5vGV;3uR+RnvlbkNjT0!A1Bj0t!@f{wPo|+m=P5mOiP;{%0H2sWCj-u-3F;zi8 z(62UK$pWE2ljuRae#&{oRH9ok>5uf>s`d_S%iS*QtKTJH(F?h4(gPjk^T2)DVOHJQ z@DNz(g>@r|D>EX@%z%2&xVGZmw6S$)A`kf;X1A z7@-(x6h>_Y(Qqu@qgSN!H46*%I3kB7iD%Hy1Y5j4nsB>O-E*n#Ul{c{>F@7N1hYu} zgvFDWKVUr>=rtedR>}xCZLK)<{?V`m(Z%2)>0Q}GF2E#pUFN6 zI~ohxSLn1CNlG8waGP*;qw>A*Gm<11(7aDtk$^6?<9SlM5qQL7uN&-~P>-mrgDmf8c>eBRK*w0q3292B#X zi#}AtbHLMY6>D$F;!T42?aHeooT#UC(oL_oI!!2D@DJ6?FD8pZaL2u5vL~<}Ba|qa zV9^clGyMW`UW=Tk@NPArUk;`BX$N}so*vZdbMf^6rV5sk#4CE`^*t)*k&Fs3=CY)) z0<#}-#W=rG6aQcgyO3%dDxeSjbpn50L8^Y|b>n*l#p2y}_i`0$UKgHAD)XS!9fXwm^7z z&aO)�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 VT%%}kHMhN*9?Xp;+Tir-{{wNTbVUFF literal 6607 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 CgaSwa From 8dc419fd144f26cb2081087c8d749b4dbc802700 Mon Sep 17 00:00:00 2001 From: driemworks Date: Thu, 19 Sep 2024 15:22:17 -0500 Subject: [PATCH 08/20] refactor: move mapping and root into murmurstore, create execute function, create functions that will work work to wrap with wasm_bindgen --- README.md | 6 ++ cli/src/main.rs | 125 +++++++++++++++++--------------- core/README.md | 11 +++ core/src/lib.rs | 3 - core/src/murmur.rs | 177 +++++++++++++++++++++------------------------ core/src/types.rs | 16 +--- device/Cargo.toml | 20 ----- device/src/main.rs | 50 ------------- mmr_store | Bin 89937 -> 44785 bytes 9 files changed, 170 insertions(+), 238 deletions(-) delete mode 100644 device/Cargo.toml delete mode 100644 device/src/main.rs diff --git a/README.md b/README.md index 3a5dcd9..12f7987 100644 --- a/README.md +++ b/README.md @@ -14,3 +14,9 @@ cargo build cargo test ``` +## TODOs + +- [ ] create and add latex doc +- [ ] add zeroize for safety +- [ ] look into using ratatui +- [ ] performance and storage optimizations \ No newline at end of file diff --git a/cli/src/main.rs b/cli/src/main.rs index 15d9765..929674d 100644 --- a/cli/src/main.rs +++ b/cli/src/main.rs @@ -118,7 +118,7 @@ struct WalletCreationDetails { #[arg(long)] seed: String, #[clap(long)] - valid_for: u8, + validity: u32, } #[derive(Parser)] @@ -127,8 +127,6 @@ struct WalletExecuteDetails { name: String, #[arg(long)] seed: String, - #[arg(long)] - when: BlockNumber, #[arg(short, long)] amount: String, } @@ -136,6 +134,7 @@ struct WalletExecuteDetails { pub enum CLIError { } + #[derive(Debug)] pub struct BasicIdBuilder; impl IdentityBuilder for BasicIdBuilder { @@ -171,7 +170,7 @@ async fn main() -> Result<(), Box> { .await?; let round_pubkey_bytes = result.unwrap().as_type::>()?; - let round_pubkey = DoublePublicKey::::from_bytes(&round_pubkey_bytes).unwrap(); + // let round_pubkey = DoublePublicKey::::from_bytes(&round_pubkey_bytes).unwrap(); println!("🔑 Successfully retrieved the round public key."); let current_block = client.blocks().at_latest().await?; let current_block_number = current_block.header().number; @@ -182,8 +181,7 @@ async fn main() -> Result<(), Box> { let etf = OnlineClient::::new().await?; // let mut mmr_store_file = File::create("mmr_store").unwrap(); - let store = MemStore::default(); - let mut mmr = MemMMR::<_, MergeLeaves>::new(0, store); + // let store = MemStore::default(); // TODO: HKDF? just hash the seed? let ephem_msk = [1;32]; @@ -191,40 +189,29 @@ async fn main() -> Result<(), Box> { match &cli.commands { Commands::New(args) => { println!("🭠Murmur: Generating Merkle mountain range"); + // 1. prepare block schedule let mut schedule: Vec = Vec::new(); - for i in 2..args.valid_for + 2 { + for i in 2..args.validity + 2 { // wallet is 'active' in 2 blocks let next_block = current_block_number.clone() + i as u32; schedule.push(next_block); } - // create MMRDataStore - let store: MurmurStore = MurmurStore::new::( - args.seed.clone().into(), - schedule.clone(), + // 2. create mmr + let (call, mmr_store) = create( + args.name.clone(), + args.seed.clone(), ephem_msk, - round_pubkey, - ); - - store.to_mmr(&mut mmr).unwrap(); - // println!("Write leaves {:?} to disk", data.len()); - write_mmr_store(store.data.clone()); - - let root = mmr.get_root().clone() - .expect("The MMR root should be calculable"); - let name = args.name.as_bytes().to_vec(); - // prepare and send tx from 'alice' account (for now) - // should be configurable - let create_anon_tx = etf::tx() - .murmur() - .create( - root.0.into(), - store.data.len() as u64, - etf::runtime_types::bounded_collections::bounded_vec::BoundedVec(name)); + schedule, + round_pubkey_bytes, + ).await; + // 3. add to storage + write_mmr_store(mmr_store.clone()); // TODO: make the origin configurable + // sign and send the call let from = dev::alice(); let events = etf .tx() - .sign_and_submit_then_watch_default(&create_anon_tx, &from) + .sign_and_submit_then_watch_default(&call, &from) .await?; println!("✅ MMR proxy account creation successful!"); @@ -272,15 +259,22 @@ async fn main() -> Result<(), Box> { dest: subxt::utils::MultiAddress::<_, u32>::from(bob), value: v, }); + + let store: MurmurStore = load_mmr_store(); + // store.to_mmr(&mut mmr).unwrap(); - execute::( - etf.clone(), + let tx = prepare_execute::( + // etf.clone(), args.name.clone().as_bytes().to_vec(), args.seed.clone().as_bytes().to_vec(), current_block_number, - mmr, + store, balance_transfer_call, ).await; + // submit the tx using alice to sign it + etf.tx() + .sign_and_submit_then_watch_default(&tx, &dev::alice()) + .await; }, _ => panic!("Hey, don't do that!"), } @@ -288,9 +282,34 @@ async fn main() -> Result<(), Box> { Ok(()) } +// fn get_key_index( +// b: &BTreeMap, key: &K) -> Option { +// b.keys().position(|k| k == key) +// } -fn get_key_index(b: &BTreeMap, key: &K) -> Option { - b.keys().position(|k| k == key) +pub async fn create( + name: String, + seed: String, + ephem_msk: [u8;32], + block_schedule: Vec, + round_pubkey_bytes: Vec, +) -> (subxt::tx::Payload, MurmurStore) { + let round_pubkey = DoublePublicKey::::from_bytes(&round_pubkey_bytes).unwrap(); + let mmr_store = MurmurStore::new::( + seed.clone().into(), + block_schedule.clone(), + ephem_msk, + round_pubkey, + ); + let root = mmr_store.root.clone(); + let name = name.as_bytes().to_vec(); + let call = etf::tx() + .murmur() + .create( + root.0.into(), + mmr_store.metadata.len() as u64, + etf::runtime_types::bounded_collections::bounded_vec::BoundedVec(name)); + (call, mmr_store) } /// prepare the call for immediate execution @@ -302,25 +321,20 @@ fn get_key_index(b: &BTreeMap, key: &K) -> Opti /// We could potentially use that idea as a way to optimize the execute function in general. Rather than /// loading the entire MMR into memory, we really only need to load a minimal subtree containing the leaf we want to consume /// -> add this to the 'future work' section later -async fn execute( - etf: OnlineClient, +pub async fn prepare_execute( name: Vec, seed: Vec, when: BlockNumber, - mut mmr: MemMMR::, + store: MurmurStore, call: etf::runtime_types::node_template_runtime::RuntimeCall, -) { - let store: MurmurStore = load_mmr_store(seed); +) -> subxt::tx::Payload { let call_data = call.encode(); - let hash = store.commit(when, &call_data); - store.to_mmr(&mut mmr).unwrap(); - let ciphertext = store.get(when).unwrap(); - let pos = get_key_index(&store.data, &when).unwrap() as u64; - // let pos: u64 = leaf_index_to_pos(idx as u64); + let root = store.root.clone(); - let proof = mmr.gen_proof(vec![pos]) - .expect("todo: handle error"); + let (proof, commitment, ciphertext, pos) = store.execute( + seed.clone(), when, call.encode().to_vec(), + ).unwrap(); let proof_items: Vec> = proof.proof_items().iter() .map(|leaf| leaf.0.to_vec().clone()) @@ -328,17 +342,14 @@ async fn execute( let bounded = etf::runtime_types::bounded_collections::bounded_vec::BoundedVec(name); - let tx = etf::tx().murmur().proxy( + etf::tx().murmur().proxy( bounded, pos, - hash, + commitment, ciphertext, proof_items, call, - ); - etf.tx() - .sign_and_submit_then_watch_default(&tx, &dev::alice()) - .await; + ) } // /// prepare the proxy call for a scheduled transaction @@ -417,17 +428,17 @@ async fn execute( // } /// read an MMR from a file -fn load_mmr_store(seed: Vec) -> MurmurStore { +fn load_mmr_store() -> MurmurStore { let mmr_store_file = File::open("mmr_store") .expect("Unable to open file"); - let data: BTreeMap = + let data: MurmurStore = serde_cbor::from_reader(mmr_store_file).unwrap(); - MurmurStore::from(seed, data) + data } /// Write the MMR data to a file (no seed) -fn write_mmr_store(mmr_store: BTreeMap) { +fn write_mmr_store(mmr_store: MurmurStore) { let mut mmr_store_file = File::create("mmr_store") .expect("should be ok"); // TODO: error handling diff --git a/core/README.md b/core/README.md index 73a5a2c..cae53a4 100644 --- a/core/README.md +++ b/core/README.md @@ -14,12 +14,23 @@ $h_b \leftarrow PrepareExecute(seed, AUX, b)$ - `verify -> true/false` ## Build + ``` shell cargo build ``` +The OTP code generator is gated under the "client" feature, so build with: +``` shell +cargo build --features "client" +``` + ## Test ``` shell cargo test +``` + +The OTP code generator is gated under the "client" feature, so run tests with: +``` shell +cargo test --features "client" ``` \ No newline at end of file diff --git a/core/src/lib.rs b/core/src/lib.rs index 882ca5b..b1cc950 100644 --- a/core/src/lib.rs +++ b/core/src/lib.rs @@ -16,9 +16,6 @@ #![no_std] //! the murmur core library extern crate alloc; -// extern crate allocation; -// extern crate core; -// extern crate #[cfg(feature = "client")] mod otp; diff --git a/core/src/murmur.rs b/core/src/murmur.rs index 58dd0f4..79da55d 100644 --- a/core/src/murmur.rs +++ b/core/src/murmur.rs @@ -38,8 +38,9 @@ use ckb_merkle_mountain_range::{ MerkleProof, util::{ MemMMR, - MemStore + MemStore, }, + MMRStore, }; use ark_serialize::CanonicalSerialize; use codec::Encode; @@ -51,35 +52,24 @@ pub enum Error { MMRError, } +/// the murmur store #[cfg(feature = "client")] -#[derive(Debug)] +#[derive(Clone, serde::Serialize, serde::Deserialize)] pub struct MurmurStore { - /// the seed used to create the store (should we even keep it here?) probably not... - seed: Vec, - /// a store of block numbers to ciphertexts (encrypted OTP codes) - /// Q: how large is each ciphertext? - pub data: BTreeMap, + /// map block numbers to positions in the mmr + pub metadata: BTreeMap, + /// the root of the mmr + pub root: Leaf, } #[cfg(feature = "client")] impl MurmurStore { - pub fn from( - seed: Vec, - data: BTreeMap - ) -> Self { - MurmurStore { - seed, - data, - } - } - /// creates the leaves needed to generate an MMR /// This function generates otp codes for the given block schedule /// then it encrypts the resulting codes and constructs leaves /// the leaves can be used to generate an MMR /// - #[cfg(feature = "client")] pub fn new>( seed: Vec, block_schedule: Vec, @@ -87,9 +77,11 @@ impl MurmurStore { pk: DoublePublicKey, ) -> Self { let totp = build_generator(&seed.clone()); + let mut metadata = BTreeMap::new(); - let mut mmr_store = BTreeMap::new(); - + let store = MemStore::default(); + let mut mmr = MemMMR::<_, MergeLeaves>::new(0, store); + for i in &block_schedule { let otp_code = totp.generate(*i); let identity = I::build_identity(*i); @@ -99,24 +91,49 @@ impl MurmurStore { ephemeral_msk, otp_code.as_bytes(), ); - mmr_store.insert(*i, ct_bytes); + let leaf = Leaf(ct_bytes.clone()); + let _pos = mmr.push(leaf).expect("todo");//.map_err(|e| { + metadata.insert(*i, ct_bytes); } - + + MurmurStore { - seed, - data: mmr_store, + metadata, + root: mmr.get_root().unwrap().clone(), } } - pub fn get(&self, when: BlockNumber) -> Option { - self.data.get(&when).cloned() + /// build the parameters needed to use a murmur wallet + /// note: this rebuilds the entire mmr + /// we can look into ways to optimize this in the future + /// the main issue is that he MemStore is not serializable + /// a possible fix is to externalize mmr logic + /// + /// TODO: this should probably be a result, not option + pub fn execute( + &self, + seed: Vec, + when: BlockNumber, + call_data: Vec + ) -> Option<(MerkleProof::, Vec, Ciphertext, u64)> { + let mmr = self.to_mmr(); + let store = mmr.store(); + let commitment = MurmurStore::commit(seed.clone(), when, &call_data.clone()); + // generate the merkle proof here and fetch the ciphertext + if let Some(ciphertext) = self.metadata.get(&when) { + let pos = get_key_index(&self.metadata, &when).unwrap() as u64; + let proof = mmr.gen_proof(vec![pos]).expect("todo: handle error"); + return Some((proof, commitment, ciphertext.clone(), pos)); + } + + None } /// use the seed to commit to some data at a specific block number /// i.e. this commit cannot be verified until there is a signature /// output from IDN for `when` - pub fn commit(&self, when: BlockNumber, data: &[u8]) -> Vec { - let botp = build_generator(&self.seed); + fn commit(seed: Vec, when: BlockNumber, data: &[u8]) -> Vec { + let botp = build_generator(&seed); let otp_code = botp.generate(when); let mut hasher = sha3::Sha3_256::default(); @@ -125,23 +142,21 @@ impl MurmurStore { hasher.finalize().to_vec() } - // builds an mmr from the mmr store + /// builds an mmr from the mmr store /// - /// * `mmr`: a MemMMR instance + /// * `mmr`: a MemMMR instance (to be populated) /// - pub fn to_mmr(&self, mmr: &mut MemMMR::) -> Result<(), Error> { - self.data.iter().for_each(|elem| { - let leaf = Leaf::from(elem.1.clone()); - mmr.push(leaf).map_err(|e| { - return Error::MMRError; - }); - }); - - Ok(()) + fn to_mmr(&self) -> MemMMR { + let store = MemStore::default(); + let mut mmr = MemMMR::<_, MergeLeaves>::new(0, store); + for (block_number, ciphertext) in self.metadata.clone() { + mmr.push(Leaf(ciphertext)).expect("todo"); + } + + mmr } } - #[cfg(feature = "client")] /// timelock encryption function pub fn timelock_encrypt( @@ -172,11 +187,6 @@ fn build_generator(seed: &[u8]) -> BOTPGenerator { } // verify the correctness of execution parameters -// e.g. would be called by the pallet/runtime -// this function assumes that the otp is the timelock decryption result -// of decrypting the ciphertext -// I don't know if I like this design, could move decryption -// inside this function maybe? not sure... pub fn verify( root: Leaf, proof: MerkleProof, @@ -187,7 +197,7 @@ pub fn verify( pos: u64, ) -> bool { - let mut validity = proof.verify(root, vec![(pos, Leaf::from(ciphertext))]) + let mut validity = proof.verify(root, vec![(pos, Leaf(ciphertext))]) .unwrap_or(false); if validity { @@ -204,6 +214,10 @@ pub fn verify( validity } +pub fn get_key_index(b: &BTreeMap, key: &K) -> Option { + b.keys().position(|k| k == key) +} + mod tests { use super::*; @@ -217,10 +231,6 @@ mod tests { } } - fn get_key_index(b: &BTreeMap, key: &K) -> Option { - b.keys().position(|k| k == key) - } - #[cfg(feature = "client")] #[test] pub fn it_can_generate_mmr_data_store() { @@ -235,24 +245,21 @@ mod tests { let seed = vec![1,2,3]; let schedule = vec![1,2,3]; - let datastore = MurmurStore::new::( + let murmur_store = MurmurStore::new::( seed.clone(), schedule.clone(), ephem_msk, double_public, ); - assert!(datastore.data.len() == 3); - assert!(datastore.data.get(&schedule.clone()[0]).is_some()); - assert!(datastore.data.get(&schedule.clone()[1]).is_some()); - assert!(datastore.data.get(&schedule.clone()[2]).is_some()); + // + assert!(murmur_store.metadata.keys().len() == 3); } #[cfg(feature = "client")] #[test] pub fn it_can_generate_valid_output_and_verify_it() { let keypair = w3f_bls::KeypairVT::::generate(&mut OsRng); - // let msk = keypair.secret.0; // can destroy this let double_public: DoublePublicKey = DoublePublicKey( keypair.into_public_key_in_signature_group().0, keypair.public.0, @@ -261,30 +268,23 @@ mod tests { let ephem_msk = [1;32]; let seed = vec![1,2,3]; let schedule = vec![1,2,3]; - let aux_data = vec![3,4,3]; - let when = 2; - let datastore = MurmurStore::new::( + let aux_data = vec![2,3,4,5]; + + let murmur_store = MurmurStore::new::( seed.clone(), schedule.clone(), ephem_msk, double_public, ); - let hash = datastore.commit(when, &aux_data); - - let store = MemStore::default(); - let mut mmr = MemMMR::<_, MergeLeaves>::new(0, store); - datastore.to_mmr(&mut mmr).unwrap(); + // the block number when this would execute + let when = 1; - let ciphertext = datastore.get(when).unwrap(); - let pos: u64 = get_key_index(&datastore.data, &when).unwrap() as u64; - // let pos: u64 = leaf_index_to_pos(idx as u64); - - let proof = mmr.gen_proof(vec![pos]) - .expect("todo: handle error"); - - let root = mmr.get_root().expect("the root should be able to be calculated"); + let root = murmur_store.root.clone(); + let (proof, commitment, ciphertext, pos) = murmur_store + .execute(seed.clone(), when, aux_data.clone()) + .unwrap(); // in practice, the otp code would be timelock decrypted // but for testing purposes, we will just calculate the expected one now @@ -294,7 +294,7 @@ mod tests { assert!(verify( root, proof, - hash, + commitment, ciphertext, otp_code.as_bytes().to_vec(), aux_data, @@ -306,7 +306,6 @@ mod tests { #[test] pub fn it_fails_on_verify_bad_aux_data() { let keypair = w3f_bls::KeypairVT::::generate(&mut OsRng); - // let msk = keypair.secret.0; // can destroy this let double_public: DoublePublicKey = DoublePublicKey( keypair.into_public_key_in_signature_group().0, keypair.public.0, @@ -315,42 +314,34 @@ mod tests { let ephem_msk = [1;32]; let seed = vec![1,2,3]; let schedule = vec![1,2,3]; - let aux_data = vec![3,4,3]; - let when = 2; - let datastore = MurmurStore::new::( + let aux_data = vec![2,3,4,5]; + + let murmur_store = MurmurStore::new::( seed.clone(), schedule.clone(), ephem_msk, double_public, ); - let hash = datastore.commit(when, &aux_data); - - let store = MemStore::default(); - let mut mmr = MemMMR::<_, MergeLeaves>::new(0, store); - datastore.to_mmr(&mut mmr).unwrap(); - - let ciphertext = datastore.get(when).unwrap(); - let pos: u64 = get_key_index(&datastore.data, &when).unwrap() as u64; - // let pos: u64 = leaf_index_to_pos(idx as u64); + // the block number when this would execute + let when = 1; + let root = murmur_store.root.clone(); + let (proof, commitment, ciphertext, pos) = murmur_store + .execute(seed.clone(), when, aux_data.clone()) + .unwrap(); - let proof = mmr.gen_proof(vec![pos]) - .expect("todo: handle error"); - - let root = mmr.get_root().expect("the root should be able to be calculated"); // in practice, the otp code would be timelock decrypted // but for testing purposes, we will just calculate the expected one now let botp = build_generator(&seed.clone()); let otp_code = botp.generate(when); - let bad_aux = vec![4,4,4,4,4,4]; - + let bad_aux = vec![2,3,13,3]; assert!(!verify( root, proof, - hash, + commitment, ciphertext, otp_code.as_bytes().to_vec(), bad_aux, diff --git a/core/src/types.rs b/core/src/types.rs index a295fa1..737e474 100644 --- a/core/src/types.rs +++ b/core/src/types.rs @@ -55,21 +55,7 @@ impl Merge for MergeLeaves { } } -/// an execution payload to represent knowledge of a future otp code -#[derive(Debug)] -pub struct ExecutionPayload { - /// the root of the mmr - pub root: Leaf, - /// the merkle proof for the target leaf - pub proof: MerkleProof, - /// the target leaf (contains ciphertext) - pub target: Leaf, - /// the position of the target leaf in the mmr - pub pos: u64, - /// hash(OTP || CALL_DATA) - pub hash: Vec, -} - +/// something that builds unique identities (e.g. using crypto hash function) for any block number pub trait IdentityBuilder { fn build_identity(at: BlockNumber) -> Identity; } \ No newline at end of file diff --git a/device/Cargo.toml b/device/Cargo.toml deleted file mode 100644 index 88f8c3b..0000000 --- a/device/Cargo.toml +++ /dev/null @@ -1,20 +0,0 @@ -[package] -name = "etf-otp-device" -version = "0.1.0" -edition = "2021" - -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html - -[dependencies] -subxt = "0.34.0" -subxt-signer = "0.34.0" -tokio = { version = "1.35", features = ["macros", "time", "rt-multi-thread"] } -totp-rs = "5.5.1" -etf-crypto-primitives = { git = "https://github.com/ideal-lab5/etf-sdk/", branch = "main" } -clap = { version = "4.1.1", features = ["derive"] } -rand_chacha = "0.3.1" -ckb-merkle-mountain-range = "0.5.2" -blake2b-rs = "0.2.0" -bytes = "1.4.0" -serde_json = "1.0.108" -indicatif = "0.17.8" \ No newline at end of file diff --git a/device/src/main.rs b/device/src/main.rs deleted file mode 100644 index c6a2dac..0000000 --- a/device/src/main.rs +++ /dev/null @@ -1,50 +0,0 @@ -#![allow(missing_docs)] -use subxt::{OnlineClient, PolkadotConfig, config::Header}; -use subxt_signer::sr25519::dev; - -// Generate an interface that we can use from the node's metadata. -#[subxt::subxt(runtime_metadata_path = "../artifacts/metadata.scale")] -pub mod etf {} - -#[tokio::main] -async fn main() -> Result<(), Box> { - // Create a new API client, configured to talk to Polkadot nodes. - // let api = OnlineClient::::new().await?; - // // fetch current block details we need: - // let current_block = api.blocks().at_latest().await?; - // // get validators and digests - // let validators = current_block.storage().fetch(&etf::storage().aura().authorities()).await?.unwrap(); - // let digest_logs = ¤t_block.header().digest.logs; - - // println!("{:?}", digest_logs); - - // Create a new API client, configured to talk to Polkadot nodes. - let api = OnlineClient::::new().await?; - let mut last_block_number = 0u32; // Store the last processed block number - - loop { - // Fetch the latest FINALIZED block - let current_block = api.blocks().at_latest().await?; - let current_block_number = current_block.header().number; - // Check if a new block has been received - if current_block_number != last_block_number { - // Update the last processed block number - last_block_number = current_block_number; - - // Fetch validators and digests for the current block - let validators = current_block.storage().fetch(&etf::storage().aura().authorities()).await?.unwrap(); - let digest_logs = ¤t_block.header().digest.logs; - - // Print out the digest logs - println!("Block Number: {}", current_block_number); - println!("Validators: {:?}", validators); - println!("Digest Logs: {:?}", digest_logs); - } - - // Wait for some time before checking for the next block - tokio::time::sleep(std::time::Duration::from_secs(3)).await; - } - - Ok(()) -} - diff --git a/mmr_store b/mmr_store index 92feef3d3c39a6f12058ab98d3dcb6596b40948e..ffa086a771e8223b383a88573da18749888fab75 100644 GIT binary patch literal 44785 zcmb5Xb$Arp)3rTucPm_iOOW911ef3z^x(k>?(XgyJh;1i@Zb_$g1bw;yXN=I(BEI- zJ?8?FneM%-)>^e{cTacEuGY45ZCnFQ|NBoS$}uS`PlJ4AwS1KvGGCg>EqNmkd?ie( zy2&OvZjv?bmdzh}yUCmY87 z{x)(_ij&2AIU}8=p{$cia#e&4_sehoo+`70q=*!jUG{8Vfr-Aj@%s|lB~PWjbe9lW zE*ri7B&PDZIJ1?*+443~=1g|Ke~F-$RO%OLw@pX?=% z@lwl9)-(PG$f+T#?Tpl22d6hs@JlYpL+Q(Idx`kI)Mv+G(tsg0lT9&sX=9~tHj%%R zJCa)_$r~Ghzb*Me_MZtn!p0pPWQG)C)+kA1C*Ne8qqO(or4q6fvYtv$NeMl5J$Ydq z=!Fs8aU`|UUnYRqa(O8|0DmxVypkF=gfrQM?&?b`s1I|Mg=nM$jCX{cgK|pd$`oEH zC1oJBDF4rrEppO{koP9A+_Z@lU|nbHrCt#c@%&ppxD`R zSE@1mJE=wd$z{C*Zyu2wi2syiA(gGn80G*mp)ybIG1sKO!@OpPETnos`pbKFS?rDI zx}lr$Fj*NbtwBu(JP2wlFGK-AJi%Y*?=h0Y-bi0p`GXRlkmPRiKkv_vQz@%@0GOQ@ ze@YGyZwc|Sa<@jl$Z1L>wQO=Di8Ul}STb1yOQQB{(Bua~D=)FgbUkzCVw!h+?>ZJh4<>l2y zX!RTDv_v2CrE3t?mI2bDrGldu75W3YEte5?l8Rq)Q(a*ww!So{c2dh|AL%D)q!-2T z+FVqn4D8+G)yJ~l6)>a0z6pWUhVxwvejM&*QSPdu`w@o5VRV zY-vc_K@rsg@r;tk+XMVY@^ea%*bNu;@Pcq0w1E=_5CyPL`862O&Idv98LaX$85clG zx23cVao;4Wk7%(jHaid6&H_>fdoYxr9p=r8nC7CK(?;JsMX>ED&b<8HfvLYR+XP4K`VIPOMTpVzh=NU!r4Dk}R=)U9 z8K0cxJfT>e3G?3})7`M2`e^e3BCLzAE+DzqsNgZs&c|;C2VsPvY_L3_MH@i0*S6z<`!DyVTw^HkA=#m zu-6$b&r&JBY-FJiTJ47aoCVlXlvKQtxLUjvja?ig&KyL)%H-w(MBSmQFQxYc3f{`3 zK;HYr{|Oi-io*69Fr<~a^E4qG#>p4|zl~bDd*YU-$hst>Peq5<*rzio$1`l49lx9b zjG}l!u#=Ivhh(x5gFnc0hoP%91b<-53xs$ATewX$|B3j@5G!{Fc&Qaogs@RDlrjux zgE0t8Y)P_L5&J9UA-!yWVM zhOfm8+mmvih|64MeeebK?xHh&0*|bS_7wD#0L0rSYj!Yv-3x70ljjby!WHtbAc%wf zo*Wv|0@^J!-wmjDNe@>^>4&b%kWUMswIBp3@2TE&fYyqVTTj7mC;Q_3ybK-oqNbM< zWki4ngO8=3^q>W7Hb;&TI2-v}M3i^T3xYTNz0F=46HOT)x+UfCi=QOgh2g{GyOqDw z$n`zcZl=2PnWd|{X0%3^B!7?br$w^b6*qiO{*94tHnKkgjZ>j?Jfev}_^bG-zl?S# zjEs_{e~Dm<&@7M8Xpey9sQ`R4t-SP-4+aMNF#m7H&LN*c zR#%>fSq64s#y8B17|o455yF@L;Vrdod`AYIKc#9FTw6-Sm}ol)+7_z)Mu>0k}`;` zU&wi9Osot=Q4L87PP~yJ(>g)%c%WG2&)^3zx9Thodf@^^VX!`1ea8UafPE@fEzx+; zTp4BHa5{`nV$zmaLT{u~+8l8u_6tT0H_=shtUNx*T~7IvVl_#$Wwh+%`^O3sz>R~} zJ2bZ~BDT;MPB~&0N?vUV6J434D)wKY_&=f}I

YA5rD)teyxyfYHk?@4wTY&!v+LLyUd%QLrPiSw0 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�(4B5kOm8>@6{c}*S|gyN?g3dCwUGq5KJ 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


8s8(iaL+SV08V5XBW`SzAHs+rVfua!VkypB@Oe z9l!KoefCV&S;2J)dP6gI8%2^^VEht7T7wgGkszaulyQNRDEvKy{x%X=f}y_?Gc|_V z(o)DkyjvujD}CuIV+WEzVP2n26o;vbR>*mj4dYM4tY$#+a%fs5Y5x`>?4BgtcDQwZ zihUy!{6ujP@co(JzhNl#Ve*;_?zo;xI>x*en6fsp+(rH=Fi}dEsg0|W-XCr4mECqs zUB!(bdYRifY@jd`#Ig5khTlLI>4G`f&Y_sIU*3nk*lTENCL})Umw%k;2-{LRJqz4rB1G_3VFd1CrW|uopOiUy_V= zfVB>QJ4IePaRz4rCmiTI`DLM_95>)iQFP$FEERrH>H&aXn%8PMNJ(d0JuB!fMH2b( z+p*@vT$yi%EOVjCCZX-u48Ib)I}XQlfs0edj(BNJimyE}cBh9{qWrtENf$Owfd_pi zl0adWs0W#rODfRBU4q#P3_(_Omd6zHE!=&hk@t!~T0d4(1IXzH=cFu|3t_Se)YEn= z&|8dN1~G^p#oR^EeUQj|50IQBL(I%|_4h@SUEr-32%nN{HmE!$vQ&xd1pv{sqzpJm zZiYXLP_}zfiJVCOfhIarNzV~jZT=OA%JnL{2e{Ez99~aPbVpv#D3)?md@uZMCd(Q= z&EZpNqZjNnMbMdXtG)0si4DF{ChIYYd2E;#V+q3?tNUU~nE-V)GnEGF$80={-}6yJ zIh<(di&!@a9r_JNZwDET6P+mu5^_$$@6D^bWsd<5_$kj!$7{7{9&XwX~AOk?}&Q!2P}ioDXjv#-brf zFJ$}IlD*vou}QkRqOulLb|L!1Lkeym>bWm@yx{vjzPeB%%3vjNnjNVE~J%)zZ|BA?aRPXX9%MR)i?5$R&12CaV{ z++SvO)fAvNVtV(S{ehq?hu z7`x?QsP`1nSpe*fl{BL2Vj$%S@0G`ix=J%Q0O@DZ14FRmxuC9}bww~uSA0m>Pope( zQq`rI=quJ#j`GwClyl*K|6<7({r$~Ip~OXqsv2)kCZl~+WE*lHNeGXy{)aFbhXuCx zry8FzT^J(PMeKdd`yIOcWXa=dRtJs1@*?KYfgZfh$A`W3%C^mfQvuA+OF3&PY^HG! zWgUfl1BtVN$!qIVR_n~srOIPYqOQO$hk+=8L1M7NyO_Sh*N+v8AlyST&c_kNx4~XC zKg$vNAJ#jeL^_rB9>^iiemS9qdj=?PNDV?X$`x0*?W+d~O-be=a_)oy9RS|kz;uTx z&ofv?`Dw*W#ppjRsJ}L-p8%Rc z{>Z(ZH4zj-1vS9-B4PExB;pX_SHzY`V$qyh(hDYPnlX~XzEp7}k?aG4I<%)im_Egy zO0e|-Nt`C#95}vS0InCi^^$V_)LVkI@sZD#{OzKOXGo|Y`|3pmpInK(snuyWK`JYr$GH@v2U*W!qmLBjb~IlH z1ZF@~6E+@4&HX0F$vC5a;y8!-2eD-uilL*_b!U))Oj?la=lLP&wxGL(ysu*g(+Knv$uQBynv#v!4pQo;?tok)1=DXr!>Q+3ng?}3Tg(?nQ?-zQSrW;?FHzF(oM zKMDya!2GV@*_-{VQHr^w8ivcl$uNRkTy>H%D3Ddi52Nfs1(!B=Hc|3&=qptD%+ zI#E}_09FTooXeMz2%Dqd#GPI}d(!Y>nX8h4F`z@Hd?1Ka*G81r+CE zjC%TgDGJ!inqvj@-vVv@FjhZ5&cJ6N=rWms>tI3JFXlq{EjElW9mD8>(kPHxN37*B zth}f%oxxGM+QDyk0J%aM$?U3U6qV0PP5`n1gj-VJAE=(iK=P8+MrEkF!v+hOxCB{` zz|=kgR%S{eAC)g`y;Xi%(3ggQ6Op)nT;70aDq~euDcM(mscovdJHPfoF+r%WJ%ARF z{XUGJ0MH%HK(XU>wirsZ`{{6pF!5+ieGeflVDROnroIu2`t*A6rbg7Zl~%Eyp-V#K zS4$RGQU_c=QPe{H{2_Ll=O<5ycnBa z-hGq>W(zd&2U%Vvr+%QF)eH7_NxT(ASbQvzft@a~`4{NQj$6C|wBl4#JXLU(h_mC- zRUq~`iS%bJbykAi*rkab;#g>g$%n)ju+Lc{Yk=ebq^s5;?Ahd^7xs3P{Z1s;+l3E) zi18(|xCU$&(aUQ2X35`18RpA2vw-O#nJi(@ZycpG$0&1SlRHsmXZ{r`3(OQ|0Fv}{ zgOg}CD|M1q-g)!S|6GSPVJeBhtI~KE1Mz41VT011QfSR6y<$?4OAckZ7kLZ=UcF&V zPi&VUv^JEIt{@KbcWw6A!#?>D&~_l+D`SjozQjXX+0$3jPQe27gy5=s+H?g9n2o|*chl8&$xg^mmAl}ah;$rLACF^uU-QKh%o z@ea;V3q%f3;j^9HCENq1N+Xb|Mt?x>;-G8f`F{t9W#GYVFqafg(-@0GV;oZsB-Tfy z9Lu?Yc=VK0di%;3H$vD=uc(7SVo3bEC40wM_vrO)h2)SgmbL;OD-qLBe#YVvwE^rD z+5eVODeQT%7|adIm)Q6feX9cns~2{rq?cL&+OaZDB)6u>nC>jemh7#ib!>#TNyIQ;F1fIh zABr6N*ppCyvc86l1F_!l6!O5K7wti7Ws=E;u3}bU0FV+~YV4ub+kn5#0o>Cu+ANM) z6PdQIp6-wEc5s4?SG=cJ;)LOl`)F51+3Jlo4iE-uYXSc@{u&LPd!RSJJ3#d_V5*fs zz9FSD3+&@Cu$&Cd^&`9%VhfeMFyCTYJB?X2-f^Tuz6YAy%vQs+4hiA6`It=-^1X-r zN3r`%dI!s*l;l|AMWLE`_(3E5f3gpasyf(qk!QMO{s#WJ^&`|r{Pn?^h808>hvDic z7Hl5mBNE*O&as|!xv93W@{pxfVbpM+*f?#_#}3}-QT`#+qh7*2oN~^O>BPzpOZJvx z0}C<8du*^1UH*$_=IrcyQN{Y^kzG zxjFkIj?2jH7={wGnCl>3U=-p*- zrZ>`EE1(9tIV#;9aQ5BoP!%n3*F_5Mc9g(y5npz1DdBpt`&1`KSFAyAy-g&r3JC2i zKNASG7t4o#k@aU1xMUszj9(+UPIyUS1X!A>FQd?Gws?Sc-3vJB9IRX~76?S2Nw{kl zlF!2{?{Mp%7VPQAUyUFr8|4*;it-clC={KOymkQN9<bR$g~&c%N1SCXuP&e*(#i}YRaHzHdy;uem?%bd#X#e8;vbBr#}VZOVvUs3&J;#l zpz14$J`}|!vJQrgNJ@SKQqE3+_M--xgZ(7}>?uS3vPXO?LF}g92-Z{jdNH>iza`PF zwlVWZhONeo^N>~x*34aL1Y_)}fvu>oh8ZFRmCUB@%&jDzCd^fz|67{b z8^e1GK`ok+YfEM4ra-%)z7&C`%3quv_LGRAY-X-AguaQMKLH#T8CdO~L}>YVVKefjqx=?#%aq^Y?yQMsKB&$tkhY-09lSXBk^>A~KCB-a-a z^hWPTWR(wo)B}wyHWSzf)f{D))ezSS$l7ttot?t|&je18lP=ITg3fcD5i0qR>0|;M zkJjoFb1{r%4tD+mgl3wwT3)*Qf_nv->VkP?<-KV5(9`^{smRq<>>i_Mly8{qz9JrS z(v~9q2?*sS)=?|&EAuTP+8F+>4K&y2Z}nuo9X35mzWXD_H>hAJyGBDxGj!B|!s_HN zLp?0Xd&%w-srS|VJrE5Zp~jw5YtJOB8pYXPub|4`oVQs#8Mq8jzS6#3*cymz|!`+4f=&QE-?GkQbur{bu@36HF7h?LxZK0Yo+05zhZJeV-XP8}J8Gc7tf) zfmB5)Y2-^e?BSrb1{L`py%hm~(u^O8M^y!fw`4YuaytvtC7C@7QN&1LS4_1y*`0*^ zF$RYILmh?Uv7cDGykxtVFq8`zb}?yJYOxHxs0ONCD#i5@upvnNCU5^B;eqV-3jq~I zKGiUx!YqPXfZk(57%BBEY_uN|+sqWDG0TM|F9@g(}y8`D-T4BrU92dfft>MbzFhZz=9UYud%1 z=@3_x>>tZ!50))O?7a!U1P57BGTNI=`;u=0YAwNb7hxn4rEHOdPNZ3YqS_Ci2T8Ck zg9Jf92AS+^MD@>13#T}COtb~+qImLp(;{uGIWLB4OWla9c4OlLt|+Z5S)4Wp(STj6gus9A_TTqnUQO^VLy$VsSQn-_* zj@a`OjBPNDBbQMs8rUc$w$zv-&{8H_n9kUGoAei8S_xbF5wku`ATLX?B1AG3X>j?# zB?_)Pp;d5T`wlQP91JH&f*rf;C%=M@bl)FR9R@gi&{XgJSS5o!rJgr+tR?aeAvWYd z@*F$VqWb!v!)q{5jdCl=t1}SC5LO4-San>HrVg@9AKFrjS1%HqSR6J~V!R0?K3dQ9 zYxm@mR7!aYQx-zSd005yMhu;8*smk>=Esg_!titO8)pWH!S^uG0TQf)w)E;#E;*D( zRxl8SsyY&1Ez@D`Xog$|!$onU80=*%wc8-TXk|&?R?4P3?SrejAw0_2npwM3&s=f~ zvBy23G0<9?o4GpC_9Q31!T!{2P(^s0Fl!c_eK*S29v7B1DPOq7bTm~@o zAILq9HGZBmkvq5KLZRf71Y5GxlF zT7ut5HhAeZ7Pn~NC#WL5D>;}+!U+BVX0-q;&hz?ch)LwVT2$l#3HJ4)Bc))(o15Kb zm>;q&Ay+t01KQ7}i9JHhiUM8`ys)4>!J_1s-fp~+JcD46n*#%k)|Tu&CF6^9{aAWU zIyfv$utVt&`bls;Uy5L#E2g`~;?C+B;G^f!*R!Nq#={`=vU2WYGW_qq)QZo`7w$UR zNF#RuCxr2s^<~mT;i@pti`}<1X)Z2kr(J!yWu*z&I1sb1=S5f;VQ4^gY6em+Yi^uLjnna zUYTkh2jdTL+csEGTYyNi=y~TT(c8q#Rl5|$UTEXfc?hcq3r(<%KDb^yI$6z>#~8Ic zY<$OT4$%(MW8Enru`1pP(_NVC6*bk@Rv!no&C$nHrBS3@fy9fsVGerMeK!keZHA*+ zs@DrJ+E~)p7{A?3R2jjlk7Triwfz1d+LtIxvM!jw3#Dl-(dP2gd(XMabECVoah70f zGGAnlD>d@q{0ON1!aiO@OEUl{OkY2PcH<=2irFrae=$H#K-QTcL1hvSzqPnVS#M}> zK^?7!j?Fj^pHy<%5wTR_sJEXA` z{x-sCLlT)~joVd`V0$O&s_i%meVBRElh_9w2qTKxDhMk_*yAdC{TDbYrh@lwc@D#{Axv%vfc6IN#h+(GubA|1Ujstk2Kf-OH0R01mF%BYkCv9*OV z%AOxuX$Vhm03GXub-aSumh{AV{LI9Q57GTvCN3}Q9ff(+2YDep}1fT_K&3A1~JVV2JgrY+}5Q_pctsV zfj%+!XJ=~sBVPLf^|#W`=DN5LQD!P7FST_ZVMnrVk25U=A5$NN^^TPk znB=gHNmGk3nrbxtjO-FjIFC%Z_l1F(tbdAt!UXcz0WJkGn&My`2ids-jP{l!?jz{5 zNT9f#k~RRb=L6wV*hpJU^bH{uCDcTVhZ>A!uIXSolx>?)7TKk%3p=EQmnw^WiL^8f z4X~#cMvxt!@#z`d+pw2Jq!ZlnkZ@;?ls_S_5u8}FBEGcHHpW0pn@7SgA?Y}X_@mJa zQq^EY2O+M~(x@LbER~N=lv79OdWK8seVGx|SYDPAGwD@&7im>T2dXABPPQD$@&GI4 zYd<=k<$wXyr_&*+#IriVQLcggS6QQvhw`gzL0uNDp0xL+nEc z*3W;4M&yYhd4j1%f0(VJLdJWg%bIU?u*4R=T>LPGq=YZe1MrGpN(xD2f`zjZ-#C1ivhv94qE zRfLg}W~$`nU~it1b%{RR13-W9vl+Gb6&q@VoR5>r5O^C&B$YXF_znz$`TaQDPQne_ zg2*DU>&APRO+`~l>a*%6e@?&^hxkZbcPb7tPyV&0)K(ys-5AAHkjlwc;~6F|m~CdD zE68Or0ZgXAr&DhCJRvD9O+n+VGHFz>TWe?^Wt;F_awgeut1YcM)R z0X<}b_OK8EC~Xi5A1snwf~*cOI$F}W9C>epsiBbkFIm<^jO*o{2MuZ@wtkgU6q_W# zTMnCj^gJ33L;0(LYBXy7O8GP<#{WvAzjU!;^^#0M=)w3C3ThhsowKF1$H-fI*v&7G z?7`s^F15=DUMTMrnh?hFe1ruY*?CscH=HQs>!qjNe8*1ARKR5jJ4!} z2TRMGfKVBjw-Q1ooOJ}heP`S3)XEH;s}ojnL!U~M0U4e|6;*(;pBW{#j0J-lB+?({ zB|$&{qg*GPEhIJ+DB5EY|3YCP6{a7Gj)B~Xr1H^L_68W8ELnWd05QmRADlF0ra$z8 zBnEE*B!yvT5jM;V6fToWm@joVxFZk$SmTnP5bxBF^X1bkl#PdO!Z$7p9Mxp|Y&Xzpt1(p-p z_y{2->Rqm_@%aB*jiAO=mK4Pc z5Kha_HxyhrMf5sDUo;?tV`}`W)2mC6+r%ji!8{Znv}9a zf&ZDoP9V|?8y?O2bOn0(&0IHVS6O7A4FOLf*OtW6$iSdusfjdHjNaS~YZ*dNQ9 z37>D|h!rI0lKc{ewMKWy10Pw5wVDqZg_Bn_jPCUWs$*FAA&%lo(ZdoMJv}4n`dXji zoCJAKkZx4~Y{0Q$M?7IFJ{Uv!kAs>iJ|Y$jmZb&HBDQ}~h@gr{_H+yJAiC5dI_g%fG^@TKEVvL>#I*un~=^F#i)^Ts~xJ%>y-b6AWq z`_r-KBA+^_tQ;m3L}DqyrMkH30JfjVbvZ#5A)wLv`0I7pS`u@;$Kje+t~xPceSAovx4m-RPcwy9{~i9 zeKQ?6tOUBMZ2XqM$1(gh@O^?T^f`J9_+3}P2YGEOTkJs{0hoMW=6z?uqh2f1f%3ma zxbZ;H)zoeuKtXv&jJy!$y^sI9QiT^GE>x~rLBksu)`yU%07cA`J+PLN_V~>y&>T)c znSp*HjBb{O_6!p4N0M_n`*0PETL9cb8s-ey9bj~`nC-L`_fo=N2Jm_du+1s;t;nt>Oxz>>l-N=w@j6o7gF2o{OAkEb0+Kk*ASi9*^-tvAflBQ`cvr!=B7qg4`nV9?8L9?3;})?9u$lxKB?HgU^Okw8 zjJOlNGtp;`vd=bZ<2I@+NWt~g2bVWzfb|TNm2y2zoi4-u^f`(#RP$?8+Swf#n^5`t zs0;4n{o4@{3aCaRs+@#4j({h#w_d!`h{0RPA)cA!WQVLyu<~r=0YF9IfP3~KF$E&Z z{5It19i7>KXGMMSFTf%}v&smGQ4t?3)^0Dr-)`d%1A4y{K5f6 zODSki;6(_#*546sGxZ+KU2{!?+aDvY`lz&^jC5h^e>m1j?E zq)dR(!-738RNt0Iar%H!E?06)!Z4~}!zZPuGeNfmqx=?+t-o(tdAy?0_W%VR?^%mI zcnYiGfB&V*oPHwKP@Y?3P%jwZ7)cgz;zt)EY=@PEU?Pnu_5fxsO!wo!l(oV=+3Eog z%^>$4@T4KaarnYRFnrAG74i6n1|rRh-9Iz%dRaVKA8wkRGCs(V9mp(90dfRsy&O0S zq#o->wly%p?9$Pj-=4zxULxSWISMI=Xm;Vhne&{sANY>Z4>c#4DuMG!bQhTBqW}wn^bA^HO^RkPaAcvi)u0mk z;9$3*uq0*LhVY+beluuepNOp#^)Uzu2qpFuf!`y_NZxJdst*P=otW^HwGISVicaxb#JIcN(Ho@M7Fm%=3Us9p=c7MkqBc0ktF0!U0AvOB$;{!7b8>MyDZ! zeUt`YfPbx%k&ZUVEE-!)D@C2mG`0o6i>wJ=F>4N{>?mb@sf?7+Ql(Lqs*g9Hf~p>2 zRFNQ&EU#_pCev9MR7KXunBXIC52U+HV3SXNAo34^J<*Qji3U0#>v!zBjfFr%Vr)k_ zR5F6(GrQQoe)$Ff9kNe{B))=OY-|} z@cu$fdhPW*^v^XK77Xg+40}2vg^$D-F1H-%b!!MzFW(=@pB+eR7NQDg+H-X0RybKR zYB4Qoa9C#e-+#EsYUHzyx|u+XN1^MruUxmr&77TU|WjE`Irk z$f^ezy)6iIqKIb0({^O_4}VWU0X&3{5}!dr`V5IB$g(`O@~@e~bI7Pt$+AeTVVUgMJ9RyLP=__AoP~xr`~1M$C^Nv_yfl_P}3)4 z6~KH7qr`YJPs1uN8>9{5y+X3ZK$e3^}G}Y zoS569r8G_`yaF1Y4HlD~;rA>qrx!4{uqH!&u4yI<3iVv3KI#7zI*LYu9|86Nq}M^r z3-rU=)#$Mx;~qvfdXh{Z2)&X~vr?@G%_xz15+O8~hx#}Tp(~xl!w-^R9ekn^S^Sg+ zu8gb~%dbOBcUd$~V6bR6nHFI5vEYzeI1PkBWH*UJW_=WEH|XC%E3Gdt^wHxbOwD$L z1e-ZLBHL^TK05$@Blv!VUY6hfD~H~WA|43forB)o-xT<^17awiTn=G2gMkP_O-tz9 zwBySJdlB$B6g8CqGh%%D^vNms>Q>CLD?iK0TN`O(U?El#KTf9kJOYN?Q1nT1=w%V% z?D`HDyMny+^5HJ-46UCj97YY#aHoQ-CiSj%F3g(`cDmmEEg$uv2d5|_u7OL*jd@2> z$n}^>Z|GXWnWf&iw%(DHiPh+JN_;llBm+r9d_9=hKfv@v#4;5^|6WUEYT$v?dNz{j zY%;;=gmf8KZ$^0(1BKeGb8bSPKIV6{bo6A-LXdM0y#@sseJx1j$>@-@9|V7)zF#^NcleS+F#3L=R)dNSV{JuI2`MgNsqv9Ndr@;b%Ap)^q>~^I-oEc|S_LK31NLE-J$bj5lQ&w=D4(3s z=5JZbmr&TzhU!?XW~w_9NnOf#B}7NUTN@nfGW!$&yiJHPfgR_ej6-lcmwz`PvHTJZqmU30o_^7%{0xa1W(7 zm+H}rj#?vueMbKA_wksiGI*TwEf0dN2zoKTq<5Lz!_= z%btDv(MfW^>L^-46+$h{0Kb{5h<<;O+L8^Rquia2!EjaYF`Ad2yt~ z=wlo=fp>Z{gTHAf6WQQ1+Nw&-OF;jow>i308PuoJPeL7ep`km3>>%9N6|iJkd7Qrd`A=OWSW;h zlZ`d!hE#@t(rSvY5AGT132hVQhrgd*L8MQ538FzfmmK~gj{J+;Vh~=K9g(?@*% zL7;y~F&FAM&T$3bqXhH8IPVwiU8A%Ttu4-qX2D~6P%EP`ww$bBhmz_z>O3X9RLOe?85^am zE%4pq>}NeIE6PaEL3ET&_WYwb42|-aw|etZJz46AM#r;DX}0Jq?3jxAN{dZNZ>kkWuEsl(c(JK3D(x1R7HMhomm;pAt+wxC}`E9-(}utiGT2Cl1# zpCmI63yg;>eY8uYoU%s#Tm6lW{5}-abFt8A&hj#h^}td9xd|61C5B=Z1akhzM4PQz4o0^5mM z=+}6SCF2&Ta3>1PNw=Ftf$E7=eQLX&dDDv*gCsG)n9h>Ed#LdaTh?L!eiCHMPyuM= zA!(nN+$!z^*lt^k19@Hcmy+8y9KfxS{8qH!Jz$v@RTmmcUW!q_&@!2j>hbq)M-VTFQ*~i-Jt8i_YG|20rFRj1 z;GTX+o&i5f0KF@W*PbfxN{Bq%9c!FH;|Thn-3+e%w|Ddx%m_k2)zBk*fV;ZH)^VG`(N z#s@%)A+pY7KOTFi$`E?bPcv3PpLo4L4R;j%s2?%t=l*)4xFU3x#){H8%enw#dQ0{S z!Ne3KH6Ba&$e=wW&cn3F0(#9*x(v^YgZRzd-f8&Xf6(2SZ&jkV^U!A|;=qsY-oYGS zs{Cz2DATB##dN!>sJt=$^_saR!ysQf1}JMyPSA?-S#N~iK7gAJ8Akx@CN><&Ch1_R z7q8r75%CJn-rz}>?ToaKjikPlKW|v6E(gY)R%Cydk{l^}J)ruvr1b;a68wJ+b819m z+5%#F+e_(VzOV_*7R8aK({?1awm zg5qIf9;Ge70i^`M3m>^sJde#FL1I&PiSWbSe>3qW>a4u3RhKjJPYUmj9^cwC>ru>S zkUp|60e$MVwF3f-87v9Zk5vn!!+mHqD=J+{OR4I@!sIkay^%cna1X(^63zVSQ$B`J z5|Ps04&L;!Qoa5!9Z(;b+YPMRV0N#ljD9FEnQAEP;lw*7!SpNkwoyM1KSx;M_+4EZ z-~v!Q!%m|Bd5OI~rm-;|GlVS;QCK^5{Zb55+z$I0Njt9}Qix-lnO=Z%k=MFFNfl6d zh}^Dv0F*vqJvUIbz_Z%}vVOZ`JP>q->H?IZE6!vAm`(QJf+4>4hT*{+fKX zL;YDSZkI2C+m@yp^hvB^L2#)z@NPASmud+nV=PY@SPyK&QCK%n)QcL|+OwveO^HnN zL2CM4W;5l5haZ`LMew&=(a};l?Mk@%^z;a1KS?e*BHuM^z!M4dn;%+HO4Y%0D}R3T z`*MBiM{`z6X@K{s2mPftMW>I-zG~xx1z)0rZD-5-_(=`v?dr{N&s91RNOLdVmCk~^ zsqQFtzkJryR>v5;4SCO(d+M_<ZkAx7)C$!_`ADIWi!$8vk zLPzqh!gjOCGbw9zxIhg6faSM{jxUNu6)NUs4j|mn%$J3zS>3x;gL6NRN@-ZUm!u zo+To;H3&>?T)%0yG;J>^9y12lqsSIO1hR8s|j^JM_sEz>!1bP;8 z{(!ycBS}t@XinbH@8!uUTOA>_GzjUHo-2v49~(|K=q>Ama6!(@Rz|P)O}PxD(?gNnkvi5I+K(US2)enfdh_jGFOcG;;_1WiXt~^$x$8`pw(1MG;`PBGPD`)2DC%z8rk0~23a5kF#|jO191G5DHaq;`jj?#?6c zBFUHQHF%zrUiUr@i7mwCCV)*M`@E614wSk+6m~llMZo`8ru(AtFxWP!?ZRFskbV)$ z@hAI_q<=nOe2as?AtF~2nRdbjIs5i@O zV-S7B@_Bc<2p6PX#%0b^Lcvs~UN_&}n_&;3&gI~|5PTQ1zzpTz`USi@Nn?vGi;hYp z-_{N7aBU=Y^PEZ2V6`Oy<`GPA7lXT{lU~xtQQjv1(QI@bCeI?WU5vs9=Y1v2mDEnd z!7C;k2KlGiPOtlZ%iw=Mr=j-`WVNl&eXnmz&k99c`uQ?X5tmSRfW3~X&zJO`l;{hD z+MAN(f(pKdOv(lrvs+TA-=x;l(StRGK7Uw`%P!L6T9aiuG#Evm88{k^lTGFl6j|Yk zpj(mRZz6vt=T$5JnZSbj?G}@e!4Mql9;uE6sUH-C-hnb3y!AnH7ie}l;H?f2=mIaj zm#I5vGV;3uR+RnvlbkNjT0!A1Bj0t!@f{wPo|+m=P5mOiP;{%0H2sWCj-u-3F;zi8 z(62UK$pWE2ljuRae#&{oRH9ok>5uf>s`d_S%iS*QtKTJH(F?h4(gPjk^T2)DVOHJQ z@DNz(g>@r|D>EX@%z%2&xVGZmw6S$)A`kf;X1A z7@-(x6h>_Y(Qqu@qgSN!H46*%I3kB7iD%Hy1Y5j4nsB>O-E*n#Ul{c{>F@7N1hYu} zgvFDWKVUr>=rtedR>}xCZLK)<{?V`m(Z%2)>0Q}GF2E#pUFN6 zI~ohxSLn1CNlG8waGP*;qw>A*Gm<11(7aDtk$^6?<9SlM5qQL7uN&-~P>-mrgDmf8c>eBRK*w0q3292B#X zi#}AtbHLMY6>D$F;!T42?aHeooT#UC(oL_oI!!2D@DJ6?FD8pZaL2u5vL~<}Ba|qa zV9^clGyMW`UW=Tk@NPArUk;`BX$N}so*vZdbMf^6rV5sk#4CE`^*t)*k&Fs3=CY)) z0<#}-#W=rG6aQcgyO3%dDxeSjbpn50L8^Y|b>n*l#p2y}_i`0$UKgHAD)XS!9fXwm^7z z&aO)�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 VT%%}kHMhN*9?Xp;+Tir-{{wNTbVUFF From ddefc4d59081908e0f65bc2f60b4030706e52f32 Mon Sep 17 00:00:00 2001 From: driemworks Date: Tue, 24 Sep 2024 12:45:12 -0500 Subject: [PATCH 09/20] feat: add test-utils, cleanup --- Cargo.lock | 10120 +++++++--------------------------------- Cargo.toml | 63 +- cli/Cargo.toml | 21 +- cli/src/main.rs | 76 +- core/Cargo.toml | 4 +- core/src/lib.rs | 5 +- core/src/murmur.rs | 39 +- core/src/types.rs | 3 +- mmr_store | Bin 44785 -> 0 bytes test-utils/Cargo.toml | 59 + test-utils/README.md | 1 + test-utils/src/lib.rs | 28 + 12 files changed, 1932 insertions(+), 8487 deletions(-) delete mode 100644 mmr_store create mode 100644 test-utils/Cargo.toml create mode 100644 test-utils/README.md create mode 100644 test-utils/src/lib.rs diff --git a/Cargo.lock b/Cargo.lock index 3b3f2c5..0dfd239 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -14,27 +14,18 @@ dependencies = [ [[package]] name = "addr2line" -version = "0.19.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a76fd60b23679b7d19bd066031410fb7e458ccc5e958eb5c325888ce4baedc97" -dependencies = [ - "gimli 0.27.3", -] - -[[package]] -name = "addr2line" -version = "0.21.0" +version = "0.24.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb" +checksum = "f5fb1d8e4442bd405fdfd1dacb42792696b0cf9cb15882e5d097b742a676d375" dependencies = [ - "gimli 0.28.1", + "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 = "aead" @@ -71,17 +62,6 @@ dependencies = [ "subtle", ] -[[package]] -name = "ahash" -version = "0.7.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "891477e0c6a8957309ee5c45a6368af3ae14bb510732d2684ffa19af310920f9" -dependencies = [ - "getrandom", - "once_cell", - "version_check", -] - [[package]] name = "ahash" version = "0.8.11" @@ -110,108 +90,50 @@ version = "0.2.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5c6cb57a04249c6480766f7f7cef5467412af1490f8d1e243141daddada3264f" -[[package]] -name = "alloy-primitives" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0628ec0ba5b98b3370bb6be17b12f23bfce8ee4ad83823325a20546d9b03b78" -dependencies = [ - "alloy-rlp", - "bytes", - "cfg-if", - "const-hex", - "derive_more", - "hex-literal", - "itoa", - "proptest", - "rand", - "ruint", - "serde", - "tiny-keccak", -] - -[[package]] -name = "alloy-rlp" -version = "0.3.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26154390b1d205a4a7ac7352aa2eb4f81f391399d4e2f546fb81a2f8bb383f62" -dependencies = [ - "arrayvec 0.7.4", - "bytes", -] - -[[package]] -name = "alloy-sol-macro" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a98ad1696a2e17f010ae8e43e9f2a1e930ed176a8e3ff77acfeff6dfb07b42c" -dependencies = [ - "const-hex", - "dunce", - "heck 0.4.1", - "proc-macro-error", - "proc-macro2", - "quote", - "syn 2.0.77", - "syn-solidity", - "tiny-keccak", -] - -[[package]] -name = "alloy-sol-types" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "98d7107bed88e8f09f0ddcc3335622d87bfb6821f3e0c7473329fb1cfad5e015" -dependencies = [ - "alloy-primitives", - "alloy-sol-macro", - "const-hex", - "serde", -] - [[package]] name = "anstream" -version = "0.6.13" +version = "0.6.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d96bd03f33fe50a863e394ee9718a706f988b9079b20c3784fb726e7678b62fb" +checksum = "64e15c1ab1f89faffbf04a634d5e1962e9074f2741eef6d97f3c4e322426d526" dependencies = [ "anstyle", "anstyle-parse", "anstyle-query", "anstyle-wincon", "colorchoice", + "is_terminal_polyfill", "utf8parse", ] [[package]] name = "anstyle" -version = "1.0.6" +version = "1.0.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8901269c6307e8d93993578286ac0edf7f195079ffff5ebdeea6a59ffb7e36bc" +checksum = "1bec1de6f59aedf83baf9ff929c98f2ad654b97c9510f4e70cf6f661d49fd5b1" [[package]] name = "anstyle-parse" -version = "0.2.3" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c75ac65da39e5fe5ab759307499ddad880d724eed2f6ce5b5e8a26f4f387928c" +checksum = "eb47de1e80c2b463c735db5b217a0ddc39d612e7ac9e2e96a5aed1f57616c1cb" dependencies = [ "utf8parse", ] [[package]] name = "anstyle-query" -version = "1.0.2" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e28923312444cdd728e4738b3f9c9cac739500909bb3d3c94b43551b16517648" +checksum = "6d36fc52c7f6c869915e99412912f22093507da8d9e942ceaf66fe4b7c14422a" dependencies = [ "windows-sys 0.52.0", ] [[package]] name = "anstyle-wincon" -version = "3.0.2" +version = "3.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1cd54b81ec8d6180e24654d0b371ad22fc3dd083b6ff8ba325b72e00c87660a7" +checksum = "5bf74e1b6e971609db8ca7a9ce79fd5768ab6ae46441c572e46cf596f59e57f8" dependencies = [ "anstyle", "windows-sys 0.52.0", @@ -219,32 +141,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.82" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f538837af36e6f6a9be0faa67f9a314f8119e4e4b5867c6ab40ed60360142519" - -[[package]] -name = "approx" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cab112f0a86d568ea0e627cc1d6be74a1e9cd55214684db5561995f6dad897c6" -dependencies = [ - "num-traits", -] - -[[package]] -name = "aquamarine" -version = "0.5.0" +version = "1.0.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21cc1548309245035eb18aa7f0967da6bc65587005170c56e6ef2788a4cf3f4e" -dependencies = [ - "include_dir", - "itertools 0.10.5", - "proc-macro-error", - "proc-macro2", - "quote", - "syn 2.0.77", -] +checksum = "86fdf8605db99b54d3cd748a44c6d04df638eb5dafb219b135d0149bd0db01f6" [[package]] name = "ark-bls12-377" @@ -253,8 +152,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fb00293ba84f51ce3bd026bd0de55899c4e68f0a39a5728cebae3a73ffdc0a4f" dependencies = [ "ark-ec", - "ark-ff 0.4.2", - "ark-std 0.4.0", + "ark-ff", + "ark-std", ] [[package]] @@ -266,7 +165,7 @@ dependencies = [ "ark-bls12-377", "ark-ec", "ark-models-ext", - "ark-std 0.4.0", + "ark-std", ] [[package]] @@ -276,9 +175,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c775f0d12169cba7aae4caeb547bb6a50781c7449a8aa53793827c9ec4abf488" dependencies = [ "ark-ec", - "ark-ff 0.4.2", - "ark-serialize 0.4.2", - "ark-std 0.4.0", + "ark-ff", + "ark-serialize", + "ark-std", ] [[package]] @@ -289,10 +188,10 @@ checksum = "b1dc4b3d08f19e8ec06e949712f95b8361e43f1391d94f65e4234df03480631c" dependencies = [ "ark-bls12-381", "ark-ec", - "ark-ff 0.4.2", + "ark-ff", "ark-models-ext", - "ark-serialize 0.4.2", - "ark-std 0.4.0", + "ark-serialize", + "ark-std", ] [[package]] @@ -303,8 +202,8 @@ checksum = "2e0605daf0cc5aa2034b78d008aaf159f56901d92a52ee4f6ecdfdac4f426700" dependencies = [ "ark-bls12-377", "ark-ec", - "ark-ff 0.4.2", - "ark-std 0.4.0", + "ark-ff", + "ark-std", ] [[package]] @@ -315,9 +214,9 @@ checksum = "ccee5fba47266f460067588ee1bf070a9c760bf2050c1c509982c5719aadb4f2" dependencies = [ "ark-bw6-761", "ark-ec", - "ark-ff 0.4.2", + "ark-ff", "ark-models-ext", - "ark-std 0.4.0", + "ark-std", ] [[package]] @@ -326,10 +225,10 @@ version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "defd9a439d56ac24968cca0571f598a61bc8c55f71d50a89cda591cb750670ba" dependencies = [ - "ark-ff 0.4.2", + "ark-ff", "ark-poly", - "ark-serialize 0.4.2", - "ark-std 0.4.0", + "ark-serialize", + "ark-std", "derivative", "hashbrown 0.13.2", "itertools 0.10.5", @@ -346,8 +245,8 @@ checksum = "b10d901b9ac4b38f9c32beacedfadcdd64e46f8d7f8e88c1ae1060022cf6f6c6" dependencies = [ "ark-bls12-377", "ark-ec", - "ark-ff 0.4.2", - "ark-std 0.4.0", + "ark-ff", + "ark-std", ] [[package]] @@ -358,9 +257,9 @@ checksum = "524a4fb7540df2e1a8c2e67a83ba1d1e6c3947f4f9342cc2359fc2e789ad731d" dependencies = [ "ark-ec", "ark-ed-on-bls12-377", - "ark-ff 0.4.2", + "ark-ff", "ark-models-ext", - "ark-std 0.4.0", + "ark-std", ] [[package]] @@ -371,8 +270,8 @@ checksum = "f9cde0f2aa063a2a5c28d39b47761aa102bda7c13c84fc118a61b87c7b2f785c" dependencies = [ "ark-bls12-381", "ark-ec", - "ark-ff 0.4.2", - "ark-std 0.4.0", + "ark-ff", + "ark-std", ] [[package]] @@ -383,27 +282,9 @@ checksum = "d15185f1acb49a07ff8cbe5f11a1adc5a93b19e211e325d826ae98e98e124346" dependencies = [ "ark-ec", "ark-ed-on-bls12-381-bandersnatch", - "ark-ff 0.4.2", + "ark-ff", "ark-models-ext", - "ark-std 0.4.0", -] - -[[package]] -name = "ark-ff" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b3235cc41ee7a12aaaf2c575a2ad7b46713a8a50bda2fc3b003a04845c05dd6" -dependencies = [ - "ark-ff-asm 0.3.0", - "ark-ff-macros 0.3.0", - "ark-serialize 0.3.0", - "ark-std 0.3.0", - "derivative", - "num-bigint", - "num-traits", - "paste", - "rustc_version 0.3.3", - "zeroize", + "ark-std", ] [[package]] @@ -412,30 +293,20 @@ version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec847af850f44ad29048935519032c33da8aa03340876d351dfab5660d2966ba" dependencies = [ - "ark-ff-asm 0.4.2", - "ark-ff-macros 0.4.2", - "ark-serialize 0.4.2", - "ark-std 0.4.0", + "ark-ff-asm", + "ark-ff-macros", + "ark-serialize", + "ark-std", "derivative", "digest 0.10.7", "itertools 0.10.5", "num-bigint", "num-traits", "paste", - "rustc_version 0.4.0", + "rustc_version", "zeroize", ] -[[package]] -name = "ark-ff-asm" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db02d390bf6643fb404d3d22d31aee1c4bc4459600aef9113833d17e786c6e44" -dependencies = [ - "quote", - "syn 1.0.109", -] - [[package]] name = "ark-ff-asm" version = "0.4.2" @@ -446,18 +317,6 @@ dependencies = [ "syn 1.0.109", ] -[[package]] -name = "ark-ff-macros" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db2fd794a08ccb318058009eefdf15bcaaaaf6f8161eb3345f907222bac38b20" -dependencies = [ - "num-bigint", - "num-traits", - "quote", - "syn 1.0.109", -] - [[package]] name = "ark-ff-macros" version = "0.4.2" @@ -478,9 +337,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3e9eab5d4b5ff2f228b763d38442adc9b084b0a465409b059fac5c2308835ec2" dependencies = [ "ark-ec", - "ark-ff 0.4.2", - "ark-serialize 0.4.2", - "ark-std 0.4.0", + "ark-ff", + "ark-serialize", + "ark-std", "derivative", ] @@ -490,9 +349,9 @@ version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d320bfc44ee185d899ccbadfa8bc31aab923ce1558716e1997a1e74057fe86bf" dependencies = [ - "ark-ff 0.4.2", - "ark-serialize 0.4.2", - "ark-std 0.4.0", + "ark-ff", + "ark-serialize", + "ark-std", "derivative", "hashbrown 0.13.2", ] @@ -504,9 +363,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5f69c00b3b529be29528a6f2fd5fa7b1790f8bed81b9cdca17e326538545a179" dependencies = [ "ark-ec", - "ark-ff 0.4.2", - "ark-serialize 0.4.2", - "ark-std 0.4.0", + "ark-ff", + "ark-serialize", + "ark-std", "parity-scale-codec", "scale-info", ] @@ -517,25 +376,15 @@ version = "0.0.2" source = "git+https://github.com/w3f/ring-vrf?rev=e9782f9#e9782f938629c90f3adb3fff2358bc8d1386af3e" dependencies = [ "ark-ec", - "ark-ff 0.4.2", - "ark-serialize 0.4.2", - "ark-std 0.4.0", + "ark-ff", + "ark-serialize", + "ark-std", "ark-transcript 0.0.2 (git+https://github.com/w3f/ring-vrf?rev=e9782f9)", "digest 0.10.7", "getrandom_or_panic", "zeroize", ] -[[package]] -name = "ark-serialize" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d6c2b318ee6e10f8c2853e73a83adc0ccb88995aa978d8a3408d492ab2ee671" -dependencies = [ - "ark-std 0.3.0", - "digest 0.9.0", -] - [[package]] name = "ark-serialize" version = "0.4.2" @@ -543,7 +392,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "adb7b85a02b83d2f22f89bd5cac66c9c89474240cb6207cb1efc16d098e822a5" dependencies = [ "ark-serialize-derive", - "ark-std 0.4.0", + "ark-std", "digest 0.10.7", "num-bigint", ] @@ -559,16 +408,6 @@ dependencies = [ "syn 1.0.109", ] -[[package]] -name = "ark-std" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1df2c09229cbc5a028b1d70e00fdb2acee28b1055dfb5ca73eea49c5a25c4e7c" -dependencies = [ - "num-traits", - "rand", -] - [[package]] name = "ark-std" version = "0.4.0" @@ -585,9 +424,9 @@ name = "ark-transcript" version = "0.0.2" source = "git+https://github.com/w3f/ring-vrf?rev=e9782f9#e9782f938629c90f3adb3fff2358bc8d1386af3e" dependencies = [ - "ark-ff 0.4.2", - "ark-serialize 0.4.2", - "ark-std 0.4.0", + "ark-ff", + "ark-serialize", + "ark-std", "digest 0.10.7", "rand_core", "sha3", @@ -598,9 +437,9 @@ name = "ark-transcript" version = "0.0.2" source = "git+https://github.com/w3f/ring-vrf#0fef8266d851932ad25d6b41bc4b34d834d1e11d" dependencies = [ - "ark-ff 0.4.2", - "ark-serialize 0.4.2", - "ark-std 0.4.0", + "ark-ff", + "ark-serialize", + "ark-std", "digest 0.10.7", "rand_core", "sha3", @@ -608,21 +447,15 @@ dependencies = [ [[package]] name = "array-bytes" -version = "4.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f52f63c5c1316a16a4b35eaac8b76a98248961a533f061684cb2a7cb0eafb6c6" - -[[package]] -name = "array-bytes" -version = "6.2.2" +version = "6.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f840fb7195bcfc5e17ea40c26e5ce6d5b9ce5d584466e17703209657e459ae0" +checksum = "5d5dde061bd34119e902bbb2d9b90c5692635cf59fb91d582c2b68043f1b8293" [[package]] name = "arrayref" -version = "0.3.7" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b4930d2cb77ce62f89ee5d5289b4ac049559b1c45539271f5ed4fdc7db34545" +checksum = "76a2e8124351fda1ef8aaaa3bbd7ebbcb486bbcd4225aca0aa0d84bb2db8fecb" [[package]] name = "arrayvec" @@ -635,87 +468,27 @@ dependencies = [ [[package]] name = "arrayvec" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711" - -[[package]] -name = "assert_matches" -version = "1.5.0" +version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b34d609dfbaf33d6889b2b7106d3ca345eacad44200913df5ba02bfd31d2ba9" - -[[package]] -name = "asset-test-utils" -version = "7.0.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" -dependencies = [ - "cumulus-pallet-parachain-system", - "cumulus-pallet-xcmp-queue", - "cumulus-primitives-core", - "frame-support", - "frame-system", - "pallet-assets", - "pallet-balances", - "pallet-collator-selection", - "pallet-session", - "pallet-timestamp", - "pallet-xcm", - "pallet-xcm-bridge-hub-router", - "parachains-common", - "parachains-runtimes-test-utils", - "parity-scale-codec", - "sp-io", - "sp-runtime", - "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", - "staging-parachain-info", - "staging-xcm", - "staging-xcm-builder", - "staging-xcm-executor", - "substrate-wasm-builder", -] - -[[package]] -name = "assets-common" -version = "0.7.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" -dependencies = [ - "cumulus-primitives-core", - "frame-support", - "impl-trait-for-tuples", - "log", - "pallet-asset-conversion", - "pallet-xcm", - "parachains-common", - "parity-scale-codec", - "scale-info", - "sp-api", - "sp-runtime", - "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", - "staging-xcm", - "staging-xcm-builder", - "staging-xcm-executor", - "substrate-wasm-builder", -] +checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" [[package]] name = "async-channel" -version = "2.2.1" +version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "136d4d23bcc79e27423727b36823d86233aad06dfea531837b038394d11e9928" +checksum = "89b47800b0be77592da0afd425cc03468052844aff33b84e33cc696f64e77b6a" dependencies = [ "concurrent-queue", - "event-listener 5.3.0", - "event-listener-strategy 0.5.1", + "event-listener-strategy", "futures-core", "pin-project-lite", ] [[package]] name = "async-executor" -version = "1.11.0" +version = "1.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b10202063978b3351199d68f8b22c4e47e4b1b822f8d43fd862d5ea8c006b29a" +checksum = "30ca9a001c1e8ba5149f91a74362376cc6bc5b919d92d988668657bd570bdcec" dependencies = [ "async-task", "concurrent-queue", @@ -726,9 +499,9 @@ dependencies = [ [[package]] name = "async-fs" -version = "2.1.1" +version = "2.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc19683171f287921f2405677dd2ed2549c3b3bda697a563ebc3a121ace2aba1" +checksum = "ebcd09b382f40fcd159c2d695175b2ae620ffa5f3bd6f664131efff4e8b9e04a" dependencies = [ "async-lock", "blocking", @@ -737,9 +510,9 @@ dependencies = [ [[package]] name = "async-io" -version = "2.3.2" +version = "2.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcccb0f599cfa2f8ace422d3555572f47424da5648a4382a9dd0310ff8210884" +checksum = "444b0228950ee6501b3568d3c93bf1176a1fdbc3b758dcd9475046d30f4dc7e8" dependencies = [ "async-lock", "cfg-if", @@ -748,20 +521,20 @@ dependencies = [ "futures-lite", "parking", "polling", - "rustix 0.38.34", + "rustix", "slab", "tracing", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] name = "async-lock" -version = "3.3.0" +version = "3.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d034b430882f8381900d3fe6f0aaa3ad94f2cb4ac519b429692a1bc2dda4ae7b" +checksum = "ff6e472cdea888a4bd64f342f09b3f50e1886d32afe8df3d663c01140b811b18" dependencies = [ - "event-listener 4.0.3", - "event-listener-strategy 0.4.0", + "event-listener 5.3.1", + "event-listener-strategy", "pin-project-lite", ] @@ -778,9 +551,9 @@ dependencies = [ [[package]] name = "async-process" -version = "2.2.2" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a53fc6301894e04a92cb2584fedde80cb25ba8e02d9dc39d4a87d036e22f397d" +checksum = "63255f1dc2381611000436537bbedfe83183faa303a5a0edaf191edef06526bb" dependencies = [ "async-channel", "async-io", @@ -789,18 +562,17 @@ dependencies = [ "async-task", "blocking", "cfg-if", - "event-listener 5.3.0", + "event-listener 5.3.1", "futures-lite", - "rustix 0.38.34", + "rustix", "tracing", - "windows-sys 0.52.0", ] [[package]] name = "async-signal" -version = "0.2.6" +version = "0.2.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "afe66191c335039c7bb78f99dc7520b0cbb166b3a1cb33a03f53d8a1c6f2afda" +checksum = "637e00349800c0bdf8bfc21ebbc0b6524abea702b0da4168ac00d070d0c0b9f3" dependencies = [ "async-io", "async-lock", @@ -808,23 +580,23 @@ dependencies = [ "cfg-if", "futures-core", "futures-io", - "rustix 0.38.34", + "rustix", "signal-hook-registry", "slab", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] name = "async-task" -version = "4.7.0" +version = "4.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbb36e985947064623dbd357f727af08ffd077f93d696782f3c56365fa2e2799" +checksum = "8b75356056920673b02621b35afd0f7dda9306d03c79a30f5c56c44cf256e3de" [[package]] name = "async-trait" -version = "0.1.80" +version = "0.1.82" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6fa2087f2753a7da8cc1c0dbfcf89579dd57458e36769de5ac750b4671737ca" +checksum = "a27b8a3a6e1a44fa4c8baf1f653e4172e81486d4941f2237e20dc2d0cf4ddff1" dependencies = [ "proc-macro2", "quote", @@ -843,36 +615,25 @@ version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" -[[package]] -name = "auto_impl" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c87f3f15e7794432337fc718554eaa4dc8f04c9677a950ffe366f20a162ae42" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.77", -] - [[package]] name = "autocfg" -version = "1.2.0" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1fdabc7756949593fe60f30ec81974b613357de856987752631dea1e3394c80" +checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0" [[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 0.21.0", - "cc", + "addr2line", "cfg-if", "libc", "miniz_oxide", - "object 0.32.2", + "object", "rustc-demangle", + "windows-targets", ] [[package]] @@ -883,9 +644,9 @@ dependencies = [ "ark-bls12-381", "ark-ec", "ark-ed-on-bls12-381-bandersnatch", - "ark-ff 0.4.2", - "ark-serialize 0.4.2", - "ark-std 0.4.0", + "ark-ff", + "ark-serialize", + "ark-std", "dleq_vrf", "fflonk", "merlin", @@ -930,9 +691,9 @@ checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" [[package]] name = "base64" -version = "0.22.0" +version = "0.22.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9475866fec1451be56a3c2400fd081ff546538961565ccb5b7142cbd22bc7a51" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" [[package]] name = "base64ct" @@ -949,24 +710,6 @@ dependencies = [ "serde", ] -[[package]] -name = "binary-merkle-tree" -version = "13.0.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" -dependencies = [ - "hash-db", - "log", -] - -[[package]] -name = "bincode" -version = "1.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad" -dependencies = [ - "serde", -] - [[package]] name = "bip39" version = "2.0.0" @@ -978,21 +721,6 @@ dependencies = [ "unicode-normalization", ] -[[package]] -name = "bit-set" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0700ddab506f33b20a03b13996eccd309a48e5ff77d0d95926aa0210fb4e95f1" -dependencies = [ - "bit-vec", -] - -[[package]] -name = "bit-vec" -version = "0.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "349f9b6a179ed607305526ca489b34ad0a41aed5f7980fa90eb03160b69598fb" - [[package]] name = "bitcoin-internals" version = "0.2.0" @@ -1023,9 +751,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.5.0" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf4b9d6a944f767f8e5e0db018570623c85f3d925ac718db4e06d0187adb21c1" +checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" [[package]] name = "bitvec" @@ -1035,7 +763,6 @@ checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" dependencies = [ "funty", "radium", - "serde", "tap", "wyz", ] @@ -1066,8 +793,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "23285ad32269793932e830392f2fe2f83e26488fd3ec778883a93c8323735780" dependencies = [ "arrayref", - "arrayvec 0.7.4", - "constant_time_eq 0.3.0", + "arrayvec 0.7.6", + "constant_time_eq 0.3.1", ] [[package]] @@ -1090,18 +817,15 @@ dependencies = [ [[package]] name = "blocking" -version = "1.5.1" +version = "1.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a37913e8dc4ddcc604f0c6d3bf2887c995153af3611de9e23c352b44c1b9118" +checksum = "703f41c54fc768e63e091340b424302bb1c29ef4aa0c7f10fe849dfb114d29ea" dependencies = [ "async-channel", - "async-lock", "async-task", - "fastrand", "futures-io", "futures-lite", "piper", - "tracing", ] [[package]] @@ -1117,5919 +841,1944 @@ dependencies = [ ] [[package]] -name = "bp-asset-hub-rococo" -version = "0.4.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +name = "bs58" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf88ba1141d185c399bee5288d850d63b8369520c1eafc32a0430b5b6c287bf4" dependencies = [ - "bp-xcm-bridge-hub-router", - "frame-support", - "parity-scale-codec", - "scale-info", + "tinyvec", ] [[package]] -name = "bp-asset-hub-westend" +name = "bumpalo" +version = "3.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" + +[[package]] +name = "byte-slice-cast" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3ac9f8b63eca6fd385229b3675f6cc0dc5c8a5c8a54a59d4f52ffd670d87b0c" + +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + +[[package]] +name = "bytes" +version = "1.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "428d9aa8fbc0670b7b8d6030a7fadd0f86151cae55e4dbbece15f3780a3dfaf3" + +[[package]] +name = "cassowary" version = "0.3.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df8670b8c7b9dae1793364eafadf7239c40d669904660c5960d74cfd80b46a53" + +[[package]] +name = "castaway" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0abae9be0aaf9ea96a3b1b8b1b55c602ca751eba1b1500220cea4ecbafe7c0d5" dependencies = [ - "bp-xcm-bridge-hub-router", - "frame-support", - "parity-scale-codec", - "scale-info", + "rustversion", ] [[package]] -name = "bp-bridge-hub-cumulus" -version = "0.7.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +name = "cc" +version = "1.1.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07b1695e2c7e8fc85310cde85aeaab7e3097f593c91d209d3f9df76c928100f0" dependencies = [ - "bp-messages", - "bp-polkadot-core", - "bp-runtime", - "frame-support", - "frame-system", - "polkadot-primitives", - "sp-api", - "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", + "shlex", ] [[package]] -name = "bp-bridge-hub-kusama" -version = "0.6.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" -dependencies = [ - "bp-bridge-hub-cumulus", - "bp-messages", - "bp-runtime", - "frame-support", - "sp-api", - "sp-runtime", - "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", -] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] -name = "bp-bridge-hub-polkadot" -version = "0.6.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +name = "chacha20" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3613f74bd2eac03dad61bd53dbe620703d4371614fe0bc3b9f04dd36fe4e818" dependencies = [ - "bp-bridge-hub-cumulus", - "bp-messages", - "bp-runtime", - "frame-support", - "sp-api", - "sp-runtime", - "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", + "cfg-if", + "cipher", + "cpufeatures", ] [[package]] -name = "bp-bridge-hub-rococo" -version = "0.7.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +name = "chacha20poly1305" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10cd79432192d1c0f4e1a0fef9527696cc039165d729fb41b3f4f4f354c2dc35" dependencies = [ - "bp-bridge-hub-cumulus", - "bp-messages", - "bp-runtime", - "frame-support", - "sp-api", - "sp-runtime", - "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", + "aead", + "chacha20", + "cipher", + "poly1305", + "zeroize", ] [[package]] -name = "bp-bridge-hub-westend" -version = "0.3.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +name = "cipher" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad" dependencies = [ - "bp-bridge-hub-cumulus", - "bp-messages", - "bp-runtime", - "frame-support", - "sp-api", - "sp-runtime", - "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", + "crypto-common", + "inout", + "zeroize", ] [[package]] -name = "bp-header-chain" -version = "0.7.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +name = "ckb-merkle-mountain-range" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56ccb671c5921be8a84686e6212ca184cb1d7c51cadcdbfcbd1cc3f042f5dfb8" dependencies = [ - "bp-runtime", - "finality-grandpa", - "frame-support", - "parity-scale-codec", - "scale-info", - "serde", - "sp-consensus-grandpa", - "sp-core", - "sp-runtime", - "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", + "cfg-if", ] [[package]] -name = "bp-kusama" -version = "0.5.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +name = "clap" +version = "4.5.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0956a43b323ac1afaffc053ed5c4b7c1f1800bacd1683c353aabbb752515dd3" dependencies = [ - "bp-header-chain", - "bp-polkadot-core", - "bp-runtime", - "frame-support", - "sp-api", - "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", + "clap_builder", + "clap_derive", ] [[package]] -name = "bp-messages" -version = "0.7.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +name = "clap_builder" +version = "4.5.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d72166dd41634086d5803a47eb71ae740e61d84709c36f3c34110173db3961b" dependencies = [ - "bp-header-chain", - "bp-runtime", - "frame-support", - "parity-scale-codec", - "scale-info", - "serde", - "sp-core", - "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", + "anstream", + "anstyle", + "clap_lex", + "strsim 0.11.1", ] [[package]] -name = "bp-parachains" -version = "0.7.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +name = "clap_derive" +version = "4.5.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ac6a0c7b1a9e9a5186361f67dfa1b88213572f427fb9ab038efb2bd8c582dab" dependencies = [ - "bp-header-chain", - "bp-polkadot-core", - "bp-runtime", - "frame-support", - "impl-trait-for-tuples", - "parity-scale-codec", - "scale-info", - "sp-core", - "sp-runtime", - "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", + "heck 0.5.0", + "proc-macro2", + "quote", + "syn 2.0.77", ] [[package]] -name = "bp-polkadot" -version = "0.5.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" -dependencies = [ - "bp-header-chain", - "bp-polkadot-core", - "bp-runtime", - "frame-support", - "sp-api", - "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", -] +name = "clap_lex" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1462739cb27611015575c0c11df5df7601141071f07518d56fcc1be504cbec97" [[package]] -name = "bp-polkadot-bulletin" -version = "0.4.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" -dependencies = [ - "bp-header-chain", - "bp-messages", - "bp-polkadot-core", - "bp-runtime", - "frame-support", - "frame-system", - "parity-scale-codec", - "scale-info", - "sp-api", - "sp-runtime", - "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", -] +name = "colorchoice" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3fd119d74b830634cea2a0f58bbd0d54540518a14397557951e79340abc28c0" [[package]] -name = "bp-polkadot-core" -version = "0.7.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +name = "common" +version = "0.1.0" +source = "git+https://github.com/w3f/ring-proof#1472ce9cd87cee49c56ce7869a0aba872d837c51" dependencies = [ - "bp-messages", - "bp-runtime", - "frame-support", - "frame-system", - "parity-scale-codec", - "parity-util-mem", - "scale-info", - "serde", - "sp-core", - "sp-runtime", - "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", + "ark-ec", + "ark-ff", + "ark-poly", + "ark-serialize", + "ark-std", + "fflonk", + "getrandom_or_panic", + "rand_core", ] [[package]] -name = "bp-relayers" -version = "0.7.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" -dependencies = [ - "bp-messages", - "bp-runtime", - "frame-support", - "parity-scale-codec", - "scale-info", - "sp-runtime", - "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", -] +name = "common-path" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2382f75942f4b3be3690fe4f86365e9c853c1587d6ee58212cebf6e2a9ccd101" [[package]] -name = "bp-rococo" -version = "0.6.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +name = "compact_str" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6050c3a16ddab2e412160b31f2c871015704239bca62f72f6e5f0be631d3f644" dependencies = [ - "bp-header-chain", - "bp-polkadot-core", - "bp-runtime", - "frame-support", - "sp-api", - "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", + "castaway", + "cfg-if", + "itoa", + "rustversion", + "ryu", + "static_assertions", ] [[package]] -name = "bp-runtime" -version = "0.7.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +name = "concurrent-queue" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" dependencies = [ - "frame-support", - "frame-system", - "hash-db", - "impl-trait-for-tuples", - "log", - "num-traits", - "parity-scale-codec", - "scale-info", - "serde", - "sp-core", - "sp-io", - "sp-runtime", - "sp-state-machine", - "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", - "sp-trie", - "trie-db", + "crossbeam-utils", ] [[package]] -name = "bp-test-utils" -version = "0.7.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" -dependencies = [ - "bp-header-chain", - "bp-parachains", - "bp-polkadot-core", - "bp-runtime", - "ed25519-dalek", - "finality-grandpa", - "parity-scale-codec", - "sp-application-crypto", - "sp-consensus-grandpa", - "sp-core", - "sp-runtime", - "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", - "sp-trie", -] +name = "const-oid" +version = "0.9.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" [[package]] -name = "bp-westend" -version = "0.3.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" -dependencies = [ - "bp-header-chain", - "bp-polkadot-core", - "bp-runtime", - "frame-support", - "sp-api", - "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", -] +name = "constant_time_eq" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "245097e9a4535ee1e3e3931fcfcd55a796a44c643e8596ff6566d68f09b87bbc" [[package]] -name = "bp-xcm-bridge-hub" -version = "0.2.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" -dependencies = [ - "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", -] +name = "constant_time_eq" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21a53c0a4d288377e7415b53dcfc3c04da5cdc2cc95c8d5ac178b58f0b861ad6" [[package]] -name = "bp-xcm-bridge-hub-router" -version = "0.6.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +name = "constant_time_eq" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c74b8349d32d297c9134b8c88677813a227df8f779daa29bfc29c183fe3dca6" + +[[package]] +name = "constcat" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd7e35aee659887cbfb97aaf227ac12cad1a9d7c71e55ff3376839ed4e282d08" + +[[package]] +name = "convert_case" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" + +[[package]] +name = "core-foundation" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" dependencies = [ - "parity-scale-codec", - "scale-info", - "sp-core", - "sp-runtime", + "core-foundation-sys", + "libc", ] [[package]] -name = "bridge-hub-common" -version = "0.1.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +name = "core-foundation-sys" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" + +[[package]] +name = "cpufeatures" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "608697df725056feaccfa42cffdaeeec3fccc4ffc38358ecd19b243e716a78e0" dependencies = [ - "cumulus-primitives-core", - "frame-support", - "pallet-message-queue", - "parity-scale-codec", - "scale-info", - "snowbridge-core", - "sp-core", - "sp-runtime", - "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", - "staging-xcm", + "libc", ] [[package]] -name = "bridge-hub-test-utils" -version = "0.7.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" -dependencies = [ - "asset-test-utils", - "bp-header-chain", - "bp-messages", - "bp-polkadot-core", - "bp-relayers", - "bp-runtime", - "bp-test-utils", - "bridge-runtime-common", - "cumulus-pallet-parachain-system", - "cumulus-pallet-xcmp-queue", - "frame-support", - "frame-system", - "impl-trait-for-tuples", - "log", - "pallet-balances", - "pallet-bridge-grandpa", - "pallet-bridge-messages", - "pallet-bridge-parachains", - "pallet-bridge-relayers", - "pallet-timestamp", - "pallet-utility", - "parachains-common", - "parachains-runtimes-test-utils", - "parity-scale-codec", - "sp-core", - "sp-io", - "sp-keyring", - "sp-runtime", - "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", - "sp-tracing 16.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", - "staging-xcm", - "staging-xcm-builder", - "staging-xcm-executor", -] - -[[package]] -name = "bridge-runtime-common" -version = "0.7.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +name = "crossbeam-deque" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "613f8cc01fe9cf1a3eb3d7f488fd2fa8388403e97039e2f73692932e291a770d" dependencies = [ - "bp-header-chain", - "bp-messages", - "bp-parachains", - "bp-polkadot-core", - "bp-relayers", - "bp-runtime", - "bp-xcm-bridge-hub", - "bp-xcm-bridge-hub-router", - "frame-support", - "frame-system", - "hash-db", - "log", - "pallet-bridge-grandpa", - "pallet-bridge-messages", - "pallet-bridge-parachains", - "pallet-bridge-relayers", - "pallet-transaction-payment", - "pallet-utility", - "parity-scale-codec", - "scale-info", - "sp-api", - "sp-core", - "sp-io", - "sp-runtime", - "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", - "sp-trie", - "staging-xcm", - "staging-xcm-builder", - "tuplex", + "crossbeam-epoch", + "crossbeam-utils", ] [[package]] -name = "bs58" -version = "0.5.1" +name = "crossbeam-epoch" +version = "0.9.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf88ba1141d185c399bee5288d850d63b8369520c1eafc32a0430b5b6c287bf4" +checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" dependencies = [ - "tinyvec", + "crossbeam-utils", ] [[package]] -name = "build-helper" -version = "0.1.1" +name = "crossbeam-queue" +version = "0.3.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bdce191bf3fa4995ce948c8c83b4640a1745457a149e73c6db75b4ffe36aad5f" +checksum = "df0346b5d5e76ac2fe4e327c5fd1118d6be7c51dfb18f9b7922923f287471e35" dependencies = [ - "semver 0.6.0", + "crossbeam-utils", ] [[package]] -name = "bumpalo" -version = "3.16.0" +name = "crossbeam-utils" +version = "0.8.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" +checksum = "22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80" [[package]] -name = "byte-slice-cast" -version = "1.2.2" +name = "crossterm" +version = "0.28.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3ac9f8b63eca6fd385229b3675f6cc0dc5c8a5c8a54a59d4f52ffd670d87b0c" +checksum = "829d955a0bb380ef178a640b91779e3987da38c9aea133b20614cfed8cdea9c6" +dependencies = [ + "bitflags 2.6.0", + "crossterm_winapi", + "mio", + "parking_lot", + "rustix", + "signal-hook", + "signal-hook-mio", + "winapi", +] [[package]] -name = "bytemuck" -version = "1.18.0" +name = "crossterm_winapi" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94bbb0ad554ad961ddc5da507a12a29b14e4ae5bda06b19f575a3e6079d2e2ae" +checksum = "acdd7c62a3665c7f6830a51635d9ac9b23ed385797f70a83bb8bafe9c572ab2b" +dependencies = [ + "winapi", +] [[package]] -name = "byteorder" -version = "1.5.0" +name = "crunchy" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" +checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" [[package]] -name = "bytes" -version = "1.6.0" +name = "crypto-bigint" +version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "514de17de45fdb8dc022b1a7975556c53c86f9f0aa5f534b98977b171857c2c9" +checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76" +dependencies = [ + "generic-array", + "rand_core", + "subtle", + "zeroize", +] [[package]] -name = "camino" -version = "1.1.9" +name = "crypto-common" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b96ec4966b5813e2c0507c1f86115c8c5abaadc3980879c3424042a02fd1ad3" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" dependencies = [ - "serde", + "generic-array", + "rand_core", + "typenum", ] [[package]] -name = "cargo-platform" -version = "0.1.8" +name = "crypto-mac" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24b1f0365a6c6bb4020cd05806fd0d33c44d38046b8bd7f0e40814b9763cabfc" +checksum = "b584a330336237c1eecd3e94266efb216c56ed91225d634cb2991c5f3fd1aeab" dependencies = [ - "serde", + "generic-array", + "subtle", ] [[package]] -name = "cargo_metadata" -version = "0.15.4" +name = "ctr" +version = "0.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eee4243f1f26fc7a42710e7439c149e2b10b05472f88090acce52632f231a73a" +checksum = "0369ee1ad671834580515889b80f2ea915f23b8be8d0daa4bbaf2ac5c7590835" dependencies = [ - "camino", - "cargo-platform", - "semver 1.0.22", - "serde", - "serde_json", - "thiserror", + "cipher", ] [[package]] -name = "cassowary" -version = "0.3.0" +name = "curve25519-dalek" +version = "4.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df8670b8c7b9dae1793364eafadf7239c40d669904660c5960d74cfd80b46a53" +checksum = "97fb8b7c4503de7d6ae7b42ab72a5a59857b4c937ec27a3d4539dba95b5ab2be" +dependencies = [ + "cfg-if", + "cpufeatures", + "curve25519-dalek-derive", + "digest 0.10.7", + "fiat-crypto", + "rustc_version", + "subtle", + "zeroize", +] [[package]] -name = "castaway" -version = "0.2.3" +name = "curve25519-dalek-derive" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0abae9be0aaf9ea96a3b1b8b1b55c602ca751eba1b1500220cea4ecbafe7c0d5" +checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" dependencies = [ - "rustversion", + "proc-macro2", + "quote", + "syn 2.0.77", ] [[package]] -name = "cc" -version = "1.0.95" +name = "darling" +version = "0.14.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d32a725bc159af97c3e629873bb9f88fb8cf8a4867175f76dc987815ea07c83b" +checksum = "7b750cb3417fd1b327431a470f388520309479ab0bf5e323505daf0290cd3850" dependencies = [ - "jobserver", - "libc", - "once_cell", + "darling_core 0.14.4", + "darling_macro 0.14.4", ] [[package]] -name = "cfg-expr" -version = "0.15.8" +name = "darling" +version = "0.20.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d067ad48b8650848b989a59a86c6c36a995d02d2bf778d45c3c5d57bc2718f02" +checksum = "6f63b86c8a8826a49b8c21f08a2d07338eec8d900540f8630dc76284be802989" dependencies = [ - "smallvec", + "darling_core 0.20.10", + "darling_macro 0.20.10", ] [[package]] -name = "cfg-if" -version = "1.0.0" +name = "darling_core" +version = "0.14.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +checksum = "109c1ca6e6b7f82cc233a97004ea8ed7ca123a9af07a8230878fcfda9b158bf0" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2", + "quote", + "strsim 0.10.0", + "syn 1.0.109", +] [[package]] -name = "chacha20" -version = "0.9.1" +name = "darling_core" +version = "0.20.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3613f74bd2eac03dad61bd53dbe620703d4371614fe0bc3b9f04dd36fe4e818" +checksum = "95133861a8032aaea082871032f5815eb9e98cef03fa916ab4500513994df9e5" dependencies = [ - "cfg-if", - "cipher", - "cpufeatures", + "fnv", + "ident_case", + "proc-macro2", + "quote", + "strsim 0.11.1", + "syn 2.0.77", ] [[package]] -name = "chacha20poly1305" -version = "0.10.1" +name = "darling_macro" +version = "0.14.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10cd79432192d1c0f4e1a0fef9527696cc039165d729fb41b3f4f4f354c2dc35" +checksum = "a4aab4dbc9f7611d8b55048a3a16d2d010c2c8334e46304b40ac1cc14bf3b48e" dependencies = [ - "aead", - "chacha20", - "cipher", - "poly1305", - "zeroize", + "darling_core 0.14.4", + "quote", + "syn 1.0.109", ] [[package]] -name = "cipher" -version = "0.4.4" +name = "darling_macro" +version = "0.20.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad" +checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" dependencies = [ - "crypto-common", - "inout", - "zeroize", + "darling_core 0.20.10", + "quote", + "syn 2.0.77", ] [[package]] -name = "ckb-merkle-mountain-range" -version = "0.5.2" +name = "der" +version = "0.7.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56ccb671c5921be8a84686e6212ca184cb1d7c51cadcdbfcbd1cc3f042f5dfb8" +checksum = "f55bf8e7b65898637379c1b74eb1551107c8294ed26d855ceb9fd1a09cfc9bc0" dependencies = [ - "cfg-if", + "const-oid", + "zeroize", ] [[package]] -name = "clap" -version = "4.5.4" +name = "deranged" +version = "0.3.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90bc066a67923782aa8515dbaea16946c5bcc5addbd668bb80af688e53e548a0" +checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4" dependencies = [ - "clap_builder", - "clap_derive", + "powerfmt", ] [[package]] -name = "clap_builder" -version = "4.5.2" +name = "derivative" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae129e2e766ae0ec03484e609954119f123cc1fe650337e155d03b022f24f7b4" +checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" dependencies = [ - "anstream", - "anstyle", - "clap_lex", - "strsim 0.11.1", + "proc-macro2", + "quote", + "syn 1.0.109", ] [[package]] -name = "clap_derive" -version = "4.5.4" +name = "derive-syn-parse" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "528131438037fd55894f62d6e9f068b8f45ac57ffa77517819645d10aed04f64" +checksum = "d65d7ce8132b7c0e54497a4d9a55a1c2a0912a0d786cf894472ba818fba45762" dependencies = [ - "heck 0.5.0", "proc-macro2", "quote", "syn 2.0.77", ] [[package]] -name = "clap_lex" -version = "0.7.0" +name = "derive_more" +version = "0.99.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "98cc8fbded0c607b7ba9dd60cd98df59af97e84d24e49c8557331cfc26d301ce" +checksum = "5f33878137e4dafd7fa914ad4e259e18a4e8e532b9617a2d0150262bf53abfce" +dependencies = [ + "convert_case", + "proc-macro2", + "quote", + "rustc_version", + "syn 2.0.77", +] [[package]] -name = "codespan-reporting" -version = "0.11.1" +name = "digest" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3538270d33cc669650c4b093848450d380def10c331d38c768e34cac80576e6e" +checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" dependencies = [ - "termcolor", - "unicode-width", + "generic-array", ] [[package]] -name = "colorchoice" -version = "1.0.0" +name = "digest" +version = "0.10.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7" - -[[package]] -name = "common" -version = "0.1.0" -source = "git+https://github.com/w3f/ring-proof#31658d1f5b88e106c969557c36c821aff46b2236" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ - "ark-ec", - "ark-ff 0.4.2", - "ark-poly", - "ark-serialize 0.4.2", - "ark-std 0.4.0", - "fflonk", - "getrandom_or_panic", - "rand_core", + "block-buffer 0.10.4", + "const-oid", + "crypto-common", + "subtle", ] [[package]] -name = "common-path" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2382f75942f4b3be3690fe4f86365e9c853c1587d6ee58212cebf6e2a9ccd101" +name = "dleq_vrf" +version = "0.0.2" +source = "git+https://github.com/w3f/ring-vrf?rev=e9782f9#e9782f938629c90f3adb3fff2358bc8d1386af3e" +dependencies = [ + "ark-ec", + "ark-ff", + "ark-scale", + "ark-secret-scalar", + "ark-serialize", + "ark-std", + "ark-transcript 0.0.2 (git+https://github.com/w3f/ring-vrf?rev=e9782f9)", + "arrayvec 0.7.6", + "zeroize", +] [[package]] -name = "compact_str" -version = "0.8.0" +name = "docify" +version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6050c3a16ddab2e412160b31f2c871015704239bca62f72f6e5f0be631d3f644" +checksum = "43a2f138ad521dc4a2ced1a4576148a6a610b4c5923933b062a263130a6802ce" dependencies = [ - "castaway", - "cfg-if", - "itoa", - "rustversion", - "ryu", - "static_assertions", + "docify_macros", ] [[package]] -name = "concurrent-queue" -version = "2.4.0" +name = "docify_macros" +version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d16048cd947b08fa32c24458a22f5dc5e835264f689f4f5653210c69fd107363" +checksum = "1a081e51fb188742f5a7a1164ad752121abcb22874b21e2c3b0dd040c515fdad" dependencies = [ - "crossbeam-utils", + "common-path", + "derive-syn-parse", + "once_cell", + "proc-macro2", + "quote", + "regex", + "syn 2.0.77", + "termcolor", + "toml", + "walkdir", ] [[package]] -name = "console" -version = "0.15.8" +name = "downcast-rs" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75b325c5dbd37f80359721ad39aca5a29fb04c89279657cffdda8736d0c0b9d2" + +[[package]] +name = "dyn-clonable" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e1f83fc076bd6dd27517eacdf25fef6c4dfe5f1d7448bafaaf3a26f13b5e4eb" +checksum = "4e9232f0e607a262ceb9bd5141a3dfb3e4db6994b31989bbfd845878cba59fd4" dependencies = [ - "encode_unicode", - "lazy_static", - "libc", - "unicode-width", - "windows-sys 0.52.0", + "dyn-clonable-impl", + "dyn-clone", ] [[package]] -name = "const-hex" -version = "1.12.0" +name = "dyn-clonable-impl" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94fb8a24a26d37e1ffd45343323dc9fe6654ceea44c12f2fcb3d7ac29e610bc6" +checksum = "558e40ea573c374cf53507fd240b7ee2f5477df7cfebdb97323ec61c719399c5" dependencies = [ - "cfg-if", - "cpufeatures", - "hex", - "proptest", - "serde", + "proc-macro2", + "quote", + "syn 1.0.109", ] [[package]] -name = "const-oid" -version = "0.9.6" +name = "dyn-clone" +version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" +checksum = "0d6ef0072f8a535281e4876be788938b528e9a1d43900b82c2569af7da799125" [[package]] -name = "const-random" -version = "0.1.18" +name = "ecdsa" +version = "0.16.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87e00182fe74b066627d63b85fd550ac2998d4b0bd86bfed477a0ae4c7c71359" +checksum = "ee27f32b5c5292967d2d4a9d7f1e0b0aed2c15daded5a60300e4abb9d8020bca" dependencies = [ - "const-random-macro", + "der", + "digest 0.10.7", + "elliptic-curve", + "rfc6979", + "serdect", + "signature", + "spki", ] [[package]] -name = "const-random-macro" -version = "0.1.16" +name = "ed25519" +version = "2.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9d839f2a20b0aee515dc581a6172f2321f96cab76c1a38a4c584a194955390e" +checksum = "115531babc129696a58c64a4fef0a8bf9e9698629fb97e9e40767d235cfbcd53" dependencies = [ - "getrandom", - "once_cell", - "tiny-keccak", + "pkcs8", + "signature", ] [[package]] -name = "constant_time_eq" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "245097e9a4535ee1e3e3931fcfcd55a796a44c643e8596ff6566d68f09b87bbc" - -[[package]] -name = "constant_time_eq" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21a53c0a4d288377e7415b53dcfc3c04da5cdc2cc95c8d5ac178b58f0b861ad6" - -[[package]] -name = "constant_time_eq" -version = "0.3.0" +name = "ed25519-dalek" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7144d30dcf0fafbce74250a3963025d8d52177934239851c917d29f1df280c2" +checksum = "4a3daa8e81a3963a60642bcc1f90a670680bd4a77535faa384e9d1c79d620871" +dependencies = [ + "curve25519-dalek", + "ed25519", + "serde", + "sha2 0.10.8", + "subtle", + "zeroize", +] [[package]] -name = "constcat" -version = "0.3.1" +name = "ed25519-zebra" +version = "4.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd7e35aee659887cbfb97aaf227ac12cad1a9d7c71e55ff3376839ed4e282d08" +checksum = "7d9ce6874da5d4415896cd45ffbc4d1cfc0c4f9c079427bd870742c30f2f65a9" +dependencies = [ + "curve25519-dalek", + "ed25519", + "hashbrown 0.14.5", + "hex", + "rand_core", + "sha2 0.10.8", + "zeroize", +] [[package]] -name = "convert_case" -version = "0.4.0" +name = "either" +version = "1.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" +checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" [[package]] -name = "core-foundation" -version = "0.9.4" +name = "elliptic-curve" +version = "0.13.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" +checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" dependencies = [ - "core-foundation-sys", - "libc", + "base16ct", + "crypto-bigint", + "digest 0.10.7", + "ff", + "generic-array", + "group", + "pkcs8", + "rand_core", + "sec1", + "serdect", + "subtle", + "zeroize", ] [[package]] -name = "core-foundation-sys" -version = "0.8.6" +name = "environmental" +version = "1.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" +checksum = "e48c92028aaa870e83d51c64e5d4e0b6981b360c522198c23959f219a4e1b15b" [[package]] -name = "cpp_demangle" -version = "0.3.5" +name = "equivalent" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eeaa953eaad386a53111e47172c2fedba671e5684c8dd601a5f474f4f118710f" -dependencies = [ - "cfg-if", -] +checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" [[package]] -name = "cpufeatures" -version = "0.2.12" +name = "errno" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53fe5e26ff1b7aef8bca9c6080520cfb8d9333c7568e1829cef191a9723e5504" +checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba" dependencies = [ "libc", + "windows-sys 0.52.0", ] [[package]] -name = "cranelift-bforest" -version = "0.95.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1277fbfa94bc82c8ec4af2ded3e639d49ca5f7f3c7eeab2c66accd135ece4e70" +name = "etf-crypto-primitives" +version = "0.2.4" +source = "git+https://github.com/ideal-lab5/etf-sdk/?branch=dev#e2b3615e0936c2cdd1ab8673e15208bef880b040" dependencies = [ - "cranelift-entity", + "aes-gcm", + "ark-bls12-377", + "ark-bls12-381", + "ark-ec", + "ark-ff", + "ark-poly", + "ark-serialize", + "ark-std", + "array-bytes", + "chacha20poly1305", + "generic-array", + "parity-scale-codec", + "rand_chacha", + "scale-info", + "serde", + "serde_cbor", + "serde_json", + "sha2 0.10.8", + "sha3", + "w3f-bls", ] [[package]] -name = "cranelift-codegen" -version = "0.95.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6e8c31ad3b2270e9aeec38723888fe1b0ace3bea2b06b3f749ccf46661d3220" +name = "etf-crypto-primitives" +version = "0.2.4" +source = "git+https://github.com/ideal-lab5/etf-sdk/?branch=tony/dev#159ed603ca8a31b7d2e5f4437c62411c4d1fd743" dependencies = [ - "bumpalo", - "cranelift-bforest", - "cranelift-codegen-meta", - "cranelift-codegen-shared", - "cranelift-entity", - "cranelift-isle", - "gimli 0.27.3", - "hashbrown 0.13.2", - "log", - "regalloc2 0.6.1", - "smallvec", - "target-lexicon", + "aes-gcm", + "ark-bls12-377", + "ark-bls12-381", + "ark-ec", + "ark-ff", + "ark-poly", + "ark-serialize", + "ark-std", + "array-bytes", + "chacha20poly1305", + "generic-array", + "parity-scale-codec", + "rand_chacha", + "scale-info", + "serde", + "serde_cbor", + "serde_json", + "sha2 0.10.8", + "sha3", + "w3f-bls", ] [[package]] -name = "cranelift-codegen-meta" -version = "0.95.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8ac5ac30d62b2d66f12651f6b606dbdfd9c2cfd0908de6b387560a277c5c9da" +name = "etf-crypto-primitives" +version = "0.2.4" +source = "git+http://github.com/ideal-lab5/etf-sdk?branch=w3fbls-migration#c6e61a89b94b57bcbde2293208a2875469f4fc5c" dependencies = [ - "cranelift-codegen-shared", + "aes-gcm", + "ark-bls12-377", + "ark-bls12-381", + "ark-ec", + "ark-ff", + "ark-poly", + "ark-serialize", + "ark-std", + "array-bytes", + "chacha20poly1305", + "generic-array", + "parity-scale-codec", + "rand_chacha", + "scale-info", + "serde", + "serde_cbor", + "serde_json", + "sha2 0.10.8", + "sha3", + "w3f-bls", ] [[package]] -name = "cranelift-codegen-shared" -version = "0.95.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd82b8b376247834b59ed9bdc0ddeb50f517452827d4a11bccf5937b213748b8" - -[[package]] -name = "cranelift-entity" -version = "0.95.1" +name = "event-listener" +version = "4.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40099d38061b37e505e63f89bab52199037a72b931ad4868d9089ff7268660b0" +checksum = "67b215c49b2b248c855fb73579eb1f4f26c38ffdc12973e20e07b91d78d5646e" dependencies = [ - "serde", + "concurrent-queue", + "pin-project-lite", ] [[package]] -name = "cranelift-frontend" -version = "0.95.1" +name = "event-listener" +version = "5.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64a25d9d0a0ae3079c463c34115ec59507b4707175454f0eee0891e83e30e82d" +checksum = "6032be9bd27023a771701cc49f9f053c751055f71efb2e0ae5c15809093675ba" dependencies = [ - "cranelift-codegen", - "log", - "smallvec", - "target-lexicon", + "concurrent-queue", + "parking", + "pin-project-lite", ] [[package]] -name = "cranelift-isle" -version = "0.95.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80de6a7d0486e4acbd5f9f87ec49912bf4c8fb6aea00087b989685460d4469ba" - -[[package]] -name = "cranelift-native" -version = "0.95.1" +name = "event-listener-strategy" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb6b03e0e03801c4b3fd8ce0758a94750c07a44e7944cc0ffbf0d3f2e7c79b00" +checksum = "0f214dc438f977e6d4e3500aaa277f5ad94ca83fbbd9b1a15713ce2344ccc5a1" dependencies = [ - "cranelift-codegen", - "libc", - "target-lexicon", + "event-listener 5.3.1", + "pin-project-lite", ] [[package]] -name = "cranelift-wasm" -version = "0.95.1" +name = "expander" +version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff3220489a3d928ad91e59dd7aeaa8b3de18afb554a6211213673a71c90737ac" +checksum = "e2c470c71d91ecbd179935b24170459e926382eaaa86b590b78814e180d8a8e2" dependencies = [ - "cranelift-codegen", - "cranelift-entity", - "cranelift-frontend", - "itertools 0.10.5", - "log", - "smallvec", - "wasmparser", - "wasmtime-types", + "blake2", + "file-guard", + "fs-err", + "prettyplease", + "proc-macro2", + "quote", + "syn 2.0.77", ] [[package]] -name = "crc32fast" -version = "1.4.2" +name = "fastrand" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8c02a5121d4ea3eb16a80748c74f5549a5665e4c21333c6098f283870fbdea6" + +[[package]] +name = "ff" +version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" +checksum = "ded41244b729663b1e574f1b4fb731469f69f79c17667b5d776b16cda0479449" dependencies = [ - "cfg-if", + "rand_core", + "subtle", ] [[package]] -name = "crossbeam-deque" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "613f8cc01fe9cf1a3eb3d7f488fd2fa8388403e97039e2f73692932e291a770d" +name = "fflonk" +version = "0.1.0" +source = "git+https://github.com/w3f/fflonk#1e854f35e9a65d08b11a86291405cdc95baa0a35" dependencies = [ - "crossbeam-epoch", - "crossbeam-utils", + "ark-ec", + "ark-ff", + "ark-poly", + "ark-serialize", + "ark-std", + "merlin", ] [[package]] -name = "crossbeam-epoch" -version = "0.9.18" +name = "fiat-crypto" +version = "0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" +checksum = "28dea519a9695b9977216879a3ebfddf92f1c08c05d984f8996aecd6ecdc811d" + +[[package]] +name = "file-guard" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21ef72acf95ec3d7dbf61275be556299490a245f017cf084bd23b4f68cf9407c" dependencies = [ - "crossbeam-utils", + "libc", + "winapi", ] [[package]] -name = "crossbeam-queue" -version = "0.3.11" +name = "fixed-hash" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df0346b5d5e76ac2fe4e327c5fd1118d6be7c51dfb18f9b7922923f287471e35" +checksum = "835c052cb0c08c1acf6ffd71c022172e18723949c8282f2b9f27efbc51e64534" dependencies = [ - "crossbeam-utils", + "byteorder", + "rand", + "rustc-hex", + "static_assertions", ] [[package]] -name = "crossbeam-utils" -version = "0.8.19" +name = "fnv" +version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "248e3bacc7dc6baa3b21e405ee045c3047101a49145e7e9eca583ab4c2ca5345" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] -name = "crossterm" -version = "0.28.1" +name = "form_urlencoded" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "829d955a0bb380ef178a640b91779e3987da38c9aea133b20614cfed8cdea9c6" +checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" dependencies = [ - "bitflags 2.5.0", - "crossterm_winapi", - "mio 1.0.2", - "parking_lot", - "rustix 0.38.34", - "signal-hook", - "signal-hook-mio", - "winapi", + "percent-encoding", ] [[package]] -name = "crossterm_winapi" -version = "0.9.1" +name = "frame-metadata" +version = "15.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "acdd7c62a3665c7f6830a51635d9ac9b23ed385797f70a83bb8bafe9c572ab2b" +checksum = "878babb0b136e731cc77ec2fd883ff02745ff21e6fb662729953d44923df009c" dependencies = [ - "winapi", + "cfg-if", + "parity-scale-codec", + "scale-info", ] [[package]] -name = "crunchy" -version = "0.2.2" +name = "frame-metadata" +version = "16.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" +checksum = "87cf1549fba25a6fcac22785b61698317d958e96cac72a59102ea45b9ae64692" +dependencies = [ + "cfg-if", + "parity-scale-codec", + "scale-info", + "serde", +] [[package]] -name = "crypto-bigint" -version = "0.5.5" +name = "fs-err" +version = "2.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76" +checksum = "88a41f105fe1d5b6b34b2055e3dc59bb79b46b48b2040b9e6c7b4b5de097aa41" dependencies = [ - "generic-array", - "rand_core", - "subtle", - "zeroize", + "autocfg", ] [[package]] -name = "crypto-common" -version = "0.1.6" +name = "funty" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" -dependencies = [ - "generic-array", - "rand_core", - "typenum", -] +checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" [[package]] -name = "crypto-mac" -version = "0.8.0" +name = "futures" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b584a330336237c1eecd3e94266efb216c56ed91225d634cb2991c5f3fd1aeab" +checksum = "645c6916888f6cb6350d2550b80fb63e734897a8498abe35cfb732b6487804b0" dependencies = [ - "generic-array", - "subtle", + "futures-channel", + "futures-core", + "futures-executor", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", ] [[package]] -name = "ctr" -version = "0.9.2" +name = "futures-channel" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0369ee1ad671834580515889b80f2ea915f23b8be8d0daa4bbaf2ac5c7590835" +checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78" dependencies = [ - "cipher", + "futures-core", + "futures-sink", ] [[package]] -name = "cumulus-pallet-aura-ext" -version = "0.7.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" -dependencies = [ - "cumulus-pallet-parachain-system", - "frame-support", - "frame-system", - "pallet-aura", - "pallet-timestamp", - "parity-scale-codec", - "scale-info", - "sp-application-crypto", - "sp-consensus-aura", - "sp-runtime", - "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", -] +name = "futures-core" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" [[package]] -name = "cumulus-pallet-dmp-queue" -version = "0.7.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +name = "futures-executor" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a576fc72ae164fca6b9db127eaa9a9dda0d61316034f33a0a0d4eda41f02b01d" dependencies = [ - "cumulus-primitives-core", - "frame-benchmarking", - "frame-support", - "frame-system", - "log", - "parity-scale-codec", - "scale-info", - "sp-io", - "sp-runtime", - "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", - "staging-xcm", + "futures-core", + "futures-task", + "futures-util", + "num_cpus", ] [[package]] -name = "cumulus-pallet-parachain-system" -version = "0.7.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +name = "futures-io" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1" + +[[package]] +name = "futures-lite" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52527eb5074e35e9339c6b4e8d12600c7128b68fb25dcb9fa9dec18f7c25f3a5" dependencies = [ - "bytes", - "cumulus-pallet-parachain-system-proc-macro", - "cumulus-primitives-core", - "cumulus-primitives-parachain-inherent", - "cumulus-primitives-proof-size-hostfunction", - "environmental", - "frame-benchmarking", - "frame-support", - "frame-system", - "impl-trait-for-tuples", - "log", - "pallet-message-queue", - "parity-scale-codec", - "polkadot-parachain-primitives", - "polkadot-runtime-common", - "polkadot-runtime-parachains", - "scale-info", - "sp-core", - "sp-externalities 0.25.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", - "sp-inherents", - "sp-io", - "sp-runtime", - "sp-state-machine", - "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", - "sp-trie", - "sp-version", - "staging-xcm", - "staging-xcm-builder", - "trie-db", + "fastrand", + "futures-core", + "futures-io", + "parking", + "pin-project-lite", ] [[package]] -name = "cumulus-pallet-parachain-system-proc-macro" -version = "0.6.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +name = "futures-macro" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" dependencies = [ - "proc-macro-crate 3.1.0", "proc-macro2", "quote", "syn 2.0.77", ] [[package]] -name = "cumulus-pallet-session-benchmarking" -version = "9.0.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" -dependencies = [ - "frame-benchmarking", - "frame-support", - "frame-system", - "pallet-session", - "parity-scale-codec", - "sp-runtime", - "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", -] +name = "futures-sink" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5" [[package]] -name = "cumulus-pallet-solo-to-para" -version = "0.7.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" -dependencies = [ - "cumulus-pallet-parachain-system", - "frame-support", - "frame-system", - "pallet-sudo", - "parity-scale-codec", - "polkadot-primitives", - "scale-info", - "sp-runtime", - "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", -] +name = "futures-task" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004" [[package]] -name = "cumulus-pallet-xcm" -version = "0.7.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +name = "futures-timer" +version = "3.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f288b0a4f20f9a56b5d1da57e2227c661b7b16168e2f72365f57b63326e29b24" + +[[package]] +name = "futures-util" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48" dependencies = [ - "cumulus-primitives-core", - "frame-support", - "frame-system", - "parity-scale-codec", - "scale-info", - "sp-io", - "sp-runtime", - "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", - "staging-xcm", + "futures-channel", + "futures-core", + "futures-io", + "futures-macro", + "futures-sink", + "futures-task", + "memchr", + "pin-project-lite", + "pin-utils", + "slab", ] [[package]] -name = "cumulus-pallet-xcmp-queue" -version = "0.7.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" dependencies = [ - "bounded-collections", - "bp-xcm-bridge-hub-router", - "cumulus-primitives-core", - "frame-benchmarking", - "frame-support", - "frame-system", - "log", - "pallet-message-queue", - "parity-scale-codec", - "polkadot-runtime-common", - "polkadot-runtime-parachains", - "scale-info", - "sp-core", - "sp-io", - "sp-runtime", - "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", - "staging-xcm", - "staging-xcm-builder", - "staging-xcm-executor", + "typenum", + "version_check", + "zeroize", ] [[package]] -name = "cumulus-ping" -version = "0.7.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +name = "getrandom" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" dependencies = [ - "cumulus-pallet-xcm", - "cumulus-primitives-core", - "frame-support", - "frame-system", - "parity-scale-codec", - "scale-info", - "sp-runtime", - "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", - "staging-xcm", + "cfg-if", + "js-sys", + "libc", + "wasi", + "wasm-bindgen", ] [[package]] -name = "cumulus-primitives-aura" -version = "0.7.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +name = "getrandom_or_panic" +version = "0.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ea1015b5a70616b688dc230cfe50c8af89d972cb132d5a622814d29773b10b9" dependencies = [ - "parity-scale-codec", - "polkadot-core-primitives", - "polkadot-primitives", - "sp-api", - "sp-consensus-aura", - "sp-runtime", - "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", + "rand", + "rand_core", ] [[package]] -name = "cumulus-primitives-core" -version = "0.7.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +name = "ghash" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0d8a4362ccb29cb0b265253fb0a2728f592895ee6854fd9bc13f2ffda266ff1" dependencies = [ - "parity-scale-codec", - "polkadot-core-primitives", - "polkadot-parachain-primitives", - "polkadot-primitives", - "scale-info", - "sp-api", - "sp-runtime", - "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", - "sp-trie", - "staging-xcm", + "opaque-debug", + "polyval", ] [[package]] -name = "cumulus-primitives-parachain-inherent" -version = "0.7.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" -dependencies = [ - "async-trait", - "cumulus-primitives-core", - "parity-scale-codec", - "scale-info", - "sp-core", - "sp-inherents", - "sp-runtime", - "sp-state-machine", - "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", - "sp-trie", -] +name = "gimli" +version = "0.31.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32085ea23f3234fc7846555e85283ba4de91e21016dc0455a16286d87a292d64" [[package]] -name = "cumulus-primitives-proof-size-hostfunction" -version = "0.2.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +name = "group" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" dependencies = [ - "sp-externalities 0.25.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", - "sp-runtime-interface 24.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", - "sp-trie", + "ff", + "rand_core", + "subtle", ] [[package]] -name = "cumulus-primitives-storage-weight-reclaim" -version = "1.0.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +name = "h2" +version = "0.3.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81fe527a889e1532da5c525686d96d4c2e74cdd345badf8dfef9f6b39dd5f5e8" dependencies = [ - "cumulus-primitives-core", - "cumulus-primitives-proof-size-hostfunction", - "docify", - "frame-support", - "frame-system", - "log", - "parity-scale-codec", - "scale-info", - "sp-runtime", - "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", + "bytes", + "fnv", + "futures-core", + "futures-sink", + "futures-util", + "http", + "indexmap", + "slab", + "tokio", + "tokio-util", + "tracing", ] [[package]] -name = "cumulus-primitives-timestamp" -version = "0.7.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" -dependencies = [ - "cumulus-primitives-core", - "futures", - "parity-scale-codec", - "sp-inherents", - "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", - "sp-timestamp", -] +name = "half" +version = "1.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b43ede17f21864e81be2fa654110bf1e793774238d86ef8555c37e6519c0403" [[package]] -name = "cumulus-primitives-utility" -version = "0.7.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" -dependencies = [ - "cumulus-primitives-core", - "frame-support", - "log", - "pallet-asset-conversion", - "parity-scale-codec", - "polkadot-runtime-common", - "polkadot-runtime-parachains", - "sp-io", - "sp-runtime", - "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", - "staging-xcm", - "staging-xcm-builder", - "staging-xcm-executor", -] +name = "hash-db" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e7d7786361d7425ae2fe4f9e407eb0efaa0840f5212d109cc018c40c35c6ab4" [[package]] -name = "cumulus-test-relay-sproof-builder" -version = "0.7.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +name = "hash256-std-hasher" +version = "0.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92c171d55b98633f4ed3860808f004099b36c1cc29c42cfc53aa8591b21efcf2" dependencies = [ - "cumulus-primitives-core", - "parity-scale-codec", - "polkadot-primitives", - "sp-runtime", - "sp-state-machine", - "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", - "sp-trie", + "crunchy", ] [[package]] -name = "curve25519-dalek" -version = "4.1.3" +name = "hashbrown" +version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97fb8b7c4503de7d6ae7b42ab72a5a59857b4c937ec27a3d4539dba95b5ab2be" +checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e" dependencies = [ - "cfg-if", - "cpufeatures", - "curve25519-dalek-derive", - "digest 0.10.7", - "fiat-crypto", - "rustc_version 0.4.0", - "subtle", - "zeroize", + "ahash", ] [[package]] -name = "curve25519-dalek-derive" -version = "0.1.1" +name = "hashbrown" +version = "0.14.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" +checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.77", + "ahash", + "allocator-api2", + "serde", ] [[package]] -name = "cxx" -version = "1.0.128" +name = "heck" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54ccead7d199d584d139148b04b4a368d1ec7556a1d9ea2548febb1b9d49f9a4" -dependencies = [ - "cc", - "cxxbridge-flags", - "cxxbridge-macro", - "link-cplusplus", -] +checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" [[package]] -name = "cxx-build" -version = "1.0.128" +name = "heck" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c77953e99f01508f89f55c494bfa867171ef3a6c8cea03d26975368f2121a5c1" -dependencies = [ - "cc", - "codespan-reporting", - "once_cell", - "proc-macro2", - "quote", - "scratch", - "syn 2.0.77", -] +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" [[package]] -name = "cxxbridge-flags" -version = "1.0.128" +name = "hermit-abi" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65777e06cc48f0cb0152024c77d6cf9e4bdb4408e7b48bea993d42fa0f5b02b6" +checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" [[package]] -name = "cxxbridge-macro" -version = "1.0.128" +name = "hermit-abi" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "98532a60dedaebc4848cb2cba5023337cc9ea3af16a5b062633fabfd9f18fb60" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.77", -] +checksum = "fbf6a919d6cf397374f7dfeeea91d974c7c0a7221d0d0f4f20d859d329e53fcc" [[package]] -name = "darling" -version = "0.14.4" +name = "hex" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b750cb3417fd1b327431a470f388520309479ab0bf5e323505daf0290cd3850" -dependencies = [ - "darling_core 0.14.4", - "darling_macro 0.14.4", -] +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" [[package]] -name = "darling" -version = "0.20.8" +name = "hex-conservative" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54e36fcd13ed84ffdfda6f5be89b31287cbb80c439841fe69e04841435464391" -dependencies = [ - "darling_core 0.20.8", - "darling_macro 0.20.8", -] +checksum = "212ab92002354b4819390025006c897e8140934349e8635c9b077f47b4dcbd20" [[package]] -name = "darling_core" -version = "0.14.4" +name = "hmac" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "109c1ca6e6b7f82cc233a97004ea8ed7ca123a9af07a8230878fcfda9b158bf0" +checksum = "126888268dcc288495a26bf004b38c5fdbb31682f992c84ceb046a1f0fe38840" dependencies = [ - "fnv", - "ident_case", - "proc-macro2", - "quote", - "strsim 0.10.0", - "syn 1.0.109", + "crypto-mac", + "digest 0.9.0", ] [[package]] -name = "darling_core" -version = "0.20.8" +name = "hmac" +version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c2cf1c23a687a1feeb728783b993c4e1ad83d99f351801977dd809b48d0a70f" +checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" dependencies = [ - "fnv", - "ident_case", - "proc-macro2", - "quote", - "strsim 0.10.0", - "syn 2.0.77", + "digest 0.10.7", ] [[package]] -name = "darling_macro" -version = "0.14.4" +name = "hmac-drbg" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4aab4dbc9f7611d8b55048a3a16d2d010c2c8334e46304b40ac1cc14bf3b48e" +checksum = "17ea0a1394df5b6574da6e0c1ade9e78868c9fb0a4e5ef4428e32da4676b85b1" dependencies = [ - "darling_core 0.14.4", - "quote", - "syn 1.0.109", + "digest 0.9.0", + "generic-array", + "hmac 0.8.1", ] [[package]] -name = "darling_macro" -version = "0.20.8" +name = "http" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a668eda54683121533a393014d8692171709ff57a7d61f187b6e782719f8933f" +checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1" dependencies = [ - "darling_core 0.20.8", - "quote", - "syn 2.0.77", + "bytes", + "fnv", + "itoa", ] [[package]] -name = "der" -version = "0.7.9" +name = "http-body" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f55bf8e7b65898637379c1b74eb1551107c8294ed26d855ceb9fd1a09cfc9bc0" -dependencies = [ - "const-oid", - "zeroize", -] - -[[package]] -name = "deranged" -version = "0.3.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4" -dependencies = [ - "powerfmt", -] - -[[package]] -name = "derivative" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "derive-syn-parse" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e79116f119dd1dba1abf1f3405f03b9b0e79a27a3883864bfebded8a3dc768cd" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "derive-syn-parse" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d65d7ce8132b7c0e54497a4d9a55a1c2a0912a0d786cf894472ba818fba45762" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.77", -] - -[[package]] -name = "derive_more" -version = "0.99.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fb810d30a7c1953f91334de7244731fc3f3c10d7fe163338a35b9f640960321" -dependencies = [ - "convert_case", - "proc-macro2", - "quote", - "rustc_version 0.4.0", - "syn 1.0.109", -] - -[[package]] -name = "digest" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" -dependencies = [ - "generic-array", -] - -[[package]] -name = "digest" -version = "0.10.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" -dependencies = [ - "block-buffer 0.10.4", - "const-oid", - "crypto-common", - "subtle", -] - -[[package]] -name = "directories-next" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "339ee130d97a610ea5a5872d2bbb130fdf68884ff09d3028b81bec8a1ac23bbc" -dependencies = [ - "cfg-if", - "dirs-sys-next", -] - -[[package]] -name = "dirs-sys-next" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ebda144c4fe02d1f7ea1a7d9641b6fc6b580adcfa024ae48797ecdeb6825b4d" -dependencies = [ - "libc", - "redox_users", - "winapi", -] - -[[package]] -name = "dleq_vrf" -version = "0.0.2" -source = "git+https://github.com/w3f/ring-vrf?rev=e9782f9#e9782f938629c90f3adb3fff2358bc8d1386af3e" -dependencies = [ - "ark-ec", - "ark-ff 0.4.2", - "ark-scale", - "ark-secret-scalar", - "ark-serialize 0.4.2", - "ark-std 0.4.0", - "ark-transcript 0.0.2 (git+https://github.com/w3f/ring-vrf?rev=e9782f9)", - "arrayvec 0.7.4", - "zeroize", -] - -[[package]] -name = "docify" -version = "0.2.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43a2f138ad521dc4a2ced1a4576148a6a610b4c5923933b062a263130a6802ce" -dependencies = [ - "docify_macros", -] - -[[package]] -name = "docify_macros" -version = "0.2.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a081e51fb188742f5a7a1164ad752121abcb22874b21e2c3b0dd040c515fdad" -dependencies = [ - "common-path", - "derive-syn-parse 0.2.0", - "once_cell", - "proc-macro2", - "quote", - "regex", - "syn 2.0.77", - "termcolor", - "toml 0.8.12", - "walkdir", -] - -[[package]] -name = "downcast-rs" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75b325c5dbd37f80359721ad39aca5a29fb04c89279657cffdda8736d0c0b9d2" - -[[package]] -name = "dunce" -version = "1.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" - -[[package]] -name = "dyn-clonable" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e9232f0e607a262ceb9bd5141a3dfb3e4db6994b31989bbfd845878cba59fd4" -dependencies = [ - "dyn-clonable-impl", - "dyn-clone", -] - -[[package]] -name = "dyn-clonable-impl" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "558e40ea573c374cf53507fd240b7ee2f5477df7cfebdb97323ec61c719399c5" +checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", + "bytes", + "http", + "pin-project-lite", ] [[package]] -name = "dyn-clone" -version = "1.0.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d6ef0072f8a535281e4876be788938b528e9a1d43900b82c2569af7da799125" - -[[package]] -name = "ecdsa" -version = "0.16.9" +name = "httparse" +version = "1.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee27f32b5c5292967d2d4a9d7f1e0b0aed2c15daded5a60300e4abb9d8020bca" -dependencies = [ - "der", - "digest 0.10.7", - "elliptic-curve", - "rfc6979", - "serdect", - "signature", - "spki", -] +checksum = "0fcc0b4a115bf80b728eb8ea024ad5bd707b615bfed49e0665b6e0f86fd082d9" [[package]] -name = "ed25519" -version = "2.2.3" +name = "httpdate" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "115531babc129696a58c64a4fef0a8bf9e9698629fb97e9e40767d235cfbcd53" -dependencies = [ - "pkcs8", - "signature", -] +checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" [[package]] -name = "ed25519-dalek" -version = "2.1.1" +name = "hyper" +version = "0.14.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a3daa8e81a3963a60642bcc1f90a670680bd4a77535faa384e9d1c79d620871" +checksum = "a152ddd61dfaec7273fe8419ab357f33aee0d914c5f4efbf0d96fa749eea5ec9" dependencies = [ - "curve25519-dalek", - "ed25519", - "serde", - "sha2 0.10.8", - "subtle", - "zeroize", + "bytes", + "futures-channel", + "futures-core", + "futures-util", + "h2", + "http", + "http-body", + "httparse", + "httpdate", + "itoa", + "pin-project-lite", + "socket2", + "tokio", + "tower-service", + "tracing", + "want", ] [[package]] -name = "ed25519-zebra" -version = "4.0.3" +name = "hyper-rustls" +version = "0.24.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d9ce6874da5d4415896cd45ffbc4d1cfc0c4f9c079427bd870742c30f2f65a9" +checksum = "ec3efd23720e2049821a693cbc7e65ea87c72f1c58ff2f9522ff332b1491e590" dependencies = [ - "curve25519-dalek", - "ed25519", - "hashbrown 0.14.3", - "hex", - "rand_core", - "sha2 0.10.8", - "zeroize", + "futures-util", + "http", + "hyper", + "log", + "rustls 0.21.12", + "rustls-native-certs 0.6.3", + "tokio", + "tokio-rustls 0.24.1", ] [[package]] -name = "either" -version = "1.11.0" +name = "ident_case" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a47c1c47d2f5964e29c61246e81db715514cd532db6b5116a25ea3c03d6780a2" +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" [[package]] -name = "elliptic-curve" -version = "0.13.8" +name = "idna" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" -dependencies = [ - "base16ct", - "crypto-bigint", - "digest 0.10.7", - "ff", - "generic-array", - "group", - "pkcs8", - "rand_core", - "sec1", - "serdect", - "subtle", - "zeroize", -] - -[[package]] -name = "encode_unicode" -version = "0.3.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a357d28ed41a50f9c765dbfe56cbc04a64e53e5fc58ba79fbc34c10ef3df831f" - -[[package]] -name = "enumflags2" -version = "0.7.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d232db7f5956f3f14313dc2f87985c58bd2c695ce124c8cdd984e08e15ac133d" -dependencies = [ - "enumflags2_derive", -] - -[[package]] -name = "enumflags2_derive" -version = "0.7.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de0d48a183585823424a4ce1aa132d174a6a81bd540895822eb4c8373a8e49e8" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.77", -] - -[[package]] -name = "enumn" -version = "0.1.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f9ed6b3789237c8a0c1c505af1c7eb2c560df6186f01b098c3a1064ea532f38" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.77", -] - -[[package]] -name = "env_logger" -version = "0.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4cd405aab171cb85d6735e5c8d9db038c17d3ca007a4d2c25f337935c3d90580" -dependencies = [ - "humantime", - "is-terminal", - "log", - "regex", - "termcolor", -] - -[[package]] -name = "environmental" -version = "1.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e48c92028aaa870e83d51c64e5d4e0b6981b360c522198c23959f219a4e1b15b" - -[[package]] -name = "equivalent" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" - -[[package]] -name = "errno" -version = "0.3.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a258e46cdc063eb8519c00b9fc845fc47bcfca4130e2f08e88665ceda8474245" -dependencies = [ - "libc", - "windows-sys 0.52.0", -] - -[[package]] -name = "etf-crypto-primitives" -version = "0.2.4" -source = "git+https://github.com/ideal-lab5/etf-sdk.git?branch=dev#e2b3615e0936c2cdd1ab8673e15208bef880b040" -dependencies = [ - "aes-gcm", - "ark-bls12-377", - "ark-bls12-381", - "ark-ec", - "ark-ff 0.4.2", - "ark-poly", - "ark-serialize 0.4.2", - "ark-std 0.4.0", - "array-bytes 6.2.2", - "chacha20poly1305", - "generic-array", - "parity-scale-codec", - "rand_chacha", - "scale-info", - "serde", - "serde_cbor", - "serde_json", - "sha2 0.10.8", - "sha3", - "w3f-bls", -] - -[[package]] -name = "etf-crypto-primitives" -version = "0.2.4" -source = "git+https://github.com/ideal-lab5/etf-sdk/?branch=tony/dev#159ed603ca8a31b7d2e5f4437c62411c4d1fd743" -dependencies = [ - "aes-gcm", - "ark-bls12-377", - "ark-bls12-381", - "ark-ec", - "ark-ff 0.4.2", - "ark-poly", - "ark-serialize 0.4.2", - "ark-std 0.4.0", - "array-bytes 6.2.2", - "chacha20poly1305", - "generic-array", - "parity-scale-codec", - "rand_chacha", - "scale-info", - "serde", - "serde_cbor", - "serde_json", - "sha2 0.10.8", - "sha3", - "w3f-bls", -] - -[[package]] -name = "etf-crypto-primitives" -version = "0.2.4" -source = "git+https://github.com/ideal-lab5/etf-sdk/?branch=w3fbls-migration#c6e61a89b94b57bcbde2293208a2875469f4fc5c" -dependencies = [ - "aes-gcm", - "ark-bls12-377", - "ark-bls12-381", - "ark-ec", - "ark-ff 0.4.2", - "ark-poly", - "ark-serialize 0.4.2", - "ark-std 0.4.0", - "array-bytes 6.2.2", - "chacha20poly1305", - "generic-array", - "parity-scale-codec", - "rand_chacha", - "scale-info", - "serde", - "serde_cbor", - "serde_json", - "sha2 0.10.8", - "sha3", - "w3f-bls", -] - -[[package]] -name = "ethabi-decode" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09d398648d65820a727d6a81e58b962f874473396a047e4c30bafe3240953417" -dependencies = [ - "ethereum-types", - "tiny-keccak", -] - -[[package]] -name = "ethbloom" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c22d4b5885b6aa2fe5e8b9329fb8d232bf739e434e6b87347c63bdd00c120f60" -dependencies = [ - "crunchy", - "fixed-hash", - "impl-codec", - "impl-rlp", - "impl-serde", - "scale-info", - "tiny-keccak", -] - -[[package]] -name = "ethereum-types" -version = "0.14.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02d215cbf040552efcbe99a38372fe80ab9d00268e20012b79fcd0f073edd8ee" -dependencies = [ - "ethbloom", - "fixed-hash", - "impl-codec", - "impl-rlp", - "impl-serde", - "primitive-types", - "scale-info", - "uint", -] - -[[package]] -name = "event-listener" -version = "4.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67b215c49b2b248c855fb73579eb1f4f26c38ffdc12973e20e07b91d78d5646e" -dependencies = [ - "concurrent-queue", - "parking", - "pin-project-lite", -] - -[[package]] -name = "event-listener" -version = "5.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d9944b8ca13534cdfb2800775f8dd4902ff3fc75a50101466decadfdf322a24" -dependencies = [ - "concurrent-queue", - "parking", - "pin-project-lite", -] - -[[package]] -name = "event-listener-strategy" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "958e4d70b6d5e81971bebec42271ec641e7ff4e170a6fa605f2b8a8b65cb97d3" -dependencies = [ - "event-listener 4.0.3", - "pin-project-lite", -] - -[[package]] -name = "event-listener-strategy" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "332f51cb23d20b0de8458b86580878211da09bcd4503cb579c225b3d124cabb3" -dependencies = [ - "event-listener 5.3.0", - "pin-project-lite", -] - -[[package]] -name = "expander" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00e83c02035136f1592a47964ea60c05a50e4ed8b5892cfac197063850898d4d" -dependencies = [ - "blake2", - "fs-err", - "prettier-please", - "proc-macro2", - "quote", - "syn 2.0.77", -] - -[[package]] -name = "fallible-iterator" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4443176a9f2c162692bd3d352d745ef9413eec5782a80d8fd6f8a1ac692a07f7" - -[[package]] -name = "fallible-iterator" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2acce4a10f12dc2fb14a218589d4f1f62ef011b2d0cc4b3cb1bba8e94da14649" - -[[package]] -name = "fastrand" -version = "2.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "658bd65b1cf4c852a3cc96f18a8ce7b5640f6b703f905c7d74532294c2a63984" - -[[package]] -name = "fastrlp" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "139834ddba373bbdd213dffe02c8d110508dcf1726c2be27e8d1f7d7e1856418" -dependencies = [ - "arrayvec 0.7.4", - "auto_impl", - "bytes", -] - -[[package]] -name = "ff" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ded41244b729663b1e574f1b4fb731469f69f79c17667b5d776b16cda0479449" -dependencies = [ - "rand_core", - "subtle", -] - -[[package]] -name = "fflonk" -version = "0.1.0" -source = "git+https://github.com/w3f/fflonk#1e854f35e9a65d08b11a86291405cdc95baa0a35" -dependencies = [ - "ark-ec", - "ark-ff 0.4.2", - "ark-poly", - "ark-serialize 0.4.2", - "ark-std 0.4.0", - "merlin", -] - -[[package]] -name = "fiat-crypto" -version = "0.2.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38793c55593b33412e3ae40c2c9781ffaa6f438f6f8c10f24e71846fbd7ae01e" - -[[package]] -name = "file-per-thread-logger" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84f2e425d9790201ba4af4630191feac6dcc98765b118d4d18e91d23c2353866" -dependencies = [ - "env_logger", - "log", -] - -[[package]] -name = "filetime" -version = "0.2.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ee447700ac8aa0b2f2bd7bc4462ad686ba06baa6727ac149a2d6277f0d240fd" -dependencies = [ - "cfg-if", - "libc", - "redox_syscall", - "windows-sys 0.52.0", -] - -[[package]] -name = "finality-grandpa" -version = "0.16.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36530797b9bf31cd4ff126dcfee8170f86b00cfdcea3269d73133cc0415945c3" -dependencies = [ - "either", - "futures", - "futures-timer", - "log", - "num-traits", - "parity-scale-codec", - "parking_lot", - "scale-info", -] - -[[package]] -name = "fixed-hash" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "835c052cb0c08c1acf6ffd71c022172e18723949c8282f2b9f27efbc51e64534" -dependencies = [ - "byteorder", - "rand", - "rustc-hex", - "static_assertions", -] - -[[package]] -name = "fnv" -version = "1.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" - -[[package]] -name = "form_urlencoded" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" -dependencies = [ - "percent-encoding", -] - -[[package]] -name = "frame-benchmarking" -version = "28.0.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" -dependencies = [ - "frame-support", - "frame-support-procedural", - "frame-system", - "linregress", - "log", - "parity-scale-codec", - "paste", - "scale-info", - "serde", - "sp-api", - "sp-application-crypto", - "sp-core", - "sp-io", - "sp-runtime", - "sp-runtime-interface 24.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", - "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", - "sp-storage 19.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", - "static_assertions", -] - -[[package]] -name = "frame-benchmarking-pallet-pov" -version = "18.0.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" -dependencies = [ - "frame-benchmarking", - "frame-support", - "frame-system", - "parity-scale-codec", - "scale-info", - "sp-io", - "sp-runtime", - "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", -] - -[[package]] -name = "frame-election-provider-solution-type" -version = "13.0.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" -dependencies = [ - "proc-macro-crate 3.1.0", - "proc-macro2", - "quote", - "syn 2.0.77", -] - -[[package]] -name = "frame-election-provider-support" -version = "28.0.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" -dependencies = [ - "frame-election-provider-solution-type", - "frame-support", - "frame-system", - "parity-scale-codec", - "scale-info", - "sp-arithmetic", - "sp-core", - "sp-npos-elections", - "sp-runtime", - "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", -] - -[[package]] -name = "frame-executive" -version = "28.0.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" -dependencies = [ - "aquamarine", - "frame-support", - "frame-system", - "frame-try-runtime", - "log", - "parity-scale-codec", - "scale-info", - "sp-core", - "sp-io", - "sp-runtime", - "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", - "sp-tracing 16.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", -] - -[[package]] -name = "frame-metadata" -version = "15.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "878babb0b136e731cc77ec2fd883ff02745ff21e6fb662729953d44923df009c" -dependencies = [ - "cfg-if", - "parity-scale-codec", - "scale-info", -] - -[[package]] -name = "frame-metadata" -version = "16.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87cf1549fba25a6fcac22785b61698317d958e96cac72a59102ea45b9ae64692" -dependencies = [ - "cfg-if", - "parity-scale-codec", - "scale-info", - "serde", -] - -[[package]] -name = "frame-metadata-hash-extension" -version = "0.1.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" -dependencies = [ - "array-bytes 6.2.2", - "docify", - "frame-support", - "frame-system", - "log", - "parity-scale-codec", - "scale-info", - "sp-runtime", -] - -[[package]] -name = "frame-support" -version = "28.0.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" -dependencies = [ - "aquamarine", - "array-bytes 6.2.2", - "bitflags 1.3.2", - "docify", - "environmental", - "frame-metadata 16.0.0", - "frame-support-procedural", - "impl-trait-for-tuples", - "k256", - "log", - "macro_magic", - "parity-scale-codec", - "paste", - "scale-info", - "serde", - "serde_json", - "smallvec", - "sp-api", - "sp-arithmetic", - "sp-core", - "sp-crypto-hashing-proc-macro", - "sp-debug-derive 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", - "sp-genesis-builder", - "sp-inherents", - "sp-io", - "sp-metadata-ir", - "sp-runtime", - "sp-staking", - "sp-state-machine", - "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", - "sp-tracing 16.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", - "sp-weights", - "static_assertions", - "tt-call", -] - -[[package]] -name = "frame-support-procedural" -version = "23.0.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" -dependencies = [ - "Inflector", - "cfg-expr", - "derive-syn-parse 0.2.0", - "expander", - "frame-support-procedural-tools", - "itertools 0.11.0", - "macro_magic", - "proc-macro-warning", - "proc-macro2", - "quote", - "sp-crypto-hashing 0.1.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", - "syn 2.0.77", -] - -[[package]] -name = "frame-support-procedural-tools" -version = "10.0.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" -dependencies = [ - "frame-support-procedural-tools-derive", - "proc-macro-crate 3.1.0", - "proc-macro2", - "quote", - "syn 2.0.77", -] - -[[package]] -name = "frame-support-procedural-tools-derive" -version = "11.0.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.77", -] - -[[package]] -name = "frame-system" -version = "28.0.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" -dependencies = [ - "cfg-if", - "docify", - "frame-support", - "log", - "parity-scale-codec", - "scale-info", - "serde", - "sp-core", - "sp-io", - "sp-runtime", - "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", - "sp-version", - "sp-weights", -] - -[[package]] -name = "frame-system-benchmarking" -version = "28.0.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" -dependencies = [ - "frame-benchmarking", - "frame-support", - "frame-system", - "parity-scale-codec", - "scale-info", - "sp-core", - "sp-runtime", - "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", -] - -[[package]] -name = "frame-system-rpc-runtime-api" -version = "26.0.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" -dependencies = [ - "docify", - "parity-scale-codec", - "sp-api", -] - -[[package]] -name = "frame-try-runtime" -version = "0.34.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" -dependencies = [ - "frame-support", - "parity-scale-codec", - "sp-api", - "sp-runtime", - "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", -] - -[[package]] -name = "fs-err" -version = "2.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88a41f105fe1d5b6b34b2055e3dc59bb79b46b48b2040b9e6c7b4b5de097aa41" -dependencies = [ - "autocfg", -] - -[[package]] -name = "funty" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" - -[[package]] -name = "futures" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "645c6916888f6cb6350d2550b80fb63e734897a8498abe35cfb732b6487804b0" -dependencies = [ - "futures-channel", - "futures-core", - "futures-executor", - "futures-io", - "futures-sink", - "futures-task", - "futures-util", -] - -[[package]] -name = "futures-channel" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78" -dependencies = [ - "futures-core", - "futures-sink", -] - -[[package]] -name = "futures-core" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" - -[[package]] -name = "futures-executor" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a576fc72ae164fca6b9db127eaa9a9dda0d61316034f33a0a0d4eda41f02b01d" -dependencies = [ - "futures-core", - "futures-task", - "futures-util", - "num_cpus", -] - -[[package]] -name = "futures-io" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1" - -[[package]] -name = "futures-lite" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52527eb5074e35e9339c6b4e8d12600c7128b68fb25dcb9fa9dec18f7c25f3a5" -dependencies = [ - "fastrand", - "futures-core", - "futures-io", - "parking", - "pin-project-lite", -] - -[[package]] -name = "futures-macro" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.77", -] - -[[package]] -name = "futures-sink" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5" - -[[package]] -name = "futures-task" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004" - -[[package]] -name = "futures-timer" -version = "3.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f288b0a4f20f9a56b5d1da57e2227c661b7b16168e2f72365f57b63326e29b24" - -[[package]] -name = "futures-util" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48" -dependencies = [ - "futures-channel", - "futures-core", - "futures-io", - "futures-macro", - "futures-sink", - "futures-task", - "memchr", - "pin-project-lite", - "pin-utils", - "slab", -] - -[[package]] -name = "fxhash" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c" -dependencies = [ - "byteorder", -] - -[[package]] -name = "generic-array" -version = "0.14.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" -dependencies = [ - "typenum", - "version_check", - "zeroize", -] - -[[package]] -name = "getrandom" -version = "0.2.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94b22e06ecb0110981051723910cbf0b5f5e09a2062dd7663334ee79a9d1286c" -dependencies = [ - "cfg-if", - "js-sys", - "libc", - "wasi", - "wasm-bindgen", -] - -[[package]] -name = "getrandom_or_panic" -version = "0.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ea1015b5a70616b688dc230cfe50c8af89d972cb132d5a622814d29773b10b9" -dependencies = [ - "rand", - "rand_core", -] - -[[package]] -name = "ghash" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0d8a4362ccb29cb0b265253fb0a2728f592895ee6854fd9bc13f2ffda266ff1" -dependencies = [ - "opaque-debug", - "polyval", -] - -[[package]] -name = "gimli" -version = "0.27.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6c80984affa11d98d1b88b66ac8853f143217b399d3c74116778ff8fdb4ed2e" -dependencies = [ - "fallible-iterator 0.2.0", - "indexmap 1.9.3", - "stable_deref_trait", -] - -[[package]] -name = "gimli" -version = "0.28.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" -dependencies = [ - "fallible-iterator 0.3.0", - "stable_deref_trait", -] - -[[package]] -name = "group" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" -dependencies = [ - "ff", - "rand_core", - "subtle", -] - -[[package]] -name = "h2" -version = "0.3.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81fe527a889e1532da5c525686d96d4c2e74cdd345badf8dfef9f6b39dd5f5e8" -dependencies = [ - "bytes", - "fnv", - "futures-core", - "futures-sink", - "futures-util", - "http", - "indexmap 2.2.6", - "slab", - "tokio", - "tokio-util", - "tracing", -] - -[[package]] -name = "half" -version = "1.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b43ede17f21864e81be2fa654110bf1e793774238d86ef8555c37e6519c0403" - -[[package]] -name = "hash-db" -version = "0.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e7d7786361d7425ae2fe4f9e407eb0efaa0840f5212d109cc018c40c35c6ab4" - -[[package]] -name = "hash256-std-hasher" -version = "0.15.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92c171d55b98633f4ed3860808f004099b36c1cc29c42cfc53aa8591b21efcf2" -dependencies = [ - "crunchy", -] - -[[package]] -name = "hashbrown" -version = "0.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" -dependencies = [ - "ahash 0.7.8", -] - -[[package]] -name = "hashbrown" -version = "0.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e" -dependencies = [ - "ahash 0.8.11", -] - -[[package]] -name = "hashbrown" -version = "0.14.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" -dependencies = [ - "ahash 0.8.11", - "allocator-api2", - "serde", -] - -[[package]] -name = "heck" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" - -[[package]] -name = "heck" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" - -[[package]] -name = "hermit-abi" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" - -[[package]] -name = "hermit-abi" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbf6a919d6cf397374f7dfeeea91d974c7c0a7221d0d0f4f20d859d329e53fcc" - -[[package]] -name = "hex" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" - -[[package]] -name = "hex-conservative" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30ed443af458ccb6d81c1e7e661545f94d3176752fb1df2f543b902a1e0f51e2" - -[[package]] -name = "hex-literal" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6fe2267d4ed49bc07b63801559be28c718ea06c4738b7a03c94df7386d2cde46" - -[[package]] -name = "hkdf" -version = "0.12.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b5f8eb2ad728638ea2c7d47a21db23b7b58a72ed6a38256b8a1849f15fbbdf7" -dependencies = [ - "hmac 0.12.1", -] - -[[package]] -name = "hmac" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "126888268dcc288495a26bf004b38c5fdbb31682f992c84ceb046a1f0fe38840" -dependencies = [ - "crypto-mac", - "digest 0.9.0", -] - -[[package]] -name = "hmac" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" -dependencies = [ - "digest 0.10.7", -] - -[[package]] -name = "hmac-drbg" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17ea0a1394df5b6574da6e0c1ade9e78868c9fb0a4e5ef4428e32da4676b85b1" -dependencies = [ - "digest 0.9.0", - "generic-array", - "hmac 0.8.1", -] - -[[package]] -name = "http" -version = "0.2.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1" -dependencies = [ - "bytes", - "fnv", - "itoa", -] - -[[package]] -name = "http-body" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" -dependencies = [ - "bytes", - "http", - "pin-project-lite", -] - -[[package]] -name = "httparse" -version = "1.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" - -[[package]] -name = "httpdate" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" - -[[package]] -name = "humantime" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" - -[[package]] -name = "hyper" -version = "0.14.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf96e135eb83a2a8ddf766e426a841d8ddd7449d5f00d34ea02b41d2f19eef80" -dependencies = [ - "bytes", - "futures-channel", - "futures-core", - "futures-util", - "h2", - "http", - "http-body", - "httparse", - "httpdate", - "itoa", - "pin-project-lite", - "socket2", - "tokio", - "tower-service", - "tracing", - "want", -] - -[[package]] -name = "hyper-rustls" -version = "0.24.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec3efd23720e2049821a693cbc7e65ea87c72f1c58ff2f9522ff332b1491e590" -dependencies = [ - "futures-util", - "http", - "hyper", - "log", - "rustls 0.21.11", - "rustls-native-certs 0.6.3", - "tokio", - "tokio-rustls 0.24.1", -] - -[[package]] -name = "ident_case" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" - -[[package]] -name = "idna" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" -dependencies = [ - "unicode-bidi", - "unicode-normalization", -] - -[[package]] -name = "impl-codec" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba6a270039626615617f3f36d15fc827041df3b78c439da2cadfa47455a77f2f" -dependencies = [ - "parity-scale-codec", -] - -[[package]] -name = "impl-num-traits" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "951641f13f873bff03d4bf19ae8bec531935ac0ac2cc775f84d7edfdcfed3f17" -dependencies = [ - "integer-sqrt", - "num-traits", - "uint", -] - -[[package]] -name = "impl-rlp" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f28220f89297a075ddc7245cd538076ee98b01f2a9c23a53a4f1105d5a322808" -dependencies = [ - "rlp", -] - -[[package]] -name = "impl-serde" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebc88fc67028ae3db0c853baa36269d398d5f45b6982f95549ff5def78c935cd" -dependencies = [ - "serde", -] - -[[package]] -name = "impl-trait-for-tuples" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11d7a9f6330b71fea57921c9b61c47ee6e84f72d394754eff6163ae67e7395eb" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "include_dir" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18762faeff7122e89e0857b02f7ce6fcc0d101d5e9ad2ad7846cc01d61b7f19e" -dependencies = [ - "include_dir_macros", -] - -[[package]] -name = "include_dir_macros" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b139284b5cf57ecfa712bcc66950bb635b31aff41c188e8a4cfc758eca374a3f" -dependencies = [ - "proc-macro2", - "quote", -] - -[[package]] -name = "indexmap" -version = "1.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" -dependencies = [ - "autocfg", - "hashbrown 0.12.3", - "serde", -] - -[[package]] -name = "indexmap" -version = "2.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "168fb715dda47215e360912c096649d23d58bf392ac62f73919e831745e40f26" -dependencies = [ - "equivalent", - "hashbrown 0.14.3", -] - -[[package]] -name = "indexmap-nostd" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e04e2fd2b8188ea827b32ef11de88377086d690286ab35747ef7f9bf3ccb590" - -[[package]] -name = "indicatif" -version = "0.17.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "763a5a8f45087d6bcea4222e7b72c291a054edf80e4ef6efd2a4979878c7bea3" -dependencies = [ - "console", - "instant", - "number_prefix", - "portable-atomic", - "unicode-width", -] - -[[package]] -name = "inout" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0c10553d664a4d0bcff9f4215d0aac67a639cc68ef660840afe309b807bc9f5" -dependencies = [ - "generic-array", -] - -[[package]] -name = "instability" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b23a0c8dfe501baac4adf6ebbfa6eddf8f0c07f56b058cc1288017e32397846c" -dependencies = [ - "quote", - "syn 2.0.77", -] - -[[package]] -name = "instant" -version = "0.1.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "integer-sqrt" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "276ec31bcb4a9ee45f58bec6f9ec700ae4cf4f4f8f2fa7e06cb406bd5ffdd770" -dependencies = [ - "num-traits", -] - -[[package]] -name = "io-lifetimes" -version = "1.0.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eae7b9aee968036d54dce06cebaefd919e4472e753296daccd6d344e3e2df0c2" -dependencies = [ - "hermit-abi 0.3.9", - "libc", - "windows-sys 0.48.0", -] - -[[package]] -name = "is-terminal" -version = "0.4.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "261f68e344040fbd0edea105bef17c66edf46f984ddb1115b775ce31be948f4b" -dependencies = [ - "hermit-abi 0.4.0", - "libc", - "windows-sys 0.52.0", -] - -[[package]] -name = "itertools" -version = "0.10.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" -dependencies = [ - "either", -] - -[[package]] -name = "itertools" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1c173a5686ce8bfa551b3563d0c2170bf24ca44da99c7ca4bfdab5418c3fe57" -dependencies = [ - "either", -] - -[[package]] -name = "itertools" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" -dependencies = [ - "either", -] - -[[package]] -name = "itertools" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" -dependencies = [ - "either", -] - -[[package]] -name = "itoa" -version = "1.0.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" - -[[package]] -name = "jobserver" -version = "0.1.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48d1dbcbbeb6a7fec7e059840aa538bd62aaccf972c7346c4d9d2059312853d0" -dependencies = [ - "libc", -] - -[[package]] -name = "js-sys" -version = "0.3.69" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29c15563dc2726973df627357ce0c9ddddbea194836909d655df6a75d2cf296d" -dependencies = [ - "wasm-bindgen", -] - -[[package]] -name = "jsonrpsee" -version = "0.22.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4b0e68d9af1f066c06d6e2397583795b912d78537d7d907c561e82c13d69fa1" -dependencies = [ - "jsonrpsee-client-transport", - "jsonrpsee-core", - "jsonrpsee-http-client", - "jsonrpsee-types", -] - -[[package]] -name = "jsonrpsee-client-transport" -version = "0.22.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92f254f56af1ae84815b9b1325094743dcf05b92abb5e94da2e81a35cff0cada" -dependencies = [ - "futures-util", - "http", - "jsonrpsee-core", - "pin-project", - "rustls-native-certs 0.7.0", - "rustls-pki-types", - "soketto", - "thiserror", - "tokio", - "tokio-rustls 0.25.0", - "tokio-util", - "tracing", - "url", -] - -[[package]] -name = "jsonrpsee-core" -version = "0.22.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "274d68152c24aa78977243bb56f28d7946e6aa309945b37d33174a3f92d89a3a" -dependencies = [ - "anyhow", - "async-trait", - "beef", - "futures-timer", - "futures-util", - "hyper", - "jsonrpsee-types", - "pin-project", - "rustc-hash", - "serde", - "serde_json", - "thiserror", - "tokio", - "tokio-stream", - "tracing", -] - -[[package]] -name = "jsonrpsee-http-client" -version = "0.22.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac13bc1e44cd00448a5ff485824a128629c945f02077804cb659c07a0ba41395" -dependencies = [ - "async-trait", - "hyper", - "hyper-rustls", - "jsonrpsee-core", - "jsonrpsee-types", - "serde", - "serde_json", - "thiserror", - "tokio", - "tower", - "tracing", - "url", -] - -[[package]] -name = "jsonrpsee-types" -version = "0.22.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3dc828e537868d6b12bbb07ec20324909a22ced6efca0057c825c3e1126b2c6d" -dependencies = [ - "anyhow", - "beef", - "serde", - "serde_json", - "thiserror", -] - -[[package]] -name = "k256" -version = "0.13.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "956ff9b67e26e1a6a866cb758f12c6f8746208489e3e4a4b5580802f2f0a587b" -dependencies = [ - "cfg-if", - "ecdsa", - "elliptic-curve", - "once_cell", - "serdect", - "sha2 0.10.8", -] - -[[package]] -name = "keccak" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ecc2af9a1119c51f12a14607e783cb977bde58bc069ff0c3da1095e635d70654" -dependencies = [ - "cpufeatures", -] - -[[package]] -name = "lazy_static" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" - -[[package]] -name = "libc" -version = "0.2.153" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd" - -[[package]] -name = "libm" -version = "0.2.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058" - -[[package]] -name = "libredox" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" -dependencies = [ - "bitflags 2.5.0", - "libc", -] - -[[package]] -name = "libsecp256k1" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95b09eff1b35ed3b33b877ced3a691fc7a481919c7e29c53c906226fcf55e2a1" -dependencies = [ - "arrayref", - "base64 0.13.1", - "digest 0.9.0", - "hmac-drbg", - "libsecp256k1-core", - "libsecp256k1-gen-ecmult", - "libsecp256k1-gen-genmult", - "rand", - "serde", - "sha2 0.9.9", - "typenum", -] - -[[package]] -name = "libsecp256k1-core" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5be9b9bb642d8522a44d533eab56c16c738301965504753b03ad1de3425d5451" -dependencies = [ - "crunchy", - "digest 0.9.0", - "subtle", -] - -[[package]] -name = "libsecp256k1-gen-ecmult" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3038c808c55c87e8a172643a7d87187fc6c4174468159cb3090659d55bcb4809" -dependencies = [ - "libsecp256k1-core", -] - -[[package]] -name = "libsecp256k1-gen-genmult" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3db8d6ba2cec9eacc40e6e8ccc98931840301f1006e95647ceb2dd5c3aa06f7c" -dependencies = [ - "libsecp256k1-core", -] - -[[package]] -name = "link-cplusplus" -version = "1.0.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d240c6f7e1ba3a28b0249f774e6a9dd0175054b52dfbb61b16eb8505c3785c9" -dependencies = [ - "cc", -] - -[[package]] -name = "linregress" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4de04dcecc58d366391f9920245b85ffa684558a5ef6e7736e754347c3aea9c2" -dependencies = [ - "nalgebra", -] - -[[package]] -name = "linux-raw-sys" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f051f77a7c8e6957c0696eac88f26b0117e54f52d3fc682ab19397a8812846a4" - -[[package]] -name = "linux-raw-sys" -version = "0.4.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01cda141df6706de531b6c46c3a33ecca755538219bd484262fa09410c13539c" - -[[package]] -name = "lock_api" -version = "0.4.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c168f8615b12bc01f9c17e2eb0cc07dcae1940121185446edc3744920e8ef45" -dependencies = [ - "autocfg", - "scopeguard", -] - -[[package]] -name = "log" -version = "0.4.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" - -[[package]] -name = "lru" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6e8aaa3f231bb4bd57b84b2d5dc3ae7f350265df8aa96492e0bc394a1571909" -dependencies = [ - "hashbrown 0.12.3", -] - -[[package]] -name = "lru" -version = "0.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3262e75e648fce39813cb56ac41f3c3e3f65217ebf3844d818d1f9398cfb0dc" -dependencies = [ - "hashbrown 0.14.3", -] - -[[package]] -name = "mach" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b823e83b2affd8f40a9ee8c29dbc56404c1e34cd2710921f2801e2cf29527afa" -dependencies = [ - "libc", -] - -[[package]] -name = "macro_magic" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e03844fc635e92f3a0067e25fa4bf3e3dbf3f2927bf3aa01bb7bc8f1c428949d" -dependencies = [ - "macro_magic_core", - "macro_magic_macros", - "quote", - "syn 2.0.77", -] - -[[package]] -name = "macro_magic_core" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "468155613a44cfd825f1fb0ffa532b018253920d404e6fca1e8d43155198a46d" -dependencies = [ - "const-random", - "derive-syn-parse 0.1.5", - "macro_magic_core_macros", - "proc-macro2", - "quote", - "syn 2.0.77", -] - -[[package]] -name = "macro_magic_core_macros" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ea73aa640dc01d62a590d48c0c3521ed739d53b27f919b25c3551e233481654" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.77", -] - -[[package]] -name = "macro_magic_macros" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef9d79ae96aaba821963320eb2b6e34d17df1e5a83d8a1985c29cc5be59577b3" -dependencies = [ - "macro_magic_core", - "quote", - "syn 2.0.77", -] - -[[package]] -name = "matchers" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558" -dependencies = [ - "regex-automata 0.1.10", -] - -[[package]] -name = "matrixmultiply" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9380b911e3e96d10c1f415da0876389aaf1b56759054eeb0de7df940c456ba1a" -dependencies = [ - "autocfg", - "rawpointer", -] - -[[package]] -name = "memchr" -version = "2.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c8640c5d730cb13ebd907d8d04b52f55ac9a2eec55b440c8892f40d56c76c1d" - -[[package]] -name = "memfd" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2cffa4ad52c6f791f4f8b15f0c05f9824b2ced1160e88cc393d64fff9a8ac64" -dependencies = [ - "rustix 0.38.34", -] - -[[package]] -name = "memoffset" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d61c719bcfbcf5d62b3a09efa6088de8c54bc0bfcd3ea7ae39fcc186108b8de1" -dependencies = [ - "autocfg", -] - -[[package]] -name = "memory-db" -version = "0.32.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "808b50db46293432a45e63bc15ea51e0ab4c0a1647b8eb114e31a3e698dd6fbe" -dependencies = [ - "hash-db", -] - -[[package]] -name = "merlin" -version = "3.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "58c38e2799fc0978b65dfff8023ec7843e2330bb462f19198840b34b6582397d" -dependencies = [ - "byteorder", - "keccak", - "rand_core", - "zeroize", -] - -[[package]] -name = "minimal-lexical" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" - -[[package]] -name = "miniz_oxide" -version = "0.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d811f3e15f28568be3407c8e7fdb6514c1cda3cb30683f15b6a1a1dc4ea14a7" -dependencies = [ - "adler", -] - -[[package]] -name = "mio" -version = "0.8.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4a650543ca06a924e8b371db273b2756685faae30f8487da1b56505a8f78b0c" -dependencies = [ - "libc", - "wasi", - "windows-sys 0.48.0", -] - -[[package]] -name = "mio" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80e04d1dcff3aae0704555fe5fee3bcfaf3d1fdf8a7e521d5b9d2b42acb52cec" -dependencies = [ - "hermit-abi 0.3.9", - "libc", - "log", - "wasi", - "windows-sys 0.52.0", -] - -[[package]] -name = "multi-stash" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "685a9ac4b61f4e728e1d2c6a7844609c16527aeb5e6c865915c08e619c16410f" - -[[package]] -name = "murmur-cli" -version = "0.1.0" -dependencies = [ - "ark-bls12-377", - "ark-ec", - "ark-ff 0.4.2", - "ark-serialize 0.4.2", - "ark-std 0.4.0", - "array-bytes 6.2.2", - "ckb-merkle-mountain-range", - "clap", - "crossterm", - "etf-crypto-primitives 0.2.4 (git+https://github.com/ideal-lab5/etf-sdk/?branch=tony/dev)", - "frame-support", - "getrandom", - "hex", - "indicatif", - "murmur-core", - "node-template-runtime", - "parity-scale-codec", - "rand_chacha", - "rand_core", - "ratatui", - "serde", - "serde_cbor", - "serde_json", - "sha3", - "sp-application-crypto", - "sp-consensus-beefy-etf 13.0.0 (git+https://github.com/ideal-lab5/etf.git?branch=tony/dev)", - "sp-core", - "sp-keyring", - "sp-runtime", - "subxt", - "subxt-signer", - "tokio", - "w3f-bls", -] - -[[package]] -name = "murmur-core" -version = "0.1.0" -dependencies = [ - "ark-bls12-377", - "ark-ff 0.4.2", - "ark-serialize 0.4.2", - "ark-std 0.4.0", - "array-bytes 6.2.2", - "ckb-merkle-mountain-range", - "etf-crypto-primitives 0.2.4 (git+https://github.com/ideal-lab5/etf-sdk/?branch=tony/dev)", - "getrandom", - "hex", - "parity-scale-codec", - "rand_core", - "serde", - "sha3", - "totp-rs", - "w3f-bls", -] - -[[package]] -name = "nalgebra" -version = "0.32.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b5c17de023a86f59ed79891b2e5d5a94c705dbe904a5b5c9c952ea6221b03e4" -dependencies = [ - "approx", - "matrixmultiply", - "nalgebra-macros", - "num-complex", - "num-rational", - "num-traits", - "simba", - "typenum", -] - -[[package]] -name = "nalgebra-macros" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "254a5372af8fc138e36684761d3c0cdb758a4410e938babcff1c860ce14ddbfc" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.77", -] - -[[package]] -name = "no-std-net" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43794a0ace135be66a25d3ae77d41b91615fb68ae937f904090203e81f755b65" - -[[package]] -name = "node-primitives" -version = "2.0.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" -dependencies = [ - "sp-core", - "sp-runtime", -] - -[[package]] -name = "node-template-runtime" -version = "0.0.1" -dependencies = [ - "frame-benchmarking", - "frame-benchmarking-pallet-pov", - "frame-election-provider-support", - "frame-executive", - "frame-metadata-hash-extension", - "frame-support", - "frame-system", - "frame-system-benchmarking", - "frame-system-rpc-runtime-api", - "frame-try-runtime", - "log", - "node-primitives", - "pallet-alliance", - "pallet-asset-conversion", - "pallet-asset-conversion-ops", - "pallet-asset-conversion-tx-payment", - "pallet-asset-rate", - "pallet-asset-tx-payment", - "pallet-assets", - "pallet-authority-discovery", - "pallet-authorship", - "pallet-babe", - "pallet-bags-list", - "pallet-balances", - "pallet-beefy-etf", - "pallet-beefy-mmr-etf", - "pallet-bounties", - "pallet-broker", - "pallet-child-bounties", - "pallet-collective", - "pallet-contracts", - "pallet-conviction-voting", - "pallet-core-fellowship", - "pallet-democracy", - "pallet-election-provider-multi-phase", - "pallet-election-provider-support-benchmarking", - "pallet-elections-phragmen", - "pallet-etf", - "pallet-example-mbm", - "pallet-example-tasks", - "pallet-fast-unstake", - "pallet-glutton", - "pallet-grandpa", - "pallet-identity", - "pallet-im-online", - "pallet-indices", - "pallet-insecure-randomness-collective-flip", - "pallet-lottery", - "pallet-membership", - "pallet-message-queue", - "pallet-migrations", - "pallet-mixnet", - "pallet-mmr", - "pallet-multisig", - "pallet-murmur", - "pallet-nft-fractionalization", - "pallet-nfts", - "pallet-nfts-runtime-api", - "pallet-nis", - "pallet-nomination-pools", - "pallet-nomination-pools-benchmarking", - "pallet-nomination-pools-runtime-api", - "pallet-offences", - "pallet-offences-benchmarking", - "pallet-parameters", - "pallet-preimage", - "pallet-proxy 28.1.0", - "pallet-randomness-beacon", - "pallet-ranked-collective", - "pallet-recovery", - "pallet-referenda", - "pallet-remark", - "pallet-root-testing", - "pallet-safe-mode", - "pallet-salary", - "pallet-scheduler 4.0.0-dev", - "pallet-session", - "pallet-session-benchmarking", - "pallet-skip-feeless-payment", - "pallet-society", - "pallet-staking", - "pallet-staking-reward-curve", - "pallet-staking-runtime-api", - "pallet-state-trie-migration", - "pallet-statement", - "pallet-sudo", - "pallet-timestamp", - "pallet-tips", - "pallet-transaction-payment", - "pallet-transaction-payment-rpc-runtime-api", - "pallet-transaction-storage", - "pallet-treasury", - "pallet-tx-pause", - "pallet-uniques", - "pallet-utility", - "pallet-vesting", - "pallet-whitelist", - "parity-scale-codec", - "polkadot-sdk", - "polkadot-sdk-frame", - "primitive-types", - "scale-info", - "serde_json", - "sp-api", - "sp-authority-discovery", - "sp-block-builder", - "sp-consensus-babe", - "sp-consensus-beefy-etf 13.0.0", - "sp-consensus-grandpa", - "sp-core", - "sp-genesis-builder", - "sp-inherents", - "sp-io", - "sp-mixnet", - "sp-offchain", - "sp-runtime", - "sp-session", - "sp-staking", - "sp-statement-store", - "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", - "sp-storage 19.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", - "sp-transaction-pool", - "sp-version", - "static_assertions", - "substrate-wasm-builder", -] - -[[package]] -name = "nodrop" -version = "0.1.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72ef4a56884ca558e5ddb05a1d1e7e1bfd9a68d9ed024c21704cc98872dae1bb" - -[[package]] -name = "nohash-hasher" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2bf50223579dc7cdcfb3bfcacf7069ff68243f8c363f62ffa99cf000a6b9c451" - -[[package]] -name = "nom" -version = "7.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" -dependencies = [ - "memchr", - "minimal-lexical", -] - -[[package]] -name = "nu-ansi-term" -version = "0.46.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" -dependencies = [ - "overload", - "winapi", -] - -[[package]] -name = "num-bigint" -version = "0.4.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "608e7659b5c3d7cba262d894801b9ec9d00de989e8a82bd4bef91d08da45cdc0" -dependencies = [ - "autocfg", - "num-integer", - "num-traits", -] - -[[package]] -name = "num-complex" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73f88a1307638156682bada9d7604135552957b7818057dcef22705b4d509495" -dependencies = [ - "num-traits", -] - -[[package]] -name = "num-conv" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" - -[[package]] -name = "num-derive" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.77", -] - -[[package]] -name = "num-format" -version = "0.4.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a652d9771a63711fd3c3deb670acfbe5c30a4072e664d7a3bf5a9e1056ac72c3" -dependencies = [ - "arrayvec 0.7.4", - "itoa", -] - -[[package]] -name = "num-integer" -version = "0.1.46" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" -dependencies = [ - "num-traits", -] - -[[package]] -name = "num-rational" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0638a1c9d0a3c0914158145bc76cff373a75a627e6ecbfb71cbe6f453a5a19b0" -dependencies = [ - "autocfg", - "num-bigint", - "num-integer", - "num-traits", -] - -[[package]] -name = "num-traits" -version = "0.2.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da0df0e5185db44f69b44f26786fe401b6c293d1907744beaa7fa62b2e5a517a" -dependencies = [ - "autocfg", - "libm", -] - -[[package]] -name = "num_cpus" -version = "1.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" -dependencies = [ - "hermit-abi 0.3.9", - "libc", -] - -[[package]] -name = "number_prefix" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "830b246a0e5f20af87141b25c173cd1b609bd7779a4617d6ec582abaf90870f3" - -[[package]] -name = "object" -version = "0.30.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03b4680b86d9cfafba8fc491dc9b6df26b68cf40e9e6cd73909194759a63c385" -dependencies = [ - "crc32fast", - "hashbrown 0.13.2", - "indexmap 1.9.3", - "memchr", -] - -[[package]] -name = "object" -version = "0.32.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6a622008b6e321afc04970976f62ee297fdbaa6f95318ca343e3eebb9648441" -dependencies = [ - "memchr", -] - -[[package]] -name = "once_cell" -version = "1.19.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" - -[[package]] -name = "opaque-debug" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" - -[[package]] -name = "openssl-probe" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" - -[[package]] -name = "overload" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" - -[[package]] -name = "pallet-alliance" -version = "27.0.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" -dependencies = [ - "frame-benchmarking", - "frame-support", - "frame-system", - "log", - "pallet-collective", - "pallet-identity", - "parity-scale-codec", - "scale-info", - "sp-core", - "sp-crypto-hashing 0.1.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", - "sp-io", - "sp-runtime", - "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", -] - -[[package]] -name = "pallet-asset-conversion" -version = "10.0.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" -dependencies = [ - "frame-benchmarking", - "frame-support", - "frame-system", - "log", - "parity-scale-codec", - "scale-info", - "sp-api", - "sp-arithmetic", - "sp-core", - "sp-io", - "sp-runtime", - "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", -] - -[[package]] -name = "pallet-asset-conversion-ops" -version = "0.1.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" -dependencies = [ - "frame-benchmarking", - "frame-support", - "frame-system", - "log", - "pallet-asset-conversion", - "parity-scale-codec", - "scale-info", - "sp-arithmetic", - "sp-core", - "sp-io", - "sp-runtime", - "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", -] - -[[package]] -name = "pallet-asset-conversion-tx-payment" -version = "10.0.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" -dependencies = [ - "frame-support", - "frame-system", - "pallet-asset-conversion", - "pallet-transaction-payment", - "parity-scale-codec", - "scale-info", - "sp-runtime", - "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", -] - -[[package]] -name = "pallet-asset-rate" -version = "7.0.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" -dependencies = [ - "frame-benchmarking", - "frame-support", - "frame-system", - "parity-scale-codec", - "scale-info", - "sp-core", - "sp-runtime", - "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", -] - -[[package]] -name = "pallet-asset-tx-payment" -version = "28.0.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" -dependencies = [ - "frame-benchmarking", - "frame-support", - "frame-system", - "pallet-transaction-payment", - "parity-scale-codec", - "scale-info", - "serde", - "sp-core", - "sp-io", - "sp-runtime", - "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", -] - -[[package]] -name = "pallet-assets" -version = "29.1.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" -dependencies = [ - "frame-benchmarking", - "frame-support", - "frame-system", - "log", - "parity-scale-codec", - "scale-info", - "sp-core", - "sp-runtime", - "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", -] - -[[package]] -name = "pallet-assets-freezer" -version = "0.1.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" -dependencies = [ - "frame-benchmarking", - "frame-support", - "frame-system", - "log", - "pallet-assets", - "parity-scale-codec", - "scale-info", - "sp-runtime", -] - -[[package]] -name = "pallet-atomic-swap" -version = "28.0.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" -dependencies = [ - "frame-support", - "frame-system", - "parity-scale-codec", - "scale-info", - "sp-core", - "sp-io", - "sp-runtime", - "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", -] - -[[package]] -name = "pallet-aura" -version = "27.0.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" -dependencies = [ - "frame-support", - "frame-system", - "log", - "pallet-timestamp", - "parity-scale-codec", - "scale-info", - "sp-application-crypto", - "sp-consensus-aura", - "sp-runtime", - "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", -] - -[[package]] -name = "pallet-authority-discovery" -version = "28.0.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" -dependencies = [ - "frame-support", - "frame-system", - "pallet-session", - "parity-scale-codec", - "scale-info", - "sp-application-crypto", - "sp-authority-discovery", - "sp-runtime", - "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", -] - -[[package]] -name = "pallet-authorship" -version = "28.0.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" -dependencies = [ - "frame-support", - "frame-system", - "impl-trait-for-tuples", - "parity-scale-codec", - "scale-info", - "sp-runtime", - "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", -] - -[[package]] -name = "pallet-babe" -version = "28.0.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" -dependencies = [ - "frame-benchmarking", - "frame-support", - "frame-system", - "log", - "pallet-authorship", - "pallet-session", - "pallet-timestamp", - "parity-scale-codec", - "scale-info", - "sp-application-crypto", - "sp-consensus-babe", - "sp-core", - "sp-io", - "sp-runtime", - "sp-session", - "sp-staking", - "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", -] - -[[package]] -name = "pallet-bags-list" -version = "27.0.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" -dependencies = [ - "aquamarine", - "docify", - "frame-benchmarking", - "frame-election-provider-support", - "frame-support", - "frame-system", - "log", - "pallet-balances", - "parity-scale-codec", - "scale-info", - "sp-core", - "sp-io", - "sp-runtime", - "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", - "sp-tracing 16.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", -] - -[[package]] -name = "pallet-balances" -version = "28.0.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" -dependencies = [ - "docify", - "frame-benchmarking", - "frame-support", - "frame-system", - "log", - "parity-scale-codec", - "scale-info", - "sp-runtime", - "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", -] - -[[package]] -name = "pallet-beefy" -version = "28.0.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" -dependencies = [ - "frame-support", - "frame-system", - "log", - "pallet-authorship", - "pallet-session", - "parity-scale-codec", - "scale-info", - "serde", - "sp-consensus-beefy", - "sp-runtime", - "sp-session", - "sp-staking", - "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", -] - -[[package]] -name = "pallet-beefy-etf" -version = "28.0.0" -dependencies = [ - "ark-bls12-377", - "ark-serialize 0.4.2", - "ark-std 0.4.0", - "frame-support", - "frame-system", - "getrandom", - "log", - "pallet-authorship", - "pallet-etf", - "pallet-session", - "parity-scale-codec", - "scale-info", - "serde", - "sp-consensus-beefy-etf 13.0.0", - "sp-runtime", - "sp-session", - "sp-staking", - "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", -] - -[[package]] -name = "pallet-beefy-mmr" -version = "28.0.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" -dependencies = [ - "array-bytes 6.2.2", - "binary-merkle-tree", - "frame-support", - "frame-system", - "log", - "pallet-beefy", - "pallet-mmr", - "pallet-session", - "parity-scale-codec", - "scale-info", - "serde", - "sp-api", - "sp-consensus-beefy", - "sp-core", - "sp-io", - "sp-runtime", - "sp-state-machine", - "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", -] - -[[package]] -name = "pallet-beefy-mmr-etf" -version = "28.0.0" -dependencies = [ - "array-bytes 6.2.2", - "binary-merkle-tree", - "frame-support", - "frame-system", - "log", - "pallet-beefy-etf", - "pallet-mmr", - "pallet-session", - "parity-scale-codec", - "scale-info", - "serde", - "sp-api", - "sp-consensus-beefy-etf 13.0.0", - "sp-core", - "sp-io", - "sp-runtime", - "sp-state-machine", - "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", -] - -[[package]] -name = "pallet-bounties" -version = "27.0.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" -dependencies = [ - "frame-benchmarking", - "frame-support", - "frame-system", - "log", - "pallet-treasury", - "parity-scale-codec", - "scale-info", - "sp-core", - "sp-io", - "sp-runtime", - "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", -] - -[[package]] -name = "pallet-bridge-grandpa" -version = "0.7.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" -dependencies = [ - "bp-header-chain", - "bp-runtime", - "bp-test-utils", - "finality-grandpa", - "frame-benchmarking", - "frame-support", - "frame-system", - "log", - "parity-scale-codec", - "scale-info", - "sp-consensus-grandpa", - "sp-runtime", - "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", - "sp-trie", -] - -[[package]] -name = "pallet-bridge-messages" -version = "0.7.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" -dependencies = [ - "bp-messages", - "bp-runtime", - "frame-benchmarking", - "frame-support", - "frame-system", - "log", - "num-traits", - "parity-scale-codec", - "scale-info", - "sp-runtime", - "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", -] - -[[package]] -name = "pallet-bridge-parachains" -version = "0.7.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" -dependencies = [ - "bp-header-chain", - "bp-parachains", - "bp-polkadot-core", - "bp-runtime", - "frame-benchmarking", - "frame-support", - "frame-system", - "log", - "pallet-bridge-grandpa", - "parity-scale-codec", - "scale-info", - "sp-runtime", - "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", - "sp-trie", -] - -[[package]] -name = "pallet-bridge-relayers" -version = "0.7.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" -dependencies = [ - "bp-messages", - "bp-relayers", - "bp-runtime", - "frame-benchmarking", - "frame-support", - "frame-system", - "log", - "pallet-bridge-messages", - "parity-scale-codec", - "scale-info", - "sp-arithmetic", - "sp-runtime", - "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", -] - -[[package]] -name = "pallet-broker" -version = "0.6.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" -dependencies = [ - "bitvec", - "frame-benchmarking", - "frame-support", - "frame-system", - "log", - "parity-scale-codec", - "scale-info", - "sp-api", - "sp-arithmetic", - "sp-core", - "sp-runtime", - "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", -] - -[[package]] -name = "pallet-child-bounties" -version = "27.0.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" -dependencies = [ - "frame-benchmarking", - "frame-support", - "frame-system", - "log", - "pallet-bounties", - "pallet-treasury", - "parity-scale-codec", - "scale-info", - "sp-core", - "sp-io", - "sp-runtime", - "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", -] - -[[package]] -name = "pallet-collator-selection" -version = "9.0.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" -dependencies = [ - "frame-benchmarking", - "frame-support", - "frame-system", - "log", - "pallet-authorship", - "pallet-balances", - "pallet-session", - "parity-scale-codec", - "rand", - "scale-info", - "sp-runtime", - "sp-staking", - "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", -] - -[[package]] -name = "pallet-collective" -version = "28.0.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" -dependencies = [ - "frame-benchmarking", - "frame-support", - "frame-system", - "log", - "parity-scale-codec", - "scale-info", - "sp-core", - "sp-io", - "sp-runtime", - "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", -] - -[[package]] -name = "pallet-collective-content" -version = "0.6.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" -dependencies = [ - "frame-benchmarking", - "frame-support", - "frame-system", - "parity-scale-codec", - "scale-info", - "sp-core", - "sp-runtime", - "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", -] - -[[package]] -name = "pallet-contracts" -version = "27.0.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" -dependencies = [ - "bitflags 1.3.2", - "environmental", - "frame-benchmarking", - "frame-support", - "frame-system", - "impl-trait-for-tuples", - "log", - "pallet-balances", - "pallet-contracts-proc-macro", - "pallet-contracts-uapi", - "parity-scale-codec", - "paste", - "rand", - "scale-info", - "serde", - "smallvec", - "sp-api", - "sp-core", - "sp-io", - "sp-runtime", - "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", - "staging-xcm", - "staging-xcm-builder", - "wasm-instrument", - "wasmi 0.32.3", -] - -[[package]] -name = "pallet-contracts-mock-network" -version = "3.0.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" -dependencies = [ - "frame-support", - "frame-system", - "pallet-assets", - "pallet-balances", - "pallet-contracts", - "pallet-contracts-proc-macro", - "pallet-contracts-uapi", - "pallet-insecure-randomness-collective-flip", - "pallet-message-queue", - "pallet-proxy 28.0.0", - "pallet-timestamp", - "pallet-utility", - "pallet-xcm", - "parity-scale-codec", - "polkadot-parachain-primitives", - "polkadot-primitives", - "polkadot-runtime-parachains", - "scale-info", - "sp-api", - "sp-core", - "sp-io", - "sp-keystore", - "sp-runtime", - "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", - "sp-tracing 16.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", - "staging-xcm", - "staging-xcm-builder", - "staging-xcm-executor", - "xcm-simulator", -] - -[[package]] -name = "pallet-contracts-proc-macro" -version = "18.0.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.77", -] - -[[package]] -name = "pallet-contracts-uapi" -version = "5.0.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" -dependencies = [ - "bitflags 1.3.2", - "parity-scale-codec", - "paste", - "polkavm-derive", - "scale-info", -] - -[[package]] -name = "pallet-conviction-voting" -version = "28.0.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" -dependencies = [ - "assert_matches", - "frame-benchmarking", - "frame-support", - "frame-system", - "parity-scale-codec", - "scale-info", - "serde", - "sp-io", - "sp-runtime", - "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", -] - -[[package]] -name = "pallet-core-fellowship" -version = "12.0.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" -dependencies = [ - "frame-benchmarking", - "frame-support", - "frame-system", - "log", - "pallet-ranked-collective", - "parity-scale-codec", - "scale-info", - "sp-arithmetic", - "sp-core", - "sp-io", - "sp-runtime", - "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", -] - -[[package]] -name = "pallet-delegated-staking" -version = "1.0.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" -dependencies = [ - "frame-support", - "frame-system", - "parity-scale-codec", - "scale-info", - "sp-runtime", - "sp-staking", - "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", -] - -[[package]] -name = "pallet-democracy" -version = "28.0.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" -dependencies = [ - "frame-benchmarking", - "frame-support", - "frame-system", - "log", - "parity-scale-codec", - "scale-info", - "serde", - "sp-core", - "sp-io", - "sp-runtime", - "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", -] - -[[package]] -name = "pallet-dev-mode" -version = "10.0.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" -dependencies = [ - "frame-support", - "frame-system", - "log", - "pallet-balances", - "parity-scale-codec", - "scale-info", - "sp-io", - "sp-runtime", - "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", -] - -[[package]] -name = "pallet-election-provider-multi-phase" -version = "27.0.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" -dependencies = [ - "frame-benchmarking", - "frame-election-provider-support", - "frame-support", - "frame-system", - "log", - "pallet-election-provider-support-benchmarking", - "parity-scale-codec", - "rand", - "scale-info", - "sp-arithmetic", - "sp-core", - "sp-io", - "sp-npos-elections", - "sp-runtime", - "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", - "strum 0.26.3", -] - -[[package]] -name = "pallet-election-provider-support-benchmarking" -version = "27.0.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" -dependencies = [ - "frame-benchmarking", - "frame-election-provider-support", - "frame-system", - "parity-scale-codec", - "sp-npos-elections", - "sp-runtime", - "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", -] - -[[package]] -name = "pallet-elections-phragmen" -version = "29.0.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" -dependencies = [ - "frame-benchmarking", - "frame-support", - "frame-system", - "log", - "parity-scale-codec", - "scale-info", - "sp-core", - "sp-io", - "sp-npos-elections", - "sp-runtime", - "sp-staking", - "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", -] - -[[package]] -name = "pallet-etf" -version = "28.0.0" -dependencies = [ - "ark-bls12-377", - "ark-serialize 0.4.2", - "ark-std 0.4.0", - "frame-support", - "frame-system", - "getrandom", - "log", - "pallet-authorship", - "pallet-session", - "parity-scale-codec", - "scale-info", - "serde", - "sp-consensus-beefy-etf 13.0.0", - "sp-runtime", - "sp-session", - "sp-staking", - "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", -] - -[[package]] -name = "pallet-example-mbm" -version = "0.1.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" -dependencies = [ - "frame-support", - "frame-system", - "log", - "pallet-migrations", - "parity-scale-codec", - "scale-info", - "sp-io", -] - -[[package]] -name = "pallet-example-tasks" -version = "1.0.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" -dependencies = [ - "frame-benchmarking", - "frame-support", - "frame-system", - "log", - "parity-scale-codec", - "scale-info", - "sp-core", - "sp-io", - "sp-runtime", - "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", -] - -[[package]] -name = "pallet-fast-unstake" -version = "27.0.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" -dependencies = [ - "docify", - "frame-benchmarking", - "frame-election-provider-support", - "frame-support", - "frame-system", - "log", - "parity-scale-codec", - "scale-info", - "sp-io", - "sp-runtime", - "sp-staking", - "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", -] - -[[package]] -name = "pallet-glutton" -version = "14.0.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" -dependencies = [ - "blake2", - "frame-benchmarking", - "frame-support", - "frame-system", - "log", - "parity-scale-codec", - "scale-info", - "sp-core", - "sp-inherents", - "sp-io", - "sp-runtime", - "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", -] - -[[package]] -name = "pallet-grandpa" -version = "28.0.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" -dependencies = [ - "frame-benchmarking", - "frame-support", - "frame-system", - "log", - "pallet-authorship", - "pallet-session", - "parity-scale-codec", - "scale-info", - "sp-application-crypto", - "sp-consensus-grandpa", - "sp-core", - "sp-io", - "sp-runtime", - "sp-session", - "sp-staking", - "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", -] - -[[package]] -name = "pallet-identity" -version = "29.0.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" -dependencies = [ - "enumflags2", - "frame-benchmarking", - "frame-support", - "frame-system", - "log", - "parity-scale-codec", - "scale-info", - "sp-io", - "sp-runtime", - "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", -] - -[[package]] -name = "pallet-im-online" -version = "27.0.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" -dependencies = [ - "frame-benchmarking", - "frame-support", - "frame-system", - "log", - "pallet-authorship", - "parity-scale-codec", - "scale-info", - "sp-application-crypto", - "sp-core", - "sp-io", - "sp-runtime", - "sp-staking", - "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", -] - -[[package]] -name = "pallet-indices" -version = "28.0.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" -dependencies = [ - "frame-benchmarking", - "frame-support", - "frame-system", - "parity-scale-codec", - "scale-info", - "sp-core", - "sp-io", - "sp-keyring", - "sp-runtime", - "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", -] - -[[package]] -name = "pallet-insecure-randomness-collective-flip" -version = "16.0.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" -dependencies = [ - "frame-support", - "frame-system", - "parity-scale-codec", - "safe-mix", - "scale-info", - "sp-runtime", - "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", -] - -[[package]] -name = "pallet-lottery" -version = "28.0.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" -dependencies = [ - "frame-benchmarking", - "frame-support", - "frame-system", - "parity-scale-codec", - "scale-info", - "sp-runtime", - "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", -] - -[[package]] -name = "pallet-membership" -version = "28.0.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" -dependencies = [ - "frame-benchmarking", - "frame-support", - "frame-system", - "log", - "parity-scale-codec", - "scale-info", - "sp-core", - "sp-io", - "sp-runtime", - "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", -] - -[[package]] -name = "pallet-message-queue" -version = "31.0.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" -dependencies = [ - "environmental", - "frame-benchmarking", - "frame-support", - "frame-system", - "log", - "parity-scale-codec", - "scale-info", - "sp-arithmetic", - "sp-core", - "sp-io", - "sp-runtime", - "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", - "sp-weights", -] - -[[package]] -name = "pallet-migrations" -version = "1.0.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" -dependencies = [ - "docify", - "frame-benchmarking", - "frame-support", - "frame-system", - "impl-trait-for-tuples", - "log", - "parity-scale-codec", - "scale-info", - "sp-core", - "sp-runtime", - "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", -] - -[[package]] -name = "pallet-mixnet" -version = "0.4.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" -dependencies = [ - "frame-benchmarking", - "frame-support", - "frame-system", - "log", - "parity-scale-codec", - "scale-info", - "serde", - "sp-application-crypto", - "sp-arithmetic", - "sp-io", - "sp-mixnet", - "sp-runtime", - "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", -] - -[[package]] -name = "pallet-mmr" -version = "27.0.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" -dependencies = [ - "frame-benchmarking", - "frame-support", - "frame-system", - "log", - "parity-scale-codec", - "scale-info", - "sp-core", - "sp-io", - "sp-mmr-primitives", - "sp-runtime", - "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", -] - -[[package]] -name = "pallet-multisig" -version = "28.0.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" -dependencies = [ - "frame-benchmarking", - "frame-support", - "frame-system", - "log", - "parity-scale-codec", - "scale-info", - "sp-io", - "sp-runtime", - "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", -] - -[[package]] -name = "pallet-murmur" -version = "4.0.0-dev" -dependencies = [ - "ark-bls12-381", - "ark-serialize 0.4.2", - "array-bytes 4.2.0", - "ckb-merkle-mountain-range", - "frame-benchmarking", - "frame-support", - "frame-system", - "log", - "murmur-core", - "pallet-proxy 28.1.0", - "pallet-randomness-beacon", - "parity-scale-codec", - "primitive-types", - "scale-info", - "serde", - "sha3", - "sp-core", - "sp-runtime", - "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", -] - -[[package]] -name = "pallet-nft-fractionalization" -version = "10.0.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" -dependencies = [ - "frame-benchmarking", - "frame-support", - "frame-system", - "log", - "pallet-assets", - "pallet-nfts", - "parity-scale-codec", - "scale-info", - "sp-runtime", - "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", +checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" +dependencies = [ + "unicode-bidi", + "unicode-normalization", ] [[package]] -name = "pallet-nfts" -version = "22.0.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +name = "impl-codec" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba6a270039626615617f3f36d15fc827041df3b78c439da2cadfa47455a77f2f" dependencies = [ - "enumflags2", - "frame-benchmarking", - "frame-support", - "frame-system", - "log", "parity-scale-codec", - "scale-info", - "sp-core", - "sp-io", - "sp-runtime", - "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", ] [[package]] -name = "pallet-nfts-runtime-api" -version = "14.0.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +name = "impl-serde" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc88fc67028ae3db0c853baa36269d398d5f45b6982f95549ff5def78c935cd" dependencies = [ - "pallet-nfts", - "parity-scale-codec", - "sp-api", - "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", + "serde", ] [[package]] -name = "pallet-nis" -version = "28.0.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +name = "impl-trait-for-tuples" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11d7a9f6330b71fea57921c9b61c47ee6e84f72d394754eff6163ae67e7395eb" dependencies = [ - "frame-benchmarking", - "frame-support", - "frame-system", - "parity-scale-codec", - "scale-info", - "sp-arithmetic", - "sp-core", - "sp-runtime", - "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", + "proc-macro2", + "quote", + "syn 1.0.109", ] [[package]] -name = "pallet-node-authorization" -version = "28.0.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +name = "indexmap" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68b900aa2f7301e21c36462b170ee99994de34dff39a4a6a528e80e7376d07e5" dependencies = [ - "frame-support", - "frame-system", - "log", - "parity-scale-codec", - "scale-info", - "sp-core", - "sp-io", - "sp-runtime", - "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", + "equivalent", + "hashbrown 0.14.5", ] [[package]] -name = "pallet-nomination-pools" -version = "25.0.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" -dependencies = [ - "frame-support", - "frame-system", - "log", - "pallet-balances", - "parity-scale-codec", - "scale-info", - "sp-core", - "sp-io", - "sp-runtime", - "sp-staking", - "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", - "sp-tracing 16.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", -] +name = "indexmap-nostd" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e04e2fd2b8188ea827b32ef11de88377086d690286ab35747ef7f9bf3ccb590" [[package]] -name = "pallet-nomination-pools-benchmarking" -version = "26.0.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +name = "inout" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0c10553d664a4d0bcff9f4215d0aac67a639cc68ef660840afe309b807bc9f5" dependencies = [ - "frame-benchmarking", - "frame-election-provider-support", - "frame-support", - "frame-system", - "pallet-bags-list", - "pallet-delegated-staking", - "pallet-nomination-pools", - "pallet-staking", - "parity-scale-codec", - "scale-info", - "sp-runtime", - "sp-runtime-interface 24.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", - "sp-staking", - "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", + "generic-array", ] [[package]] -name = "pallet-nomination-pools-runtime-api" -version = "23.0.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +name = "instability" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b23a0c8dfe501baac4adf6ebbfa6eddf8f0c07f56b058cc1288017e32397846c" dependencies = [ - "pallet-nomination-pools", - "parity-scale-codec", - "sp-api", - "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", + "quote", + "syn 2.0.77", ] [[package]] -name = "pallet-offences" -version = "27.0.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +name = "instant" +version = "0.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0242819d153cba4b4b05a5a8f2a7e9bbf97b6055b2a002b395c96b5ff3c0222" dependencies = [ - "frame-support", - "frame-system", - "log", - "pallet-balances", - "parity-scale-codec", - "scale-info", - "serde", - "sp-runtime", - "sp-staking", - "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", + "cfg-if", ] [[package]] -name = "pallet-offences-benchmarking" -version = "28.0.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +name = "integer-sqrt" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "276ec31bcb4a9ee45f58bec6f9ec700ae4cf4f4f8f2fa7e06cb406bd5ffdd770" dependencies = [ - "frame-benchmarking", - "frame-election-provider-support", - "frame-support", - "frame-system", - "log", - "pallet-babe", - "pallet-balances", - "pallet-grandpa", - "pallet-im-online", - "pallet-offences", - "pallet-session", - "pallet-staking", - "parity-scale-codec", - "scale-info", - "sp-runtime", - "sp-staking", - "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", + "num-traits", ] [[package]] -name = "pallet-paged-list" -version = "0.6.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" -dependencies = [ - "docify", - "frame-benchmarking", - "frame-support", - "frame-system", - "parity-scale-codec", - "scale-info", - "sp-core", - "sp-io", - "sp-metadata-ir", - "sp-runtime", - "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", -] +name = "is_terminal_polyfill" +version = "1.70.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" [[package]] -name = "pallet-parameters" -version = "0.1.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +name = "itertools" +version = "0.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" dependencies = [ - "docify", - "frame-benchmarking", - "frame-support", - "frame-system", - "parity-scale-codec", - "paste", - "scale-info", - "serde", - "sp-core", - "sp-runtime", - "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", + "either", ] [[package]] -name = "pallet-preimage" -version = "28.0.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +name = "itertools" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1c173a5686ce8bfa551b3563d0c2170bf24ca44da99c7ca4bfdab5418c3fe57" dependencies = [ - "frame-benchmarking", - "frame-support", - "frame-system", - "log", - "parity-scale-codec", - "scale-info", - "sp-core", - "sp-io", - "sp-runtime", - "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", + "either", ] [[package]] -name = "pallet-proxy" -version = "28.0.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +name = "itertools" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" dependencies = [ - "frame-benchmarking", - "frame-support", - "frame-system", - "parity-scale-codec", - "scale-info", - "sp-io", - "sp-runtime", - "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", + "either", ] [[package]] -name = "pallet-proxy" -version = "28.1.0" +name = "itertools" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" dependencies = [ - "frame-benchmarking", - "frame-support", - "frame-system", - "parity-scale-codec", - "scale-info", - "sp-io", - "sp-runtime", - "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", + "either", ] [[package]] -name = "pallet-randomness-beacon" -version = "28.0.0" +name = "itoa" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" + +[[package]] +name = "js-sys" +version = "0.3.70" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1868808506b929d7b0cfa8f75951347aa71bb21144b7791bae35d9bccfcfe37a" dependencies = [ - "ark-bls12-377", - "ark-ff 0.4.2", - "ark-serialize 0.4.2", - "ark-std 0.4.0", - "array-bytes 6.2.2", - "etf-crypto-primitives 0.2.4 (git+https://github.com/ideal-lab5/etf-sdk.git?branch=dev)", - "frame-support", - "frame-system", - "log", - "pallet-authorship", - "pallet-beefy-etf", - "pallet-etf", - "pallet-session", - "parity-scale-codec", - "scale-info", - "serde", - "sha2 0.10.8", - "sha3", - "sp-consensus-beefy-etf 13.0.0", - "sp-runtime", - "sp-session", - "sp-staking", - "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", - "w3f-bls", + "wasm-bindgen", ] [[package]] -name = "pallet-ranked-collective" -version = "28.0.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +name = "jsonrpsee" +version = "0.22.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfdb12a2381ea5b2e68c3469ec604a007b367778cdb14d09612c8069ebd616ad" dependencies = [ - "frame-benchmarking", - "frame-support", - "frame-system", - "impl-trait-for-tuples", - "log", - "parity-scale-codec", - "scale-info", - "sp-arithmetic", - "sp-core", - "sp-io", - "sp-runtime", - "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", + "jsonrpsee-client-transport", + "jsonrpsee-core", + "jsonrpsee-http-client", + "jsonrpsee-types", ] [[package]] -name = "pallet-recovery" -version = "28.0.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +name = "jsonrpsee-client-transport" +version = "0.22.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4978087a58c3ab02efc5b07c5e5e2803024536106fd5506f558db172c889b3aa" dependencies = [ - "frame-benchmarking", - "frame-support", - "frame-system", - "parity-scale-codec", - "scale-info", - "sp-io", - "sp-runtime", - "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", + "futures-util", + "http", + "jsonrpsee-core", + "pin-project", + "rustls-native-certs 0.7.3", + "rustls-pki-types", + "soketto", + "thiserror", + "tokio", + "tokio-rustls 0.25.0", + "tokio-util", + "tracing", + "url", ] [[package]] -name = "pallet-referenda" -version = "28.0.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +name = "jsonrpsee-core" +version = "0.22.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4b257e1ec385e07b0255dde0b933f948b5c8b8c28d42afda9587c3a967b896d" dependencies = [ - "frame-benchmarking", - "frame-support", - "frame-system", - "log", - "parity-scale-codec", - "scale-info", + "anyhow", + "async-trait", + "beef", + "futures-timer", + "futures-util", + "hyper", + "jsonrpsee-types", + "pin-project", + "rustc-hash", "serde", - "sp-arithmetic", - "sp-io", - "sp-runtime", - "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", + "serde_json", + "thiserror", + "tokio", + "tokio-stream", + "tracing", ] [[package]] -name = "pallet-remark" -version = "28.0.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +name = "jsonrpsee-http-client" +version = "0.22.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ccf93fc4a0bfe05d851d37d7c32b7f370fe94336b52a2f0efc5f1981895c2e5" dependencies = [ - "frame-benchmarking", - "frame-support", - "frame-system", - "parity-scale-codec", - "scale-info", + "async-trait", + "hyper", + "hyper-rustls", + "jsonrpsee-core", + "jsonrpsee-types", "serde", - "sp-core", - "sp-io", - "sp-runtime", - "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", + "serde_json", + "thiserror", + "tokio", + "tower", + "tracing", + "url", ] [[package]] -name = "pallet-root-offences" -version = "25.0.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +name = "jsonrpsee-types" +version = "0.22.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "150d6168405890a7a3231a3c74843f58b8959471f6df76078db2619ddee1d07d" dependencies = [ - "frame-support", - "frame-system", - "pallet-session", - "pallet-staking", - "parity-scale-codec", - "scale-info", - "sp-runtime", - "sp-staking", + "anyhow", + "beef", + "serde", + "serde_json", + "thiserror", ] [[package]] -name = "pallet-root-testing" -version = "4.0.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +name = "k256" +version = "0.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6e3919bbaa2945715f0bb6d3934a173d1e9a59ac23767fbaaef277265a7411b" dependencies = [ - "frame-support", - "frame-system", - "parity-scale-codec", - "scale-info", - "sp-core", - "sp-io", - "sp-runtime", - "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", + "cfg-if", + "ecdsa", + "elliptic-curve", + "once_cell", + "serdect", + "sha2 0.10.8", ] [[package]] -name = "pallet-safe-mode" -version = "9.0.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +name = "keccak" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ecc2af9a1119c51f12a14607e783cb977bde58bc069ff0c3da1095e635d70654" dependencies = [ - "docify", - "frame-benchmarking", - "frame-support", - "frame-system", - "pallet-balances", - "pallet-proxy 28.0.0", - "pallet-utility", - "parity-scale-codec", - "scale-info", - "sp-arithmetic", - "sp-runtime", - "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", + "cpufeatures", ] [[package]] -name = "pallet-salary" -version = "13.0.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" -dependencies = [ - "frame-benchmarking", - "frame-support", - "frame-system", - "log", - "pallet-ranked-collective", - "parity-scale-codec", - "scale-info", - "sp-arithmetic", - "sp-core", - "sp-io", - "sp-runtime", - "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", -] +name = "lazy_static" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" [[package]] -name = "pallet-scheduler" -version = "4.0.0-dev" -dependencies = [ - "docify", - "frame-benchmarking", - "frame-support", - "frame-system", - "log", - "pallet-randomness-beacon", - "parity-scale-codec", - "scale-info", - "sp-io", - "sp-runtime", - "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", - "sp-weights", -] +name = "libc" +version = "0.2.158" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8adc4bb1803a324070e64a98ae98f38934d91957a99cfb3a43dcbc01bc56439" [[package]] -name = "pallet-scheduler" -version = "29.0.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" -dependencies = [ - "docify", - "frame-benchmarking", - "frame-support", - "frame-system", - "log", - "parity-scale-codec", - "scale-info", - "sp-io", - "sp-runtime", - "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", - "sp-weights", -] +name = "libm" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058" [[package]] -name = "pallet-scored-pool" -version = "28.0.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +name = "libsecp256k1" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95b09eff1b35ed3b33b877ced3a691fc7a481919c7e29c53c906226fcf55e2a1" dependencies = [ - "frame-support", - "frame-system", - "parity-scale-codec", - "scale-info", - "sp-io", - "sp-runtime", - "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", + "arrayref", + "base64 0.13.1", + "digest 0.9.0", + "hmac-drbg", + "libsecp256k1-core", + "libsecp256k1-gen-ecmult", + "libsecp256k1-gen-genmult", + "rand", + "serde", + "sha2 0.9.9", + "typenum", ] [[package]] -name = "pallet-session" -version = "28.0.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +name = "libsecp256k1-core" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5be9b9bb642d8522a44d533eab56c16c738301965504753b03ad1de3425d5451" dependencies = [ - "frame-support", - "frame-system", - "impl-trait-for-tuples", - "log", - "pallet-timestamp", - "parity-scale-codec", - "scale-info", - "sp-core", - "sp-io", - "sp-runtime", - "sp-session", - "sp-staking", - "sp-state-machine", - "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", - "sp-trie", + "crunchy", + "digest 0.9.0", + "subtle", ] [[package]] -name = "pallet-session-benchmarking" -version = "28.0.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +name = "libsecp256k1-gen-ecmult" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3038c808c55c87e8a172643a7d87187fc6c4174468159cb3090659d55bcb4809" dependencies = [ - "frame-benchmarking", - "frame-support", - "frame-system", - "pallet-session", - "pallet-staking", - "parity-scale-codec", - "rand", - "sp-runtime", - "sp-session", - "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", + "libsecp256k1-core", ] [[package]] -name = "pallet-skip-feeless-payment" -version = "3.0.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +name = "libsecp256k1-gen-genmult" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3db8d6ba2cec9eacc40e6e8ccc98931840301f1006e95647ceb2dd5c3aa06f7c" dependencies = [ - "frame-support", - "frame-system", - "parity-scale-codec", - "scale-info", - "sp-runtime", - "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", + "libsecp256k1-core", ] [[package]] -name = "pallet-society" -version = "28.0.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" -dependencies = [ - "frame-benchmarking", - "frame-support", - "frame-system", - "log", - "parity-scale-codec", - "rand_chacha", - "scale-info", - "sp-arithmetic", - "sp-io", - "sp-runtime", - "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", -] +name = "linux-raw-sys" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" [[package]] -name = "pallet-staking" -version = "28.0.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +name = "lock_api" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" dependencies = [ - "frame-benchmarking", - "frame-election-provider-support", - "frame-support", - "frame-system", - "log", - "pallet-authorship", - "pallet-session", - "parity-scale-codec", - "scale-info", - "serde", - "sp-application-crypto", - "sp-io", - "sp-runtime", - "sp-staking", - "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", + "autocfg", + "scopeguard", ] [[package]] -name = "pallet-staking-reward-curve" -version = "11.0.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" -dependencies = [ - "proc-macro-crate 3.1.0", - "proc-macro2", - "quote", - "syn 2.0.77", -] +name = "log" +version = "0.4.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" [[package]] -name = "pallet-staking-reward-fn" -version = "19.0.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +name = "lru" +version = "0.12.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37ee39891760e7d94734f6f63fedc29a2e4a152f836120753a72503f09fcf904" dependencies = [ - "log", - "sp-arithmetic", + "hashbrown 0.14.5", ] [[package]] -name = "pallet-staking-runtime-api" -version = "14.0.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +name = "matchers" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558" dependencies = [ - "parity-scale-codec", - "sp-api", - "sp-staking", + "regex-automata 0.1.10", ] [[package]] -name = "pallet-state-trie-migration" -version = "29.0.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +name = "memchr" +version = "2.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" + +[[package]] +name = "memory-db" +version = "0.32.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "808b50db46293432a45e63bc15ea51e0ab4c0a1647b8eb114e31a3e698dd6fbe" dependencies = [ - "frame-benchmarking", - "frame-support", - "frame-system", - "log", - "parity-scale-codec", - "scale-info", - "sp-core", - "sp-io", - "sp-runtime", - "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", + "hash-db", ] [[package]] -name = "pallet-statement" -version = "10.0.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" -dependencies = [ - "frame-support", - "frame-system", - "log", - "parity-scale-codec", - "scale-info", - "sp-api", - "sp-core", - "sp-io", - "sp-runtime", - "sp-statement-store", - "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", +name = "merlin" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "58c38e2799fc0978b65dfff8023ec7843e2330bb462f19198840b34b6582397d" +dependencies = [ + "byteorder", + "keccak", + "rand_core", + "zeroize", ] [[package]] -name = "pallet-sudo" -version = "28.0.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +name = "minimal-lexical" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" + +[[package]] +name = "miniz_oxide" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2d80299ef12ff69b16a84bb182e3b9df68b5a91574d3d4fa6e41b65deec4df1" dependencies = [ - "docify", - "frame-benchmarking", - "frame-support", - "frame-system", - "parity-scale-codec", - "scale-info", - "sp-io", - "sp-runtime", - "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", + "adler2", ] [[package]] -name = "pallet-timestamp" -version = "27.0.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +name = "mio" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80e04d1dcff3aae0704555fe5fee3bcfaf3d1fdf8a7e521d5b9d2b42acb52cec" dependencies = [ - "docify", - "frame-benchmarking", - "frame-support", - "frame-system", + "hermit-abi 0.3.9", + "libc", "log", - "parity-scale-codec", - "scale-info", - "sp-inherents", - "sp-io", - "sp-runtime", - "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", - "sp-storage 19.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", - "sp-timestamp", + "wasi", + "windows-sys 0.52.0", ] [[package]] -name = "pallet-tips" -version = "27.0.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +name = "murmur-cli" +version = "0.1.0" dependencies = [ - "frame-benchmarking", - "frame-support", - "frame-system", - "log", - "pallet-treasury", + "ark-bls12-377", + "ark-ec", + "ark-ff", + "ark-serialize", + "ark-std", + "array-bytes", + "ckb-merkle-mountain-range", + "clap", + "crossterm", + "etf-crypto-primitives 0.2.4 (git+https://github.com/ideal-lab5/etf-sdk/?branch=tony/dev)", + "getrandom", + "hex", + "murmur-core", "parity-scale-codec", - "scale-info", + "rand_chacha", + "rand_core", + "ratatui", "serde", + "serde_cbor", + "serde_json", + "sha3", + "sp-consensus-beefy-etf", "sp-core", - "sp-io", - "sp-runtime", - "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", + "subxt", + "subxt-signer", + "tokio", + "w3f-bls", ] [[package]] -name = "pallet-transaction-payment" -version = "28.0.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +name = "murmur-core" +version = "0.1.0" dependencies = [ - "frame-support", - "frame-system", + "ark-bls12-377", + "ark-ff", + "ark-serialize", + "ark-std", + "array-bytes", + "ckb-merkle-mountain-range", + "etf-crypto-primitives 0.2.4 (git+https://github.com/ideal-lab5/etf-sdk/?branch=dev)", + "getrandom", + "hex", "parity-scale-codec", - "scale-info", + "rand_core", "serde", - "sp-core", - "sp-io", - "sp-runtime", - "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", + "sha3", + "totp-rs", + "w3f-bls", ] [[package]] -name = "pallet-transaction-payment-rpc-runtime-api" -version = "28.0.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" -dependencies = [ - "pallet-transaction-payment", - "parity-scale-codec", - "sp-api", - "sp-runtime", - "sp-weights", -] +name = "no-std-net" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43794a0ace135be66a25d3ae77d41b91615fb68ae937f904090203e81f755b65" [[package]] -name = "pallet-transaction-storage" -version = "27.0.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" -dependencies = [ - "frame-benchmarking", - "frame-support", - "frame-system", - "log", - "pallet-balances", - "parity-scale-codec", - "scale-info", - "serde", - "sp-inherents", - "sp-io", - "sp-runtime", - "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", - "sp-transaction-storage-proof", -] +name = "nodrop" +version = "0.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72ef4a56884ca558e5ddb05a1d1e7e1bfd9a68d9ed024c21704cc98872dae1bb" [[package]] -name = "pallet-treasury" -version = "27.0.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" -dependencies = [ - "docify", - "frame-benchmarking", - "frame-support", - "frame-system", - "impl-trait-for-tuples", - "pallet-balances", - "parity-scale-codec", - "scale-info", - "serde", - "sp-core", - "sp-runtime", - "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", -] +name = "nohash-hasher" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2bf50223579dc7cdcfb3bfcacf7069ff68243f8c363f62ffa99cf000a6b9c451" [[package]] -name = "pallet-tx-pause" -version = "9.0.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +name = "nom" +version = "7.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" dependencies = [ - "docify", - "frame-benchmarking", - "frame-support", - "frame-system", - "pallet-balances", - "pallet-proxy 28.0.0", - "pallet-utility", - "parity-scale-codec", - "scale-info", - "sp-runtime", - "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", + "memchr", + "minimal-lexical", ] [[package]] -name = "pallet-uniques" -version = "28.0.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +name = "nu-ansi-term" +version = "0.46.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" dependencies = [ - "frame-benchmarking", - "frame-support", - "frame-system", - "log", - "parity-scale-codec", - "scale-info", - "sp-runtime", - "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", + "overload", + "winapi", ] [[package]] -name = "pallet-utility" -version = "28.0.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +name = "num-bigint" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" dependencies = [ - "frame-benchmarking", - "frame-support", - "frame-system", - "parity-scale-codec", - "scale-info", - "sp-core", - "sp-io", - "sp-runtime", - "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", + "num-integer", + "num-traits", ] [[package]] -name = "pallet-vesting" -version = "28.0.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +name = "num-conv" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" + +[[package]] +name = "num-format" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a652d9771a63711fd3c3deb670acfbe5c30a4072e664d7a3bf5a9e1056ac72c3" dependencies = [ - "frame-benchmarking", - "frame-support", - "frame-system", - "log", - "parity-scale-codec", - "scale-info", - "sp-runtime", - "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", + "arrayvec 0.7.6", + "itoa", ] [[package]] -name = "pallet-whitelist" -version = "27.0.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +name = "num-integer" +version = "0.1.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" dependencies = [ - "frame-benchmarking", - "frame-support", - "frame-system", - "parity-scale-codec", - "scale-info", - "sp-api", - "sp-runtime", - "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", + "num-traits", ] [[package]] -name = "pallet-xcm" -version = "7.0.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +name = "num-rational" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f83d14da390562dca69fc84082e73e548e1ad308d24accdedd2720017cb37824" dependencies = [ - "bounded-collections", - "frame-benchmarking", - "frame-support", - "frame-system", - "log", - "pallet-balances", - "parity-scale-codec", - "scale-info", - "serde", - "sp-core", - "sp-io", - "sp-runtime", - "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", - "staging-xcm", - "staging-xcm-builder", - "staging-xcm-executor", - "xcm-fee-payment-runtime-api", + "num-bigint", + "num-integer", + "num-traits", ] [[package]] -name = "pallet-xcm-benchmarks" -version = "7.0.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" dependencies = [ - "frame-benchmarking", - "frame-support", - "frame-system", - "log", - "parity-scale-codec", - "scale-info", - "sp-io", - "sp-runtime", - "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", - "staging-xcm", - "staging-xcm-builder", - "staging-xcm-executor", + "autocfg", ] [[package]] -name = "pallet-xcm-bridge-hub" -version = "0.2.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +name = "num_cpus" +version = "1.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" dependencies = [ - "bp-messages", - "bp-runtime", - "bp-xcm-bridge-hub", - "bridge-runtime-common", - "frame-support", - "frame-system", - "log", - "pallet-bridge-messages", - "parity-scale-codec", - "scale-info", - "sp-core", - "sp-runtime", - "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", - "staging-xcm", - "staging-xcm-builder", - "staging-xcm-executor", + "hermit-abi 0.3.9", + "libc", ] [[package]] -name = "pallet-xcm-bridge-hub-router" -version = "0.5.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +name = "object" +version = "0.36.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "084f1a5821ac4c651660a94a7153d27ac9d8a53736203f58b31945ded098070a" dependencies = [ - "bp-xcm-bridge-hub-router", - "frame-benchmarking", - "frame-support", - "frame-system", - "log", - "parity-scale-codec", - "scale-info", - "sp-core", - "sp-runtime", - "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", - "staging-xcm", - "staging-xcm-builder", + "memchr", ] [[package]] -name = "parachains-common" -version = "7.0.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" -dependencies = [ - "cumulus-primitives-core", - "cumulus-primitives-utility", - "frame-support", - "frame-system", - "log", - "pallet-asset-tx-payment", - "pallet-assets", - "pallet-authorship", - "pallet-balances", - "pallet-collator-selection", - "pallet-message-queue", - "pallet-xcm", - "parity-scale-codec", - "polkadot-primitives", - "scale-info", - "sp-consensus-aura", - "sp-core", - "sp-io", - "sp-runtime", - "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", - "staging-parachain-info", - "staging-xcm", - "staging-xcm-executor", - "substrate-wasm-builder", -] +name = "once_cell" +version = "1.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" + +[[package]] +name = "opaque-debug" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" + +[[package]] +name = "openssl-probe" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" [[package]] -name = "parachains-runtimes-test-utils" -version = "7.0.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" -dependencies = [ - "cumulus-pallet-parachain-system", - "cumulus-pallet-xcmp-queue", - "cumulus-primitives-core", - "cumulus-primitives-parachain-inherent", - "cumulus-test-relay-sproof-builder", - "frame-support", - "frame-system", - "pallet-balances", - "pallet-collator-selection", - "pallet-session", - "pallet-timestamp", - "pallet-xcm", - "parity-scale-codec", - "polkadot-parachain-primitives", - "sp-consensus-aura", - "sp-core", - "sp-io", - "sp-runtime", - "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", - "sp-tracing 16.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", - "staging-parachain-info", - "staging-xcm", - "staging-xcm-executor", - "substrate-wasm-builder", -] +name = "overload" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" [[package]] name = "parity-bip39" @@ -7044,19 +2793,13 @@ dependencies = [ "unicode-normalization", ] -[[package]] -name = "parity-bytes" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16b56e3a2420138bdb970f84dfb9c774aea80fa0e7371549eedec0d80c209c67" - [[package]] name = "parity-scale-codec" version = "3.6.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "306800abfa29c7f16596b5970a588435e3d5b3149683d00c12b699cc19f895ee" dependencies = [ - "arrayvec 0.7.4", + "arrayvec 0.7.6", "bitvec", "byte-slice-cast", "bytes", @@ -7071,41 +2814,12 @@ version = "3.6.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d830939c76d294956402033aee57a6da7b438f2294eb94864c37b0569053a42c" dependencies = [ - "proc-macro-crate 3.1.0", + "proc-macro-crate 3.2.0", "proc-macro2", "quote", "syn 1.0.109", ] -[[package]] -name = "parity-util-mem" -version = "0.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d32c34f4f5ca7f9196001c0aba5a1f9a5a12382c8944b8b0f90233282d1e8f8" -dependencies = [ - "cfg-if", - "ethereum-types", - "hashbrown 0.12.3", - "impl-trait-for-tuples", - "lru 0.8.1", - "parity-util-mem-derive", - "parking_lot", - "primitive-types", - "smallvec", - "winapi", -] - -[[package]] -name = "parity-util-mem-derive" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f557c32c6d268a07c921471619c0295f5efad3a0e76d4f97a05c091a51d110b2" -dependencies = [ - "proc-macro2", - "syn 1.0.109", - "synstructure", -] - [[package]] name = "parity-wasm" version = "0.45.0" @@ -7114,15 +2828,15 @@ checksum = "e1ad0aff30c1da14b1254fcb2af73e1fa9a28670e584a626f53a369d0e157304" [[package]] name = "parking" -version = "2.2.0" +version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb813b8af86854136c6922af0598d719255ecb2179515e6e7730d468f05c9cae" +checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" [[package]] name = "parking_lot" -version = "0.12.1" +version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" +checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" dependencies = [ "lock_api", "parking_lot_core", @@ -7130,15 +2844,15 @@ dependencies = [ [[package]] name = "parking_lot_core" -version = "0.9.9" +version = "0.9.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c42a9226546d68acdd9c0a280d17ce19bfe27a46bf68784e4066115788d008e" +checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" dependencies = [ "cfg-if", "libc", "redox_syscall", "smallvec", - "windows-targets 0.48.5", + "windows-targets", ] [[package]] @@ -7154,9 +2868,9 @@ dependencies = [ [[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 = "pbkdf2" @@ -7174,17 +2888,6 @@ version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" -[[package]] -name = "pest" -version = "2.7.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c73c26c01b8c87956cea613c907c9d6ecffd8d18a2a5908e5de0adfaa185cea" -dependencies = [ - "memchr", - "thiserror", - "ucd-trie", -] - [[package]] name = "pin-project" version = "1.1.5" @@ -7219,9 +2922,9 @@ checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" [[package]] name = "piper" -version = "0.2.1" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "668d31b1c4eba19242f2088b2bf3316b82ca31082a8335764db4e083db7485d4" +checksum = "96c8c490f422ef9a4efd2cb5b42b76c8613d7e7dfc1caf667b8a3350a5acc066" dependencies = [ "atomic-waker", "fastrand", @@ -7238,12 +2941,6 @@ dependencies = [ "spki", ] -[[package]] -name = "pkg-config" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec" - [[package]] name = "polkadot-ckb-merkle-mountain-range" version = "0.7.0" @@ -7254,477 +2951,11 @@ dependencies = [ "itertools 0.10.5", ] -[[package]] -name = "polkadot-core-primitives" -version = "7.0.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" -dependencies = [ - "parity-scale-codec", - "scale-info", - "sp-core", - "sp-runtime", - "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", -] - -[[package]] -name = "polkadot-parachain-primitives" -version = "6.0.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" -dependencies = [ - "bounded-collections", - "derive_more", - "parity-scale-codec", - "polkadot-core-primitives", - "scale-info", - "serde", - "sp-core", - "sp-runtime", - "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", - "sp-weights", -] - -[[package]] -name = "polkadot-primitives" -version = "7.0.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" -dependencies = [ - "bitvec", - "hex-literal", - "log", - "parity-scale-codec", - "polkadot-core-primitives", - "polkadot-parachain-primitives", - "scale-info", - "serde", - "sp-api", - "sp-application-crypto", - "sp-arithmetic", - "sp-authority-discovery", - "sp-consensus-slots", - "sp-core", - "sp-inherents", - "sp-io", - "sp-keystore", - "sp-runtime", - "sp-staking", - "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", -] - -[[package]] -name = "polkadot-runtime-common" -version = "7.0.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" -dependencies = [ - "bitvec", - "frame-benchmarking", - "frame-election-provider-support", - "frame-support", - "frame-system", - "impl-trait-for-tuples", - "libsecp256k1", - "log", - "pallet-asset-rate", - "pallet-authorship", - "pallet-balances", - "pallet-broker", - "pallet-election-provider-multi-phase", - "pallet-fast-unstake", - "pallet-identity", - "pallet-session", - "pallet-staking", - "pallet-staking-reward-fn", - "pallet-timestamp", - "pallet-transaction-payment", - "pallet-treasury", - "pallet-vesting", - "parity-scale-codec", - "polkadot-primitives", - "polkadot-runtime-parachains", - "rustc-hex", - "scale-info", - "serde", - "serde_derive", - "slot-range-helper", - "sp-api", - "sp-core", - "sp-inherents", - "sp-io", - "sp-npos-elections", - "sp-runtime", - "sp-session", - "sp-staking", - "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", - "staging-xcm", - "staging-xcm-builder", - "staging-xcm-executor", - "static_assertions", -] - -[[package]] -name = "polkadot-runtime-metrics" -version = "7.0.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" -dependencies = [ - "bs58", - "frame-benchmarking", - "parity-scale-codec", - "polkadot-primitives", - "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", - "sp-tracing 16.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", -] - -[[package]] -name = "polkadot-runtime-parachains" -version = "7.0.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" -dependencies = [ - "bitflags 1.3.2", - "bitvec", - "derive_more", - "frame-benchmarking", - "frame-support", - "frame-system", - "impl-trait-for-tuples", - "log", - "pallet-authority-discovery", - "pallet-authorship", - "pallet-babe", - "pallet-balances", - "pallet-broker", - "pallet-message-queue", - "pallet-session", - "pallet-staking", - "pallet-timestamp", - "pallet-vesting", - "parity-scale-codec", - "polkadot-core-primitives", - "polkadot-parachain-primitives", - "polkadot-primitives", - "polkadot-runtime-metrics", - "rand", - "rand_chacha", - "rustc-hex", - "scale-info", - "serde", - "sp-api", - "sp-application-crypto", - "sp-arithmetic", - "sp-core", - "sp-inherents", - "sp-io", - "sp-keystore", - "sp-runtime", - "sp-session", - "sp-staking", - "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", - "staging-xcm", - "staging-xcm-executor", -] - -[[package]] -name = "polkadot-sdk" -version = "0.1.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" -dependencies = [ - "asset-test-utils", - "assets-common", - "binary-merkle-tree", - "bp-asset-hub-rococo", - "bp-asset-hub-westend", - "bp-bridge-hub-cumulus", - "bp-bridge-hub-kusama", - "bp-bridge-hub-polkadot", - "bp-bridge-hub-rococo", - "bp-bridge-hub-westend", - "bp-header-chain", - "bp-kusama", - "bp-messages", - "bp-parachains", - "bp-polkadot", - "bp-polkadot-bulletin", - "bp-polkadot-core", - "bp-relayers", - "bp-rococo", - "bp-runtime", - "bp-test-utils", - "bp-westend", - "bp-xcm-bridge-hub", - "bp-xcm-bridge-hub-router", - "bridge-hub-common", - "bridge-hub-test-utils", - "bridge-runtime-common", - "cumulus-pallet-aura-ext", - "cumulus-pallet-dmp-queue", - "cumulus-pallet-parachain-system", - "cumulus-pallet-parachain-system-proc-macro", - "cumulus-pallet-session-benchmarking", - "cumulus-pallet-solo-to-para", - "cumulus-pallet-xcm", - "cumulus-pallet-xcmp-queue", - "cumulus-ping", - "cumulus-primitives-aura", - "cumulus-primitives-core", - "cumulus-primitives-parachain-inherent", - "cumulus-primitives-proof-size-hostfunction", - "cumulus-primitives-storage-weight-reclaim", - "cumulus-primitives-timestamp", - "cumulus-primitives-utility", - "cumulus-test-relay-sproof-builder", - "frame-benchmarking", - "frame-benchmarking-pallet-pov", - "frame-election-provider-support", - "frame-executive", - "frame-metadata-hash-extension", - "frame-support", - "frame-support-procedural", - "frame-system", - "frame-system-benchmarking", - "frame-system-rpc-runtime-api", - "frame-try-runtime", - "pallet-alliance", - "pallet-asset-conversion", - "pallet-asset-conversion-ops", - "pallet-asset-conversion-tx-payment", - "pallet-asset-rate", - "pallet-asset-tx-payment", - "pallet-assets", - "pallet-assets-freezer", - "pallet-atomic-swap", - "pallet-aura", - "pallet-authority-discovery", - "pallet-authorship", - "pallet-babe", - "pallet-bags-list", - "pallet-balances", - "pallet-beefy", - "pallet-beefy-mmr", - "pallet-bounties", - "pallet-bridge-grandpa", - "pallet-bridge-messages", - "pallet-bridge-parachains", - "pallet-bridge-relayers", - "pallet-broker", - "pallet-child-bounties", - "pallet-collator-selection", - "pallet-collective", - "pallet-collective-content", - "pallet-contracts", - "pallet-contracts-mock-network", - "pallet-conviction-voting", - "pallet-core-fellowship", - "pallet-delegated-staking", - "pallet-democracy", - "pallet-dev-mode", - "pallet-election-provider-multi-phase", - "pallet-election-provider-support-benchmarking", - "pallet-elections-phragmen", - "pallet-fast-unstake", - "pallet-glutton", - "pallet-grandpa", - "pallet-identity", - "pallet-im-online", - "pallet-indices", - "pallet-insecure-randomness-collective-flip", - "pallet-lottery", - "pallet-membership", - "pallet-message-queue", - "pallet-migrations", - "pallet-mixnet", - "pallet-mmr", - "pallet-multisig", - "pallet-nft-fractionalization", - "pallet-nfts", - "pallet-nfts-runtime-api", - "pallet-nis", - "pallet-node-authorization", - "pallet-nomination-pools", - "pallet-nomination-pools-benchmarking", - "pallet-nomination-pools-runtime-api", - "pallet-offences", - "pallet-offences-benchmarking", - "pallet-paged-list", - "pallet-parameters", - "pallet-preimage", - "pallet-proxy 28.0.0", - "pallet-ranked-collective", - "pallet-recovery", - "pallet-referenda", - "pallet-remark", - "pallet-root-offences", - "pallet-root-testing", - "pallet-safe-mode", - "pallet-salary", - "pallet-scheduler 29.0.0", - "pallet-scored-pool", - "pallet-session", - "pallet-session-benchmarking", - "pallet-skip-feeless-payment", - "pallet-society", - "pallet-staking", - "pallet-staking-reward-fn", - "pallet-staking-runtime-api", - "pallet-state-trie-migration", - "pallet-statement", - "pallet-sudo", - "pallet-timestamp", - "pallet-tips", - "pallet-transaction-payment", - "pallet-transaction-payment-rpc-runtime-api", - "pallet-transaction-storage", - "pallet-treasury", - "pallet-tx-pause", - "pallet-uniques", - "pallet-utility", - "pallet-vesting", - "pallet-whitelist", - "pallet-xcm", - "pallet-xcm-benchmarks", - "pallet-xcm-bridge-hub", - "pallet-xcm-bridge-hub-router", - "parachains-common", - "parachains-runtimes-test-utils", - "polkadot-core-primitives", - "polkadot-parachain-primitives", - "polkadot-primitives", - "polkadot-runtime-common", - "polkadot-runtime-metrics", - "polkadot-runtime-parachains", - "polkadot-sdk-frame", - "rococo-runtime-constants", - "sc-executor", - "slot-range-helper", - "snowbridge-beacon-primitives", - "snowbridge-core", - "snowbridge-ethereum", - "snowbridge-outbound-queue-merkle-tree", - "snowbridge-outbound-queue-runtime-api", - "snowbridge-pallet-ethereum-client", - "snowbridge-pallet-ethereum-client-fixtures", - "snowbridge-pallet-inbound-queue", - "snowbridge-pallet-inbound-queue-fixtures", - "snowbridge-pallet-outbound-queue", - "snowbridge-pallet-system", - "snowbridge-router-primitives", - "snowbridge-runtime-common", - "snowbridge-runtime-test-common", - "snowbridge-system-runtime-api", - "sp-api", - "sp-api-proc-macro", - "sp-application-crypto", - "sp-arithmetic", - "sp-authority-discovery", - "sp-block-builder", - "sp-consensus-aura", - "sp-consensus-babe", - "sp-consensus-beefy", - "sp-consensus-grandpa", - "sp-consensus-pow", - "sp-consensus-slots", - "sp-core", - "sp-core-hashing", - "sp-crypto-ec-utils 0.10.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", - "sp-crypto-hashing 0.1.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", - "sp-debug-derive 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", - "sp-externalities 0.25.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", - "sp-genesis-builder", - "sp-inherents", - "sp-io", - "sp-keyring", - "sp-keystore", - "sp-metadata-ir", - "sp-mixnet", - "sp-mmr-primitives", - "sp-npos-elections", - "sp-offchain", - "sp-runtime", - "sp-runtime-interface 24.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", - "sp-session", - "sp-staking", - "sp-state-machine", - "sp-statement-store", - "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", - "sp-storage 19.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", - "sp-timestamp", - "sp-tracing 16.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", - "sp-transaction-pool", - "sp-transaction-storage-proof", - "sp-trie", - "sp-version", - "sp-wasm-interface 20.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", - "sp-weights", - "staging-parachain-info", - "staging-xcm", - "staging-xcm-builder", - "staging-xcm-executor", - "substrate-bip39", - "testnet-parachains-constants", - "westend-runtime-constants", - "xcm-fee-payment-runtime-api", -] - -[[package]] -name = "polkadot-sdk-frame" -version = "0.1.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" -dependencies = [ - "docify", - "frame-benchmarking", - "frame-executive", - "frame-support", - "frame-system", - "frame-system-benchmarking", - "frame-system-rpc-runtime-api", - "frame-try-runtime", - "log", - "parity-scale-codec", - "scale-info", - "sp-api", - "sp-arithmetic", - "sp-block-builder", - "sp-consensus-aura", - "sp-consensus-grandpa", - "sp-core", - "sp-inherents", - "sp-io", - "sp-offchain", - "sp-runtime", - "sp-session", - "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", - "sp-storage 19.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", - "sp-transaction-pool", - "sp-version", -] - -[[package]] -name = "polkavm" -version = "0.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a3693e5efdb2bf74e449cd25fd777a28bd7ed87e41f5d5da75eb31b4de48b94" -dependencies = [ - "libc", - "log", - "polkavm-assembler", - "polkavm-common", - "polkavm-linux-raw", -] - -[[package]] -name = "polkavm-assembler" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fa96d6d868243acc12de813dd48e756cbadcc8e13964c70d272753266deadc1" -dependencies = [ - "log", -] - [[package]] name = "polkavm-common" version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1d9428a5cfcc85c5d7b9fc4b6a18c4b802d0173d768182a51cc7751640f08b92" -dependencies = [ - "log", -] [[package]] name = "polkavm-derive" @@ -7757,40 +2988,19 @@ dependencies = [ "syn 2.0.77", ] -[[package]] -name = "polkavm-linker" -version = "0.9.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c7be503e60cf56c0eb785f90aaba4b583b36bff00e93997d93fef97f9553c39" -dependencies = [ - "gimli 0.28.1", - "hashbrown 0.14.3", - "log", - "object 0.32.2", - "polkavm-common", - "regalloc2 0.9.3", - "rustc-demangle", -] - -[[package]] -name = "polkavm-linux-raw" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26e85d3456948e650dff0cfc85603915847faf893ed1e66b020bb82ef4557120" - [[package]] name = "polling" -version = "3.7.0" +version = "3.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "645493cf344456ef24219d02a768cf1fb92ddf8c92161679ae3d91b91a637be3" +checksum = "cc2790cd301dec6cd3b7a025e4815cf825724a51c98dccfe6a3e55f05ffb6511" dependencies = [ "cfg-if", "concurrent-queue", - "hermit-abi 0.3.9", + "hermit-abi 0.4.0", "pin-project-lite", - "rustix 0.38.34", + "rustix", "tracing", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -7816,12 +3026,6 @@ dependencies = [ "universal-hash", ] -[[package]] -name = "portable-atomic" -version = "1.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7170ef9988bc169ba16dd36a7fa041e5c4cbeb6a35b76d4c03daded371eae7c0" - [[package]] name = "powerfmt" version = "0.2.0" @@ -7830,15 +3034,18 @@ 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 = "prettier-please" -version = "0.2.0" +name = "prettyplease" +version = "0.2.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22020dfcf177fcc7bf5deaf7440af371400c67c0de14c399938d8ed4fb4645d3" +checksum = "479cf940fbbb3426c32c5d5176f62ad57549a0bb84773423ba8be9d089f5faba" dependencies = [ "proc-macro2", "syn 2.0.77", @@ -7852,8 +3059,6 @@ checksum = "0b34d9fd68ae0b74a41b21c03c2f62847aa0ffea044eee893b4c140b37e244e2" dependencies = [ "fixed-hash", "impl-codec", - "impl-num-traits", - "impl-rlp", "impl-serde", "scale-info", "uint", @@ -7871,11 +3076,11 @@ dependencies = [ [[package]] name = "proc-macro-crate" -version = "3.1.0" +version = "3.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d37c51ca738a55da99dc0c4a34860fd675453b8b36209178c2249bb13651284" +checksum = "8ecf48c7ca261d60b74ab1a7b20da18bede46776b2e55535cb958eb595c5fa7b" dependencies = [ - "toml_edit 0.21.1", + "toml_edit 0.22.21", ] [[package]] @@ -7902,17 +3107,6 @@ dependencies = [ "version_check", ] -[[package]] -name = "proc-macro-warning" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "834da187cfe638ae8abb0203f0b33e5ccdb02a28e7199f2f47b3e2754f50edca" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.77", -] - [[package]] name = "proc-macro2" version = "1.0.86" @@ -7922,41 +3116,6 @@ dependencies = [ "unicode-ident", ] -[[package]] -name = "proptest" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4c2511913b88df1637da85cc8d96ec8e43a3f8bb8ccb71ee1ac240d6f3df58d" -dependencies = [ - "bit-set", - "bit-vec", - "bitflags 2.5.0", - "lazy_static", - "num-traits", - "rand", - "rand_chacha", - "rand_xorshift", - "regex-syntax 0.8.3", - "rusty-fork", - "tempfile", - "unarray", -] - -[[package]] -name = "psm" -version = "0.1.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa37f80ca58604976033fae9515a8a2989fc13797d953f7c04fb8fa36a11f205" -dependencies = [ - "cc", -] - -[[package]] -name = "quick-error" -version = "1.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" - [[package]] name = "quote" version = "1.0.37" @@ -8002,28 +3161,19 @@ dependencies = [ "getrandom", ] -[[package]] -name = "rand_xorshift" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d25bf25ec5ae4a3f1b92f929810509a2f53d7dca2f50b794ff57e3face536c8f" -dependencies = [ - "rand_core", -] - [[package]] name = "ratatui" version = "0.28.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fdef7f9be5c0122f890d58bdf4d964349ba6a6161f705907526d891efabba57d" dependencies = [ - "bitflags 2.5.0", + "bitflags 2.6.0", "cassowary", "compact_str", "crossterm", "instability", "itertools 0.13.0", - "lru 0.12.3", + "lru", "paste", "strum 0.26.3", "strum_macros 0.26.4", @@ -8032,12 +3182,6 @@ dependencies = [ "unicode-width", ] -[[package]] -name = "rawpointer" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60a357793950651c4ed0f3f52338f53b2f809f32d83a07f72909fa13e4c6c1e3" - [[package]] name = "rayon" version = "1.10.0" @@ -8060,22 +3204,11 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.4.1" +version = "0.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" +checksum = "0884ad60e090bf1345b93da0a5de8923c93884cd03f40dfcfddd3b4bee661853" dependencies = [ - "bitflags 1.3.2", -] - -[[package]] -name = "redox_users" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" -dependencies = [ - "getrandom", - "libredox", - "thiserror", + "bitflags 2.6.0", ] [[package]] @@ -8098,41 +3231,16 @@ dependencies = [ "syn 2.0.77", ] -[[package]] -name = "regalloc2" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80535183cae11b149d618fbd3c37e38d7cda589d82d7769e196ca9a9042d7621" -dependencies = [ - "fxhash", - "log", - "slice-group-by", - "smallvec", -] - -[[package]] -name = "regalloc2" -version = "0.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad156d539c879b7a24a363a2016d77961786e71f48f2e2fc8302a92abd2429a6" -dependencies = [ - "hashbrown 0.13.2", - "log", - "rustc-hash", - "slice-group-by", - "smallvec", -] - [[package]] name = "regex" -version = "1.10.4" +version = "1.10.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c117dbdfde9c8308975b6a18d71f3f385c89461f7b3fb054288ecf2a2058ba4c" +checksum = "4219d74c6b67a3654a9fbebc4b419e22126d13d2f3c4a07ee0cb61ff79a79619" dependencies = [ "aho-corasick", "memchr", - "regex-automata 0.4.6", - "regex-syntax 0.8.3", + "regex-automata 0.4.7", + "regex-syntax 0.8.4", ] [[package]] @@ -8146,13 +3254,13 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.6" +version = "0.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86b83b8b9847f9bf95ef68afb0b8e6cdb80f498442f5179a29fad448fcc1eaea" +checksum = "38caf58cc5ef2fed281f89292ef23f6365465ed9a41b7a7754eb4e26496c92df" dependencies = [ "aho-corasick", "memchr", - "regex-syntax 0.8.3", + "regex-syntax 0.8.4", ] [[package]] @@ -8163,9 +3271,9 @@ checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" [[package]] name = "regex-syntax" -version = "0.8.3" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adad44e29e4c806119491a7f06f03de4d1af22c3a680dd47f1e6e179439d1f56" +checksum = "7a66a03ae7c801facd77a29370b4faec201768915ac14a721ba36f20bc9c209b" [[package]] name = "rfc6979" @@ -8180,15 +3288,15 @@ dependencies = [ [[package]] name = "ring" version = "0.1.0" -source = "git+https://github.com/w3f/ring-proof#31658d1f5b88e106c969557c36c821aff46b2236" +source = "git+https://github.com/w3f/ring-proof#1472ce9cd87cee49c56ce7869a0aba872d837c51" dependencies = [ "ark-ec", - "ark-ff 0.4.2", + "ark-ff", "ark-poly", - "ark-serialize 0.4.2", - "ark-std 0.4.0", + "ark-serialize", + "ark-std", "ark-transcript 0.0.2 (git+https://github.com/w3f/ring-vrf)", - "arrayvec 0.7.4", + "arrayvec 0.7.6", "blake2", "common", "fflonk", @@ -8209,67 +3317,11 @@ dependencies = [ "windows-sys 0.52.0", ] -[[package]] -name = "rlp" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb919243f34364b6bd2fc10ef797edbfa75f33c252e7998527479c6d6b47e1ec" -dependencies = [ - "bytes", - "rustc-hex", -] - -[[package]] -name = "rococo-runtime-constants" -version = "7.0.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" -dependencies = [ - "frame-support", - "polkadot-primitives", - "polkadot-runtime-common", - "smallvec", - "sp-core", - "sp-runtime", - "sp-weights", - "staging-xcm", - "staging-xcm-builder", -] - -[[package]] -name = "ruint" -version = "1.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c3cc4c2511671f327125da14133d0c5c5d137f006a1017a16f557bc85b16286" -dependencies = [ - "alloy-rlp", - "ark-ff 0.3.0", - "ark-ff 0.4.2", - "bytes", - "fastrlp", - "num-bigint", - "num-traits", - "parity-scale-codec", - "primitive-types", - "proptest", - "rand", - "rlp", - "ruint-macro", - "serde", - "valuable", - "zeroize", -] - -[[package]] -name = "ruint-macro" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48fd7bd8a6377e15ad9d42a8ec25371b94ddc67abe7c8b9127bec79bebaaae18" - [[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" @@ -8285,63 +3337,31 @@ checksum = "3e75f6a532d0fd9f7f13144f392b6ad56a32696bfcd9c78f797f16bbb6f072d6" [[package]] name = "rustc_version" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a" -dependencies = [ - "semver 0.9.0", -] - -[[package]] -name = "rustc_version" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0dfe2087c51c460008730de8b57e6a320782fbfb312e1f4d520e6c6fae155ee" -dependencies = [ - "semver 0.11.0", -] - -[[package]] -name = "rustc_version" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" -dependencies = [ - "semver 1.0.22", -] - -[[package]] -name = "rustix" -version = "0.36.17" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "305efbd14fde4139eb501df5f136994bb520b033fa9fbdce287507dc23b8c7ed" +checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" dependencies = [ - "bitflags 1.3.2", - "errno", - "io-lifetimes", - "libc", - "linux-raw-sys 0.1.4", - "windows-sys 0.45.0", + "semver", ] [[package]] name = "rustix" -version = "0.38.34" +version = "0.38.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70dc5ec042f7a43c4a73241207cecc9873a06d45debb38b329f8541d85c2730f" +checksum = "8acb788b847c24f28525660c4d7758620a7210875711f79e7f663cc152726811" dependencies = [ - "bitflags 2.5.0", + "bitflags 2.6.0", "errno", "libc", - "linux-raw-sys 0.4.13", + "linux-raw-sys", "windows-sys 0.52.0", ] [[package]] name = "rustls" -version = "0.21.11" +version = "0.21.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fecbfb7b1444f477b345853b1fce097a2c6fb637b2bfb87e6bc5db0f043fae4" +checksum = "3f56a14d1f48b391359b22f731fd4bd7e43c97f3c50eee276f3aa09c94784d3e" dependencies = [ "log", "ring 0.17.8", @@ -8358,7 +3378,7 @@ dependencies = [ "log", "ring 0.17.8", "rustls-pki-types", - "rustls-webpki 0.102.3", + "rustls-webpki 0.102.8", "subtle", "zeroize", ] @@ -8377,12 +3397,12 @@ dependencies = [ [[package]] name = "rustls-native-certs" -version = "0.7.0" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f1fb85efa936c42c6d5fc28d2629bb51e4b2f4b8a5211e297d599cc5a093792" +checksum = "e5bfb394eeed242e909609f56089eecfe5fda225042e8b171791b9c95f5931e5" dependencies = [ "openssl-probe", - "rustls-pemfile 2.1.2", + "rustls-pemfile 2.1.3", "rustls-pki-types", "schannel", "security-framework", @@ -8399,19 +3419,19 @@ dependencies = [ [[package]] name = "rustls-pemfile" -version = "2.1.2" +version = "2.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29993a25686778eb88d4189742cd713c9bce943bc54251a33509dc63cbacf73d" +checksum = "196fe16b00e106300d3e45ecfcb764fa292a535d7326a29a5875c579c7417425" dependencies = [ - "base64 0.22.0", + "base64 0.22.1", "rustls-pki-types", ] [[package]] name = "rustls-pki-types" -version = "1.5.0" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "beb461507cee2c2ff151784c52762cf4d9ff6a61f3e80968600ed24fa837fa54" +checksum = "fc0a2ce646f8655401bb81e7927b812614bd5d91dbc968696be50603510fcaf0" [[package]] name = "rustls-webpki" @@ -8425,9 +3445,9 @@ dependencies = [ [[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 = [ "ring 0.17.8", "rustls-pki-types", @@ -8436,21 +3456,9 @@ dependencies = [ [[package]] name = "rustversion" -version = "1.0.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80af6f9131f277a45a3fba6ce8e2258037bb0477a67e610d3c1fe046ab31de47" - -[[package]] -name = "rusty-fork" -version = "0.3.0" +version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb3dcc6e454c328bb824492db107ab7c0ae8fcffe4ad210136ef014458c1bc4f" -dependencies = [ - "fnv", - "quick-error", - "tempfile", - "wait-timeout", -] +checksum = "955d28af4278de8121b7ebeb796b6a45735dc01436d898801014aced2773a3d6" [[package]] name = "ruzstd" @@ -8465,27 +3473,9 @@ dependencies = [ [[package]] name = "ryu" -version = "1.0.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e86697c916019a8588c99b5fac3cead74ec0b4b819707a682fd4d23fa0ce1ba1" - -[[package]] -name = "safe-mix" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d3d055a2582e6b00ed7a31c1524040aa391092bf636328350813f3a0605215c" -dependencies = [ - "rustc_version 0.2.3", -] - -[[package]] -name = "safe_arch" -version = "0.7.2" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3460605018fdc9612bce72735cba0d27efbcd9904780d44c7e3a9948f96148a" -dependencies = [ - "bytemuck", -] +checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" [[package]] name = "same-file" @@ -8496,82 +3486,6 @@ dependencies = [ "winapi-util", ] -[[package]] -name = "sc-allocator" -version = "23.0.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" -dependencies = [ - "log", - "sp-core", - "sp-wasm-interface 20.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", - "thiserror", -] - -[[package]] -name = "sc-executor" -version = "0.32.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" -dependencies = [ - "parity-scale-codec", - "parking_lot", - "sc-executor-common", - "sc-executor-polkavm", - "sc-executor-wasmtime", - "schnellru", - "sp-api", - "sp-core", - "sp-externalities 0.25.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", - "sp-io", - "sp-panic-handler", - "sp-runtime-interface 24.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", - "sp-trie", - "sp-version", - "sp-wasm-interface 20.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", - "tracing", -] - -[[package]] -name = "sc-executor-common" -version = "0.29.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" -dependencies = [ - "polkavm", - "sc-allocator", - "sp-maybe-compressed-blob", - "sp-wasm-interface 20.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", - "thiserror", - "wasm-instrument", -] - -[[package]] -name = "sc-executor-polkavm" -version = "0.29.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" -dependencies = [ - "log", - "polkavm", - "sc-executor-common", - "sp-wasm-interface 20.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", -] - -[[package]] -name = "sc-executor-wasmtime" -version = "0.29.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" -dependencies = [ - "anyhow", - "cfg-if", - "libc", - "log", - "parking_lot", - "rustix 0.36.17", - "sc-allocator", - "sc-executor-common", - "sp-runtime-interface 24.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", - "sp-wasm-interface 20.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", - "wasmtime", -] - [[package]] name = "scale-bits" version = "0.5.0" @@ -8641,9 +3555,9 @@ dependencies = [ [[package]] name = "scale-info" -version = "2.11.2" +version = "2.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c453e59a955f81fb62ee5d596b450383d699f152d350e9d23a0db2adb78e4c0" +checksum = "eca070c12893629e2cc820a9761bedf6ce1dcddc9852984d1dc734b8bd9bd024" dependencies = [ "bitvec", "cfg-if", @@ -8655,11 +3569,11 @@ dependencies = [ [[package]] name = "scale-info-derive" -version = "2.11.2" +version = "2.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18cf6c6447f813ef19eb450e985bcce6705f9ce7660db221b59093d15c79c4b7" +checksum = "2d35494501194174bda522a32605929eefc9ecf7e0a326c26db1fdd85881eb62" dependencies = [ - "proc-macro-crate 1.3.1", + "proc-macro-crate 3.2.0", "proc-macro2", "quote", "syn 1.0.109", @@ -8711,20 +3625,20 @@ dependencies = [ [[package]] name = "schannel" -version = "0.1.23" +version = "0.1.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbc91545643bcf3a0bbb6569265615222618bdf33ce4ffbbd13c4bbd4c093534" +checksum = "e9aaafd5a2b6e3d657ff009d82fbd630b6bd54dd4eb06f21693925cdf80f9b8b" dependencies = [ - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] name = "schnellru" -version = "0.2.1" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "772575a524feeb803e5b0fcbc6dd9f367e579488197c94c6e4023aad2305774d" +checksum = "c9a8ef13a93c54d20580de1e5c413e624e53121d42fc7e2c11d10ef7f8b02367" dependencies = [ - "ahash 0.8.11", + "ahash", "cfg-if", "hashbrown 0.13.2", ] @@ -8737,7 +3651,7 @@ checksum = "8de18f6d8ba0aad7045f5feae07ec29899c1112584a38509a84ad7b04451eaa0" dependencies = [ "aead", "arrayref", - "arrayvec 0.7.4", + "arrayvec 0.7.6", "curve25519-dalek", "getrandom_or_panic", "merlin", @@ -8754,12 +3668,6 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" -[[package]] -name = "scratch" -version = "1.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3cf7c11c38cb994f3d40e8a8cde3bbd1f72a435e4c49e85d6553d8312306152" - [[package]] name = "sct" version = "0.7.1" @@ -8814,77 +3722,32 @@ dependencies = [ [[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 2.6.0", "core-foundation", "core-foundation-sys", "libc", - "security-framework-sys", -] - -[[package]] -name = "security-framework-sys" -version = "2.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41f3cc463c0ef97e11c3461a9d3787412d30e8e7eb907c79180c4a57bf7c04ef" -dependencies = [ - "core-foundation-sys", - "libc", -] - -[[package]] -name = "semver" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a3186ec9e65071a2095434b1f5bb24838d4e8e130f584c790f6033c79943537" -dependencies = [ - "semver-parser 0.7.0", -] - -[[package]] -name = "semver" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403" -dependencies = [ - "semver-parser 0.7.0", -] - -[[package]] -name = "semver" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f301af10236f6df4160f7c3f04eec6dbc70ace82d23326abad5edee88801c6b6" -dependencies = [ - "semver-parser 0.10.2", -] - -[[package]] -name = "semver" -version = "1.0.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92d43fe69e652f3df9bdc2b85b2854a0825b86e4fb76bc44d945137d053639ca" -dependencies = [ - "serde", + "security-framework-sys", ] [[package]] -name = "semver-parser" -version = "0.7.0" +name = "security-framework-sys" +version = "2.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" +checksum = "ea4a292869320c0272d7bc55a5a6aafaff59b4f63404a003887b679a2e05b4b6" +dependencies = [ + "core-foundation-sys", + "libc", +] [[package]] -name = "semver-parser" -version = "0.10.2" +name = "semver" +version = "1.0.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00b0bef5b7f9e0df16536d3961cfb6e84331c065b4066afb39768d0e319411f7" -dependencies = [ - "pest", -] +checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" [[package]] name = "serde" @@ -8895,20 +3758,11 @@ dependencies = [ "serde_derive", ] -[[package]] -name = "serde-big-array" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd31f59f6fe2b0c055371bb2f16d7f0aa7d8881676c04a55b1596d1a17cd10a4" -dependencies = [ - "serde", -] - [[package]] name = "serde_bytes" -version = "0.11.14" +version = "0.11.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b8497c313fd43ab992087548117643f6fcd935cbf36f176ffda0aacf9591734" +checksum = "387cc504cb06bb40a96c8e04e951fe01854cf6bc921053c954e4a606d9675c6a" dependencies = [ "serde", ] @@ -8936,20 +3790,21 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.116" +version = "1.0.128" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e17db7126d17feb94eb3fad46bf1a96b034e8aacbc2e775fe81505f8b0b2813" +checksum = "6ff5456707a1de34e7e37f2a6fd3d3f808c318259cbd01ab6377795054b483d8" dependencies = [ "itoa", + "memchr", "ryu", "serde", ] [[package]] name = "serde_spanned" -version = "0.6.5" +version = "0.6.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb3622f419d1296904700073ea6cc23ad690adbd66f13ea683df73298736f0c1" +checksum = "eb5b1b31579f3811bf615c144393417496f152e12ac8b7663bf664f4a815306d" dependencies = [ "serde", ] @@ -9031,6 +3886,12 @@ dependencies = [ "lazy_static", ] +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + [[package]] name = "signal-hook" version = "0.3.17" @@ -9048,7 +3909,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "34db1a06d485c9142248b7a054f034b349b212551f3dfd19c94d45a754a217cd" dependencies = [ "libc", - "mio 1.0.2", + "mio", "signal-hook", ] @@ -9071,19 +3932,6 @@ dependencies = [ "rand_core", ] -[[package]] -name = "simba" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "061507c94fc6ab4ba1c9a0305018408e312e17c041eb63bef8aa726fa33aceae" -dependencies = [ - "approx", - "num-complex", - "num-traits", - "paste", - "wide", -] - [[package]] name = "simple-mermaid" version = "0.1.1" @@ -9105,24 +3953,6 @@ dependencies = [ "autocfg", ] -[[package]] -name = "slice-group-by" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "826167069c09b99d56f31e9ae5c99049e932a98c9dc2dac47645b08dbbf76ba7" - -[[package]] -name = "slot-range-helper" -version = "7.0.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" -dependencies = [ - "enumn", - "parity-scale-codec", - "paste", - "sp-runtime", - "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", -] - [[package]] name = "smallvec" version = "1.13.2" @@ -9131,9 +3961,9 @@ checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" [[package]] name = "smol" -version = "2.0.0" +version = "2.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e635339259e51ef85ac7aa29a1cd991b957047507288697a690e80ab97d07cad" +checksum = "a33bd3e260892199c3ccfc487c88b2da2265080acb316cd920da72fdfd7c599f" dependencies = [ "async-channel", "async-executor", @@ -9152,7 +3982,7 @@ version = "0.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e6d1eaa97d77be4d026a1e7ffad1bb3b78448763b357ea6f8188d3e6f736a9b9" dependencies = [ - "arrayvec 0.7.4", + "arrayvec 0.7.6", "async-lock", "atomic-take", "base64 0.21.7", @@ -9168,7 +3998,7 @@ dependencies = [ "fnv", "futures-lite", "futures-util", - "hashbrown 0.14.3", + "hashbrown 0.14.5", "hex", "hmac 0.12.1", "itertools 0.12.1", @@ -9187,370 +4017,61 @@ dependencies = [ "rand_chacha", "ruzstd", "schnorrkel", - "serde", - "serde_json", - "sha2 0.10.8", - "sha3", - "siphasher", - "slab", - "smallvec", - "soketto", - "twox-hash", - "wasmi 0.31.2", - "x25519-dalek", - "zeroize", -] - -[[package]] -name = "smoldot-light" -version = "0.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5496f2d116b7019a526b1039ec2247dd172b8670633b1a64a614c9ea12c9d8c7" -dependencies = [ - "async-channel", - "async-lock", - "base64 0.21.7", - "blake2-rfc", - "derive_more", - "either", - "event-listener 4.0.3", - "fnv", - "futures-channel", - "futures-lite", - "futures-util", - "hashbrown 0.14.3", - "hex", - "itertools 0.12.1", - "log", - "lru 0.12.3", - "no-std-net", - "parking_lot", - "pin-project", - "rand", - "rand_chacha", - "serde", - "serde_json", - "siphasher", - "slab", - "smol", - "smoldot", - "zeroize", -] - -[[package]] -name = "snowbridge-amcl" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "460a9ed63cdf03c1b9847e8a12a5f5ba19c4efd5869e4a737e05be25d7c427e5" -dependencies = [ - "parity-scale-codec", - "scale-info", -] - -[[package]] -name = "snowbridge-beacon-primitives" -version = "0.2.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" -dependencies = [ - "byte-slice-cast", - "frame-support", - "hex", - "parity-scale-codec", - "rlp", - "scale-info", - "serde", - "snowbridge-ethereum", - "snowbridge-milagro-bls", - "sp-core", - "sp-io", - "sp-runtime", - "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", - "ssz_rs", - "ssz_rs_derive", -] - -[[package]] -name = "snowbridge-core" -version = "0.2.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" -dependencies = [ - "ethabi-decode", - "frame-support", - "frame-system", - "hex-literal", - "parity-scale-codec", - "polkadot-parachain-primitives", - "scale-info", - "serde", - "snowbridge-beacon-primitives", - "sp-arithmetic", - "sp-core", - "sp-io", - "sp-runtime", - "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", - "staging-xcm", - "staging-xcm-builder", -] - -[[package]] -name = "snowbridge-ethereum" -version = "0.3.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" -dependencies = [ - "ethabi-decode", - "ethbloom", - "ethereum-types", - "hex-literal", - "parity-bytes", - "parity-scale-codec", - "rlp", - "scale-info", - "serde", - "serde-big-array", - "sp-io", - "sp-runtime", - "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", -] - -[[package]] -name = "snowbridge-milagro-bls" -version = "1.5.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "026aa8638f690a53e3f7676024b9e913b1cab0111d1b7b92669d40a188f9d7e6" -dependencies = [ - "hex", - "lazy_static", - "parity-scale-codec", - "rand", - "scale-info", - "snowbridge-amcl", - "zeroize", -] - -[[package]] -name = "snowbridge-outbound-queue-merkle-tree" -version = "0.3.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" -dependencies = [ - "parity-scale-codec", - "scale-info", - "sp-core", - "sp-runtime", -] - -[[package]] -name = "snowbridge-outbound-queue-runtime-api" -version = "0.2.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" -dependencies = [ - "frame-support", - "parity-scale-codec", - "snowbridge-core", - "snowbridge-outbound-queue-merkle-tree", - "sp-api", - "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", -] - -[[package]] -name = "snowbridge-pallet-ethereum-client" -version = "0.2.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" -dependencies = [ - "frame-benchmarking", - "frame-support", - "frame-system", - "log", - "pallet-timestamp", - "parity-scale-codec", - "scale-info", - "serde", - "snowbridge-beacon-primitives", - "snowbridge-core", - "snowbridge-ethereum", - "snowbridge-pallet-ethereum-client-fixtures", - "sp-core", - "sp-io", - "sp-runtime", - "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", - "static_assertions", -] - -[[package]] -name = "snowbridge-pallet-ethereum-client-fixtures" -version = "0.9.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" -dependencies = [ - "hex-literal", - "snowbridge-beacon-primitives", - "snowbridge-core", - "sp-core", - "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", -] - -[[package]] -name = "snowbridge-pallet-inbound-queue" -version = "0.2.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" -dependencies = [ - "alloy-primitives", - "alloy-sol-types", - "frame-benchmarking", - "frame-support", - "frame-system", - "log", - "pallet-balances", - "parity-scale-codec", - "scale-info", - "serde", - "snowbridge-beacon-primitives", - "snowbridge-core", - "snowbridge-pallet-inbound-queue-fixtures", - "snowbridge-router-primitives", - "sp-core", - "sp-io", - "sp-runtime", - "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", - "staging-xcm", - "staging-xcm-executor", -] - -[[package]] -name = "snowbridge-pallet-inbound-queue-fixtures" -version = "0.10.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" -dependencies = [ - "hex-literal", - "snowbridge-beacon-primitives", - "snowbridge-core", - "sp-core", - "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", -] - -[[package]] -name = "snowbridge-pallet-outbound-queue" -version = "0.2.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" -dependencies = [ - "bridge-hub-common", - "ethabi-decode", - "frame-benchmarking", - "frame-support", - "frame-system", - "parity-scale-codec", - "scale-info", - "serde", - "snowbridge-core", - "snowbridge-outbound-queue-merkle-tree", - "sp-arithmetic", - "sp-core", - "sp-io", - "sp-runtime", - "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", -] - -[[package]] -name = "snowbridge-pallet-system" -version = "0.2.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" -dependencies = [ - "frame-benchmarking", - "frame-support", - "frame-system", - "log", - "parity-scale-codec", - "scale-info", - "snowbridge-core", - "sp-core", - "sp-io", - "sp-runtime", - "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", - "staging-xcm", - "staging-xcm-executor", -] - -[[package]] -name = "snowbridge-router-primitives" -version = "0.9.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" -dependencies = [ - "frame-support", - "hex-literal", - "log", - "parity-scale-codec", - "scale-info", - "snowbridge-core", - "sp-core", - "sp-io", - "sp-runtime", - "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", - "staging-xcm", - "staging-xcm-executor", + "serde", + "serde_json", + "sha2 0.10.8", + "sha3", + "siphasher", + "slab", + "smallvec", + "soketto", + "twox-hash", + "wasmi", + "x25519-dalek", + "zeroize", ] [[package]] -name = "snowbridge-runtime-common" -version = "0.2.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +name = "smoldot-light" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5496f2d116b7019a526b1039ec2247dd172b8670633b1a64a614c9ea12c9d8c7" dependencies = [ - "frame-support", + "async-channel", + "async-lock", + "base64 0.21.7", + "blake2-rfc", + "derive_more", + "either", + "event-listener 4.0.3", + "fnv", + "futures-channel", + "futures-lite", + "futures-util", + "hashbrown 0.14.5", + "hex", + "itertools 0.12.1", "log", - "parity-scale-codec", - "snowbridge-core", - "sp-arithmetic", - "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", - "staging-xcm", - "staging-xcm-builder", - "staging-xcm-executor", -] - -[[package]] -name = "snowbridge-runtime-test-common" -version = "0.2.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" -dependencies = [ - "cumulus-pallet-parachain-system", - "frame-support", - "frame-system", - "pallet-balances", - "pallet-collator-selection", - "pallet-message-queue", - "pallet-session", - "pallet-timestamp", - "pallet-utility", - "pallet-xcm", - "parachains-runtimes-test-utils", - "parity-scale-codec", - "snowbridge-core", - "snowbridge-pallet-ethereum-client", - "snowbridge-pallet-ethereum-client-fixtures", - "snowbridge-pallet-outbound-queue", - "snowbridge-pallet-system", - "sp-core", - "sp-io", - "sp-keyring", - "sp-runtime", - "staging-parachain-info", - "staging-xcm", - "staging-xcm-executor", -] - -[[package]] -name = "snowbridge-system-runtime-api" -version = "0.2.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" -dependencies = [ - "parity-scale-codec", - "snowbridge-core", - "sp-api", - "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", - "staging-xcm", + "lru", + "no-std-net", + "parking_lot", + "pin-project", + "rand", + "rand_chacha", + "serde", + "serde_json", + "siphasher", + "slab", + "smol", + "smoldot", + "zeroize", ] [[package]] name = "socket2" -version = "0.5.6" +version = "0.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05ffd9c0a93b7543e062e759284fcf5f5e3b098501104bfbdde4d404db792871" +checksum = "ce305eb0b4296696835b71df73eb912e0f1ffd2556a501fcede6e0c50349191c" dependencies = [ "libc", "windows-sys 0.52.0", @@ -9602,7 +4123,7 @@ dependencies = [ "Inflector", "blake2", "expander", - "proc-macro-crate 3.1.0", + "proc-macro-crate 3.2.0", "proc-macro2", "quote", "syn 2.0.77", @@ -9642,7 +4163,7 @@ version = "0.4.2" source = "git+https://github.com/paritytech/arkworks-substrate#caa2eed74beb885dd07c7db5f916f2281dad818f" dependencies = [ "ark-bls12-381-ext", - "sp-crypto-ec-utils 0.10.0 (git+https://github.com/paritytech/polkadot-sdk)", + "sp-crypto-ec-utils", ] [[package]] @@ -9651,91 +4172,19 @@ version = "0.4.2" source = "git+https://github.com/paritytech/arkworks-substrate#caa2eed74beb885dd07c7db5f916f2281dad818f" dependencies = [ "ark-ed-on-bls12-381-bandersnatch-ext", - "sp-crypto-ec-utils 0.10.0 (git+https://github.com/paritytech/polkadot-sdk)", -] - -[[package]] -name = "sp-authority-discovery" -version = "26.0.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" -dependencies = [ - "parity-scale-codec", - "scale-info", - "sp-api", - "sp-application-crypto", - "sp-runtime", -] - -[[package]] -name = "sp-block-builder" -version = "26.0.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" -dependencies = [ - "sp-api", - "sp-inherents", - "sp-runtime", -] - -[[package]] -name = "sp-consensus-aura" -version = "0.32.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" -dependencies = [ - "async-trait", - "parity-scale-codec", - "scale-info", - "sp-api", - "sp-application-crypto", - "sp-consensus-slots", - "sp-inherents", - "sp-runtime", - "sp-timestamp", -] - -[[package]] -name = "sp-consensus-babe" -version = "0.32.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" -dependencies = [ - "async-trait", - "parity-scale-codec", - "scale-info", - "serde", - "sp-api", - "sp-application-crypto", - "sp-consensus-slots", - "sp-core", - "sp-inherents", - "sp-runtime", - "sp-timestamp", -] - -[[package]] -name = "sp-consensus-beefy" -version = "13.0.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" -dependencies = [ - "lazy_static", - "parity-scale-codec", - "scale-info", - "serde", - "sp-api", - "sp-application-crypto", - "sp-core", - "sp-crypto-hashing 0.1.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", - "sp-io", - "sp-keystore", - "sp-mmr-primitives", - "sp-runtime", - "strum 0.26.3", + "sp-crypto-ec-utils", ] [[package]] name = "sp-consensus-beefy-etf" version = "13.0.0" dependencies = [ + "ark-serialize", + "ark-std", + "etf-crypto-primitives 0.2.4 (git+https://github.com/ideal-lab5/etf-sdk/?branch=tony/dev)", "lazy_static", "parity-scale-codec", + "rand", "scale-info", "serde", "sp-api", @@ -9747,65 +4196,7 @@ dependencies = [ "sp-mmr-primitives", "sp-runtime", "strum 0.24.1", -] - -[[package]] -name = "sp-consensus-beefy-etf" -version = "13.0.0" -source = "git+https://github.com/ideal-lab5/etf.git?branch=tony/dev#eede7b8f5fc6c7f853e1e087ef92b272d9098574" -dependencies = [ - "lazy_static", - "parity-scale-codec", - "scale-info", - "serde", - "sp-api", - "sp-application-crypto", - "sp-core", - "sp-crypto-hashing 0.1.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", - "sp-io", - "sp-keystore", - "sp-mmr-primitives", - "sp-runtime", - "strum 0.24.1", -] - -[[package]] -name = "sp-consensus-grandpa" -version = "13.0.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" -dependencies = [ - "finality-grandpa", - "log", - "parity-scale-codec", - "scale-info", - "serde", - "sp-api", - "sp-application-crypto", - "sp-core", - "sp-keystore", - "sp-runtime", -] - -[[package]] -name = "sp-consensus-pow" -version = "0.32.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" -dependencies = [ - "parity-scale-codec", - "sp-api", - "sp-core", - "sp-runtime", -] - -[[package]] -name = "sp-consensus-slots" -version = "0.32.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" -dependencies = [ - "parity-scale-codec", - "scale-info", - "serde", - "sp-timestamp", + "w3f-bls", ] [[package]] @@ -9813,8 +4204,8 @@ name = "sp-core" version = "28.0.0" source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" dependencies = [ - "ark-serialize 0.4.2", - "array-bytes 6.2.2", + "ark-serialize", + "array-bytes", "bandersnatch_vrfs", "bitflags 1.3.2", "blake2", @@ -9822,7 +4213,7 @@ dependencies = [ "bs58", "dyn-clonable", "ed25519-zebra", - "etf-crypto-primitives 0.2.4 (git+https://github.com/ideal-lab5/etf-sdk/?branch=w3fbls-migration)", + "etf-crypto-primitives 0.2.4 (git+http://github.com/ideal-lab5/etf-sdk?branch=w3fbls-migration)", "futures", "hash-db", "hash256-std-hasher", @@ -9857,38 +4248,10 @@ dependencies = [ "zeroize", ] -[[package]] -name = "sp-core-hashing" -version = "15.0.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" -dependencies = [ - "sp-crypto-hashing 0.1.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", -] - -[[package]] -name = "sp-crypto-ec-utils" -version = "0.10.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" -dependencies = [ - "ark-bls12-377", - "ark-bls12-377-ext", - "ark-bls12-381", - "ark-bls12-381-ext", - "ark-bw6-761", - "ark-bw6-761-ext", - "ark-ec", - "ark-ed-on-bls12-377", - "ark-ed-on-bls12-377-ext", - "ark-ed-on-bls12-381-bandersnatch", - "ark-ed-on-bls12-381-bandersnatch-ext", - "ark-scale", - "sp-runtime-interface 24.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", -] - [[package]] name = "sp-crypto-ec-utils" version = "0.10.0" -source = "git+https://github.com/paritytech/polkadot-sdk#310ef5ce1086affdc522c4d1736211de2a7dd99e" +source = "git+https://github.com/paritytech/polkadot-sdk#08498f5473351c3d2f8eacbe1bfd7bc6d3a2ef8d" dependencies = [ "ark-bls12-377", "ark-bls12-377-ext", @@ -9955,7 +4318,7 @@ dependencies = [ [[package]] name = "sp-debug-derive" version = "14.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk#310ef5ce1086affdc522c4d1736211de2a7dd99e" +source = "git+https://github.com/paritytech/polkadot-sdk#08498f5473351c3d2f8eacbe1bfd7bc6d3a2ef8d" dependencies = [ "proc-macro2", "quote", @@ -9975,38 +4338,13 @@ dependencies = [ [[package]] name = "sp-externalities" version = "0.25.0" -source = "git+https://github.com/paritytech/polkadot-sdk#310ef5ce1086affdc522c4d1736211de2a7dd99e" +source = "git+https://github.com/paritytech/polkadot-sdk#08498f5473351c3d2f8eacbe1bfd7bc6d3a2ef8d" dependencies = [ "environmental", "parity-scale-codec", "sp-storage 19.0.0 (git+https://github.com/paritytech/polkadot-sdk)", ] -[[package]] -name = "sp-genesis-builder" -version = "0.8.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" -dependencies = [ - "parity-scale-codec", - "scale-info", - "serde_json", - "sp-api", - "sp-runtime", -] - -[[package]] -name = "sp-inherents" -version = "26.0.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" -dependencies = [ - "async-trait", - "impl-trait-for-tuples", - "parity-scale-codec", - "scale-info", - "sp-runtime", - "thiserror", -] - [[package]] name = "sp-io" version = "30.0.0" @@ -10034,16 +4372,6 @@ dependencies = [ "tracing-core", ] -[[package]] -name = "sp-keyring" -version = "31.0.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" -dependencies = [ - "sp-core", - "sp-runtime", - "strum 0.26.3", -] - [[package]] name = "sp-keystore" version = "0.34.0" @@ -10055,15 +4383,6 @@ dependencies = [ "sp-externalities 0.25.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", ] -[[package]] -name = "sp-maybe-compressed-blob" -version = "11.0.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" -dependencies = [ - "thiserror", - "zstd 0.12.4", -] - [[package]] name = "sp-metadata-ir" version = "0.6.0" @@ -10074,17 +4393,6 @@ dependencies = [ "scale-info", ] -[[package]] -name = "sp-mixnet" -version = "0.4.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" -dependencies = [ - "parity-scale-codec", - "scale-info", - "sp-api", - "sp-application-crypto", -] - [[package]] name = "sp-mmr-primitives" version = "26.0.0" @@ -10102,29 +4410,6 @@ dependencies = [ "thiserror", ] -[[package]] -name = "sp-npos-elections" -version = "26.0.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" -dependencies = [ - "parity-scale-codec", - "scale-info", - "serde", - "sp-arithmetic", - "sp-core", - "sp-runtime", -] - -[[package]] -name = "sp-offchain" -version = "26.0.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" -dependencies = [ - "sp-api", - "sp-core", - "sp-runtime", -] - [[package]] name = "sp-panic-handler" version = "13.0.0" @@ -10182,7 +4467,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface" version = "24.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk#310ef5ce1086affdc522c4d1736211de2a7dd99e" +source = "git+https://github.com/paritytech/polkadot-sdk#08498f5473351c3d2f8eacbe1bfd7bc6d3a2ef8d" dependencies = [ "bytes", "impl-trait-for-tuples", @@ -10205,7 +4490,7 @@ source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1 dependencies = [ "Inflector", "expander", - "proc-macro-crate 3.1.0", + "proc-macro-crate 3.2.0", "proc-macro2", "quote", "syn 2.0.77", @@ -10214,43 +4499,16 @@ dependencies = [ [[package]] name = "sp-runtime-interface-proc-macro" version = "17.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk#310ef5ce1086affdc522c4d1736211de2a7dd99e" +source = "git+https://github.com/paritytech/polkadot-sdk#08498f5473351c3d2f8eacbe1bfd7bc6d3a2ef8d" dependencies = [ "Inflector", "expander", - "proc-macro-crate 3.1.0", + "proc-macro-crate 3.2.0", "proc-macro2", "quote", "syn 2.0.77", ] -[[package]] -name = "sp-session" -version = "27.0.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" -dependencies = [ - "parity-scale-codec", - "scale-info", - "sp-api", - "sp-core", - "sp-keystore", - "sp-runtime", - "sp-staking", -] - -[[package]] -name = "sp-staking" -version = "26.0.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" -dependencies = [ - "impl-trait-for-tuples", - "parity-scale-codec", - "scale-info", - "serde", - "sp-core", - "sp-runtime", -] - [[package]] name = "sp-state-machine" version = "0.35.0" @@ -10271,30 +4529,6 @@ dependencies = [ "trie-db", ] -[[package]] -name = "sp-statement-store" -version = "10.0.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" -dependencies = [ - "aes-gcm", - "curve25519-dalek", - "ed25519-dalek", - "hkdf", - "parity-scale-codec", - "rand", - "scale-info", - "sha2 0.10.8", - "sp-api", - "sp-application-crypto", - "sp-core", - "sp-crypto-hashing 0.1.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", - "sp-externalities 0.25.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", - "sp-runtime", - "sp-runtime-interface 24.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", - "thiserror", - "x25519-dalek", -] - [[package]] name = "sp-std" version = "14.0.0" @@ -10303,7 +4537,7 @@ source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1 [[package]] name = "sp-std" version = "14.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk#310ef5ce1086affdc522c4d1736211de2a7dd99e" +source = "git+https://github.com/paritytech/polkadot-sdk#08498f5473351c3d2f8eacbe1bfd7bc6d3a2ef8d" [[package]] name = "sp-storage" @@ -10320,7 +4554,7 @@ dependencies = [ [[package]] name = "sp-storage" version = "19.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk#310ef5ce1086affdc522c4d1736211de2a7dd99e" +source = "git+https://github.com/paritytech/polkadot-sdk#08498f5473351c3d2f8eacbe1bfd7bc6d3a2ef8d" dependencies = [ "impl-serde", "parity-scale-codec", @@ -10329,18 +4563,6 @@ dependencies = [ "sp-debug-derive 14.0.0 (git+https://github.com/paritytech/polkadot-sdk)", ] -[[package]] -name = "sp-timestamp" -version = "26.0.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" -dependencies = [ - "async-trait", - "parity-scale-codec", - "sp-inherents", - "sp-runtime", - "thiserror", -] - [[package]] name = "sp-tracing" version = "16.0.0" @@ -10355,7 +4577,7 @@ dependencies = [ [[package]] name = "sp-tracing" version = "16.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk#310ef5ce1086affdc522c4d1736211de2a7dd99e" +source = "git+https://github.com/paritytech/polkadot-sdk#08498f5473351c3d2f8eacbe1bfd7bc6d3a2ef8d" dependencies = [ "parity-scale-codec", "tracing", @@ -10363,35 +4585,12 @@ dependencies = [ "tracing-subscriber", ] -[[package]] -name = "sp-transaction-pool" -version = "26.0.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" -dependencies = [ - "sp-api", - "sp-runtime", -] - -[[package]] -name = "sp-transaction-storage-proof" -version = "26.0.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" -dependencies = [ - "async-trait", - "parity-scale-codec", - "scale-info", - "sp-core", - "sp-inherents", - "sp-runtime", - "sp-trie", -] - [[package]] name = "sp-trie" version = "29.0.0" source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" dependencies = [ - "ahash 0.8.11", + "ahash", "hash-db", "lazy_static", "memory-db", @@ -10442,17 +4641,15 @@ name = "sp-wasm-interface" version = "20.0.0" source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" dependencies = [ - "anyhow", "impl-trait-for-tuples", "log", "parity-scale-codec", - "wasmtime", ] [[package]] name = "sp-wasm-interface" version = "20.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk#310ef5ce1086affdc522c4d1736211de2a7dd99e" +source = "git+https://github.com/paritytech/polkadot-sdk#08498f5473351c3d2f8eacbe1bfd7bc6d3a2ef8d" dependencies = [ "anyhow", "impl-trait-for-tuples", @@ -10492,9 +4689,9 @@ dependencies = [ [[package]] name = "ss58-registry" -version = "1.47.0" +version = "1.50.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4743ce898933fbff7bbf414f497c459a782d496269644b3d650a398ae6a487ba" +checksum = "43fce22ed1df64d04b262351c8f9d5c6da4f76f79f25ad15529792f893fad25d" dependencies = [ "Inflector", "num-format", @@ -10505,127 +4702,12 @@ dependencies = [ "unicode-xid", ] -[[package]] -name = "ssz_rs" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "057291e5631f280978fa9c8009390663ca4613359fc1318e36a8c24c392f6d1f" -dependencies = [ - "bitvec", - "num-bigint", - "sha2 0.9.9", - "ssz_rs_derive", -] - -[[package]] -name = "ssz_rs_derive" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f07d54c4d01a1713eb363b55ba51595da15f6f1211435b71466460da022aa140" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "stable_deref_trait" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" - -[[package]] -name = "staging-parachain-info" -version = "0.7.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" -dependencies = [ - "cumulus-primitives-core", - "frame-support", - "frame-system", - "parity-scale-codec", - "scale-info", - "sp-runtime", - "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", -] - -[[package]] -name = "staging-xcm" -version = "7.0.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" -dependencies = [ - "array-bytes 6.2.2", - "bounded-collections", - "derivative", - "environmental", - "impl-trait-for-tuples", - "log", - "parity-scale-codec", - "scale-info", - "serde", - "sp-weights", - "xcm-procedural", -] - -[[package]] -name = "staging-xcm-builder" -version = "7.0.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" -dependencies = [ - "frame-support", - "frame-system", - "impl-trait-for-tuples", - "log", - "pallet-transaction-payment", - "parity-scale-codec", - "polkadot-parachain-primitives", - "scale-info", - "sp-arithmetic", - "sp-io", - "sp-runtime", - "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", - "sp-weights", - "staging-xcm", - "staging-xcm-executor", -] - -[[package]] -name = "staging-xcm-executor" -version = "7.0.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" -dependencies = [ - "environmental", - "frame-benchmarking", - "frame-support", - "impl-trait-for-tuples", - "log", - "parity-scale-codec", - "scale-info", - "sp-arithmetic", - "sp-core", - "sp-io", - "sp-runtime", - "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", - "sp-weights", - "staging-xcm", -] - [[package]] name = "static_assertions" version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" -[[package]] -name = "string-interner" -version = "0.17.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c6a0d765f5807e98a091107bae0a56ea3799f66a5de47b2c84c94a39c09974e" -dependencies = [ - "cfg-if", - "hashbrown 0.14.3", - "serde", -] - [[package]] name = "strsim" version = "0.10.0" @@ -10694,30 +4776,11 @@ dependencies = [ "zeroize", ] -[[package]] -name = "substrate-wasm-builder" -version = "17.0.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" -dependencies = [ - "build-helper", - "cargo_metadata", - "console", - "filetime", - "parity-wasm", - "polkavm-linker", - "sp-maybe-compressed-blob", - "strum 0.26.3", - "tempfile", - "toml 0.8.12", - "walkdir", - "wasm-opt", -] - [[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 = "subxt" @@ -10799,7 +4862,7 @@ version = "0.35.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "98dc84d7e6a0abd7ed407cce0bf60d7d58004f699460cffb979640717d1ab506" dependencies = [ - "darling 0.20.8", + "darling 0.20.10", "parity-scale-codec", "proc-macro-error", "quote", @@ -10816,7 +4879,7 @@ checksum = "cc10c54028d079a9f1be65188707cd29e5ffd8d0031a2b1346a0941d57b7ab7e" dependencies = [ "derive_more", "frame-metadata 16.0.0", - "hashbrown 0.14.3", + "hashbrown 0.14.5", "parity-scale-codec", "scale-info", "sp-crypto-hashing 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -10867,55 +4930,12 @@ dependencies = [ "unicode-ident", ] -[[package]] -name = "syn-solidity" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86b837ef12ab88835251726eb12237655e61ec8dc8a280085d1961cdc3dfd047" -dependencies = [ - "paste", - "proc-macro2", - "quote", - "syn 2.0.77", -] - -[[package]] -name = "synstructure" -version = "0.12.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f36bdaa60a83aca3921b5259d5400cbf5e90fc51931376a9bd4a0eb79aa7210f" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", - "unicode-xid", -] - [[package]] name = "tap" version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" -[[package]] -name = "target-lexicon" -version = "0.12.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1" - -[[package]] -name = "tempfile" -version = "3.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8fcd239983515c23a32fb82099f97d0b11b8c72f654ed659363a95c3dad7a53" -dependencies = [ - "cfg-if", - "fastrand", - "once_cell", - "rustix 0.38.34", - "windows-sys 0.52.0", -] - [[package]] name = "termcolor" version = "1.4.1" @@ -10925,35 +4945,20 @@ dependencies = [ "winapi-util", ] -[[package]] -name = "testnet-parachains-constants" -version = "1.0.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" -dependencies = [ - "cumulus-primitives-core", - "frame-support", - "polkadot-core-primitives", - "rococo-runtime-constants", - "smallvec", - "sp-runtime", - "staging-xcm", - "westend-runtime-constants", -] - [[package]] name = "thiserror" -version = "1.0.59" +version = "1.0.64" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0126ad08bff79f29fc3ae6a55cc72352056dfff61e3ff8bb7129476d44b23aa" +checksum = "d50af8abc119fb8bb6dbabcfa89656f46f84aa0ac7688088608076ad2b459a84" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.59" +version = "1.0.64" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1cd413b5d558b4c5bf3680e324a6fa5014e7b7c067a51e69dbdf47eb7148b66" +checksum = "08904e7672f5eb876eaaf87e0ce17857500934f4981c4a0ab2b4aa98baac7fc3" dependencies = [ "proc-macro2", "quote", @@ -11001,20 +5006,11 @@ dependencies = [ "time-core", ] -[[package]] -name = "tiny-keccak" -version = "2.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c9d3793400a45f954c52e73d068316d76b6f4e36977e3fcebb13a2721e80237" -dependencies = [ - "crunchy", -] - [[package]] name = "tinyvec" -version = "1.6.0" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" +checksum = "445e881f4f6d382d5f27c034e25eb92edd7c784ceab92a0937db7f2e9471b938" dependencies = [ "tinyvec_macros", ] @@ -11027,26 +5023,25 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.37.0" +version = "1.40.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1adbebffeca75fcfd058afa480fb6c0b81e165a0323f9c9d39c9697e37c46787" +checksum = "e2b070231665d27ad9ec9b8df639893f46727666c6767db40317fbe920a5d998" dependencies = [ "backtrace", "bytes", "libc", - "mio 0.8.11", - "num_cpus", + "mio", "pin-project-lite", "socket2", "tokio-macros", - "windows-sys 0.48.0", + "windows-sys 0.52.0", ] [[package]] name = "tokio-macros" -version = "2.2.0" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b" +checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752" dependencies = [ "proc-macro2", "quote", @@ -11059,7 +5054,7 @@ version = "0.24.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081" dependencies = [ - "rustls 0.21.11", + "rustls 0.21.12", "tokio", ] @@ -11076,9 +5071,9 @@ dependencies = [ [[package]] name = "tokio-stream" -version = "0.1.15" +version = "0.1.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "267ac89e0bec6e691e5813911606935d77c476ff49024f98abcea3e7b15e37af" +checksum = "4f4e6ce100d0eb49a2734f8c0812bcd324cf357d21810932c5df6b96ef2b86f1" dependencies = [ "futures-core", "pin-project-lite", @@ -11087,45 +5082,35 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.7.10" +version = "0.7.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5419f34732d9eb6ee4c3578b7989078579b7f039cbbb9ca2c4da015749371e15" +checksum = "61e7c3654c13bcd040d4a03abee2c75b1d14a37b423cf5a813ceae1cc903ec6a" dependencies = [ "bytes", "futures-core", "futures-io", - "futures-sink", - "pin-project-lite", - "tokio", - "tracing", -] - -[[package]] -name = "toml" -version = "0.5.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4f7f0dd8d50a853a531c426359045b1998f04219d88799810762cd4ad314234" -dependencies = [ - "serde", + "futures-sink", + "pin-project-lite", + "tokio", ] [[package]] name = "toml" -version = "0.8.12" +version = "0.8.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e9dd1545e8208b4a5af1aa9bbd0b4cf7e9ea08fabc5d0a5c67fcaafa17433aa3" +checksum = "a1ed1f98e3fdc28d6d910e6737ae6ab1a93bf1985935a1193e68f93eeb68d24e" dependencies = [ "serde", "serde_spanned", "toml_datetime", - "toml_edit 0.22.12", + "toml_edit 0.22.21", ] [[package]] name = "toml_datetime" -version = "0.6.5" +version = "0.6.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3550f4e9685620ac18a50ed434eb3aec30db8ba93b0287467bca5826ea25baf1" +checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41" dependencies = [ "serde", ] @@ -11136,40 +5121,29 @@ version = "0.19.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" dependencies = [ - "indexmap 2.2.6", - "toml_datetime", - "winnow 0.5.40", -] - -[[package]] -name = "toml_edit" -version = "0.21.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a8534fd7f78b5405e860340ad6575217ce99f38d4d5c8f2442cb5ecb50090e1" -dependencies = [ - "indexmap 2.2.6", + "indexmap", "toml_datetime", "winnow 0.5.40", ] [[package]] name = "toml_edit" -version = "0.22.12" +version = "0.22.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3328d4f68a705b2a4498da1d580585d39a6510f98318a2cec3018a7ec61ddef" +checksum = "3b072cee73c449a636ffd6f32bd8de3a9f7119139aff882f44943ce2986dc5cf" dependencies = [ - "indexmap 2.2.6", + "indexmap", "serde", "serde_spanned", "toml_datetime", - "winnow 0.6.6", + "winnow 0.6.18", ] [[package]] name = "totp-rs" -version = "5.5.1" +version = "5.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c4ae9724c5888c0417d2396037ed3b60665925624766416e3e342b6ba5dbd3f" +checksum = "17b2f27dad992486c26b4e7455f38aa487e838d6d61b57e72906ee2b8c287a90" dependencies = [ "base32", "constant_time_eq 0.2.6", @@ -11195,15 +5169,15 @@ 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" @@ -11295,18 +5269,6 @@ version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" -[[package]] -name = "tt-call" -version = "1.0.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4f195fd851901624eee5a58c4bb2b4f06399148fcd0ed336e6f1cb60a9881df" - -[[package]] -name = "tuplex" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "676ac81d5454c4dcf37955d34fa8626ede3490f744b86ca14a7b90168d2a08aa" - [[package]] name = "twox-hash" version = "1.6.3" @@ -11325,12 +5287,6 @@ version = "1.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" -[[package]] -name = "ucd-trie" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed646292ffc8188ef8ea4d1e0e0150fb15a5c2e12ad9b8fc191ae7a8a7f3c4b9" - [[package]] name = "uint" version = "0.9.5" @@ -11343,12 +5299,6 @@ dependencies = [ "static_assertions", ] -[[package]] -name = "unarray" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eaea85b334db583fe3274d12b4cd1880032beab409c0d774be044d4480ab9a94" - [[package]] name = "unicode-bidi" version = "0.3.15" @@ -11357,9 +5307,9 @@ checksum = "08f95100a766bf4f8f28f90d77e0a5461bbdb219042e7679bebe79004fed8d75" [[package]] name = "unicode-ident" -version = "1.0.12" +version = "1.0.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" +checksum = "e91b56cd4cadaeb79bbf1a5645f6b4f8dc5bde8834ad5894a8db35fda9efa1fe" [[package]] name = "unicode-normalization" @@ -11372,9 +5322,9 @@ dependencies = [ [[package]] name = "unicode-segmentation" -version = "1.11.0" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4c87d22b6e3f4a18d4d40ef354e97c90fcb14dd91d7dc0aa9d8a1172ebf7202" +checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" [[package]] name = "unicode-truncate" @@ -11389,15 +5339,15 @@ dependencies = [ [[package]] name = "unicode-width" -version = "0.1.13" +version = "0.1.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0336d538f7abc86d282a4189614dfaa90810dfc2c6f6427eaf88e16311dd225d" +checksum = "7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af" [[package]] name = "unicode-xid" -version = "0.2.4" +version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f962df74c8c05a667b5ee8bcf162993134c104e96440b663c8daa176dc772d8c" +checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" [[package]] name = "universal-hash" @@ -11417,9 +5367,9 @@ checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" [[package]] name = "url" -version = "2.5.0" +version = "2.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31e6302e3bb753d46e83516cae55ae196fc0c309407cf11ab35cc51a4c2a4633" +checksum = "22784dbdf76fdde8af1aeda5622b546b422b6fc585325248a2bf9f5e41e94d6c" dependencies = [ "form_urlencoded", "idna", @@ -11428,492 +5378,164 @@ dependencies = [ [[package]] name = "utf8parse" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" +checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" [[package]] name = "valuable" version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" - -[[package]] -name = "version_check" -version = "0.9.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" - -[[package]] -name = "w3f-bls" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7335e4c132c28cc43caef6adb339789e599e39adbe78da0c4d547fad48cbc331" -dependencies = [ - "ark-bls12-377", - "ark-bls12-381", - "ark-ec", - "ark-ff 0.4.2", - "ark-serialize 0.4.2", - "ark-serialize-derive", - "arrayref", - "constcat", - "digest 0.10.7", - "rand", - "rand_chacha", - "rand_core", - "sha2 0.10.8", - "sha3", - "thiserror", - "zeroize", -] - -[[package]] -name = "wait-timeout" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f200f5b12eb75f8c1ed65abd4b2db8a6e1b138a20de009dacee265a2498f3f6" -dependencies = [ - "libc", -] - -[[package]] -name = "walkdir" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" -dependencies = [ - "same-file", - "winapi-util", -] - -[[package]] -name = "want" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" -dependencies = [ - "try-lock", -] - -[[package]] -name = "wasi" -version = "0.11.0+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" - -[[package]] -name = "wasm-bindgen" -version = "0.2.92" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4be2531df63900aeb2bca0daaaddec08491ee64ceecbee5076636a3b026795a8" -dependencies = [ - "cfg-if", - "wasm-bindgen-macro", -] - -[[package]] -name = "wasm-bindgen-backend" -version = "0.2.92" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "614d787b966d3989fa7bb98a654e369c762374fd3213d212cfc0251257e747da" -dependencies = [ - "bumpalo", - "log", - "once_cell", - "proc-macro2", - "quote", - "syn 2.0.77", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-macro" -version = "0.2.92" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1f8823de937b71b9460c0c34e25f3da88250760bec0ebac694b49997550d726" -dependencies = [ - "quote", - "wasm-bindgen-macro-support", -] - -[[package]] -name = "wasm-bindgen-macro-support" -version = "0.2.92" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.77", - "wasm-bindgen-backend", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-shared" -version = "0.2.92" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af190c94f2773fdb3729c55b007a722abb5384da03bc0986df4c289bf5567e96" - -[[package]] -name = "wasm-instrument" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a47ecb37b9734d1085eaa5ae1a81e60801fd8c28d4cabdd8aedb982021918bc" -dependencies = [ - "parity-wasm", -] - -[[package]] -name = "wasm-opt" -version = "0.116.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2fd87a4c135535ffed86123b6fb0f0a5a0bc89e50416c942c5f0662c645f679c" -dependencies = [ - "anyhow", - "libc", - "strum 0.24.1", - "strum_macros 0.24.3", - "tempfile", - "thiserror", - "wasm-opt-cxx-sys", - "wasm-opt-sys", -] - -[[package]] -name = "wasm-opt-cxx-sys" -version = "0.116.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c57b28207aa724318fcec6575fe74803c23f6f266fce10cbc9f3f116762f12e" -dependencies = [ - "anyhow", - "cxx", - "cxx-build", - "wasm-opt-sys", -] - -[[package]] -name = "wasm-opt-sys" -version = "0.116.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a1cce564dc768dacbdb718fc29df2dba80bd21cb47d8f77ae7e3d95ceb98cbe" -dependencies = [ - "anyhow", - "cc", - "cxx", - "cxx-build", -] - -[[package]] -name = "wasmi" -version = "0.31.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77a8281d1d660cdf54c76a3efa9ddd0c270cada1383a995db3ccb43d166456c7" -dependencies = [ - "smallvec", - "spin", - "wasmi_arena", - "wasmi_core 0.13.0", - "wasmparser-nostd", -] - -[[package]] -name = "wasmi" -version = "0.32.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50386c99b9c32bd2ed71a55b6dd4040af2580530fae8bdb9a6576571a80d0cca" -dependencies = [ - "arrayvec 0.7.4", - "multi-stash", - "num-derive", - "num-traits", - "smallvec", - "spin", - "wasmi_collections", - "wasmi_core 0.32.3", - "wasmparser-nostd", -] - -[[package]] -name = "wasmi_arena" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "104a7f73be44570cac297b3035d76b169d6599637631cf37a1703326a0727073" - -[[package]] -name = "wasmi_collections" -version = "0.32.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c128c039340ffd50d4195c3f8ce31aac357f06804cfc494c8b9508d4b30dca4" -dependencies = [ - "ahash 0.8.11", - "hashbrown 0.14.3", - "string-interner", -] - -[[package]] -name = "wasmi_core" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcf1a7db34bff95b85c261002720c00c3a6168256dcb93041d3fa2054d19856a" -dependencies = [ - "downcast-rs", - "libm", - "num-traits", - "paste", -] - -[[package]] -name = "wasmi_core" -version = "0.32.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a23b3a7f6c8c3ceeec6b83531ee61f0013c56e51cbf2b14b0f213548b23a4b41" -dependencies = [ - "downcast-rs", - "libm", - "num-traits", - "paste", -] - -[[package]] -name = "wasmparser" -version = "0.102.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48134de3d7598219ab9eaf6b91b15d8e50d31da76b8519fe4ecfcec2cf35104b" -dependencies = [ - "indexmap 1.9.3", - "url", -] - -[[package]] -name = "wasmparser-nostd" -version = "0.100.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5a015fe95f3504a94bb1462c717aae75253e39b9dd6c3fb1062c934535c64aa" -dependencies = [ - "indexmap-nostd", -] - -[[package]] -name = "wasmtime" -version = "8.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f907fdead3153cb9bfb7a93bbd5b62629472dc06dee83605358c64c52ed3dda9" -dependencies = [ - "anyhow", - "bincode", - "cfg-if", - "indexmap 1.9.3", - "libc", - "log", - "object 0.30.4", - "once_cell", - "paste", - "psm", - "rayon", - "serde", - "target-lexicon", - "wasmparser", - "wasmtime-cache", - "wasmtime-cranelift", - "wasmtime-environ", - "wasmtime-jit", - "wasmtime-runtime", - "windows-sys 0.45.0", -] +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" [[package]] -name = "wasmtime-asm-macros" -version = "8.0.1" +name = "version_check" +version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3b9daa7c14cd4fa3edbf69de994408d5f4b7b0959ac13fa69d465f6597f810d" -dependencies = [ - "cfg-if", -] +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" [[package]] -name = "wasmtime-cache" -version = "8.0.1" +name = "w3f-bls" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c86437fa68626fe896e5afc69234bb2b5894949083586535f200385adfd71213" +checksum = "9c5da5fa2c6afa2c9158eaa7cd9aee249765eb32b5fb0c63ad8b9e79336a47ec" dependencies = [ - "anyhow", - "base64 0.21.7", - "bincode", - "directories-next", - "file-per-thread-logger", - "log", - "rustix 0.36.17", - "serde", + "ark-bls12-377", + "ark-bls12-381", + "ark-ec", + "ark-ff", + "ark-serialize", + "ark-serialize-derive", + "arrayref", + "constcat", + "digest 0.10.7", + "rand", + "rand_chacha", + "rand_core", "sha2 0.10.8", - "toml 0.5.11", - "windows-sys 0.45.0", - "zstd 0.11.2+zstd.1.5.2", + "sha3", + "thiserror", + "zeroize", ] [[package]] -name = "wasmtime-cranelift" -version = "8.0.1" +name = "walkdir" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1cefde0cce8cb700b1b21b6298a3837dba46521affd7b8c38a9ee2c869eee04" +checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" dependencies = [ - "anyhow", - "cranelift-codegen", - "cranelift-entity", - "cranelift-frontend", - "cranelift-native", - "cranelift-wasm", - "gimli 0.27.3", - "log", - "object 0.30.4", - "target-lexicon", - "thiserror", - "wasmparser", - "wasmtime-cranelift-shared", - "wasmtime-environ", + "same-file", + "winapi-util", ] [[package]] -name = "wasmtime-cranelift-shared" -version = "8.0.1" +name = "want" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd041e382ef5aea1b9fc78442394f1a4f6d676ce457e7076ca4cb3f397882f8b" +checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" dependencies = [ - "anyhow", - "cranelift-codegen", - "cranelift-native", - "gimli 0.27.3", - "object 0.30.4", - "target-lexicon", - "wasmtime-environ", + "try-lock", ] [[package]] -name = "wasmtime-environ" -version = "8.0.1" +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a990198cee4197423045235bf89d3359e69bd2ea031005f4c2d901125955c949" -dependencies = [ - "anyhow", - "cranelift-entity", - "gimli 0.27.3", - "indexmap 1.9.3", - "log", - "object 0.30.4", - "serde", - "target-lexicon", - "thiserror", - "wasmparser", - "wasmtime-types", -] +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] -name = "wasmtime-jit" -version = "8.0.1" +name = "wasm-bindgen" +version = "0.2.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0de48df552cfca1c9b750002d3e07b45772dd033b0b206d5c0968496abf31244" +checksum = "a82edfc16a6c469f5f44dc7b571814045d60404b55a0ee849f9bcfa2e63dd9b5" dependencies = [ - "addr2line 0.19.0", - "anyhow", - "bincode", "cfg-if", - "cpp_demangle", - "gimli 0.27.3", - "log", - "object 0.30.4", - "rustc-demangle", - "serde", - "target-lexicon", - "wasmtime-environ", - "wasmtime-jit-debug", - "wasmtime-jit-icache-coherence", - "wasmtime-runtime", - "windows-sys 0.45.0", + "once_cell", + "wasm-bindgen-macro", ] [[package]] -name = "wasmtime-jit-debug" -version = "8.0.1" +name = "wasm-bindgen-backend" +version = "0.2.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e0554b84c15a27d76281d06838aed94e13a77d7bf604bbbaf548aa20eb93846" +checksum = "9de396da306523044d3302746f1208fa71d7532227f15e347e2d93e4145dd77b" dependencies = [ - "object 0.30.4", + "bumpalo", + "log", "once_cell", - "rustix 0.36.17", + "proc-macro2", + "quote", + "syn 2.0.77", + "wasm-bindgen-shared", ] [[package]] -name = "wasmtime-jit-icache-coherence" -version = "8.0.1" +name = "wasm-bindgen-macro" +version = "0.2.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aecae978b13f7f67efb23bd827373ace4578f2137ec110bbf6a4a7cde4121bbd" +checksum = "585c4c91a46b072c92e908d99cb1dcdf95c5218eeb6f3bf1efa991ee7a68cccf" dependencies = [ - "cfg-if", - "libc", - "windows-sys 0.45.0", + "quote", + "wasm-bindgen-macro-support", ] [[package]] -name = "wasmtime-runtime" -version = "8.0.1" +name = "wasm-bindgen-macro-support" +version = "0.2.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "658cf6f325232b6760e202e5255d823da5e348fdea827eff0a2a22319000b441" +checksum = "afc340c74d9005395cf9dd098506f7f44e38f2b4a21c6aaacf9a105ea5e1e836" dependencies = [ - "anyhow", - "cc", - "cfg-if", - "indexmap 1.9.3", - "libc", - "log", - "mach", - "memfd", - "memoffset", - "paste", - "rand", - "rustix 0.36.17", - "wasmtime-asm-macros", - "wasmtime-environ", - "wasmtime-jit-debug", - "windows-sys 0.45.0", + "proc-macro2", + "quote", + "syn 2.0.77", + "wasm-bindgen-backend", + "wasm-bindgen-shared", ] [[package]] -name = "wasmtime-types" -version = "8.0.1" +name = "wasm-bindgen-shared" +version = "0.2.93" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c62a0a307cb4a311d3a07867860911ca130c3494e8c2719593806c08bc5d0484" + +[[package]] +name = "wasmi" +version = "0.31.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4f6fffd2a1011887d57f07654dd112791e872e3ff4a2e626aee8059ee17f06f" +checksum = "77a8281d1d660cdf54c76a3efa9ddd0c270cada1383a995db3ccb43d166456c7" dependencies = [ - "cranelift-entity", - "serde", - "thiserror", - "wasmparser", + "smallvec", + "spin", + "wasmi_arena", + "wasmi_core", + "wasmparser-nostd", ] [[package]] -name = "westend-runtime-constants" -version = "7.0.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" +name = "wasmi_arena" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "104a7f73be44570cac297b3035d76b169d6599637631cf37a1703326a0727073" + +[[package]] +name = "wasmi_core" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcf1a7db34bff95b85c261002720c00c3a6168256dcb93041d3fa2054d19856a" dependencies = [ - "frame-support", - "polkadot-primitives", - "polkadot-runtime-common", - "smallvec", - "sp-core", - "sp-runtime", - "sp-weights", - "staging-xcm", - "staging-xcm-builder", + "downcast-rs", + "libm", + "num-traits", + "paste", ] [[package]] -name = "wide" -version = "0.7.28" +name = "wasmparser-nostd" +version = "0.100.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b828f995bf1e9622031f8009f8481a85406ce1f4d4588ff746d872043e855690" +checksum = "d5a015fe95f3504a94bb1462c717aae75253e39b9dd6c3fb1062c934535c64aa" dependencies = [ - "bytemuck", - "safe_arch", + "indexmap-nostd", ] [[package]] @@ -11934,11 +5556,11 @@ checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" [[package]] name = "winapi-util" -version = "0.1.8" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d4cc384e1e73b93bafa6fb4f1df8c41695c8a91cf9c4c64358067d15a7b6c6b" +checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" dependencies = [ - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -11947,210 +5569,87 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" -[[package]] -name = "windows-sys" -version = "0.45.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" -dependencies = [ - "windows-targets 0.42.2", -] - -[[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", -] - [[package]] name = "windows-sys" version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" dependencies = [ - "windows-targets 0.52.5", -] - -[[package]] -name = "windows-targets" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" -dependencies = [ - "windows_aarch64_gnullvm 0.42.2", - "windows_aarch64_msvc 0.42.2", - "windows_i686_gnu 0.42.2", - "windows_i686_msvc 0.42.2", - "windows_x86_64_gnu 0.42.2", - "windows_x86_64_gnullvm 0.42.2", - "windows_x86_64_msvc 0.42.2", + "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]] name = "windows-targets" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f0713a46559409d202e70e28227288446bf7841d3211583a4b53e3f6d96e7eb" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" dependencies = [ - "windows_aarch64_gnullvm 0.52.5", - "windows_aarch64_msvc 0.52.5", - "windows_i686_gnu 0.52.5", + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", "windows_i686_gnullvm", - "windows_i686_msvc 0.52.5", - "windows_x86_64_gnu 0.52.5", - "windows_x86_64_gnullvm 0.52.5", - "windows_x86_64_msvc 0.52.5", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", ] [[package]] name = "windows_aarch64_gnullvm" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" - -[[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.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7088eed71e8b8dda258ecc8bac5fb1153c5cffaf2578fc8ff5d61e23578d3263" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.48.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" [[package]] name = "windows_aarch64_msvc" -version = "0.52.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9985fd1504e250c615ca5f281c3f7a6da76213ebd5ccc9561496568a2752afb6" - -[[package]] -name = "windows_i686_gnu" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" - -[[package]] -name = "windows_i686_gnu" -version = "0.48.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" [[package]] name = "windows_i686_gnu" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88ba073cf16d5372720ec942a8ccbf61626074c6d4dd2e745299726ce8b89670" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" [[package]] name = "windows_i686_gnullvm" -version = "0.52.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87f4261229030a858f36b459e748ae97545d6f1ec60e5e0d6a3d32e0dc232ee9" - -[[package]] -name = "windows_i686_msvc" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" - -[[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 = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" [[package]] name = "windows_i686_msvc" -version = "0.52.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db3c2bf3d13d5b658be73463284eaf12830ac9a26a90c717b7f771dfe97487bf" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.48.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" [[package]] name = "windows_x86_64_gnu" -version = "0.52.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e4246f76bdeff09eb48875a0fd3e2af6aada79d409d33011886d3e1581517d9" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.48.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" [[package]] name = "windows_x86_64_gnullvm" -version = "0.52.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "852298e482cd67c356ddd9570386e2862b5673c85bd5f88df9ab6802b334c596" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.48.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" [[package]] name = "windows_x86_64_msvc" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bec47e5bfd1bff0eeaf6d8b485cc1074891a197ab4225d504cb7a1ab88b02bf0" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" [[package]] name = "winnow" @@ -12163,9 +5662,9 @@ dependencies = [ [[package]] name = "winnow" -version = "0.6.6" +version = "0.6.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0c976aaaa0e1f90dbb21e9587cdaf1d9679a1cde8875c0d6bd83ab96a208352" +checksum = "68a9bda4691f099d435ad181000724da8e5899daa10713c2d432552b9ccd3a6f" dependencies = [ "memchr", ] @@ -12191,54 +5690,6 @@ dependencies = [ "zeroize", ] -[[package]] -name = "xcm-fee-payment-runtime-api" -version = "0.1.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" -dependencies = [ - "frame-support", - "parity-scale-codec", - "scale-info", - "sp-api", - "sp-runtime", - "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", - "sp-weights", - "staging-xcm", -] - -[[package]] -name = "xcm-procedural" -version = "7.0.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" -dependencies = [ - "Inflector", - "proc-macro2", - "quote", - "syn 2.0.77", -] - -[[package]] -name = "xcm-simulator" -version = "7.0.0" -source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1f08ed576063e678539edafdf3a589ff3989e" -dependencies = [ - "frame-support", - "frame-system", - "parity-scale-codec", - "paste", - "polkadot-core-primitives", - "polkadot-parachain-primitives", - "polkadot-primitives", - "polkadot-runtime-parachains", - "scale-info", - "sp-io", - "sp-runtime", - "sp-std 14.0.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", - "staging-xcm", - "staging-xcm-builder", - "staging-xcm-executor", -] - [[package]] name = "yap" version = "0.11.0" @@ -12247,18 +5698,19 @@ checksum = "ff4524214bc4629eba08d78ceb1d6507070cc0bcbbed23af74e19e6e924a24cf" [[package]] name = "zerocopy" -version = "0.7.32" +version = "0.7.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74d4d3961e53fa4c9a25a8637fc2bfaf2595b3d3ae34875568a5cf64787716be" +checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" dependencies = [ + "byteorder", "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.7.32" +version = "0.7.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ce1b18ccd8e73a9321186f97e46f9f04b778851177567b1975109d26a08d2a6" +checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" dependencies = [ "proc-macro2", "quote", @@ -12267,9 +5719,9 @@ dependencies = [ [[package]] name = "zeroize" -version = "1.7.0" +version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "525b4ec142c6b68a2d10f01f7bbf6755599ca3f81ea53b8431b7dd348f5fdb2d" +checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" dependencies = [ "zeroize_derive", ] @@ -12284,51 +5736,3 @@ dependencies = [ "quote", "syn 2.0.77", ] - -[[package]] -name = "zstd" -version = "0.11.2+zstd.1.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20cc960326ece64f010d2d2107537f26dc589a6573a316bd5b1dba685fa5fde4" -dependencies = [ - "zstd-safe 5.0.2+zstd.1.5.2", -] - -[[package]] -name = "zstd" -version = "0.12.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a27595e173641171fc74a1232b7b1c7a7cb6e18222c11e9dfb9888fa424c53c" -dependencies = [ - "zstd-safe 6.0.6", -] - -[[package]] -name = "zstd-safe" -version = "5.0.2+zstd.1.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d2a5585e04f9eea4b2a3d1eca508c4dee9592a89ef6f450c11719da0726f4db" -dependencies = [ - "libc", - "zstd-sys", -] - -[[package]] -name = "zstd-safe" -version = "6.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee98ffd0b48ee95e6c5168188e44a54550b1564d9d530ee21d5f0eaed1069581" -dependencies = [ - "libc", - "zstd-sys", -] - -[[package]] -name = "zstd-sys" -version = "2.0.13+zstd.1.5.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38ff0f21cfee8f97d94cef41359e0c89aa6113028ab0291aa8ca0038995a95aa" -dependencies = [ - "cc", - "pkg-config", -] diff --git a/Cargo.toml b/Cargo.toml index 19696be..72df582 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,7 +1,8 @@ [workspace] members = [ - "core/", + # "core/", "cli/", + # "test-utils/", ] resolver = "2" @@ -40,20 +41,6 @@ stable_sort_primitive = { level = "allow", priority = 2 } # prefer st extra-unused-type-parameters = { level = "allow", priority = 2 } # stylistic default_constructed_unit_structs = { level = "allow", priority = 2 } # stylistic -# [workspace.dependencies] -# polkavm = "0.9.3" -# polkavm-linker = "0.9.2" -# polkavm-derive = "0.9.1" -# log = { version = "0.4.21", default-features = false } -# quote = { version = "1.0.33" } -# serde = { version = "1.0.197", default-features = false } -# serde-big-array = { version = "0.3.2" } -# serde_derive = { version = "1.0.117" } -# serde_json = { version = "1.0.114", default-features = false } -# serde_yaml = { version = "0.9" } -# syn = { versicargon = "2.0.53" } -# thiserror = { version = "1.0.48" } - [profile.release] opt-level = 3 lto = "thin" @@ -81,49 +68,3 @@ debug = true [workspace.metadata.release] dependent-version = "fix" - -# [package] -# name = "murmur-rs" -# version = "0.1.0" -# edition = "2021" - -# # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html - -# [dependencies] -# subxt = "0.35.2" -# subxt-signer = "0.35.2" -# tokio = { version = "1.35", features = ["macros", "time", "rt-multi-thread"] } -# totp-rs = "5.5.1" -# etf-crypto-primitives = { git = "https://github.com/ideal-lab5/etf-sdk/", branch = "tony/dev" } -# # etf-crypto-primitives = { path = "../etf-sdk/etf-crypto-primitives" } -# clap = { version = "4.1.1", features = ["derive"] } -# rand_chacha = "0.3.1" -# ckb-merkle-mountain-range = "0.5.2" -# # blake2b = "0.10.6" -# sha3 = "0.10.8" -# serde_cbor = "0.11.2" -# # bytes = "1.4.0" -# serde_json = "1.0.108" -# indicatif = "0.17.8" -# sp-keyring = { git = "https://github.com/ideal-lab5/polkadot-sdk.git", branch = "testing" } -# frame-support = { git = "https://github.com/ideal-lab5/polkadot-sdk.git", branch = "testing" } -# # node-runtime = { path = "../etf/runtime" } -# codec = { package = "parity-scale-codec", version = "3.6.12", features = [ -# "derive", -# ] } -# serde = { version = "1.0.188", features = ["alloc", "derive"] } -# sp-core = { git = "https://github.com/ideal-lab5/polkadot-sdk.git", branch = "testing", features = ["bls-experimental"] } -# sp-runtime = { git = "https://github.com/ideal-lab5/polkadot-sdk.git", branch = "testing" } -# beefy = { package = "sp-consensus-beefy-etf", git = "https://github.com/ideal-lab5/etf.git", branch = "tony/dev", features = ["bls-experimental"] } -# sp-application-crypto = { git = "https://github.com/ideal-lab5/polkadot-sdk.git", branch = "testing", features = ["bls-experimental"] } - -# ark-bls12-377 = "0.4.0" -# ark-std = "0.4.0" -# ark-ec = "0.4.0" -# ark-ff = "0.4.0" -# ark-serialize = "0.4.0" -# w3f-bls = "0.1.3" -# getrandom = { version = "0.2", features = ["js"] } -# rand_core = { version = "0.6.4", features = ["getrandom"] } -# hex = "0.4.3" -# array-bytes = "6.1" \ No newline at end of file diff --git a/cli/Cargo.toml b/cli/Cargo.toml index 543171d..e3c85d6 100644 --- a/cli/Cargo.toml +++ b/cli/Cargo.toml @@ -2,37 +2,34 @@ name = "murmur-cli" version = "0.1.0" edition = "2021" +authors.workspace = true -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html +# # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] subxt = "0.35.2" subxt-signer = "0.35.2" tokio = { version = "1.35", features = ["macros", "time", "rt-multi-thread"] } murmur-core = { package = "murmur-core", path = "../core/", features = ["client"] } -etf-crypto-primitives = { git = "https://github.com/ideal-lab5/etf-sdk/", branch = "tony/dev" } -# etf-crypto-primitives = { path = "../etf-sdk/etf-crypto-primitives" } +etf-crypto-primitives = { git = "https://github.com/ideal-lab5/etf-sdk/", branch = "tony/dev" } clap = { version = "4.1.1", features = ["derive"] } rand_chacha = "0.3.1" ckb-merkle-mountain-range = "0.5.2" -# blake2b = "0.10.6" sha3 = "0.10.8" serde_cbor = "0.11.2" -# bytes = "1.4.0" serde_json = "1.0.108" -indicatif = "0.17.8" -sp-keyring = { git = "https://github.com/ideal-lab5/polkadot-sdk.git", branch = "testing" } -frame-support = { git = "https://github.com/ideal-lab5/polkadot-sdk.git", branch = "testing" } -node-template-runtime = { path = "../../etf/runtime" } +# sp-keyring = { git = "https://github.com/ideal-lab5/polkadot-sdk.git", branch = "testing" } +# frame-support = { git = "https://github.com/ideal-lab5/polkadot-sdk.git", branch = "testing" } # node-template-runtime = { git = "https://github.com/ideal-lab5/etf.git", branch = "tony/dev" } codec = { package = "parity-scale-codec", version = "3.6.12", features = [ "derive", ] } serde = { version = "1.0.188", features = ["alloc", "derive"] } sp-core = { git = "https://github.com/ideal-lab5/polkadot-sdk.git", branch = "testing", features = ["bls-experimental"] } -sp-runtime = { git = "https://github.com/ideal-lab5/polkadot-sdk.git", branch = "testing" } -beefy = { package = "sp-consensus-beefy-etf", git = "https://github.com/ideal-lab5/etf.git", branch = "tony/dev", features = ["bls-experimental"] } -sp-application-crypto = { git = "https://github.com/ideal-lab5/polkadot-sdk.git", branch = "testing", features = ["bls-experimental"] } +# sp-runtime = { git = "https://github.com/ideal-lab5/polkadot-sdk.git", branch = "testing" } +# beefy = { package = "sp-consensus-beefy-etf", git = "https://github.com/ideal-lab5/etf.git", branch = "tony/dev", features = ["bls-experimental"] } +beefy = { package = "sp-consensus-beefy-etf", path = "../../etf/primitives/consensus/beefy-etf/", features = ["bls-experimental"] } +# sp-application-crypto = { git = "https://github.com/ideal-lab5/polkadot-sdk.git", branch = "testing", features = ["bls-experimental"] } ark-bls12-377 = "0.4.0" ark-std = "0.4.0" diff --git a/cli/src/main.rs b/cli/src/main.rs index 929674d..4e842a9 100644 --- a/cli/src/main.rs +++ b/cli/src/main.rs @@ -59,7 +59,7 @@ use std::io; // DefaultTerminal, // }; -use node_template_runtime::{self, MurmurCall, RuntimeCall, BalancesCall}; +// use node_template_runtime::{self, MurmurCall, RuntimeCall, BalancesCall}; use subxt::ext::codec::Encode; use beefy::{known_payloads, Payload, Commitment, VersionedFinalityProof}; @@ -70,13 +70,14 @@ use murmur_core::{ BlockNumber, Leaf, MergeLeaves, + Identity, IdentityBuilder, Ciphertext, }, murmur::MurmurStore, }; use etf_crypto_primitives::{ - ibe::fullident::{IBESecret, Identity}, + ibe::fullident::{IBESecret}, encryption::tlock::{TLECiphertext, tle} }; @@ -86,11 +87,10 @@ use rand_core::OsRng; use w3f_bls::{EngineBLS, TinyBLS377, SerializableToBytes, DoublePublicKey}; -use sp_keyring::AccountKeyring; -use frame_support::{BoundedVec, traits::ConstU32}; +// use sp_keyring::AccountKeyring; +// use frame_support::{BoundedVec, traits::ConstU32}; use std::time::Instant; -use indicatif::ProgressBar; /// Command line #[derive(Parser)] @@ -170,7 +170,6 @@ async fn main() -> Result<(), Box> { .await?; let round_pubkey_bytes = result.unwrap().as_type::>()?; - // let round_pubkey = DoublePublicKey::::from_bytes(&round_pubkey_bytes).unwrap(); println!("🔑 Successfully retrieved the round public key."); let current_block = client.blocks().at_latest().await?; let current_block_number = current_block.header().number; @@ -263,7 +262,7 @@ async fn main() -> Result<(), Box> { let store: MurmurStore = load_mmr_store(); // store.to_mmr(&mut mmr).unwrap(); - let tx = prepare_execute::( + let tx = prepare_execute( // etf.clone(), args.name.clone().as_bytes().to_vec(), args.seed.clone().as_bytes().to_vec(), @@ -282,11 +281,15 @@ async fn main() -> Result<(), Box> { Ok(()) } -// fn get_key_index( -// b: &BTreeMap, key: &K) -> Option { -// b.keys().position(|k| k == key) -// } - +/// create a new MMR and use it to generate a valid call to create a murmur wallet +/// returns the call data and the mmr_store +/// +/// * `name`: The name of the murmur wallet +/// * `seed`: The seed used to generate otp codes +/// * `ephem_msk`: An ephemeral secret key TODO: replace with an hkdf? +/// * `block_schedule`: A list of block numbers when the wallet will be executable +/// * `round_pubkey_bytes`: The Ideal Network randomness beacon public key +/// pub async fn create( name: String, seed: String, @@ -321,7 +324,7 @@ pub async fn create( /// We could potentially use that idea as a way to optimize the execute function in general. Rather than /// loading the entire MMR into memory, we really only need to load a minimal subtree containing the leaf we want to consume /// -> add this to the 'future work' section later -pub async fn prepare_execute( +pub async fn prepare_execute( name: Vec, seed: Vec, when: BlockNumber, @@ -455,29 +458,30 @@ mod tests { -// use sha3::Digest; +// // use sha3::Digest; -// fn main() -> io::Result<()> { -// let mut terminal = ratatui::init(); -// terminal.clear()?; -// let app_result = run(terminal); -// ratatui::restore(); -// app_result +// fn main() -> Result<(), Box> { +// // let mut terminal = ratatui::init(); +// // terminal.clear()?; +// // let app_result = run(terminal); +// // ratatui::restore(); +// // app_result +// Ok(()) // } -// fn run(mut terminal: DefaultTerminal) -> io::Result<()> { -// loop { -// terminal.draw(|frame| { -// let greeting = Paragraph::new("Hello Ratatui! (press 'q' to quit)") -// .white() -// .on_blue(); -// frame.render_widget(greeting, frame.area()); -// })?; - -// if let event::Event::Key(key) = event::read()? { -// if key.kind == KeyEventKind::Press && key.code == KeyCode::Char('q') { -// return Ok(()); -// } -// } -// } -// } +// // fn run(mut terminal: DefaultTerminal) -> io::Result<()> { +// // loop { +// // terminal.draw(|frame| { +// // let greeting = Paragraph::new("Hello Ratatui! (press 'q' to quit)") +// // .white() +// // .on_blue(); +// // frame.render_widget(greeting, frame.area()); +// // })?; + +// // if let event::Event::Key(key) = event::read()? { +// // if key.kind == KeyEventKind::Press && key.code == KeyCode::Char('q') { +// // return Ok(()); +// // } +// // } +// // } +// // } diff --git a/core/Cargo.toml b/core/Cargo.toml index 72a9638..229697b 100644 --- a/core/Cargo.toml +++ b/core/Cargo.toml @@ -20,7 +20,7 @@ getrandom = { version = "0.2", features = ["js"], default-features = false, opti rand_core = { version = "0.6.4", features = ["getrandom"], default-features = false, optional = true } codec = { package = "parity-scale-codec", version = "3.6.12", features = ["derive"], default-features = false } -etf-crypto-primitives = { git = "https://github.com/ideal-lab5/etf-sdk/", branch = "tony/dev", default-features = false} +etf-crypto-primitives = { git = "https://github.com/ideal-lab5/etf-sdk/", branch = "dev", default-features = false} ckb-merkle-mountain-range = { version = "0.5.2", default-features = false } sha3 = { version = "0.10.8", default-features = false } serde = { version = "1.0.188", features = ["alloc", "derive"], default-features = false} @@ -42,8 +42,6 @@ std = [ "ark-bls12-377/std", "ark-ff/std", "w3f-bls/std", - # "getrandom/std", - # "rand_core/std", "serde/std", "codec/std", "etf-crypto-primitives/std", diff --git a/core/src/lib.rs b/core/src/lib.rs index b1cc950..e640c3d 100644 --- a/core/src/lib.rs +++ b/core/src/lib.rs @@ -13,12 +13,13 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -#![no_std] +// #![no_std] +#![cfg_attr(not(feature = "std"), no_std)] //! the murmur core library extern crate alloc; #[cfg(feature = "client")] -mod otp; +pub mod otp; pub mod murmur; pub mod types; diff --git a/core/src/murmur.rs b/core/src/murmur.rs index 79da55d..208b3b2 100644 --- a/core/src/murmur.rs +++ b/core/src/murmur.rs @@ -17,7 +17,7 @@ //! The murmur protocol implementation //! use alloc::{ - string::String, vec, + vec, vec::Vec, collections::BTreeMap, }; @@ -28,6 +28,9 @@ use crate::otp::BOTPGenerator; #[cfg(feature = "client")] use rand_core::OsRng; +#[cfg(feature = "client")] +use ark_serialize::CanonicalSerialize; + use crate::types::*; use etf_crypto_primitives::{ ibe::fullident::Identity, @@ -40,10 +43,8 @@ use ckb_merkle_mountain_range::{ MemMMR, MemStore, }, - MMRStore, }; -use ark_serialize::CanonicalSerialize; -use codec::Encode; + use sha3::Digest; #[derive(Debug)] @@ -70,11 +71,16 @@ impl MurmurStore { /// then it encrypts the resulting codes and constructs leaves /// the leaves can be used to generate an MMR /// + /// * `seed`: An any-length seed (i.e. password) + /// * `block_schedule`: The blocks for which OTP codes will be generated + /// * `ephemeral_msk`: Any 32 bytes + /// * `round_public_key`: The IDN beacon's public key + /// pub fn new>( seed: Vec, block_schedule: Vec, ephemeral_msk: [u8;32], - pk: DoublePublicKey, + round_public_key: DoublePublicKey, ) -> Self { let totp = build_generator(&seed.clone()); let mut metadata = BTreeMap::new(); @@ -87,7 +93,7 @@ impl MurmurStore { let identity = I::build_identity(*i); let ct_bytes = timelock_encrypt::( identity, - pk.1, + round_public_key.1, ephemeral_msk, otp_code.as_bytes(), ); @@ -110,6 +116,10 @@ impl MurmurStore { /// a possible fix is to externalize mmr logic /// /// TODO: this should probably be a result, not option + /// + /// * `seed`: The seed used to create the mmr + /// * `when`: The block number when the wallet is being used (or will be) + /// * `call_data`: The call to be executed with the wallet (at `when`) pub fn execute( &self, seed: Vec, @@ -117,7 +127,6 @@ impl MurmurStore { call_data: Vec ) -> Option<(MerkleProof::, Vec, Ciphertext, u64)> { let mmr = self.to_mmr(); - let store = mmr.store(); let commitment = MurmurStore::commit(seed.clone(), when, &call_data.clone()); // generate the merkle proof here and fetch the ciphertext if let Some(ciphertext) = self.metadata.get(&when) { @@ -149,7 +158,7 @@ impl MurmurStore { fn to_mmr(&self) -> MemMMR { let store = MemStore::default(); let mut mmr = MemMMR::<_, MergeLeaves>::new(0, store); - for (block_number, ciphertext) in self.metadata.clone() { + for (_block_number, ciphertext) in self.metadata.clone() { mmr.push(Leaf(ciphertext)).expect("todo"); } @@ -166,8 +175,8 @@ pub fn timelock_encrypt( message: &[u8], ) -> Vec { let ciphertext = tle::( - pk.clone(), - ephemeral_msk.clone(), + pk, + ephemeral_msk, message, identity, OsRng, // TODO @@ -214,15 +223,19 @@ pub fn verify( validity } -pub fn get_key_index(b: &BTreeMap, key: &K) -> Option { +/// get the index of a key in a BTreeMap +pub fn get_key_index( + b: &BTreeMap, + key: &K +) -> Option { b.keys().position(|k| k == key) } +#[cfg(test)] mod tests { use super::*; - use w3f_bls::{DoublePublicKey, DoublePublicKeyScheme, TinyBLS377}; - use ckb_merkle_mountain_range::helper::leaf_index_to_pos; + use w3f_bls::{DoublePublicKeyScheme, TinyBLS377}; pub struct DummyIdBuilder; impl IdentityBuilder for DummyIdBuilder { diff --git a/core/src/types.rs b/core/src/types.rs index 737e474..d8e68a6 100644 --- a/core/src/types.rs +++ b/core/src/types.rs @@ -14,9 +14,8 @@ * limitations under the License. */ -use ckb_merkle_mountain_range::{Merge, Result as MMRResult, MerkleProof}; +use ckb_merkle_mountain_range::{Merge, Result as MMRResult}; pub use etf_crypto_primitives::ibe::fullident::Identity; -use codec::{Decode, Encode}; use sha3::Digest; use alloc::vec::Vec; diff --git a/mmr_store b/mmr_store deleted file mode 100644 index ffa086a771e8223b383a88573da18749888fab75..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 44785 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 a&!?{W#2rXkh5Tb^nNJZe?ywp+q51->*>;Tp literal 0 HcmV?d00001 diff --git a/lib/src/lib.rs b/lib/src/lib.rs new file mode 100644 index 0000000..dcd9a90 --- /dev/null +++ b/lib/src/lib.rs @@ -0,0 +1,101 @@ +/* + * Copyright 2024 by Ideal Labs, LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +use beefy::{known_payloads, Commitment, Payload}; +use murmur_core::{ + murmur::MurmurStore, + types::{BlockNumber, Identity, IdentityBuilder}, +}; +use subxt::ext::codec::Encode; +use w3f_bls::{DoublePublicKey, EngineBLS, SerializableToBytes, TinyBLS377}; + +// Generate an interface that we can use from the node's metadata. +#[subxt::subxt(runtime_metadata_path = "artifacts/metadata.scale")] +pub mod etf {} + +#[derive(Debug)] +pub struct BasicIdBuilder; +impl IdentityBuilder for BasicIdBuilder { + fn build_identity(when: BlockNumber) -> Identity { + let payload = Payload::from_single_entry(known_payloads::ETF_SIGNATURE, Vec::new()); + let commitment = Commitment { + payload, + block_number: when, + validator_set_id: 0, // TODO: how to ensure correct validator set ID is used? could just always set to 1 for now, else set input param. + }; + Identity::new(&commitment.encode()) + } +} + +pub async fn create( + name: String, + seed: String, + ephem_msk: [u8; 32], + block_schedule: Vec, + round_pubkey_bytes: Vec, +) -> ( + subxt::tx::Payload, + MurmurStore, +) { + let round_pubkey = DoublePublicKey::::from_bytes(&round_pubkey_bytes).unwrap(); + let mmr_store = MurmurStore::new::( + seed.clone().into(), + block_schedule.clone(), + ephem_msk, + round_pubkey, + ); + let root = mmr_store.root.clone(); + let name = name.as_bytes().to_vec(); + let call = etf::tx().murmur().create( + root.0.into(), + mmr_store.metadata.len() as u64, + etf::runtime_types::bounded_collections::bounded_vec::BoundedVec(name), + ); + (call, mmr_store) +} + +/// Prepare the call for immediate execution +// Note: in the future, we can consider ways to prune the murmurstore as OTP codes are consumed +// for example, we can take the next values from the map, reducing storage to 0 over time +// However, to do this we need to think of a way to prove it with a merkle proof +// my though is that we would have a subtree, so first we prove that the subtree is indeed in the parent MMR +// then we prove that the specific leaf is in the subtree. +// We could potentially use that idea as a way to optimize the execute function in general. Rather than +// loading the entire MMR into memory, we really only need to load a minimal subtree containing the leaf we want to consume +// -> add this to the 'future work' section later +pub async fn prepare_execute( + name: Vec, + seed: Vec, + when: BlockNumber, + store: MurmurStore, + call: etf::runtime_types::node_template_runtime::RuntimeCall, +) -> subxt::tx::Payload { + let (proof, commitment, ciphertext, pos) = store + .execute(seed.clone(), when, call.encode().to_vec()) + .unwrap(); + + let proof_items: Vec> = proof + .proof_items() + .iter() + .map(|leaf| leaf.0.to_vec().clone()) + .collect::>(); + + let bounded = etf::runtime_types::bounded_collections::bounded_vec::BoundedVec(name); + + etf::tx() + .murmur() + .proxy(bounded, pos, commitment, ciphertext, proof_items, call) +} From 1001bf3e3395f3e71bbbcd39bae9f34e7a732c4a Mon Sep 17 00:00:00 2001 From: Juan Girini Date: Fri, 27 Sep 2024 16:42:40 +0200 Subject: [PATCH 16/20] feat: create a murmur lib for create and prepare_execute --- Cargo.lock | 71 +++++++++++++++++++++++++++--------------------------- 1 file changed, 36 insertions(+), 35 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 0ca43cc..8dfa937 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -422,7 +422,8 @@ dependencies = [ [[package]] name = "ark-transcript" version = "0.0.2" -source = "git+https://github.com/w3f/ring-vrf?rev=e9782f9#e9782f938629c90f3adb3fff2358bc8d1386af3e" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "563084372d89271122bd743ef0a608179726f5fad0566008ba55bd0f756489b8" dependencies = [ "ark-ff", "ark-serialize", @@ -435,7 +436,7 @@ dependencies = [ [[package]] name = "ark-transcript" version = "0.0.2" -source = "git+https://github.com/w3f/ring-vrf#0fef8266d851932ad25d6b41bc4b34d834d1e11d" +source = "git+https://github.com/w3f/ring-vrf?rev=e9782f9#e9782f938629c90f3adb3fff2358bc8d1386af3e" dependencies = [ "ark-ff", "ark-serialize", @@ -594,9 +595,9 @@ checksum = "8b75356056920673b02621b35afd0f7dda9306d03c79a30f5c56c44cf256e3de" [[package]] name = "async-trait" -version = "0.1.82" +version = "0.1.83" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a27b8a3a6e1a44fa4c8baf1f653e4172e81486d4941f2237e20dc2d0cf4ddff1" +checksum = "721cae7de5c34fbb2acd27e21e6d2cf7b886dce0c27388d46c4e6c47ea4318dd" dependencies = [ "proc-macro2", "quote", @@ -617,9 +618,9 @@ checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" [[package]] name = "autocfg" -version = "1.3.0" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0" +checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" [[package]] name = "backtrace" @@ -890,9 +891,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.1.21" +version = "1.1.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07b1695e2c7e8fc85310cde85aeaab7e3097f593c91d209d3f9df76c928100f0" +checksum = "9540e661f81799159abee814118cc139a2004b3a3aa3ea37724a1b66530b90e0" dependencies = [ "shlex", ] @@ -996,7 +997,7 @@ checksum = "d3fd119d74b830634cea2a0f58bbd0d54540518a14397557951e79340abc28c0" [[package]] name = "common" version = "0.1.0" -source = "git+https://github.com/w3f/ring-proof#1472ce9cd87cee49c56ce7869a0aba872d837c51" +source = "git+https://github.com/w3f/ring-proof#652286c32f96beb9ce7f5793f5e2c2c923f63b73" dependencies = [ "ark-ec", "ark-ff", @@ -1612,7 +1613,7 @@ dependencies = [ [[package]] name = "etf-crypto-primitives" version = "0.2.4" -source = "git+http://github.com/ideal-lab5/etf-sdk?branch=w3fbls-migration#c6e61a89b94b57bcbde2293208a2875469f4fc5c" +source = "git+https://github.com/ideal-lab5/etf-sdk.git?branch=w3fbls-migration#c6e61a89b94b57bcbde2293208a2875469f4fc5c" dependencies = [ "aes-gcm", "ark-bls12-377", @@ -2437,9 +2438,9 @@ checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" [[package]] name = "libc" -version = "0.2.158" +version = "0.2.159" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8adc4bb1803a324070e64a98ae98f38934d91957a99cfb3a43dcbc01bc56439" +checksum = "561d97a539a36e26a9a5fad1ea11a3039a67714694aaa379433e580854bc3dc5" [[package]] name = "libm" @@ -3102,7 +3103,7 @@ version = "3.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8ecf48c7ca261d60b74ab1a7b20da18bede46776b2e55535cb958eb595c5fa7b" dependencies = [ - "toml_edit 0.22.21", + "toml_edit 0.22.22", ] [[package]] @@ -3226,9 +3227,9 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.5.4" +version = "0.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0884ad60e090bf1345b93da0a5de8923c93884cd03f40dfcfddd3b4bee661853" +checksum = "355ae415ccd3a04315d3f8246e86d67689ea74d88d915576e1589a351062a13b" dependencies = [ "bitflags 2.6.0", ] @@ -3310,14 +3311,14 @@ dependencies = [ [[package]] name = "ring" version = "0.1.0" -source = "git+https://github.com/w3f/ring-proof#1472ce9cd87cee49c56ce7869a0aba872d837c51" +source = "git+https://github.com/w3f/ring-proof#652286c32f96beb9ce7f5793f5e2c2c923f63b73" dependencies = [ "ark-ec", "ark-ff", "ark-poly", "ark-serialize", "ark-std", - "ark-transcript 0.0.2 (git+https://github.com/w3f/ring-vrf)", + "ark-transcript 0.0.2 (registry+https://github.com/rust-lang/crates.io-index)", "arrayvec 0.7.6", "blake2", "common", @@ -3824,9 +3825,9 @@ dependencies = [ [[package]] name = "serde_spanned" -version = "0.6.7" +version = "0.6.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb5b1b31579f3811bf615c144393417496f152e12ac8b7663bf664f4a815306d" +checksum = "87607cb1398ed59d48732e575a4c28a7a8ebf2454b964fe3f224f2afc07909e1" dependencies = [ "serde", ] @@ -4236,7 +4237,7 @@ dependencies = [ "bs58", "dyn-clonable", "ed25519-zebra", - "etf-crypto-primitives 0.2.4 (git+http://github.com/ideal-lab5/etf-sdk?branch=w3fbls-migration)", + "etf-crypto-primitives 0.2.4 (git+https://github.com/ideal-lab5/etf-sdk.git?branch=w3fbls-migration)", "futures", "hash-db", "hash256-std-hasher", @@ -4274,7 +4275,7 @@ dependencies = [ [[package]] name = "sp-crypto-ec-utils" version = "0.10.0" -source = "git+https://github.com/paritytech/polkadot-sdk#08498f5473351c3d2f8eacbe1bfd7bc6d3a2ef8d" +source = "git+https://github.com/paritytech/polkadot-sdk#a5e40d0cd0a0d941d6fe58aa278fedfcb9102710" dependencies = [ "ark-bls12-377", "ark-bls12-377-ext", @@ -4341,7 +4342,7 @@ dependencies = [ [[package]] name = "sp-debug-derive" version = "14.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk#08498f5473351c3d2f8eacbe1bfd7bc6d3a2ef8d" +source = "git+https://github.com/paritytech/polkadot-sdk#a5e40d0cd0a0d941d6fe58aa278fedfcb9102710" dependencies = [ "proc-macro2", "quote", @@ -4361,7 +4362,7 @@ dependencies = [ [[package]] name = "sp-externalities" version = "0.25.0" -source = "git+https://github.com/paritytech/polkadot-sdk#08498f5473351c3d2f8eacbe1bfd7bc6d3a2ef8d" +source = "git+https://github.com/paritytech/polkadot-sdk#a5e40d0cd0a0d941d6fe58aa278fedfcb9102710" dependencies = [ "environmental", "parity-scale-codec", @@ -4490,7 +4491,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface" version = "24.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk#08498f5473351c3d2f8eacbe1bfd7bc6d3a2ef8d" +source = "git+https://github.com/paritytech/polkadot-sdk#a5e40d0cd0a0d941d6fe58aa278fedfcb9102710" dependencies = [ "bytes", "impl-trait-for-tuples", @@ -4522,7 +4523,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface-proc-macro" version = "17.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk#08498f5473351c3d2f8eacbe1bfd7bc6d3a2ef8d" +source = "git+https://github.com/paritytech/polkadot-sdk#a5e40d0cd0a0d941d6fe58aa278fedfcb9102710" dependencies = [ "Inflector", "expander", @@ -4560,7 +4561,7 @@ source = "git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing#0bd1 [[package]] name = "sp-std" version = "14.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk#08498f5473351c3d2f8eacbe1bfd7bc6d3a2ef8d" +source = "git+https://github.com/paritytech/polkadot-sdk#a5e40d0cd0a0d941d6fe58aa278fedfcb9102710" [[package]] name = "sp-storage" @@ -4577,7 +4578,7 @@ dependencies = [ [[package]] name = "sp-storage" version = "19.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk#08498f5473351c3d2f8eacbe1bfd7bc6d3a2ef8d" +source = "git+https://github.com/paritytech/polkadot-sdk#a5e40d0cd0a0d941d6fe58aa278fedfcb9102710" dependencies = [ "impl-serde", "parity-scale-codec", @@ -4600,7 +4601,7 @@ dependencies = [ [[package]] name = "sp-tracing" version = "16.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk#08498f5473351c3d2f8eacbe1bfd7bc6d3a2ef8d" +source = "git+https://github.com/paritytech/polkadot-sdk#a5e40d0cd0a0d941d6fe58aa278fedfcb9102710" dependencies = [ "parity-scale-codec", "tracing", @@ -4672,7 +4673,7 @@ dependencies = [ [[package]] name = "sp-wasm-interface" version = "20.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk#08498f5473351c3d2f8eacbe1bfd7bc6d3a2ef8d" +source = "git+https://github.com/paritytech/polkadot-sdk#a5e40d0cd0a0d941d6fe58aa278fedfcb9102710" dependencies = [ "anyhow", "impl-trait-for-tuples", @@ -5126,7 +5127,7 @@ dependencies = [ "serde", "serde_spanned", "toml_datetime", - "toml_edit 0.22.21", + "toml_edit 0.22.22", ] [[package]] @@ -5151,15 +5152,15 @@ dependencies = [ [[package]] name = "toml_edit" -version = "0.22.21" +version = "0.22.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b072cee73c449a636ffd6f32bd8de3a9f7119139aff882f44943ce2986dc5cf" +checksum = "4ae48d6208a266e853d946088ed816055e556cc6028c5e8e2b84d9fa5dd7c7f5" dependencies = [ "indexmap", "serde", "serde_spanned", "toml_datetime", - "winnow 0.6.18", + "winnow 0.6.20", ] [[package]] @@ -5685,9 +5686,9 @@ dependencies = [ [[package]] name = "winnow" -version = "0.6.18" +version = "0.6.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68a9bda4691f099d435ad181000724da8e5899daa10713c2d432552b9ccd3a6f" +checksum = "36c1fec1a2bb5866f07c25f68c26e565c4c200aebb96d7e55710c19d3e8ac49b" dependencies = [ "memchr", ] From 47ba4d0f0e1f7efcd6f3c36005b259e8611245fc Mon Sep 17 00:00:00 2001 From: Juan Girini Date: Fri, 27 Sep 2024 16:43:21 +0200 Subject: [PATCH 17/20] feat: create a murmur lib for create and prepare_execute --- lib/Cargo.toml | 11 ++++ lib/artifacts/metadata.scale | Bin 0 -> 619314 bytes lib/src/lib.rs | 101 +++++++++++++++++++++++++++++++++++ 3 files changed, 112 insertions(+) create mode 100644 lib/Cargo.toml create mode 100644 lib/artifacts/metadata.scale create mode 100644 lib/src/lib.rs diff --git a/lib/Cargo.toml b/lib/Cargo.toml new file mode 100644 index 0000000..a444921 --- /dev/null +++ b/lib/Cargo.toml @@ -0,0 +1,11 @@ +[package] +name = "murmur-lib" +version = "0.1.0" +edition = "2021" +authors.workspace = true + +[dependencies] +beefy = { package = "sp-consensus-beefy-etf", git = "https://github.com/ideal-lab5/etf.git", branch = "tony/dev", features = ["bls-experimental"] } +murmur-core = { package = "murmur-core", path = "../core/", features = ["client"] } +subxt = "0.35.2" +w3f-bls = "0.1.3" \ No newline at end of file diff --git a/lib/artifacts/metadata.scale b/lib/artifacts/metadata.scale new file mode 100644 index 0000000000000000000000000000000000000000..d74dc51ccac22fc54aa26eb62afbdef16c8504e1 GIT binary patch literal 619314 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 a&!?{W#2rXkh5Tb^nNJZe?ywp+q51->*>;Tp literal 0 HcmV?d00001 diff --git a/lib/src/lib.rs b/lib/src/lib.rs new file mode 100644 index 0000000..dcd9a90 --- /dev/null +++ b/lib/src/lib.rs @@ -0,0 +1,101 @@ +/* + * Copyright 2024 by Ideal Labs, LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +use beefy::{known_payloads, Commitment, Payload}; +use murmur_core::{ + murmur::MurmurStore, + types::{BlockNumber, Identity, IdentityBuilder}, +}; +use subxt::ext::codec::Encode; +use w3f_bls::{DoublePublicKey, EngineBLS, SerializableToBytes, TinyBLS377}; + +// Generate an interface that we can use from the node's metadata. +#[subxt::subxt(runtime_metadata_path = "artifacts/metadata.scale")] +pub mod etf {} + +#[derive(Debug)] +pub struct BasicIdBuilder; +impl IdentityBuilder for BasicIdBuilder { + fn build_identity(when: BlockNumber) -> Identity { + let payload = Payload::from_single_entry(known_payloads::ETF_SIGNATURE, Vec::new()); + let commitment = Commitment { + payload, + block_number: when, + validator_set_id: 0, // TODO: how to ensure correct validator set ID is used? could just always set to 1 for now, else set input param. + }; + Identity::new(&commitment.encode()) + } +} + +pub async fn create( + name: String, + seed: String, + ephem_msk: [u8; 32], + block_schedule: Vec, + round_pubkey_bytes: Vec, +) -> ( + subxt::tx::Payload, + MurmurStore, +) { + let round_pubkey = DoublePublicKey::::from_bytes(&round_pubkey_bytes).unwrap(); + let mmr_store = MurmurStore::new::( + seed.clone().into(), + block_schedule.clone(), + ephem_msk, + round_pubkey, + ); + let root = mmr_store.root.clone(); + let name = name.as_bytes().to_vec(); + let call = etf::tx().murmur().create( + root.0.into(), + mmr_store.metadata.len() as u64, + etf::runtime_types::bounded_collections::bounded_vec::BoundedVec(name), + ); + (call, mmr_store) +} + +/// Prepare the call for immediate execution +// Note: in the future, we can consider ways to prune the murmurstore as OTP codes are consumed +// for example, we can take the next values from the map, reducing storage to 0 over time +// However, to do this we need to think of a way to prove it with a merkle proof +// my though is that we would have a subtree, so first we prove that the subtree is indeed in the parent MMR +// then we prove that the specific leaf is in the subtree. +// We could potentially use that idea as a way to optimize the execute function in general. Rather than +// loading the entire MMR into memory, we really only need to load a minimal subtree containing the leaf we want to consume +// -> add this to the 'future work' section later +pub async fn prepare_execute( + name: Vec, + seed: Vec, + when: BlockNumber, + store: MurmurStore, + call: etf::runtime_types::node_template_runtime::RuntimeCall, +) -> subxt::tx::Payload { + let (proof, commitment, ciphertext, pos) = store + .execute(seed.clone(), when, call.encode().to_vec()) + .unwrap(); + + let proof_items: Vec> = proof + .proof_items() + .iter() + .map(|leaf| leaf.0.to_vec().clone()) + .collect::>(); + + let bounded = etf::runtime_types::bounded_collections::bounded_vec::BoundedVec(name); + + etf::tx() + .murmur() + .proxy(bounded, pos, commitment, ciphertext, proof_items, call) +} From 0374c5fe6949863feb6e62f282f798871d5b6d18 Mon Sep 17 00:00:00 2001 From: driemworks Date: Fri, 27 Sep 2024 16:57:59 -0500 Subject: [PATCH 18/20] feat: refactor WIP --- .pre-commit-config.yaml | 5 + Cargo.lock | 2 + README.md | 7 +- cli/Cargo.toml | 1 + cli/artifacts/metadata.scale | Bin 619314 -> 619440 bytes cli/src/main.rs | 340 ++++++++++++++++++++--------------- cli/src/mmr_store | 1 - core/Cargo.toml | 2 + core/README.md | 13 -- core/src/murmur.rs | 42 +++-- mmr_store | Bin 0 -> 44953 bytes 11 files changed, 238 insertions(+), 175 deletions(-) create mode 100644 .pre-commit-config.yaml delete mode 100644 cli/src/mmr_store create mode 100644 mmr_store diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 100644 index 0000000..dbb3f0a --- /dev/null +++ b/.pre-commit-config.yaml @@ -0,0 +1,5 @@ +- repo: https://github.com/doublify/pre-commit-rust + rev: master + hooks: + - id: fmt + - id: cargo-check \ No newline at end of file diff --git a/Cargo.lock b/Cargo.lock index 0ca43cc..f8c5449 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2619,6 +2619,7 @@ dependencies = [ "sp-core", "subxt", "subxt-signer", + "thiserror", "tokio", "w3f-bls", ] @@ -2642,6 +2643,7 @@ dependencies = [ "sha3", "totp-rs", "w3f-bls", + "zeroize", ] [[package]] diff --git a/README.md b/README.md index 86f8a07..2d7f7a9 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,11 @@ # Murmur -Murmur is an air-gapped keyless crypto wallet protocol that runs on the Ideal Network. It is based on the [Hours of Horus](https://eprint.iacr.org/2021/715) protocol, where it enables keyless crypto wallets that require knowledge of future OTP codes rather than signatures in order to execute calls. This repository contains the core implementation of the murmur protocol and a CLI to allow fully non-custodial usage of murmur wallets on the Ideal Network. +Murmur is an air-gapped keyless crypto wallet protocol that runs on the Ideal Network. It is based on the [Hours of Horus](https://eprint.iacr.org/2021/715) protocol, which leverages timelock encryption and a secure OTP code generator to construct a keyless wallet scheme. Our scheme improves on this construction in several ways. + +- We use a Merkle mountain range in place of a Merkle tree, allowing for arbitrary numbers of OTP codes to be generated +- JIT execution: Rather than relying on a commit-reveal scheme in order to use the wallet, our scheme uses a 'just-in-time' approach leveraging the Ideal Network's on-chain randomness, which provides the decryption key (i.e. BLS signature) necessary to verify proofs. + +This repository contains the core implementation of the murmur protocol and a CLI to allow fully non-custodial usage of murmur wallets on the Ideal Network. ## Setup diff --git a/cli/Cargo.toml b/cli/Cargo.toml index 3e439ba..06400ae 100644 --- a/cli/Cargo.toml +++ b/cli/Cargo.toml @@ -15,6 +15,7 @@ clap = { version = "4.1.1", features = ["derive"] } rand_chacha = "0.3.1" ckb-merkle-mountain-range = "0.5.2" sha3 = "0.10.8" +thiserror = "1.0" serde_cbor = "0.11.2" serde_json = "1.0.108" codec = { package = "parity-scale-codec", version = "3.6.12", features = [ diff --git a/cli/artifacts/metadata.scale b/cli/artifacts/metadata.scale index d74dc51ccac22fc54aa26eb62afbdef16c8504e1..578d0969aa605efb5b2a2720564786a2aa96e9c2 100644 GIT binary patch delta 210 zcmdn=Om)L^)rJF7M3ln?L~|d(>sb-mFpw46cUQ^^Ggz}6hbmm6?}bz6hPbq zK;h!ds#K^jh^e5FSDKrYTBMMlrjV1GSe9C>31XH&bb&PFCFa63fS3v;`3i}}#hK}O zAQnhnZfOw^DHIgtS5z{HfGDO)nd$LGtm@OB7O@6%fvhoLF7M3ln?L~|N(>sb-m4!956cUQ^^Ggz}6c|Jbit;NeC8oz0 ov8qoGE@lmG-(1YPeRDCJz;zZI|B{0CQ(o*q%(4BH7w0n#01n_DzyJUM diff --git a/cli/src/main.rs b/cli/src/main.rs index 710b3c1..4fd78bf 100644 --- a/cli/src/main.rs +++ b/cli/src/main.rs @@ -15,11 +15,7 @@ */ #![allow(missing_docs)] -use subxt::{ - client::OnlineClient, - config::SubstrateConfig, - backend::rpc::RpcClient, -}; +use subxt::{backend::rpc::RpcClient, client::OnlineClient, config::SubstrateConfig}; use subxt_signer::sr25519::dev; // Generate an interface that we can use from the node's metadata. @@ -29,20 +25,24 @@ pub mod etf {} use std::fs::File; use clap::{Parser, Subcommand}; +use thiserror::Error; use subxt::ext::codec::Encode; -use beefy::{known_payloads, Payload, Commitment}; + +use beefy::{known_payloads, Commitment, Payload}; +use etf::murmur::calls::types::{Create, Proxy}; +use etf::runtime_types::{ + bounded_collections::bounded_vec::BoundedVec, + node_template_runtime::{RuntimeCall, RuntimeCall::Balances}, +}; use murmur_core::{ - types::{ - BlockNumber, - Identity, - IdentityBuilder, - }, murmur::MurmurStore, + types::{BlockNumber, Identity, IdentityBuilder, Leaf}, }; - -use w3f_bls::{TinyBLS377, SerializableToBytes, DoublePublicKey}; +use rand_core::OsRng; +use ark_serialize::CanonicalSerialize; +use w3f_bls::{KeypairVT, DoublePublicKey, DoublePublicKeyScheme, SerializableToBytes, TinyBLS377}; use std::time::Instant; @@ -73,6 +73,8 @@ struct WalletCreationDetails { seed: String, #[clap(long)] validity: u32, + #[clap(short, long)] + x: bool, } #[derive(Parser)] @@ -83,10 +85,14 @@ struct WalletExecuteDetails { seed: String, #[arg(short, long)] amount: String, + #[clap(short, long)] + x: bool, } +#[derive(Error, Debug)] pub enum CLIError { - + #[error("invalid public key")] + InvalidPubkey, } #[derive(Debug)] @@ -95,57 +101,47 @@ impl IdentityBuilder for BasicIdBuilder { fn build_identity(when: BlockNumber) -> Identity { let payload = Payload::from_single_entry(known_payloads::ETF_SIGNATURE, Vec::new()); let commitment = Commitment { - payload, - block_number: when, + payload, + block_number: when, validator_set_id: 0, // TODO: how to ensure correct validator set ID is used? could just always set to 1 for now, else set input param. }; Identity::new(&commitment.encode()) } } +pub const MMR_STORE_FILEPATH: &str = "mmr_store"; + #[tokio::main] async fn main() -> Result<(), Box> { let cli = Cli::parse(); let before = Instant::now(); - // first we need to connect to a node and fetch the round key and current block number - println!("🎲 Connecting to Ideal network (local node)"); - - let rpc_client = RpcClient::from_url("ws://localhost:9944").await?; - let client = OnlineClient::::from_rpc_client(rpc_client.clone()).await?; - println!("🔗 RPC Client: connection established"); - - // fetch the round public key from etf runtime storage - let round_key_query = subxt::dynamic::storage("Etf", "RoundPublic", ()); - let result = client - .storage() - .at_latest() - .await? - .fetch(&round_key_query) - .await?; - let round_pubkey_bytes = result.unwrap().as_type::>()?; - - println!("🔑 Successfully retrieved the round public key."); - let current_block = client.blocks().at_latest().await?; - let current_block_number = current_block.header().number; - - println!("🧊 Current block number: #{:?}", current_block_number); - - // why do I have two clients?? - let etf = OnlineClient::::new().await?; - - // let mut mmr_store_file = File::create("mmr_store").unwrap(); - // let store = MemStore::default(); + let mut current_block_number = 0; + + + let keypair = KeypairVT::::generate(&mut OsRng); + let double_public: DoublePublicKey = DoublePublicKey( + keypair.into_public_key_in_signature_group().0, + keypair.public.0, + ); + let mut round_pubkey_bytes = Vec::new(); + double_public.serialize_compressed(&mut round_pubkey_bytes).unwrap(); // TODO: HKDF? just hash the seed? - let ephem_msk = [1;32]; + let ephem_msk = [1; 32]; match &cli.commands { - Commands::New(args) => { + Commands::New(args) => { + // if args.x { + let (etf, block_number, pk_bytes) = idn_connect().await?; + current_block_number = block_number; + round_pubkey_bytes = pk_bytes; + // } + println!("🭠Murmur: Generating Merkle mountain range"); // 1. prepare block schedule let mut schedule: Vec = Vec::new(); for i in 2..args.validity + 2 { - // wallet is 'active' in 2 blocks + // wallet is 'active' in 2 blocks let next_block = current_block_number + i; schedule.push(next_block); } @@ -156,85 +152,85 @@ async fn main() -> Result<(), Box> { ephem_msk, schedule, round_pubkey_bytes, - ).await; + ); + // println!("seriously wtf: {:?}", mmr_store.metadata.clone()); // 3. add to storage - write_mmr_store(mmr_store.clone()); + write_mmr_store(mmr_store.clone(), MMR_STORE_FILEPATH); // TODO: make the origin configurable // sign and send the call - let from = dev::alice(); - let _events = etf - .tx() - .sign_and_submit_then_watch_default(&call, &from) - .await?; + // let from = dev::alice(); + // let _events = etf + // .tx() + // .sign_and_submit_then_watch_default(&call, &from) + // .await?; println!("✅ MMR proxy account creation successful!"); - - }, - // Commands::ScheduleExecute(args) => { - // // build balance transfer - // let bob = AccountKeyring::Bob.to_account_id().into(); - // // get the value argument - // let v: u128 = args.amount - // .split_whitespace() - // .map(|r| r.replace('_', "").parse().unwrap()) - // .collect::>()[0]; - // let balance_transfer_call = RuntimeCall::Balances( - // BalancesCall::transfer_allow_death { - // dest: bob, - // value: v, - // }); - // let call = prepare_execution_payload_for_proxy::( - // etf.clone(), - // args.name.clone().as_bytes().to_vec(), - // args.seed.clone().as_bytes().to_vec(), - // args.when.clone(), - // balance_transfer_call, - // ).await; - // // sign and send the tx (with the alice wallet for now) - // dispatch_sealed_tx::( - // etf, - // args.when, - // ephem_msk, - // round_pubkey, - // call, - // ).await; - // }, + } Commands::Execute(args) => { + // if args.x { + let (etf, block_number, pk_bytes) = idn_connect().await?; + current_block_number = block_number; + round_pubkey_bytes = pk_bytes; + // } else { + // current_block_number += 2; + // } // build balance transfer - let bob = dev::alice().public_key(); + let bob = dev::alice().public_key(); // get the value argument - let v: u128 = args.amount + let v: u128 = args + .amount .split_whitespace() .map(|r| r.replace('_', "").parse().unwrap()) .collect::>()[0]; // TODO: cleanup type defs - let balance_transfer_call = etf::runtime_types::node_template_runtime::RuntimeCall::Balances( - etf::balances::Call::transfer_allow_death { - dest: subxt::utils::MultiAddress::<_, u32>::from(bob), - value: v, + let balance_transfer_call = Balances(etf::balances::Call::transfer_allow_death { + dest: subxt::utils::MultiAddress::<_, u32>::from(bob), + value: v, }); - let store: MurmurStore = load_mmr_store(); - // store.to_mmr(&mut mmr).unwrap(); - + let store: MurmurStore = load_mmr_store(MMR_STORE_FILEPATH); let tx = prepare_execute( - // etf.clone(), args.name.clone().as_bytes().to_vec(), args.seed.clone().as_bytes().to_vec(), - current_block_number, + current_block_number + 1, store, balance_transfer_call, - ).await; + ) + .await; // submit the tx using alice to sign it - let _result = etf.tx() - .sign_and_submit_then_watch_default(&tx, &dev::alice()) - .await; - }, + // let _result = etf.tx() + // .sign_and_submit_then_watch_default(&tx, &dev::alice()) + // .await; + } _ => panic!("Hey, don't do that!"), } println!("Elapsed time: {:.2?}", before.elapsed()); Ok(()) } +async fn idn_connect( +) -> Result<(OnlineClient, BlockNumber, Vec), Box> { + println!("🎲 Connecting to Ideal network (local node)"); + let rpc_client = RpcClient::from_url("ws://localhost:9944").await?; + let etf = OnlineClient::::from_rpc_client(rpc_client.clone()).await?; + println!("🔗 RPC Client: connection established"); + + // fetch the round public key from etf runtime storage + let round_key_query = subxt::dynamic::storage("Etf", "RoundPublic", ()); + let result = etf + .storage() + .at_latest() + .await? + .fetch(&round_key_query) + .await?; + let round_pubkey_bytes = result.unwrap().as_type::>()?; + + println!("🔑 Successfully retrieved the round public key."); + + let current_block = etf.blocks().at_latest().await?; + let current_block_number = current_block.header().number; + println!("🧊 Current block number: #{:?}", current_block_number); + Ok((etf, current_block_number, round_pubkey_bytes)) +} /// create a new MMR and use it to generate a valid call to create a murmur wallet /// returns the call data and the mmr_store /// @@ -244,14 +240,14 @@ async fn main() -> Result<(), Box> { /// * `block_schedule`: A list of block numbers when the wallet will be executable /// * `round_pubkey_bytes`: The Ideal Network randomness beacon public key /// -pub async fn create( +pub fn create( name: String, seed: String, - ephem_msk: [u8;32], + ephem_msk: [u8; 32], block_schedule: Vec, round_pubkey_bytes: Vec, -) -> (subxt::tx::Payload, MurmurStore) { - let round_pubkey = DoublePublicKey::::from_bytes(&round_pubkey_bytes).unwrap(); +) -> (subxt::tx::Payload, MurmurStore) { + let round_pubkey = DoublePublicKey::::from_bytes(&round_pubkey_bytes).unwrap(); // TODO: error handlking let mmr_store = MurmurStore::new::( seed.clone().into(), block_schedule.clone(), @@ -260,12 +256,10 @@ pub async fn create( ); let root = mmr_store.root.clone(); let name = name.as_bytes().to_vec(); + let call = etf::tx() .murmur() - .create( - root.0, - mmr_store.metadata.len() as u64, - etf::runtime_types::bounded_collections::bounded_vec::BoundedVec(name)); + .create(root.0, mmr_store.metadata.len() as u64, BoundedVec(name)); (call, mmr_store) } @@ -273,7 +267,7 @@ pub async fn create( /// Note to self: in the future, we can consider ways to prune the murmurstore as OTP codes are consumed /// for example, we can take the next values from the map, reducing storage to 0 over time /// However, to do this we need to think of a way to prove it with a merkle proof -/// my though is that we would have a subtree, so first we prove that the subtree is indeed in the parent MMR +/// my thought is that we would have a subtree, so first we prove that the subtree is indeed in the parent MMR /// then we prove that the specific leaf is in the subtree. /// We could potentially use that idea as a way to optimize the execute function in general. Rather than /// loading the entire MMR into memory, we really only need to load a minimal subtree containing the leaf we want to consume @@ -283,27 +277,105 @@ pub async fn prepare_execute( seed: Vec, when: BlockNumber, store: MurmurStore, - call: etf::runtime_types::node_template_runtime::RuntimeCall, -) -> subxt::tx::Payload { - let (proof, commitment, ciphertext, pos) = store.execute( - seed.clone(), when, call.encode().to_vec(), - ).unwrap(); - let proof_items: Vec> = proof.proof_items().iter() - .map(|leaf| leaf.0.to_vec().clone()) + call: RuntimeCall, +) -> subxt::tx::Payload { + let (proof, commitment, ciphertext, pos) = store + .execute(seed.clone(), when, call.encode().to_vec()) + .unwrap(); + let test = proof + .verify(store.root, vec![(pos.clone(), Leaf(ciphertext.clone()))]) + .unwrap(); + println!("valid ? {:?}", test); + // println!("MMR ROOT:{:?}", store.root.clone()); + + let size: u64 = proof.mmr_size() as u64; + let proof_items: Vec> = proof + .proof_items() + .iter() + .map(|leaf| leaf.0.clone()) .collect::>(); - let bounded = etf::runtime_types::bounded_collections::bounded_vec::BoundedVec(name); - etf::tx().murmur().proxy( - bounded, + BoundedVec(name), pos, commitment, ciphertext, proof_items, + size, call, ) } +/// read an MMR from a file +fn load_mmr_store(path: &str) -> MurmurStore { + let mmr_store_file = File::open(path).expect("Unable to open file"); + let data: MurmurStore = serde_cbor::from_reader(mmr_store_file).unwrap(); + data +} + +/// Write the MMR data to a file +fn write_mmr_store(mmr_store: MurmurStore, path: &str) { + let mmr_store_file = File::create(path).expect("It should create the file"); + serde_cbor::to_writer(mmr_store_file, &mmr_store).unwrap(); +} + +// #[cfg(test)] +// mod tests { + +// use super::*; + + +// #[test] +// pub fn it_can_create_mmr_store_and_verifiable_execution_params() { +// let name = "name".to_string(); +// let seed = "seed".to_string(); +// let ephem_msk = [1;32]; +// let schedule = vec![1,2,3,4,5,6,7,8,9]; + +// let (_call, mmr_store) = create( +// name.clone(), +// seed.clone(), +// ephem_msk, +// schedule, +// pk_bytes, +// ); + +// assert!(write_mmr_store(mmr_store.clone(), "mmr_store").is_ok()); + +// // then try to load the mmr_store +// } +// } + +// Commands::ScheduleExecute(args) => { +// // build balance transfer +// let bob = AccountKeyring::Bob.to_account_id().into(); +// // get the value argument +// let v: u128 = args.amount +// .split_whitespace() +// .map(|r| r.replace('_', "").parse().unwrap()) +// .collect::>()[0]; +// let balance_transfer_call = RuntimeCall::Balances( +// BalancesCall::transfer_allow_death { +// dest: bob, +// value: v, +// }); +// let call = prepare_execution_payload_for_proxy::( +// etf.clone(), +// args.name.clone().as_bytes().to_vec(), +// args.seed.clone().as_bytes().to_vec(), +// args.when.clone(), +// balance_transfer_call, +// ).await; +// // sign and send the tx (with the alice wallet for now) +// dispatch_sealed_tx::( +// etf, +// args.when, +// ephem_msk, +// round_pubkey, +// call, +// ).await; +// } + // /// prepare the proxy call for a scheduled transaction // async fn prepare_execution_payload_for_proxy( // etf: OnlineClient, @@ -335,7 +407,7 @@ pub async fn prepare_execute( // .collect::>(); // let bounded = >>::truncate_from(name); - + // RuntimeCall::Murmur(MurmurCall::proxy { // name: bounded, // position: pos, @@ -347,8 +419,6 @@ pub async fn prepare_execute( // }) // } - - // /// dispatch a shielded (timelocked) transaction for a future block // async fn dispatch_sealed_tx>( // etf: OnlineClient, @@ -378,27 +448,3 @@ pub async fn prepare_execute( // .sign_and_submit_then_watch_default(&sealed_tx, &dev::alice()) // .await; // } - -/// read an MMR from a file -fn load_mmr_store() -> MurmurStore { - let mmr_store_file = File::open("mmr_store") - .expect("Unable to open file"); - let data: MurmurStore = - serde_cbor::from_reader(mmr_store_file).unwrap(); - - data -} - -/// Write the MMR data to a file (no seed) -fn write_mmr_store(mmr_store: MurmurStore) { - let mmr_store_file = File::create("mmr_store") - .expect("It should create the file"); - // TODO: error handling - serde_cbor::to_writer(mmr_store_file, &mmr_store) - .unwrap(); -} - -#[cfg(test)] -mod tests { - // pub fn test_can_read_write_mmr_store() { } -} diff --git a/cli/src/mmr_store b/cli/src/mmr_store deleted file mode 100644 index 15cf57c..0000000 --- a/cli/src/mmr_store +++ /dev/null @@ -1 +0,0 @@ -ƒ‚–˜ p5^¬ÇKg–ÔŠý竤›ù¤©7ÔÇÉG©˜Bð‚¯˜ V'+(é‘C§L)@¡.šR¹Æ¢còÔõ8sçÁ+,­‚Ș ’•Gxë'!ƒÓ‡h1±Ëw×l¼Çüé+™D©BÉ \ No newline at end of file diff --git a/core/Cargo.toml b/core/Cargo.toml index 26ce4e5..87ba0b7 100644 --- a/core/Cargo.toml +++ b/core/Cargo.toml @@ -32,6 +32,7 @@ ark-serialize = { version = "0.4.0", default-features = false } w3f-bls = { version = "0.1.3", default-features = false } hex = { version = "0.4.3", default-features = false } array-bytes = { version = "6.1", default-features = false } +zeroize = { version = "1.8.1", default-features = false } [features] default = ["std"] @@ -47,6 +48,7 @@ std = [ "sha3/std", "ckb-merkle-mountain-range/std", "hex/std", + "zeroize/std", ] no_std = [] client = [ diff --git a/core/README.md b/core/README.md index cae53a4..f480eeb 100644 --- a/core/README.md +++ b/core/README.md @@ -1,18 +1,5 @@ # Murmur Core -The core implementation of the murmur protocol. This library enables each step of the Murmur protocol, including implementations of the following: - -### Functions - -#### Create -$\{(b_i, ct_i)\}_{i \in [n]} \leftarrow Murmur.Create(seed, \{b_0, ..., b_n\}) $ - -#### PrepareExecute -$h_b \leftarrow PrepareExecute(seed, AUX, b)$ - -#### Verify -- `verify -> true/false` - ## Build ``` shell diff --git a/core/src/murmur.rs b/core/src/murmur.rs index 6d39db5..c2a8bf5 100644 --- a/core/src/murmur.rs +++ b/core/src/murmur.rs @@ -44,7 +44,6 @@ use ckb_merkle_mountain_range::{ MemStore, }, }; - use sha3::Digest; /// Error types for murmur wallet usage @@ -75,7 +74,7 @@ impl MurmurStore { /// * `round_public_key`: The IDN beacon's public key /// pub fn new>( - seed: Vec, + mut seed: Vec, block_schedule: Vec, ephemeral_msk: [u8;32], round_public_key: DoublePublicKey, @@ -87,7 +86,7 @@ impl MurmurStore { let mut mmr = MemMMR::<_, MergeLeaves>::new(0, store); for i in &block_schedule { - let otp_code = totp.generate(*i); + let mut otp_code = totp.generate(*i); let identity = I::build_identity(*i); let ct_bytes = timelock_encrypt::( identity, @@ -100,7 +99,6 @@ impl MurmurStore { metadata.insert(*i, ct_bytes); } - MurmurStore { metadata, root: mmr.get_root().unwrap().clone(), @@ -120,15 +118,14 @@ impl MurmurStore { /// * `call_data`: The call to be executed with the wallet (at `when`) pub fn execute( &self, - seed: Vec, + mut seed: Vec, when: BlockNumber, call_data: Vec ) -> Option<(MerkleProof::, Vec, Ciphertext, u64)> { - let mmr = self.to_mmr(); - let commitment = MurmurStore::commit(seed.clone(), when, &call_data.clone()); - // generate the merkle proof here and fetch the ciphertext if let Some(ciphertext) = self.metadata.get(&when) { + let commitment = MurmurStore::commit(seed.clone(), when, &call_data.clone()); let pos = get_key_index(&self.metadata, &when).unwrap() as u64; + let mmr = self.to_mmr(); let proof = mmr.gen_proof(vec![pos]).expect("todo: handle error"); return Some((proof, commitment, ciphertext.clone(), pos)); } @@ -142,12 +139,13 @@ impl MurmurStore { /// * `when`: The block number when the commitment is verifiable /// * `data`: The data to commit to /// - fn commit(seed: Vec, when: BlockNumber, data: &[u8]) -> Vec { + fn commit(mut seed: Vec, when: BlockNumber, data: &[u8]) -> Vec { let botp = build_generator(&seed); - let otp_code = botp.generate(when); + let mut otp_code = botp.generate(when); let mut hasher = sha3::Sha3_256::default(); hasher.update(otp_code.as_bytes()); + hasher.update(data); hasher.finalize().to_vec() } @@ -172,7 +170,7 @@ impl MurmurStore { pub fn timelock_encrypt( identity: Identity, pk: E::PublicKeyGroup, - ephemeral_msk: [u8;32], + mut ephemeral_msk: [u8;32], message: &[u8], ) -> Vec { let ciphertext = tle::( @@ -180,7 +178,7 @@ pub fn timelock_encrypt( ephemeral_msk, message, identity, - OsRng, // TODO + OsRng, ).unwrap(); // TODO: Error Handling let mut ct_bytes = Vec::new(); ciphertext.serialize_compressed(&mut ct_bytes).unwrap(); @@ -279,7 +277,7 @@ mod tests { let ephem_msk = [1;32]; let seed = vec![1,2,3]; - let schedule = vec![1,2,3]; + let schedule = vec![1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20]; let aux_data = vec![2,3,4,5]; @@ -298,6 +296,24 @@ mod tests { .execute(seed.clone(), when, aux_data.clone()) .unwrap(); + assert!(proof.verify(root.clone(), vec![(pos, Leaf(ciphertext.clone()))]).unwrap()); + // // we also simulate the serialization of the proof items + // let proof_items: Vec> = proof.proof_items().iter() + // .map(|leaf| leaf.0.to_vec().clone()) + // .collect::>(); + + // let leaves: Vec = proof_items.clone().into_iter() + // .map(|p| Leaf(p)).collect::>(); + // let new_merkle_proof = MerkleProof::::new( + // proof.mmr_size() as u64, leaves); + // let root_bytes = root.0.clone(); + // let new_root = Leaf(root_bytes); + + // let test = new_merkle_proof.verify(new_root.clone(), vec![(pos.clone(), Leaf(ciphertext.clone()))]).unwrap(); + // assert!(test == true); + + + // in practice, the otp code would be timelock decrypted // but for testing purposes, we will just calculate the expected one now let botp = build_generator(&seed.clone()); diff --git a/mmr_store b/mmr_store new file mode 100644 index 0000000000000000000000000000000000000000..0701f329686615b7ac6c7318f95036f2d3244f3d GIT binary patch literal 44953 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 literal 0 HcmV?d00001 From b55c9cae84f4d223ff5ec9b22730fea2ad36cf55 Mon Sep 17 00:00:00 2001 From: driemworks Date: Sat, 28 Sep 2024 16:18:39 -0500 Subject: [PATCH 19/20] feat: refactor cli to use murmur-lib, get correct leaf position from index --- Cargo.lock | 27 ++- README.md | 11 +- cli/Cargo.toml | 3 +- cli/README.md | 8 + cli/artifacts/metadata.scale | Bin 619440 -> 0 bytes cli/src/main.rs | 331 ++++------------------------------- core/README.md | 8 +- core/src/murmur.rs | 39 ++--- core/src/otp.rs | 2 +- lib/Cargo.toml | 2 +- lib/README.md | 5 + lib/artifacts/metadata.scale | Bin 619314 -> 619440 bytes lib/src/lib.rs | 96 ++++++---- mmr_store | Bin 44953 -> 44914 bytes 14 files changed, 157 insertions(+), 375 deletions(-) delete mode 100644 cli/artifacts/metadata.scale create mode 100644 lib/README.md diff --git a/Cargo.lock b/Cargo.lock index db9cb77..c547bae 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2604,10 +2604,9 @@ dependencies = [ "ckb-merkle-mountain-range", "clap", "crossterm", - "etf-crypto-primitives 0.2.4 (git+https://github.com/ideal-lab5/etf-sdk/?branch=tony/dev)", "getrandom", "hex", - "murmur-core", + "murmur-lib", "parity-scale-codec", "rand_chacha", "rand_core", @@ -2616,7 +2615,7 @@ dependencies = [ "serde_cbor", "serde_json", "sha3", - "sp-consensus-beefy-etf", + "sp-consensus-beefy-etf 13.0.0 (git+https://github.com/ideal-lab5/etf.git?branch=murmur)", "sp-core", "subxt", "subxt-signer", @@ -2652,7 +2651,7 @@ name = "murmur-lib" version = "0.1.0" dependencies = [ "murmur-core", - "sp-consensus-beefy-etf", + "sp-consensus-beefy-etf 13.0.0 (git+https://github.com/ideal-lab5/pallets.git?branch=main)", "subxt", "w3f-bls", ] @@ -4210,6 +4209,26 @@ dependencies = [ "sp-crypto-ec-utils", ] +[[package]] +name = "sp-consensus-beefy-etf" +version = "13.0.0" +source = "git+https://github.com/ideal-lab5/pallets.git?branch=main#d9aa53506d59b350a23647a6c9b04e253955094d" +dependencies = [ + "lazy_static", + "parity-scale-codec", + "scale-info", + "serde", + "sp-api", + "sp-application-crypto", + "sp-core", + "sp-crypto-hashing 0.1.0 (git+https://github.com/ideal-lab5/polkadot-sdk.git?branch=testing)", + "sp-io", + "sp-keystore", + "sp-mmr-primitives", + "sp-runtime", + "strum 0.24.1", +] + [[package]] name = "sp-consensus-beefy-etf" version = "13.0.0" diff --git a/README.md b/README.md index 2d7f7a9..6c6bfe0 100644 --- a/README.md +++ b/README.md @@ -1,13 +1,16 @@ # Murmur -Murmur is an air-gapped keyless crypto wallet protocol that runs on the Ideal Network. It is based on the [Hours of Horus](https://eprint.iacr.org/2021/715) protocol, which leverages timelock encryption and a secure OTP code generator to construct a keyless wallet scheme. Our scheme improves on this construction in several ways. +Murmur is an air-gapped keyless crypto wallet protocol that runs on the [Ideal Network](). This repository contains the core implementation of the murmur protocol and a CLI to allow fully non-custodial usage of murmur wallets. +The murmur protocol enables **keyless account abstraction** capabilities for any chain bridged to the Ideal Network (alternatively, we can do this with drand). wallet is a special pure proxy that can only be executed when presented with proof that the origin knows a correct time-based OTP code. + +It is based on the [Hours of Horus](https://eprint.iacr.org/2021/715) protocol, which leverages timelock encryption and a secure OTP code generator to construct a keyless wallet scheme. Our scheme improves on this construction in several ways. + +- We leverage the Ideal Network to instantiate practical timelock encryption, allowing the HoH scheme to be realized in the first place. - We use a Merkle mountain range in place of a Merkle tree, allowing for arbitrary numbers of OTP codes to be generated - JIT execution: Rather than relying on a commit-reveal scheme in order to use the wallet, our scheme uses a 'just-in-time' approach leveraging the Ideal Network's on-chain randomness, which provides the decryption key (i.e. BLS signature) necessary to verify proofs. -This repository contains the core implementation of the murmur protocol and a CLI to allow fully non-custodial usage of murmur wallets on the Ideal Network. - -## Setup +## Build ``` cargo build diff --git a/cli/Cargo.toml b/cli/Cargo.toml index 06400ae..ebbfdcb 100644 --- a/cli/Cargo.toml +++ b/cli/Cargo.toml @@ -9,8 +9,7 @@ license.workspace = true subxt = "0.35.2" subxt-signer = "0.35.2" tokio = { version = "1.35", features = ["macros", "time", "rt-multi-thread"] } -murmur-core = { package = "murmur-core", path = "../core/", features = ["client"] } -etf-crypto-primitives = { git = "https://github.com/ideal-lab5/etf-sdk/", branch = "tony/dev" } +murmur-lib = { package = "murmur-lib", path = "../lib/" } clap = { version = "4.1.1", features = ["derive"] } rand_chacha = "0.3.1" ckb-merkle-mountain-range = "0.5.2" diff --git a/cli/README.md b/cli/README.md index c2e4e3d..8722bfb 100644 --- a/cli/README.md +++ b/cli/README.md @@ -6,6 +6,14 @@ It allows for the creation and exeuction of ephemeral 'murmur' wallets on the Id ## Setup +Install the cli with + +``` shell +cargo install murmur +# verify it works +murmur --help +``` + To setup a dev environment: - run a local [IDN solochain node](https://github.com/ideal-lab5/etf) - [generate metadata](#generating-metadata-for-the-chain) diff --git a/cli/artifacts/metadata.scale b/cli/artifacts/metadata.scale deleted file mode 100644 index 578d0969aa605efb5b2a2720564786a2aa96e9c2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 619440 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 UGR#8$F|?U45g~3fspm!Z1$kwm%m4rY diff --git a/cli/src/main.rs b/cli/src/main.rs index 4fd78bf..19dd7b6 100644 --- a/cli/src/main.rs +++ b/cli/src/main.rs @@ -17,34 +17,15 @@ #![allow(missing_docs)] use subxt::{backend::rpc::RpcClient, client::OnlineClient, config::SubstrateConfig}; use subxt_signer::sr25519::dev; - -// Generate an interface that we can use from the node's metadata. -#[subxt::subxt(runtime_metadata_path = "artifacts/metadata.scale")] -pub mod etf {} - use std::fs::File; - +use std::time::Instant; use clap::{Parser, Subcommand}; use thiserror::Error; - -use subxt::ext::codec::Encode; - -use beefy::{known_payloads, Commitment, Payload}; -use etf::murmur::calls::types::{Create, Proxy}; -use etf::runtime_types::{ - bounded_collections::bounded_vec::BoundedVec, - node_template_runtime::{RuntimeCall, RuntimeCall::Balances}, -}; - -use murmur_core::{ - murmur::MurmurStore, - types::{BlockNumber, Identity, IdentityBuilder, Leaf}, +use etf::runtime_types::node_template_runtime::RuntimeCall::Balances; +use murmur_lib::{ + etf, create, prepare_execute, + MurmurStore, BlockNumber }; -use rand_core::OsRng; -use ark_serialize::CanonicalSerialize; -use w3f_bls::{KeypairVT, DoublePublicKey, DoublePublicKeyScheme, SerializableToBytes, TinyBLS377}; - -use std::time::Instant; /// Command line #[derive(Parser)] @@ -59,8 +40,6 @@ struct Cli { enum Commands { /// create a new murmur wallet New(WalletCreationDetails), - /// dispatch (proxy) a call to a murmur wallet in the future - ScheduleExecute(WalletExecuteDetails), /// dispatch (proxy) a call to a murmur wallet Execute(WalletExecuteDetails), } @@ -72,9 +51,7 @@ struct WalletCreationDetails { #[arg(long)] seed: String, #[clap(long)] - validity: u32, - #[clap(short, long)] - x: bool, + validity: u32 } #[derive(Parser)] @@ -84,9 +61,7 @@ struct WalletExecuteDetails { #[arg(long)] seed: String, #[arg(short, long)] - amount: String, - #[clap(short, long)] - x: bool, + amount: String } #[derive(Error, Debug)] @@ -95,55 +70,28 @@ pub enum CLIError { InvalidPubkey, } -#[derive(Debug)] -pub struct BasicIdBuilder; -impl IdentityBuilder for BasicIdBuilder { - fn build_identity(when: BlockNumber) -> Identity { - let payload = Payload::from_single_entry(known_payloads::ETF_SIGNATURE, Vec::new()); - let commitment = Commitment { - payload, - block_number: when, - validator_set_id: 0, // TODO: how to ensure correct validator set ID is used? could just always set to 1 for now, else set input param. - }; - Identity::new(&commitment.encode()) - } -} - +/// the mmr_store file location +/// in future, make configurable pub const MMR_STORE_FILEPATH: &str = "mmr_store"; #[tokio::main] async fn main() -> Result<(), Box> { let cli = Cli::parse(); let before = Instant::now(); - - let mut current_block_number = 0; - - - let keypair = KeypairVT::::generate(&mut OsRng); - let double_public: DoublePublicKey = DoublePublicKey( - keypair.into_public_key_in_signature_group().0, - keypair.public.0, - ); - let mut round_pubkey_bytes = Vec::new(); - double_public.serialize_compressed(&mut round_pubkey_bytes).unwrap(); // TODO: HKDF? just hash the seed? let ephem_msk = [1; 32]; + let (client, current_block_number, round_pubkey_bytes) = idn_connect().await?; + match &cli.commands { Commands::New(args) => { - // if args.x { - let (etf, block_number, pk_bytes) = idn_connect().await?; - current_block_number = block_number; - round_pubkey_bytes = pk_bytes; - // } - println!("🭠Murmur: Generating Merkle mountain range"); // 1. prepare block schedule let mut schedule: Vec = Vec::new(); for i in 2..args.validity + 2 { // wallet is 'active' in 2 blocks - let next_block = current_block_number + i; - schedule.push(next_block); + let next_block_number: BlockNumber = current_block_number + i; + schedule.push(next_block_number); } // 2. create mmr let (call, mmr_store) = create( @@ -153,26 +101,18 @@ async fn main() -> Result<(), Box> { schedule, round_pubkey_bytes, ); - // println!("seriously wtf: {:?}", mmr_store.metadata.clone()); // 3. add to storage write_mmr_store(mmr_store.clone(), MMR_STORE_FILEPATH); // TODO: make the origin configurable // sign and send the call - // let from = dev::alice(); - // let _events = etf - // .tx() - // .sign_and_submit_then_watch_default(&call, &from) - // .await?; + let from = dev::alice(); + let _events = client + .tx() + .sign_and_submit_then_watch_default(&call, &from) + .await?; println!("✅ MMR proxy account creation successful!"); } Commands::Execute(args) => { - // if args.x { - let (etf, block_number, pk_bytes) = idn_connect().await?; - current_block_number = block_number; - round_pubkey_bytes = pk_bytes; - // } else { - // current_block_number += 2; - // } // build balance transfer let bob = dev::alice().public_key(); // get the value argument @@ -181,42 +121,45 @@ async fn main() -> Result<(), Box> { .split_whitespace() .map(|r| r.replace('_', "").parse().unwrap()) .collect::>()[0]; - // TODO: cleanup type defs let balance_transfer_call = Balances(etf::balances::Call::transfer_allow_death { dest: subxt::utils::MultiAddress::<_, u32>::from(bob), value: v, }); let store: MurmurStore = load_mmr_store(MMR_STORE_FILEPATH); + let target_block_number: BlockNumber = current_block_number + 1; + println!("💾 Recovered Murmur store from local file"); let tx = prepare_execute( args.name.clone().as_bytes().to_vec(), args.seed.clone().as_bytes().to_vec(), - current_block_number + 1, + target_block_number, store, balance_transfer_call, ) .await; // submit the tx using alice to sign it - // let _result = etf.tx() - // .sign_and_submit_then_watch_default(&tx, &dev::alice()) - // .await; - } - _ => panic!("Hey, don't do that!"), + let _result = client.tx() + .sign_and_submit_then_watch_default(&tx, &dev::alice()) + .await; + }, } println!("Elapsed time: {:.2?}", before.elapsed()); Ok(()) } -async fn idn_connect( -) -> Result<(OnlineClient, BlockNumber, Vec), Box> { +/// async connection to the Ideal Network +/// if successful then fetch data +/// else error if unreachable +async fn idn_connect() -> + Result<(OnlineClient, BlockNumber, Vec), Box> { println!("🎲 Connecting to Ideal network (local node)"); let rpc_client = RpcClient::from_url("ws://localhost:9944").await?; - let etf = OnlineClient::::from_rpc_client(rpc_client.clone()).await?; + let client = OnlineClient::::from_rpc_client(rpc_client.clone()).await?; println!("🔗 RPC Client: connection established"); // fetch the round public key from etf runtime storage let round_key_query = subxt::dynamic::storage("Etf", "RoundPublic", ()); - let result = etf + let result = client .storage() .at_latest() .await? @@ -226,84 +169,10 @@ async fn idn_connect( println!("🔑 Successfully retrieved the round public key."); - let current_block = etf.blocks().at_latest().await?; - let current_block_number = current_block.header().number; + let current_block = client.blocks().at_latest().await?; + let current_block_number: BlockNumber = current_block.header().number; println!("🧊 Current block number: #{:?}", current_block_number); - Ok((etf, current_block_number, round_pubkey_bytes)) -} -/// create a new MMR and use it to generate a valid call to create a murmur wallet -/// returns the call data and the mmr_store -/// -/// * `name`: The name of the murmur wallet -/// * `seed`: The seed used to generate otp codes -/// * `ephem_msk`: An ephemeral secret key TODO: replace with an hkdf? -/// * `block_schedule`: A list of block numbers when the wallet will be executable -/// * `round_pubkey_bytes`: The Ideal Network randomness beacon public key -/// -pub fn create( - name: String, - seed: String, - ephem_msk: [u8; 32], - block_schedule: Vec, - round_pubkey_bytes: Vec, -) -> (subxt::tx::Payload, MurmurStore) { - let round_pubkey = DoublePublicKey::::from_bytes(&round_pubkey_bytes).unwrap(); // TODO: error handlking - let mmr_store = MurmurStore::new::( - seed.clone().into(), - block_schedule.clone(), - ephem_msk, - round_pubkey, - ); - let root = mmr_store.root.clone(); - let name = name.as_bytes().to_vec(); - - let call = etf::tx() - .murmur() - .create(root.0, mmr_store.metadata.len() as u64, BoundedVec(name)); - (call, mmr_store) -} - -/// prepare the call for immediate execution -/// Note to self: in the future, we can consider ways to prune the murmurstore as OTP codes are consumed -/// for example, we can take the next values from the map, reducing storage to 0 over time -/// However, to do this we need to think of a way to prove it with a merkle proof -/// my thought is that we would have a subtree, so first we prove that the subtree is indeed in the parent MMR -/// then we prove that the specific leaf is in the subtree. -/// We could potentially use that idea as a way to optimize the execute function in general. Rather than -/// loading the entire MMR into memory, we really only need to load a minimal subtree containing the leaf we want to consume -/// -> add this to the 'future work' section later -pub async fn prepare_execute( - name: Vec, - seed: Vec, - when: BlockNumber, - store: MurmurStore, - call: RuntimeCall, -) -> subxt::tx::Payload { - let (proof, commitment, ciphertext, pos) = store - .execute(seed.clone(), when, call.encode().to_vec()) - .unwrap(); - let test = proof - .verify(store.root, vec![(pos.clone(), Leaf(ciphertext.clone()))]) - .unwrap(); - println!("valid ? {:?}", test); - // println!("MMR ROOT:{:?}", store.root.clone()); - - let size: u64 = proof.mmr_size() as u64; - let proof_items: Vec> = proof - .proof_items() - .iter() - .map(|leaf| leaf.0.clone()) - .collect::>(); - - etf::tx().murmur().proxy( - BoundedVec(name), - pos, - commitment, - ciphertext, - proof_items, - size, - call, - ) + Ok((client, current_block_number, round_pubkey_bytes)) } /// read an MMR from a file @@ -318,133 +187,3 @@ fn write_mmr_store(mmr_store: MurmurStore, path: &str) { let mmr_store_file = File::create(path).expect("It should create the file"); serde_cbor::to_writer(mmr_store_file, &mmr_store).unwrap(); } - -// #[cfg(test)] -// mod tests { - -// use super::*; - - -// #[test] -// pub fn it_can_create_mmr_store_and_verifiable_execution_params() { -// let name = "name".to_string(); -// let seed = "seed".to_string(); -// let ephem_msk = [1;32]; -// let schedule = vec![1,2,3,4,5,6,7,8,9]; - -// let (_call, mmr_store) = create( -// name.clone(), -// seed.clone(), -// ephem_msk, -// schedule, -// pk_bytes, -// ); - -// assert!(write_mmr_store(mmr_store.clone(), "mmr_store").is_ok()); - -// // then try to load the mmr_store -// } -// } - -// Commands::ScheduleExecute(args) => { -// // build balance transfer -// let bob = AccountKeyring::Bob.to_account_id().into(); -// // get the value argument -// let v: u128 = args.amount -// .split_whitespace() -// .map(|r| r.replace('_', "").parse().unwrap()) -// .collect::>()[0]; -// let balance_transfer_call = RuntimeCall::Balances( -// BalancesCall::transfer_allow_death { -// dest: bob, -// value: v, -// }); -// let call = prepare_execution_payload_for_proxy::( -// etf.clone(), -// args.name.clone().as_bytes().to_vec(), -// args.seed.clone().as_bytes().to_vec(), -// args.when.clone(), -// balance_transfer_call, -// ).await; -// // sign and send the tx (with the alice wallet for now) -// dispatch_sealed_tx::( -// etf, -// args.when, -// ephem_msk, -// round_pubkey, -// call, -// ).await; -// } - -// /// prepare the proxy call for a scheduled transaction -// async fn prepare_execution_payload_for_proxy( -// etf: OnlineClient, -// name: Vec, -// seed: Vec, -// when: BlockNumber, -// call: RuntimeCall, -// ) -> RuntimeCall { -// let data: Vec<(BlockNumber, Ciphertext)> = load_mmr_store(); -// let ciphertext = data.iter().filter(|d| d.0 == when).collect().unwrap()[0]; - -// let call_data = call.encode(); -// // prepare the proof required to used the mmr wallet at the specific block height -// let payload = murmur::execute::( -// seed, -// when, -// call_data, -// leaves.clone(), -// ).map_err(|e| println!("Murmur execution failed due to {:?}", e)).unwrap(); - -// // let root: Leaf = payload.root; -// let hash: Vec = payload.hash; -// let proof: MerkleProof = payload.proof; -// let target_leaf: Leaf = payload.target; -// let pos: u64 = payload.pos; - -// let proof_items: Vec> = proof.proof_items().iter() -// .map(|leaf| leaf.0.to_vec().clone()) -// .collect::>(); - -// let bounded = >>::truncate_from(name); - -// RuntimeCall::Murmur(MurmurCall::proxy { -// name: bounded, -// position: pos, -// target_leaf: target_leaf.0, -// proof: proof_items, -// ciphertext, -// call: Box::new(call), -// hash, -// }) -// } - -// /// dispatch a shielded (timelocked) transaction for a future block -// async fn dispatch_sealed_tx>( -// etf: OnlineClient, -// when: BlockNumber, -// ephemeral_msk: [u8;32], -// pk: DoublePublicKey, -// proxy_call: RuntimeCall, -// ) { -// let proxy_call_bytes: &[u8] = &proxy_call.encode(); -// // then construct a scheduled transaction for "when" -// // 1. tlock -// let identity = I::build_identity(when); -// let timelocked_proxy_call = murmur::timelock_encrypt::( -// identity, -// pk.1, -// ephemeral_msk, -// proxy_call_bytes, -// ); -// let bounded_ciphertext = etf::runtime_types::bounded_collections::bounded_vec::BoundedVec(timelocked_proxy_call); -// // 2. build tx -// let sealed_tx = etf::tx() -// .scheduler() -// .schedule_sealed(when, 127, bounded_ciphertext); -// // 3. submit tx -// let events = etf -// .tx() -// .sign_and_submit_then_watch_default(&sealed_tx, &dev::alice()) -// .await; -// } diff --git a/core/README.md b/core/README.md index f480eeb..9efec1d 100644 --- a/core/README.md +++ b/core/README.md @@ -1,5 +1,7 @@ # Murmur Core +This library contains the core implementation of the murmur protocol. This implementation can support both BLS12-377 and BLS12-381, but is left curve-agnostic, only expecting that the beacon is produced by an ETF-PFG instance. + ## Build ``` shell @@ -20,4 +22,8 @@ cargo test The OTP code generator is gated under the "client" feature, so run tests with: ``` shell cargo test --features "client" -``` \ No newline at end of file +``` + +## Future Work/Notes +- There is an 'otpauth' feature that can be enabled on the totp lib. It allows for the inclusion of an issuer and account_name. We can investigate usage of this in the future. https://github.com/constantoine/totp-rs/blob/da78569b0c233adbce126dbe0c35452340fd3929/src/lib.rs#L160 +- Wallet Update logic: Each murmur wallet is ephemeral, since any MMR must be limited in size. We can use a zkp to prove knowledge of the seed in order to allow the wallet owner to update the wallet by providing a new MMR root. \ No newline at end of file diff --git a/core/src/murmur.rs b/core/src/murmur.rs index c2a8bf5..b0245f0 100644 --- a/core/src/murmur.rs +++ b/core/src/murmur.rs @@ -43,6 +43,7 @@ use ckb_merkle_mountain_range::{ MemMMR, MemStore, }, + helper::leaf_index_to_pos, }; use sha3::Digest; @@ -74,7 +75,7 @@ impl MurmurStore { /// * `round_public_key`: The IDN beacon's public key /// pub fn new>( - mut seed: Vec, + seed: Vec, block_schedule: Vec, ephemeral_msk: [u8;32], round_public_key: DoublePublicKey, @@ -86,7 +87,7 @@ impl MurmurStore { let mut mmr = MemMMR::<_, MergeLeaves>::new(0, store); for i in &block_schedule { - let mut otp_code = totp.generate(*i); + let otp_code = totp.generate(*i); let identity = I::build_identity(*i); let ct_bytes = timelock_encrypt::( identity, @@ -106,10 +107,6 @@ impl MurmurStore { } /// Build data required (proof and commitment) to execute a valid call from a murmur wallet - /// note: this rebuilds the entire mmr - /// we can look into ways to optimize this in the future - /// the main issue is that he MemStore is not serializable - /// a possible fix is to externalize mmr logic /// /// TODO: this should probably be a result, not option /// @@ -118,13 +115,14 @@ impl MurmurStore { /// * `call_data`: The call to be executed with the wallet (at `when`) pub fn execute( &self, - mut seed: Vec, + seed: Vec, when: BlockNumber, call_data: Vec ) -> Option<(MerkleProof::, Vec, Ciphertext, u64)> { if let Some(ciphertext) = self.metadata.get(&when) { let commitment = MurmurStore::commit(seed.clone(), when, &call_data.clone()); - let pos = get_key_index(&self.metadata, &when).unwrap() as u64; + let idx = get_key_index(&self.metadata, &when).unwrap() as u64; + let pos = leaf_index_to_pos(idx); let mmr = self.to_mmr(); let proof = mmr.gen_proof(vec![pos]).expect("todo: handle error"); return Some((proof, commitment, ciphertext.clone(), pos)); @@ -139,13 +137,12 @@ impl MurmurStore { /// * `when`: The block number when the commitment is verifiable /// * `data`: The data to commit to /// - fn commit(mut seed: Vec, when: BlockNumber, data: &[u8]) -> Vec { + fn commit(seed: Vec, when: BlockNumber, data: &[u8]) -> Vec { let botp = build_generator(&seed); - let mut otp_code = botp.generate(when); + let otp_code = botp.generate(when); let mut hasher = sha3::Sha3_256::default(); hasher.update(otp_code.as_bytes()); - hasher.update(data); hasher.finalize().to_vec() } @@ -170,7 +167,7 @@ impl MurmurStore { pub fn timelock_encrypt( identity: Identity, pk: E::PublicKeyGroup, - mut ephemeral_msk: [u8;32], + ephemeral_msk: [u8;32], message: &[u8], ) -> Vec { let ciphertext = tle::( @@ -209,7 +206,6 @@ pub fn verify( .unwrap_or(false); if validity { - // verify the hash let mut hasher = sha3::Sha3_256::default(); hasher.update(otp); hasher.update(aux_data); @@ -296,23 +292,8 @@ mod tests { .execute(seed.clone(), when, aux_data.clone()) .unwrap(); + // sanity check assert!(proof.verify(root.clone(), vec![(pos, Leaf(ciphertext.clone()))]).unwrap()); - // // we also simulate the serialization of the proof items - // let proof_items: Vec> = proof.proof_items().iter() - // .map(|leaf| leaf.0.to_vec().clone()) - // .collect::>(); - - // let leaves: Vec = proof_items.clone().into_iter() - // .map(|p| Leaf(p)).collect::>(); - // let new_merkle_proof = MerkleProof::::new( - // proof.mmr_size() as u64, leaves); - // let root_bytes = root.0.clone(); - // let new_root = Leaf(root_bytes); - - // let test = new_merkle_proof.verify(new_root.clone(), vec![(pos.clone(), Leaf(ciphertext.clone()))]).unwrap(); - // assert!(test == true); - - // in practice, the otp code would be timelock decrypted // but for testing purposes, we will just calculate the expected one now diff --git a/core/src/otp.rs b/core/src/otp.rs index f217beb..480e3a5 100644 --- a/core/src/otp.rs +++ b/core/src/otp.rs @@ -52,4 +52,4 @@ impl BOTPGenerator { self.totp.generate(block_height as u64) } -} \ No newline at end of file +} diff --git a/lib/Cargo.toml b/lib/Cargo.toml index d17b015..a405839 100644 --- a/lib/Cargo.toml +++ b/lib/Cargo.toml @@ -5,7 +5,7 @@ edition = "2021" authors.workspace = true [dependencies] -beefy = { package = "sp-consensus-beefy-etf", git = "https://github.com/ideal-lab5/etf.git", branch = "murmur", features = ["bls-experimental"] } +beefy = { package = "sp-consensus-beefy-etf", git = "https://github.com/ideal-lab5/pallets.git", branch = "main", features = ["bls-experimental"] } murmur-core = { package = "murmur-core", path = "../core/", features = ["client"] } subxt = "0.35.2" w3f-bls = "0.1.3" \ No newline at end of file diff --git a/lib/README.md b/lib/README.md new file mode 100644 index 0000000..a3972a9 --- /dev/null +++ b/lib/README.md @@ -0,0 +1,5 @@ +# murmur-lib + +This is middleware to allow easy integration of Murmur as middleware for various services. For example, it is used to build both the [murmur-cli](../cli/README.md) and the [murmur-api](). + +Specifically, this library implements an [IdentityBuilder]() for usage with the Ideal Network's core randomness beacon (produced with the ETF-Post-Finality Gadget). It \ No newline at end of file diff --git a/lib/artifacts/metadata.scale b/lib/artifacts/metadata.scale index d74dc51ccac22fc54aa26eb62afbdef16c8504e1..578d0969aa605efb5b2a2720564786a2aa96e9c2 100644 GIT binary patch delta 210 zcmdn=Om)L^)rJF7M3ln?L~|d(>sb-mFpw46cUQ^^Ggz}6hbmm6?}bz6hPbq zK;h!ds#K^jh^e5FSDKrYTBMMlrjV1GSe9C>31XH&bb&PFCFa63fS3v;`3i}}#hK}O zAQnhnZfOw^DHIgtS5z{HfGDO)nd$LGtm@OB7O@6%fvhoLF7M3ln?L~|N(>sb-m4!956cUQ^^Ggz}6c|Jbit;NeC8oz0 ov8qoGE@lmG-(1YPeRDCJz;zZI|B{0CQ(o*q%(4BH7w0n#01n_DzyJUM diff --git a/lib/src/lib.rs b/lib/src/lib.rs index dcd9a90..a7829d1 100644 --- a/lib/src/lib.rs +++ b/lib/src/lib.rs @@ -16,11 +16,19 @@ use beefy::{known_payloads, Commitment, Payload}; use murmur_core::{ - murmur::MurmurStore, - types::{BlockNumber, Identity, IdentityBuilder}, + types::{Identity, IdentityBuilder}, +}; +pub use murmur_core::types::BlockNumber; +pub use murmur_core::murmur::MurmurStore; +use etf::murmur::calls::types::{Create, Proxy}; +use etf::runtime_types::{ + bounded_collections::bounded_vec::BoundedVec, + node_template_runtime::RuntimeCall, }; use subxt::ext::codec::Encode; -use w3f_bls::{DoublePublicKey, EngineBLS, SerializableToBytes, TinyBLS377}; +use w3f_bls::{DoublePublicKey, SerializableToBytes, TinyBLS377}; + +// pub mod MurmurStore; // Generate an interface that we can use from the node's metadata. #[subxt::subxt(runtime_metadata_path = "artifacts/metadata.scale")] @@ -39,18 +47,23 @@ impl IdentityBuilder for BasicIdBuilder { Identity::new(&commitment.encode()) } } - -pub async fn create( +/// create a new MMR and use it to generate a valid call to create a murmur wallet +/// returns the call data and the mmr_store +/// +/// * `name`: The name of the murmur proxy +/// * `seed`: The seed used to generate otp codes +/// * `ephem_msk`: An ephemeral secret key TODO: replace with an hkdf? +/// * `block_schedule`: A list of block numbers when the wallet will be executable +/// * `round_pubkey_bytes`: The Ideal Network randomness beacon public key +/// +pub fn create( name: String, seed: String, ephem_msk: [u8; 32], block_schedule: Vec, round_pubkey_bytes: Vec, -) -> ( - subxt::tx::Payload, - MurmurStore, -) { - let round_pubkey = DoublePublicKey::::from_bytes(&round_pubkey_bytes).unwrap(); +) -> (subxt::tx::Payload, MurmurStore) { + let round_pubkey = DoublePublicKey::::from_bytes(&round_pubkey_bytes).unwrap(); // TODO: error handlking let mmr_store = MurmurStore::new::( seed.clone().into(), block_schedule.clone(), @@ -59,43 +72,52 @@ pub async fn create( ); let root = mmr_store.root.clone(); let name = name.as_bytes().to_vec(); - let call = etf::tx().murmur().create( - root.0.into(), - mmr_store.metadata.len() as u64, - etf::runtime_types::bounded_collections::bounded_vec::BoundedVec(name), - ); + + let call = etf::tx() + .murmur() + .create(root.0, mmr_store.metadata.len() as u64, BoundedVec(name)); (call, mmr_store) } -/// Prepare the call for immediate execution -// Note: in the future, we can consider ways to prune the murmurstore as OTP codes are consumed -// for example, we can take the next values from the map, reducing storage to 0 over time -// However, to do this we need to think of a way to prove it with a merkle proof -// my though is that we would have a subtree, so first we prove that the subtree is indeed in the parent MMR -// then we prove that the specific leaf is in the subtree. -// We could potentially use that idea as a way to optimize the execute function in general. Rather than -// loading the entire MMR into memory, we really only need to load a minimal subtree containing the leaf we want to consume -// -> add this to the 'future work' section later -pub async fn prepare_execute( +/// prepare the call for immediate execution +/// Note to self: in the future, we can consider ways to prune the murmurstore as OTP codes are consumed +/// for example, we can take the next values from the map, reducing storage to 0 over time +/// However, to do this we need to think of a way to prove it with a merkle proof +/// my thought is that we would have a subtree, so first we prove that the subtree is indeed in the parent MMR +/// then we prove that the specific leaf is in the subtree. +/// We could potentially use that idea as a way to optimize the execute function in general. Rather than +/// loading the entire MMR into memory, we really only need to load a minimal subtree containing the leaf we want to consume +/// -> add this to the 'future work' section later +/// +/// * `name`: The name of the murmur proxy +/// * `seed`: The seed used to generate otp codes +/// * `when`: The block number when OTP codeds should be generated +/// * `store`: A murmur store +/// * `call`: Any valid runtime call +/// +pub async fn prepare_execute( name: Vec, seed: Vec, when: BlockNumber, store: MurmurStore, - call: etf::runtime_types::node_template_runtime::RuntimeCall, -) -> subxt::tx::Payload { - let (proof, commitment, ciphertext, pos) = store - .execute(seed.clone(), when, call.encode().to_vec()) - .unwrap(); - + call: RuntimeCall, +) -> subxt::tx::Payload { + let (proof, commitment, ciphertext, pos) = + store.execute(seed.clone(), when, call.encode()).unwrap(); + let size: u64 = proof.mmr_size(); let proof_items: Vec> = proof .proof_items() .iter() - .map(|leaf| leaf.0.to_vec().clone()) + .map(|leaf| leaf.0.clone()) .collect::>(); - let bounded = etf::runtime_types::bounded_collections::bounded_vec::BoundedVec(name); - - etf::tx() - .murmur() - .proxy(bounded, pos, commitment, ciphertext, proof_items, call) + etf::tx().murmur().proxy( + BoundedVec(name), + pos, + commitment, + ciphertext, + proof_items, + size, + call, + ) } diff --git a/mmr_store b/mmr_store index 0701f329686615b7ac6c7318f95036f2d3244f3d..ea19e9b7d7a8aad89e0974d26c07287af54a8d57 100644 GIT binary patch literal 44914 zcmb51bzBwe_x%suU0ZCgiG>|t7j|G^Vt02dVqs!j3%k2JvAeyBUY^mZtL6OOhnN zY?78TRdUF1d#Pj3|LI(1ifosHQqkGC{RDX~TjaBpv*+bzQc7ydAO6qsf4{d#xMky{?UFDqQlqOPLy2;-bro^PN?3aqbl}T=qZ&s#wC9f=G zH2AER2~yh;EI!LlUaug}B!{O=BEKbaSBA^I)KOvxt}mE9V5*#K+m-KkNHsQ{N;2=k ze7B>EG?F%wO@ic-uSCjpUe4)6j@it48{{bG-Q^3}PA9O1GDn`uF%ROaz*jE5x=4L5 z*>2*k2Y5Y@J91g_$w%og`(&U@|b7P_{s+`s7~UwVe*oMz-yp%lFS}v z{N)9#{Y0KY9wWVeWHSoNOUoBmxqzZ;NNbdKS`IrRw#R^Znco$a_7VdH=S?udXM1^s zIDbIdY}rGyk!Z0K#j{yXp}DsbCt(r{>#dQ@V^k2#Zwg3RM$bi7f0>i`hZt5$JDA@t zj}1iqS=Oeg^adjhB7_4ZxLhjB1tX7^MAjD`!X(KPyneI&6Y%=aEIxsy!(`T%kp9SC zX)9TnY)gP{VbQkeI)H|SlZsPZsQNlAyx z)IsSpQAFp|QA#)vMLD9q3wHB>;tUX^Cx$^z5O9&o$s+&ACSQqS_BfKvi4eY9g2Nxl zZcg6>rk;i#vVq4%{_bGg>~heH%#J|(7RW1tC_71iBYm>ckL~AChYJ|49`sN4{U7MF z!56{^bRw2Ho`3HU;7qwK>tq1VlOD7`@&9u8on?*U_EV;{py#Jlkr$relO$E$WP=AG z973#L8EcZ7s*8mNn%nC3LLt;bfe)WB4;0&IkGt~uct88F`AOtPMR1CV(cXgCK&e?$FF z{tktK`4m8VJf;&-y+thpQt2xLV0pl>G1t1zhAMMH_@D?$T{+q@R&JU-@bY0MpR* z6EN>c>~Sz*lxG^P&q6X2_aLB-1cG;9TGc{UQAJ(IJO&R~PGP+UjTn%PBYlMWLll1|R$`irR^=k_Z<9 z&jDHU8R8T@^bV8GqvHBA=OAzT+Gf7ZM+ioIkmn&Vj)S#Tgt1O8STfi;ux>>!?c7k`bsoJ&OAxQ$2v{rYFL=iY1&k z(uR0i5X?iOtxmMN7;bb;j1ZAB_hOz@Ng5|{lj)s zsLUsrPg|Mi!OZietUDd@AYL1Qp$5V4H>ka=%a-|4&jLX-lCwbAnuXYDwkgZc8$qBi z9si}g^90c~NI5+dEobK)l=vo)EQ?mxGF%b7={2QXkhMlISZuaMSPxNEsI)etFA3rb zvIHuNsIoKhJsIsKYh3wxE^*%@pRAN;dVYSyfW>Jo`}xf&3Pc#o#NZGq=Ho_qFX*$y zX}z6MbS89}k0IvzLi`-It}VG#j)|D5w(O-S%1r04jf(+3n_dWn~de$qoG z+Q=(QnM^R-S!HGb%$6n&j}Ybp5LhpzJ%}tB2{l0g#>mp7@Fe|W1|tWdlrS0NLB1gv zdtDmF1w`DJT&DwRF1hB3GZ&&<9w5RGFxb!!UN2dZK{KdniXZMJwu87zC2VG*1&yi{ ze)gNb+5!DFWQrGX2y9W)s3yz z0{wj#6tNiJOEPbMO^B*DzEKrRtW7RA>7>_SekWBkifO~?u-VYc7Zj6;St`gqdp16S zLp8KD0p*PR5{V?<%Yx#Y$_7=WgNLQ1T=A7Zt|Xby2Xa=hPTp_n z??vaRB!w-(sI@&o&w;}Ma>ga4PyAvvv`nfRxpRTE=Ln>pC*JjlV#tS=%rQljCUxQ1 zcOU@0!RvB^N>OC+4=JA{&>~R!1t5O9`>}-6rr#2Z;*efda#;?Fo0;l3E>i{qa`Btx z7VM(SznxlrH>k3maI_reT0+P{zKemmag6!-Uoh_V$^(`5(Dy4i%zF6T4-6)S%q&18NaS=`hgJ#pTtdFt(U8ty4%3_^ z)<90XQ2qq!y*6J-?!>tQIh~*uZ{Sz$O&C%1fz0~|T~)B5u$PhREGgiCBDaA}Fxbo> zg)>$V`j92YE@V=Tc5{Tx%1eM5fgZ@`mKV+T9oY>;50l7A3#%G&4`q3AM#4P-X@`lw zR?K#WP|t&8A?B`&gxUarQCn&8=fO1bbk8IJY{K`Wylqg;Ad)^N$89jL-qhU&rnrQp z9{5r+c?o1UTz0qeg@oA%|22#17+$+B2c2>6EYiyYkf$Tnfn*p!ah|Y%-8Ouqrv`@F zLQXm`sEA*!pcFeJ^F6eTu@qAjdsJivp$o$i^32zpkviLv`9T|&9ghsA#2Bh3i_A`l zWDj8JA@*kkF6{qDs`)Z>I4*L}*20y-Zpy1=VWk{q{+KGcI=?>FedIEJ>JH}|qoc~bY zTaey#UVaM7+OCST+^9uc>`bcnX^qE$=5JDZjyQK=P3P&*z3p8jyA3{j)<9imf$6q< z{iakuP)6UVzX5#r78J`f#(He*AjpqmjC#mp3(Q3m%obT|2U3+R?D6Lw^tior-Z^$4 zwwh8{XI6Nt(dv4ln@e=@M17n8Iiph=L3IYh#`s@60}f-@7*yDZO(W&AD@^yIdzlz) zM%pXcV;&-&jff8rUJqCPdq}0;_Qor=dNKNIavEmI2tTRT#%N=Su3*jS3#MvbP{{qr zbsvM4#WN#x5?b%h%js+o;dh|O#4ADa)d3L?Ahb}bvX&PS*U^&81i|%X zqya}5O|zNf;#*h-J7?M#K-#Dl&{Pa7|Qu0@7LWV$B^Cy??7M!e+23S=?A zDTdfH;RE}bVlXPspIUi-Xk-Q^6ioqa#|V=^e+}cWCydU>VYVdLGihD0xXemr6y91J z`j)cOWRzrL?k)?+&y-OVL~WH%*3?03lvNKmI8AzsWr!QTJ(fT|vHJpAN0JZhCt1(~ z@|!W|1TaJBiq|Qicsb&N>r~_0WHi46M&h9Q74Gy#_L->r43!n(Iv%6_OjoasAo}5= z#@N#2E*Liq0q+C<@4aBJFamJrg}qy)@eZi z%*j_zs`&*g#bENzihm|Ba5KW|Y|AcND8TOKtIm_~dc} z|Cn`N5x#D+_X@zN?yBdOiUD#@_H8ex4Y>F&S?h`hmP5;GUi&GL77UsV#va&V6kVb5 zI7}?SgOcU0J(_O{d)ru^3|Fo`$rKmdbtU?ZroQj<{STDb?V&rCg9`L38p>LEcPKOQNQJGI24q(}wSUNp3q*@yFOU zGIuxmW+JeljJ2_FBE*a`-d7s<0EaQKG}+UISUkvnKw0T6sDP@VejbrT(R0g@F3U&~ z?MV%+qu4GRKw6h&i@_iVmV>W-q&OPgH^GA*^Oa6QEkI(b{B~lv`V#IYukgy# z2;&A^w8cyG#Ah@DsGTzXFEYIYe%(MPjJ5O|1fEk5m3FvVJ#8lO0y|J_GaUE@MFY?Me|>f^PI26&?4;n zC}oK~6r_WAbu)7;C+9U7+W^$u9BK)q4T8RiT$mSaUgjK-;VOY^XotkP*_qeKj2`H z#5$t;yr^fJ7fs|6aG%qH3PCIJQ2&(h4>R8>DyImF?Ey|_h-Iy;HKf!9XV81HeAd=7 zip=&>(7|kRpUyg#^2-S*=P=?WK(ze(pZSx8(?3v*QR(V!0OtT=$qX~4@ZEb@3b!- zRrUnA-iEXV>|Tc?YayXKD1N1>`U(@*X-vMDtq-x40F+qt|DWkg2mU`vJqcNj#hnVG z)6Gm-A_d+R;In+isM6Ov%E*CN!gB+$ZNgTQL0?T()TSa6!J*9naC*Q@? zw|Hxssp}UuxZp~&SOl}3aDxqgs6r3aYs&*m7*v_8^1vK!$N>jfeUHSq(!V%;Y{JKz z*OE#7It`E2&I0z`iT@p8O>r0YK60XPApvE_!zUu0-IVGMk|@WR{@8P2bM7)A$DJ0xpVxGMznwkoZ<5X?rhZxqACrP%vtnnn;+5sPGx5!e)3cRaPb6d&k? zF-=3{Ma(I@Mvdl^Bp1*;!yXmDbv>fW!-#D$tvW#1AKfN9o63)OpIj(b4Cg7J?DR>!Q@MTe7_T?V7gLx={@nKdf?R;vmIeZUn!I~5ak@C26gEXC>cG`TqSBS z0?=nL@hpAs?;ZseO5izJ@64o|b*J9;m_VXbvao$3o!G_8smBD`GaEqec%+?i%ECI7DhP-l^ z7#z#|c|o!_7~Ey|Au`^8RR1%Df#~zHMA@RR#$NQGb}T~DVP;unhP@q-o<&i$K)Dww z|Be0Br!GFbkzHkY+Jt8sAYdZJwuOP-uYX12)taD%6>SMyMDUp$PIGQ} zBxoIEr(Kv$H!pNu!;J;wVtL_BZ#v0hFt-f0Bx z1XHPmAqGl352CqX?+X??5zJii_r~;=LQESgh~7m(R!=#7ZiI(0?^CqDfbJ=@RAG`T zWbp&+=TR~H$gLw{C;@Hx2xBcXK0^!jsiwXC=Ug(JR1dB)Dh8YTEPN8CpkiPw>|F;>WQ7&M!-CD3KsIs%gMEj*xL3 z!ah$81OuH)FBl8F4H@&n=^3L(LsJM?41%VEd|%KGZw>;??NswZ)c6(xCb52N0q#{P zvhsWvZ_Z+MC|L=?b%~;lC*3y6-JO5yQ_SlS)gvY<%qSBO++wPJy{`I;A;p?>DI-pj z>;r?l{aC3C$&YKyDd% z;fxOcP#Wi$Ergdd$VoSKnQGqB%t#+G_CoI0$!Q$D^&$%EM{VaZ1(qg(i42gy=zAF^ zk}B$os(Mj=4e{?l40$E^kKpI(KzWL-day-VfZbz9XDbGtEm+Nz1DEnd(32s0<6DRL z?wkY|sE!FNX||*4p6s_wGWmjObr{l9b&E+p3R+7bnE*c-YoI+Jw7EQ-Ro zQD14&cpQq_ljmS*Z;!pjBGc{I_8e(#4T$4GqoAy|Bc~WI{JaH7mjU;IAm0tu6hi0k zCBa7ydy#q={(D*qyU1({N^F`WI%8(P_}hd^97!MQ4;1ZjO@AOhO*0rxE%YI`P-?wB zAYX!DJuO;_@3$lThZeB1o00QE?iw6E5yJ>I=kSfpvX>7&1Tv48>rgdq3F$fJ+Y{;* zN_KtoMlX1{f@ehfVI|dMzXSQ2ox^@fbmbVnD|?@$ZgibIk|;B<5XjD$bzKRj1!kqi z^cMjKk=-@Wn2Tq&my+fbc92Y7)L}k};xa)AwqxLf6oZ089kFlm#}3 z;sE-xC%Fc0!*s8?mi z64y1EXQHqu(mDrjr4U9{cswJOy~y*wa!B_$4bJ;~-H=K$3x_01tQYy~$?6}poLtDQ z9FomvMMPbREDFM^0L)5w7n_M_8p`QbXK+-t~ z8XLf71TkMhoc@S<68>*2C*eRK>uDBELjiclo($$Q=9pLf^ zkoPj%G`NqDrS?P|i&gy4v!OX?2#MI@2q=C}VgqPjcS&=#JK{8ggv->x4s-GEb4qX= zyC(qhdBRzbo(m9~Uc{9NYA?tDPlPrMP97q?GW3};Qre6`Cwk2fyt7vB->~uGro(8{~QpH4JBT7Ar0%=I`51lC0mtRSniJmnil_7-=O&nTf)dQOD)cTRF_&6anbz-PJVP8-%sM zio~y*fFhR?c1(Q|QKa`pw0e#r1Wd|P{lnll$pNbKN+Rz@Ix}Ty2Q-ynL;68x4AS;S zAj+N;fj^}@o|sPKVbgf!2T^3lmL`mrSlw+!xYjdE$UQ!9BvB z&~gL)RKz<4D_L(~^FXqn<429v;wvNFbTKb>1JY-f1|WLQt9n6YAS@52{tuuTJrM20 zlBios`UA-58gt%*fNIb%i0MKh+l;{z7@02pI}z|wh8Y1u2~^EjA1W~~J?6C+l~_$K zyOH7>Fp2@nN5KD*zHAgawptD{inHB#bkiP1>j|(=7;tsmJ0FVGw>x1JsB!}!4Pn)_A_a)ltI^)cB1#Pgvo^7iN1FeUN%7S7};pRJh;w=jOtJr$MCjb z#Ip;hDv2TY0l!#0=PYqY$#fSfV*!@o408^0GV}i~>ES^Yy_2P$sQVaWB-0Jkr8HJf zv3W8_e`>9i%=ICGF_sLuR$@FnEOC~>&^Q2GA4_vHA01^0w>Kz~g;?kTz$t>Wg#l4_ zPjD>GJ_V(SD}{HDu#?z15_(=>$a*|u;%_&H?pa_f5QMM6;xKA>1nS!fYxjx!H`@3> zF57_i0mrFRK_EYE;1xdm2FaH(CvY$a1rubBuNNwbCe1B0oQKT+nCi-hT}=YE2UJ-- zQxU#o656F6C*?wi3u)|8x>7Lw`zK8Tx1iGw1d^N0F7NFMfJo+Xsk2O7sMw8`myd(b`T08`yayqzaw>q==0g>j1Cti&e64W`V1{1Ix1 z0TXQ|H>lM;^r8K>=>IV2zhmk2kh&>N;RnD&cT6Q2M+?Cj&)TOBlb2vRTY_^{GRlQs zD>6!D+QCZ*i}dE39PG~ta)5ft-h0UIw#>GdWj<2YoV!}2FdwP*##;*G7NhKb%xMsdZq3=2t`A0avDa1EO(o_JC-& zQ~!0{2tS+>sEQCnDY-0UH4a6Mpcva>`DdAV5eP>^-3Nv%3(xN*-atw8fx)-H9ELHD z#;4M`;S`POG`;9RR{-`t#H9zhZ@BI;1T&H8f3rh=UJ3K1XEd?bQx2=y;Vo4j4j)tP z7}zLI&{*Yzvj34Kt{mg2u(@9NDN3&hZa1a10ltdEXI>Ohgn@f83PNqbOQtcZ;%J#9 z7e_?En^oVDc!e!)pb9&~Qy3|hA^P_uIhwFK(;`+7><$i0h5|=9a|Vl%TNc@5K@C?T zox(_}3DhhkoLZR4OJ1uiTR8qT5!g$%`VsjKpi5+{U9h}{1dPF@S$+RVq9vX&fgF;M zaLbe$p35nkO?b~@)-`jO^$HPOqryuetrApC5?n;HxN1*ETbMOk-h1M;r{J_JLhWrs z{r56Z#CIJ~{d(}f%}6ikRr&@`1z#$08)jXXX@W@T2_Ox21-#QlpCGke0J*8mG|+Jl zA(_SC*%#aC#XO~~(To{?$0(I%EGmYA&J_x=6+$>6JFJn;Y-0IL&2DC%bu!F>47yR3 z2~?q8Veyh|jVQ@S2g+F49SqY2p#BvSx{jm%M8(YrXFYbqMJww8dbv!uC&|Vz@|x@q zNqKVyA0n|1^4t>!GgEJ`m@R}lsDow2k!BH4&Eo-MY z3@%Lyk1^)Iry|}0WjFHJ2`}%wNV6%nwhGzLB$-l-TaE>8S$-}6Ax#iw2dw%UBFyA$ z2l0BeRf&aq7*!?`YB0!lH}Vg(mPfX@Ml-#@wJfM^0hScI-k%RaP$|ygAyNO*_mLwYlt7p%6cZeKw z$Z0<*Zh&Y#pSIIMDwwm^j6%o-Y2y*=ZB`?f^&Cif{woY2Q|+Pf4|FD)om5-SLML99 zxXVJF@+&FonG|DOX>zxe1%sYjK1b-;sj}M;5(pUif#Mh)B%9>dW87RwpL@qBi1r*o zeZfF3@@fZu3Zxh-LQMkN8A|h9$98%qteNC6coFLd{svI4IcbjVP{U6K?`1_DZowrk zFy}~?Ne2N`tuzla{>BXT;@pEI_LlD^x`9Xq>Xd@A*{W?+@1kV-Cd7OfNmomx<82QPl@8MhDOpJijuXsWY z3Plg03dk2z9d6+_WATcDa?DoFJCe&9*0=weNlr`<;B1O%HTBTeQWkqbR~fxeO3&w= zhp}P=oy8j(E7OoGQ+WE`=Xc8SE8jJQgSV7I25fXE9`*ua%Yff@0~oB8f4uqK9*VfR z6IOD8f~&(sJ;>rLws{h6^3#)Iah5)?6+`iimHbvjfkvvKhzv;S5WgEtPVH0t_c#HV zmEmIwdj*A}S17cDzV^)D5=Ab-GSZ>W05;B#412TH4MhH21~}k{n_;^X8yazfw8l(0 zlVFO|=JjTt{TNCWmX!&}cp*)@Cn2{cg{Kg4i_W>*&Vg>zmMR-6mCRY(iFWt0aUi+o zKumhKULu2aAh)Z0r-!>qaEtkySlrI*lbQH3z&;0sC47Gbr!&TvW<^f-fve(RQ0051S+7$7I3KNd4KZDQtaCbNJ^1UF7o~g)JK8sITG(e95+!=eWp)` zbhhx*Bnos83eJPRo|~;otFfLLiYMg4`M=}&Wl;s^(>CJi;G zDXcW5d0pG#9^bPZul+kS5YA)6j4>P^k_Bnz*3Y*s?z?B5` zE`ZW(Se|m-22g@4bJT0l_O}!{4Irkm3>kv>^ewq`KvDpQ^T(LC>K(H+agnC9|7(=_ zbDa1%gYve8WU@uPXV|s~|If!566KXG@s=~ILt9rTVjbm25;-9IvJ)IH%a! z`F#Omzk$Q_LVQ=Su#(h~UQ1JlpI`Ip5NhT--t(O!j!JqdvC&|VYb@QW1|#LP^#GoB zj27mE5WYyF(yI4+PQhgRFkfSw{Ukq~VTM;EX&U4Qj1`dVE-V7p!^$TQxavoxb!5O* zWSv0Jdq{5v=1`S_Ip;}ittiA0vaf2+;91%1Y#}FI@xoHfDPUB9Le<4tMLJ6kqT3C% zsc#cr2d%MGNIy)u0JXAB-n#&dF|;%(Tnnnz5Y}U4EhxM3UG|;R9K7@1J z%a)?*42nHrZV!c|S1VjW+&i53kDG)EYA7Mh!G5YrO)k@91qQiX&aPLMePYS<9--HF zXNFKaD*XW2{h@X`)2u2R?8&VuxE^8Jb`F?n0oczc&#mREwKLv1ha7jwQZwINjgNOl z;G_A!E-~G-gXD}<=_XIP?8nf}q3D1IQEq}Uy|4B?i0dUNsW%{CDP>_gkzZ7!DbArv zKa#)t-eD$PhR{A>LLD%j8}z`3R!lL@&5bhp$lq$_yuF7iy%}!;dv);xl04u#oPJ)H zZWhTjKjE#U^s_b@=OhBF#U@kuMFv;Bes%pf`rB!)P2` z@Q&%wcN0IxW4YL(Y1nZ^k36jfC7wGKe>Xd`T)0ic2zfNdy{7*AFr0Z#oNszj(1F z?Y${~^;XCycmUVy`_gew(h}P<>P6XWBJe}XLOGe&YlHZ2cCW?m<4w_}S$aK~;TDvw z0hS^Z!WhDe0q>Kz>EC?m!CqZj`W?2~i@#2Q+M&dCg{TgaST?rPrOi}%=}hxEL=@ls z_EjU;U zC7znxomgixWeE7`A)LNr_Szf$=7r3QEKf%A|4mZV%X^FA ze|n$tHW&7YM|0!I^(oae%s^!qBHK0W@eWAqK;;UC9!gf5aKZIV)C6e^mZctG_S?z@ z^uK%ZS{r$3Lrraj-(HOO0Y3Ail3PeWm!ot`bx%EgP@9I*9yWAk)B!L;WJNMcM0rM!qMhYNv@_Ty1C!i9D>sqkcci0t&g%h_-UCpU z*Y`tyW2xlLMtYih5(|S`Qp21)eauP}lW$My)_W+yL^gazpbrVM3T06bB(j6ZNK*xF zXSOTY(>Gw>0Kye$I(q@b7+_i?vO^xEJqZL3(pn=VyDNp*op?*jem&22lHdNI6E$Mt zvCWpzw}Zdl3^oN|^T{zwD`0w?5>-5|lZ#=>A`5QKy-&y$NdFor)?kL4aD0jlI)cDt z5DuV`4rGv;(C805vn0gP4i&VLqn7+w9JC%1%SL@-&?msH!{qnbV{9skwA81pZa-0! zYw6OumH;;4gs=QreMDcnPW3LUM!g@HG-`=AmPVr;%iICWKB*|B0aU zgLX2c)5zKQ6N9Zyk(6GM(3mz^jrLrClC4MpHO)yZfP$)$VGHy#l*69exIuR?*7sJE zsj&RSJe>2kO<3g^{`~`_&4}*`F7}+&oJ6xHzdVo-jE0I*NpXZTj9hY4W8w6L707!4poJobvhtZmcve>16U%KZ zXAPNEA)})R?6tJC4GdV#|tcoA?lT03jmzOH(4=wXCt(G3lToRMz zBGH<(%SsYspn}_CnZNi7#FLjvb$eN7MR#e;&O2EFaRoOUhd@shgmb&Smz=Q!!v<8v zasGY9iKiICT7pb=pyu9;qNf0~Yn#9i1tz_Ev9}{NrVln-4rmbeBg=F~))H3dmANq}5HPTQl?xx#Pzc$tL#p$#6Sx%jaqB z!jumHG4+{IX;R1S20_kFhzr+GfdD`hmM7$P8{VnKiABc4zW~^5>>;wDDl+_YS_ZbTKO`~7Oh_##~ zlOg34i>}}%(Tuvo+6++n<3lMeLPmmQPEh&dfODJF_cZg+$u>}xfjXKBOtty<46eYn zJ_P$5dag5d4jiH`^}P%N2eMGT#c%KOT@nj3lK?cvm3Xv5(FD!>fX31;lG7eV>9yiR z2t#kPXPF;Ft+ZeXbclcTpg29NN`*?StZb|<%ct`jw8iY2>iaR^ri+H8f@5kGwzaWu&M+;oo{0SXT->3J7|bv8Pw4ucS^- zQN@+n?%&JfBCKKN7qJRJP4VE>joAEOY{dfPD~ICwU?80dA!b{FW}6|Ef~)~Fr$I!T zjMG2X|o`28H?J#nWv_1?R>WP1^}%4P~KE&9BVB}ZfJs;-b50^#p$0Vs|&Ys?jx{5if0A_Az zzC;8?SY(btJ+FbL3i|y^uaDYhD!({@Y);X4cC=3Mu9jq;YU*jxNAMdhXe(<$raTkv zAR>KeK@7O&VY23O%^d|@hDv>7MTkK!3QTW{>>p#dbHJB=iPe<`Mwa>6%@)dYJGG1 z{$_|(=&~{;w3xMNGj_hfICbQrJ0eR4$L3UHUpZ=|&k7&!&EG!!QlGW+93=XXvoW|d z`CEvMCwj2V9|AT{-SCt1FCmlTG+hiANP2bS_CQIy~ zZy63&9hQzEg+mH)3ok(BA)@q+>>eC%Owt>ee$We>L(6h9nL;m&Ak_qft&j4k<3L?D zbI0=ZM8_0VJc~u}VB%TGn7xokR>^A1F2>xb)Bra`azj42`;xWZCHxEJTtxW(5HSvK zxW>TN3;vhhCxa0SW5+kWa`n*2o>lGcz&s zMKqTN4*ZjzIEt9%mnL_dDBXolW@2`D(%a$*#sX(p3T0GTx`i{nKRRbnscY;IwK{_hwAN4svWSRbqsbCcy6##O^=fn z0i-K(&%~ZyJTwex{6ty_*z*D4dLvkpE>ouQj{rEsBR|kBcBu-|_xPR&^&x1f5KvRaP=`kNRdN7linkIsc>>@-zNlz;DawLllxAJ-rDcX3a?J>rZQs z!N|u$?|9H(iZkdXh+EKCO-eZoY7e*qPaJ@6!qYDU%0<-D(40c8uAUq@W@mA9mqyu) zy$UF>iy=s_ILpLP9js)biNW6%pp*{9d?A2U635AU8pwa&MOFg~ATkn8AMrc>{`n3W~UDC~xwUa)fbBffoK&gjq zQ}EPFjN5WVG6E)&P}*cpWF#@{LKrH9`~9KhH?sE32ZGP>-)Ks+s}!+?ssuUm`J0khC&3Qt98K{S-&Xm2<@Zix-Z?Y8v74Qm3#CkMjF$?M;oP|Hj5FvV0rxedB4b{}dRX3CQ-MJg%pv*98}H~$;w9Mq9P@@V{AUI| z$=t8#pZ&EvxsF@DErRuf=b6LSxNC!OSRup-kQ ztdcGu>Hpz`*+(LdU_O2Bb{op~55?D~QWY3u@31M$O~#9Wlf zszYpfu&RTmXP|>@gfb4#jc~&Uh;X6E-32TxFdLN zB&-+1?Zf$AAF4G0H8!J^nwV3!N-lT;%->9Y5a0fXWm8VrT!%=T(jkIaOk7S;Q0haq zPTR09IE!a)r71pP$im1Z^`TK|w!PY7B;98qjyZ z;waFLB*{ApUT{zg18q))UICo-wyg94Jd%_vV6_D;NbZgUqxv(zSb7WH8XbS|#z9`% zq5rcSdqpu+SB{7FG0h(kng-+t5$7|U^$KX6rT%J`=GaacV#7d#ri|?LKyCD!V27z z$_0VMvUepgE&@Vxpm#sooM`0HnXzgRx=@2RsUdD5Sjj#{iKWS77680wFNbWc zA+)E|utw%TD3N3G#1DTgOb-4;UXXxK18F56oN1YKvL%`X+O>FXJ$%!q0bxF687 zZY}WB=@h3f>-qu0M*=cqurRZC;g@|Gv^yN-)e9gep_eaInf9uskTpZTTCvC}OCY7t zW<575?l)8!A!36S?6!c;-hs61%O4voKp$Kb#mmQtvz?UmK@Dp`qBcP!=oOaF_{}E* zZe~tj8wz$WbG1ov=3(gnEOYk8@AV#xC{z>1awZVSV~qUCQ&;MH2a-!iiF5}UeW?Ba z@DBVhSa=24l?jH+-$7Fkc=f%z2QZSE6~PiIZiT$xKvNihYhX?#0Btz3>d6ARGP24I z2$3LsJY{wL8R55wWoSIYCJFXb)K%ClLSiq_TOT-?PJ{VQ8GnG+`rsMFsKcqtbiR7| z;sD4or~*Oa*5}5u5aZiDquP)CrVoQLgE%t;s}hM<4GFOb=z0o;!Ii z?e%OkLJ$_gh3`b^9dH znegW^M>ztF0s7`<1iGU3DVXI819JI_9KJG6M<~@p!71zzicRS`$yp})P7`2Ra(@gm z7fE9Ual8a;qq@>8z-}oGZU%Vtvn26i7{pHqorK1^GE-49pDw{Jgfa(}&xGN&{GBGJ zya=8LxOaAA#)Gi+5XXoiLw!EMXMHZ1J}&68EO0`0%g8?qudChZtp-|THPG)!M12pJ z|4Z~^eQVB6%WGu79L#i21Rb-*7K2}_>0FNc|u9U-2MArvk z4|qsneJW;iEA0Lx_V-%CZIN9IGv)|%fr~R?c45G9blQ#g9Y|<6=6{lXC*#Ul`1MZ{ zaWyG2eQad`x`#GQ-s^QUTVSQh+g7qZMzop9ssPbu0n88vC?%EM=v6uKu0{rfsyrb*mEPa5jJD084ufSosKVR2xgS2go%qx*f~%W%lt#xmNmVK&Xi3t_hcGJRO9K7aZhNc^PMlcj(aWqZt=x@R=yUMPHt z%<#j>-@^bmqA^V|^3mtpRAS5=jacU~WMBV}!=|Q}+3FRW&9>adNvkozeDoyfU(w^J8f!jO4ed$J^?eUOM;ymKQ z1rawew9S57kE1ON5J!gy92gnR7M~H9DAdhGt^(`b)JNq=b>LKxd z92b-)Bt4I{nQi)^`d<`D7M@y-Q&(Uu(VG$fVg`NdU?&Ewr@k(Ma|J@tr?TDx|I--C zVp(K%>~M_jZW2`kbizjjI1=o7imtOhb9X9Z4YYygK7<@CQ~YF<9a$BVC~F#v5gmwq z52Dv;MbDfN+TU#OQEKzpeLLd$LOoVR8r4{UzQR5;;XB1F(bFM)OlT`}-Wsy&Dfw>a zg*@JZ=sxJE&*tR`Z>%pe?23c5=ei8TzkhtBl3rH01+Uj90_GsIRqm#+(j=`RPN`RC z-eD22itAJ@Ft95)Rr-|0#2Qvwq57!a>J0rB#82wrtz?~nUS3{SxB-7*1AtDz^ZrOH zS6=)i9}Fq2a|r5Mi||`B{0k=0L#ITl?Tp;A#)7B9$P`|>1}=Ja=~X7U%SJP8Sb9t& z&4GUU!0b|JSD%xmpPv$k`I@!308|vhL;SXZa2FcyQKoxghwgcvwSf{nhL2QbdOf*1 zn}PIsQa||a0YsU2E5mw5Z}m8h$LXiX=*RukB)k#W+dov`D~xV7V$vImFELP4?4=Ur zQBKaPmxr5kr*BhCWWvfeh=r^4kHKXGDjg3gbws=n&?F#yZ{&`=^)a5SSooad^}9gR zmTfMXqDzy$D_B)#(*MBB4J}Z--oLA-n8!07-A^*u;g_}1Q2|ybE6Hk}9B|RkIeP#= zxdCjjr1zHNuCO;*Pc~ojmO*-P-zcP$69|6^hSJ)MK{xa`AD85rjb1PwPkvhocsX%(WN)5W3;*fypI{S( zHz=Ga2GS#|Mqu$u-@y4FK82+)(diZTU*Td0k?HzQZ`WT=?8RKE_noLiFA(HW1wcFl z?eaMT*2J>QngGj^U;^CeBQ-8EZ!Q~Y?TeA}iB)E6? z?0br>s4J~X&xevy7?AbnhMyM3C`|2b@$MYtR4{zAZeWUnU+5PfdVGrhm9 zEAeVF)tSB*r8f|%Y-SnV3n}FR;}hialnR+na@QoI4NC8c28#2mMDlK}pULr%t$BL5 zGg0f~(JMj63nz+eRLXgkJ8*VXR@kGTn&_X;=9ves*GM*$QYi|P&yafp(e?BLld)3X zol?q&EK;k`hV5Fh2JYa>f!s69=)M=5F2sa$0OB^Jlb)C#&>QutXZ-+}!$>xUUfQ3H zjUX{qIH)zoavJfA$u!zV$mt06Q(S)7=u)#PfAtwfBQPj^n$2uGau`k|oZB`hFcXIG z0x5?OR7V=aTsRzxCqyEwKx$k+52B7c5k;5?EQNh_B4&Mti{1{gnQ-P~y2j|zr0}t< zvZnN!v+iTjL9xW+GPlV$7udW9gK2>OlOpHtb!J}9&qwHVi4c+>&}vY$+~8sL*BF=DC1(t@y7YE>KhY38={M95lVBeNJ_JBU6X$I=Ug=7M+G7vab7^0ZR9s!@ z;{XYI^l*c4^pTZ|fc-8qD@!ru!kbb_>QBBW2oh+ULL>b%U*-{VGIJO z&fl+8*->h=iL^5(@wE(a$9M7&>s3HKDowbV$d&_-YZM0OsI9?}Ps}kfcoAq0P_9SO z-el&UK#jbhV*WFOJR;u1#}f(bnbn~{#>4qAhffs$I~EQN;Y%N)6i5fs2Nn)Odshjj zF1FARz0?KLzMjrR)fr}vf>Jl+{6}gVuql0DepTt>1K(eGZ85*?EzKQ(MjwH_obuAk zY`Zb-GhNZ`mH_>)nxR8cwPh$c@X=y%vbU1@L5+#-I_pEg%SX8EAW-TDNiT%?+doM*~RTih)> zf=_+dA%mNvhh8T5n1OFlr@f)^Khu_lo%FG#*+^##%-$@z<)3L!Z7bNr)U(&CA{5?bE>*L=lNC$Hg1zv;TcQwM|Ooa`| zmZOt&U<&{`32ujen3g_y;UF)R)UNLfUv=2_6R!83B*NI{j#P2PHa$2TDQ`TOXDffRQiXS* zc0Pl(#Kifm0u$^@@MQgLtj0(p2Gh|GhS4)3GvVo+6m(+L?9e_03z(`;F3HT4#Ubc~ z#HJo-p}7Z4JeKia(9k9$hD?;?7zuFV_R(V(t54pWH69MfcQ zysWXYLX+pQ|J=+vgN4Uz2IS!v1{$uK{ZLCOrWd1B#lVV_!xDO+KJ8ntzo|lDuArvc z(zz~ScFmAoHUQ)qXw^u%4M-$&AE6%^#DVELR*cWVZ#lzVVhPZhA*MpzRsi`$tz4jS zO@hEs7Lg0+FcIG55?~KU^^j#4*u2(DxsBOLQywGfm~xE3viAkxZ>93}(=R*gk;TrG z_2W9J=7jq6@fiEaAU9j(q#8_PtR<0_ILKq59OMN6??KOFvpIWJNq8$sg|cr)%6$+4mY}>Z(=BS+vHNO} z(WR#86b#)cnuu<&TYV{FN5mJIb+swDG`UMe^RwCe1!%?qWPdc62WmdB2>47kM<_78 zg-7pEoec(M5YI$iD6rY*IlPx`9IPI}Hbimmk!xe$Y;N52QjM?XcJl7qenjPV^}2eZ{nGaB_F zl=|$UMqoaim9xI%zZJX>P*8fjSCOSr7rxWGOdf%2G}?~!MiF({Wv~e=#8bGMFG?7sp+OvTs2&_i#d^TESSa+NPEZ~BI2ET}D@GKb z4H=OS470>tTX95^4Ox#iWe6SB^$sRIS#}3its=mcZYh#1rB0qhuMr<9Eex0xA1cq5 zf6D}CDd?9v!U^VhXiMM7k54?u>zCj+OW`;t0@F{NjHIl0FmhL<(UQLl^l|KZ0&y^P z*VUZA<}{eMZ25yIN8;hHkkc4O%RuIHDbPDir5{oLlaKu{{QC#Fo@SqW4(MTkOm?6G z%Cp^nW^e`}b!M7LOsD5t^t_8+Ftij`yQ)_N_9B**%rMu$@2jEnebmPTgcgl-^es@m z(y1ljzeew$39uq|b(p6$ zUi|QjTzjJEa7tt>X&94CvkuoG>QVY!|I+f#S#nr0*KLYzqysAwJtf;5j?WS92w>L_ zS&5x(pQJ?TR0iWIr?aL|b zag=o;`u>4)2f_9d%0JE)RYeP}== z)FvBPR}~}fHh61eMmoS$nIznb7ak+8<`_&FxYc_C^l`7L4@0wK;JZYqpW2*_Dl3fX z7M1ok?A8h*^kdi-@=_W4zzWtL5yZp?Bf;t|l0Gio%}G2(cn=WeQ^>FDBdz(g8(p9{4Bz(|g@RNiaK;bOi=(XwlCv4S|VLSX2*l{(|MO4T)~o zyZuJ65^G0DV_}E4ZlQiPl~|AF&{%Gn2|>ORx|UtBL5!p&){>O+k2YnzrCBBF9GHF5Y#Np!=K0p;`P9X8MeDuW;rU2*>@}9v; zC=93IGXbfj%Y>-yQ7_Q{?Jd2`37o+}gq|_&>Wr2e0ib>o{1~#`hCs5qfPub^6Jkc- zC@JGeRu8bET})RDb?*cpV{B>iH(gG!YRt>8j!nPEEue)0sCuY!K^^!PAb?}IRns6Z8 z2es>M2yol!ryG2k{ zYtU&wBGn_NlcXI-T5WNR!_rM}1t|-8uThC!9C==PoAbwV&XqbE2P%34>1qc04vyTW zMIp38snINE)>31sCq`Q#j6Wnlin5Pm+9iau*~t`MnglLo^@RWbT(Z$;-ClZ_}+3ZqQDO+hP=_sC>Nc#$6e<)lJc9>EvYJpp%hl8Sw zQzoS`O(F4VtXDR`&2E4k2gv@oi@xW*lDRUG*55!Jt#2ar#ODT5XLazJk;KF^5`i*; zTCKuPtIcfmt;FlQR&xF?;RtCAc0lv{6|LXbKF0o=E(%C4_k|pKIZ&Am&5uP z_u9m-=c`@=Nf{C>E`6-g$r%hMiW;uY=gJuV{o|Liy5J&lgrb*uJw?K5yGC`TNuQo4 z8P8Hv?;C%M)r@ASvNYkj)_6%nDC16W{=I`6%$Jwkh-d@+6PSx~JB*L$l@iC$?h=G` zm1d*&*;JyCcN=7#3!~j3ze@6&oJ0FN#MqB`*_~$mgiU%A z|73`6meQQ{<5{a=OY2baQ)VuNp3N396B%_ePX@4}7&2QUr6L57g!V&$TR$Fc04t5% zFs~mNr=NcM9TV8XP7TaZV%=RA*lNfS8*j$8(P6(UvvKSZO3@N`XRbm2&k8rwY^OBWg&M0Bi)-))u*I{kv(wI2ZHN|ffvBy zdlRxgyQI*6r*8^_UPrPg=?80U;VoWPd*Qz)82YGQJ=Bg4KL`;`MTd8Q`<8wRWd)LG zjwJK((leH2Yh|+yW&Z+Nt{Y%`hQZ61rNbx4pAC4q^db@cjOd(b;1KK`AbtG+f`>?d zI2BR|)Dpm+N6+cB8Gyehtmx;C?4>2N1ur$1wsOkNoI4&UU<0#z5ucuhdxP{I!tx9h z*OH}fMz&qfLHd1EF^O8JV-1b55So*!GBeQQdRKFt_&XzkB^buvsPiBBs;kH^@=+g6 z+>zAuJgHun5Q{SWA!3gd;iI|D$;-f2TYz65HGCDr8lJKed4=-gP~&J{CrWP~N*!jR z?-mu3o1RpL^z_qA^)7w=c=Z2VebWH&7JwGfXU*!RBkSPqDk$u6ra)#(etTNiJQ?VT zdaeSwe(Z-nBzz8JoPvfxRN2G}6Wqm%A=Hz8AlY}RW`S@&6SUqTGzx(ANqybGEE7My zgYK{FKZtZjStkjSQhO#wFQN ziVliGNktST2_IXs6`}T9NraL^Nl~#0<&cyZsl)lz~;JTpx!oy>Pq?lxO! z@Gg4%PdcRpzV+hPZ_zLI-gjcp`=!hWOC&2bc#b6Whm6<(7*o>bD(Sc?QPuxm)LANx zweT#dWvm#Z>tCE)`GGS;5!U0lNiVkko@5IovpRG-hbMjlq>KD~LK!(|2U%ZnX@e|b zAsz!yVp^@-+Hu$>e5}3HHi!%VD!N4L#IIctclM(VwGOZ5R;B-)?C@fmmg9FCTHc#( z&B%Q{!DZWH9OKx*60sX%Z~AlDe5(9Q#{LIGu0-oT#A_$oMbq$lY3WgZk#YV#4sg`R zfflY>V}%*j6l!yeC~ndWb=@~a5#fPFG>?-s?GPXyjPCT6mT5>PevMMAqbYo{EAGOX ziMSti5LAFEms(Zekt@?T6>Ky4E%n8btwChpY4+~oW;AXD{=nL8()uW38OJz6wb#is z9@!djE^Clt6T$3i9^MBW?<3egf$U7&@#^6zE7`9Eo#^njP@tHd?b`0->%!?S^LO1| z?#RUM7dXr`N)zGwGvR`)C{T2@D~Mk+xWx`pT6XGzoJlWcHbsisw=U=q!Z02)9ZQGs?W(HhoTw771fa?#o3;jmMn1t z+E8?Slz?&IyJvX=z6SAP6QSf!MREM+qnW)>GJ3S zHIg)ch>ie#(QzA5ZJ0FBBNh46h-fH3km#==fL+7+76r{X=lu*(Gj+-pC`ZME>yrpS zf#2PYdE+XJy}MkZx9xH>FM;)T=%4O8`*Cvuvt6GyW!wUuDiF3Xt@p%bCA2v0{4FaK z8Z`C*yh*lwRsAA%8C=2xrV04b@99yT>|A0Z;qxFtdXVXRRGlY;{~dz&vtv{$T|tAX z(2SGq6Vgv{v)w<(I_xYOM)${|nFwBnMpHq1x#eqT{J95PTN5Q7QpAJf3rV{XSUpnv z5(w3_FI-Z## znlG{R7@sc7@r@S*u_yvKffsyHF3reuTvLxzTd}gTs2LBd|LR*!Ask10=0S40h?h|2 z#a!O78!ayNL+n1gN@S|bN3Z2fkAVJjGA;D`t9@-ae4}h%lQh0E6*KN0J_b@_ziD8# zx{7DM%1aKzo2Y^q%(b*Q_r(@VKGBsti zCG>j4T*-34qN4=AXovVv(c_aRqFP56Ux~g;#nP1uUu}FGY0^zXOEWMXXSTvv4?e~u z^{s3lPu-$J)Aa^@i+DC3vGa*Vd>ZEe<52X&w4*|08EtrUO5X0WRcTUIda*KLZ(^}O zgF0S6?-E{KvNXCCPgWi6qgK_~=;U~f9$k{Vns6I{qlKPZiKueE%#YJ#qu3=lhnLg> zZ(`13?a0$#Ug|E;)jta0dVrBQwupAFCYnX_sd!`^jV{^}Do&a-=LNS2Cw;hS$uNGHia1h&N6`YY3n*X=2=R4$DOF6Io;x4*z7b z3k9)BCOVani-ffo%8M6Ww1#e(#eL5j#_CG;1ti!& zq?&1P7L&in$J$CGF!!t3A{#Q}w=uaMMOmV>iLq~<@W{lAVD?hYAj^pn`(#s_v&Q2dz^@Xm)a_Z|! zh{rwb@5XSjh%;P5p39cEqybed@8d@4wHUQ+dhrM|$8pDow2$4mYsoV>S8P8owLOA; zq96H5q>5K0XNykD%>AZo8)h+wB}ueT?t|My8KIF-vPjaKA-r6GI{l$E(YIC`A-cWB z`m>45^9bFyrWH{b@oDzj4xQe(TTi@f#NX>)**Z)`FF;iVdwJG7(fQx9R3I zE>_I(a^!JXOe1Scc>G=fb1?P}hHZsS@d&9si%bT`Q@n37y2om&Mr<&TyY$Q1eKc=t znZB<|mAeS@5zBTXPz@?agTxEuifB&SGj%QF7pHM+{T?a2#+w=-BMEyt)zh z!OBw`leXd`vGF$Qk6zB4r#x;m zy^ss9Humgd_{{gC0M?j$+q!xqpf^x-b%}7L=D#Vtd;{&Hc*Co_@JSlChv&KMu`Ug$ zMxC`qS-T+^&tczAVq=t<+z`(bwzAE9+P?#l_L5XDQKAMoZvus9FL%4;dB$4Aduf+^ zOVkzCAN>%!22*@$oVKD;XBeI=s@^WDjd z^vYPp)C72(5o&A&^c6c5^7D-@iQP}vn)m>s#S^7#$k?41oRv+ID+%2_b*)@tC_ye> zv#iB6ryr4Ei-CF}T=dvlOXiK}+njlxFj2I4xj|I9L!SA&Ne5Uo-;)XCDjM{pY`m2^ z9=Qv7#S>NNSBIgOi(hL5s*_Q;Q3;Uo_U~K%6nk}^0qG%R+Rg&SG%FR!nus=;ORY~g zmo?o$|HiA_TKJ?J6=81V0AuAYXGUnWneBU<^HV>cNuy|KA16U#G2V~Kngeu*z;G6+ zww0;qiXm)pGtx#a-q>S%9_TkpMz5y6S?0ZsQ7(YR3?axV3HBbuR5K*l+37#k*fB~T z3}@RplJr;pY;N}TX=p|$ZG+BH{LcB6UE;;HRs^*P^oyzDjo2Uax!!g^euPau81@$u zKPihn%$B`NELF4^jT@$zG9IyiY{@wq2cop+0b@p?j0wKb5krWq3q3)8q_B+HqrHK5xt%}YdE!zWGy?C%D0 zcO}-0vwdN~=a^}7c4}QQ-;#PcyDu~6Dr>m)(PbfatKGrgP3St78rN~A$5YR;lw1Iv z16HQ>Ab+B7bhRnbS!>ZD?l2Cx_-?NMFf6{nwO7)WIV_~eA}8IPSJfnk;z0dYrn-$2 zePE3?R;Pz?{nYmxzePHgak7vbHBHy;nK9>^=qU)oD;Ug4XcM=$jU`;Nm=?%>sFR z)3WLas0t04@SU6HX2WbEh`#ja0(9>${!YTD2IBQrMtxdFcOat}K9coGR~*X><9LAn zAqRwkE+vwc>V|O?F}5`xvUq7r#Ha{&8L?-i1G&*~d<});$jNunjk+V8=P}gtN4l!M zwZa~#y(!d3ZGQFgtGM**G^$LhTZS<8(w}m`Jc?aMrX5EfgI3Wp{MUGE!UFBmPe-I> zx$M8%%->0qgQ?jN2LI)!=+`~T=NHC#``0Xb&WIiM(cG-W=-&62a~rTvJh;*Ir{|k& zJg0c9dOn}}V>&CB2m_3HE8w?EhxPe>+$|h_XUbOhn(X{aX8Q%t21|?gi5zDOg*$jj zH`aN@_#g4JC_o!;bD#0~`y$jY*=ckpb{lEbktE~O+$zwUezc|NnLfFJOZLXW#d%0l z^Y9^wastp({NraJj{|FzpnXr=D%P)5=d0(w;vlOJ~N*wPhL)T)Dm(z?~zlbRDAX*elRw{gP*fGi&{J?neLTYdtPzD5} zeDD}^#e3B$l!;?TZ!^i6NR$M@sEhgobvJR&hXF9Ayh&q!cUL%Vt7sAZNEARw45jRc zA-b_gU&!kn*(i#qO^u$=(f;<;3eY}@hg>e$tz+Og|2xe%_X~R682fEbJg+EY{oAK^ zGSFukck<0~C!C8 zd<$xFy?%~tM&X}5+*`Hef=UE$k`_fN!;8p#vX7UWcc%aEci97||3nU~>rym9bOplu6+V!J;A0mmiCH``qx!Kq)4O}G3e81HP96Ch^YmOyw3m;<`*MU&%U?c zcH7_?wZ)Q405t&^Z<%Q>`R}v<8p=aEgZ^3W_d5SSq399b_thwK51mKR{CW9s$^QY9 CV8f#T literal 44953 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 From 7474fa2c34ce1fdcba267f4d0d2355974880f8f8 Mon Sep 17 00:00:00 2001 From: driemworks Date: Sat, 28 Sep 2024 16:24:21 -0500 Subject: [PATCH 20/20] chore: cleanup --- Cargo.toml | 2 +- cli/src/main.rs | 2 -- core/Cargo.toml | 4 ---- core/src/murmur.rs | 2 +- 4 files changed, 2 insertions(+), 8 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 5f99326..d39f329 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -10,7 +10,7 @@ resolver = "2" [workspace.package] edition = "2021" authors = ["Ideal Labs "] -repository = "https://github.com/ideal-lab5/etf" +repository = "https://github.com/ideal-lab5/murmur" homepage = "https://idealabs.network" license = "Apache-2.0" diff --git a/cli/src/main.rs b/cli/src/main.rs index 19dd7b6..d5ba891 100644 --- a/cli/src/main.rs +++ b/cli/src/main.rs @@ -103,7 +103,6 @@ async fn main() -> Result<(), Box> { ); // 3. add to storage write_mmr_store(mmr_store.clone(), MMR_STORE_FILEPATH); - // TODO: make the origin configurable // sign and send the call let from = dev::alice(); let _events = client @@ -115,7 +114,6 @@ async fn main() -> Result<(), Box> { Commands::Execute(args) => { // build balance transfer let bob = dev::alice().public_key(); - // get the value argument let v: u128 = args .amount .split_whitespace() diff --git a/core/Cargo.toml b/core/Cargo.toml index 87ba0b7..6dc1acd 100644 --- a/core/Cargo.toml +++ b/core/Cargo.toml @@ -5,10 +5,6 @@ edition = "2021" authors.workspace = true license.workspace = true -[lib] -name = "murmur" -path = "src/lib.rs" - [lints] workspace = true diff --git a/core/src/murmur.rs b/core/src/murmur.rs index b0245f0..c9bc035 100644 --- a/core/src/murmur.rs +++ b/core/src/murmur.rs @@ -96,7 +96,7 @@ impl MurmurStore { otp_code.as_bytes(), ); let leaf = Leaf(ct_bytes.clone()); - let _pos = mmr.push(leaf).expect("todo");//.map_err(|e| { + let _pos = mmr.push(leaf).expect("todo"); metadata.insert(*i, ct_bytes); }

YA5rD)teyxyfYHk?@4wTY&!v+LLyUd%QLrPiSw0 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�(4B5kOm8>@6{c}*S|gyN?g3dCwUGq5KJ zstsv%Enjz~Qw{R5l5>#**V2@x@eFe@dA_Rx6`ZSMQNgGK3|7Nqn)eC-cx?J6H=g15 z6-a26HI!Q3kIGTQeQ<53i{b)SL*;NuY*jZP^{)=+xq9|y>Qy&wsVv|8g(?nAgR2V7 z&R`x+FV3)bC2qivk}&&__~)u=d^~F3R7v{WO!Zc$N8*P3UYHM;6$au-?7p(ahfTEI z0r@AvxT7!MZIE(tt^rBRDxPD^a(%^2-*PJmwaKjAMA>$6&8+lg9;90P=4o1J#@$hz zVIzfjgE1SbdwZCd%^XtZAhQ2~V`9lntlC*!Tk?NQ+>H^mv3f8D#8KxwXb}Y(lEdN=IyX*`$0YDqB*B>MvflaIW#X`NM>_AR(o(m!BG7I=T(baA7U2EyEu9$)_O`*;pacd*HD-=2Z=)H6lj*dS)g!)rd#ld zd5gHR*;wi}l=~IZex}tH*k6)*)=mAhVO+$gvx)j>sBGlFWBBt5avk>qVjj&Yy0x4e zI~=MjY4`LfoUzX5|J3?+-QDB6W!9AoW1;T8uj@Y=XzWD4s1lJRfp=-vd)}D{lOiC_ z#OxxWXpCJ*rzhXMo0kp zBCtEH8w$*kX=?1(w>EuTIVatDxckW!Vy(H!@AJ6m1d#7z*{3zC!|IE4O?FMt^m3ly zmT+TAL1Xq@!Jd5lnx{WEb95sju#|h2AkWusul Date: Wed, 25 Sep 2024 09:51:09 -0500 Subject: [PATCH 10/20] feat: remove test cfg flag --- cli/src/main.rs | 44 ------------------------------------------- test-utils/src/lib.rs | 7 +------ 2 files changed, 1 insertion(+), 50 deletions(-) diff --git a/cli/src/main.rs b/cli/src/main.rs index 4e842a9..0aa62ad 100644 --- a/cli/src/main.rs +++ b/cli/src/main.rs @@ -52,15 +52,6 @@ use rand_chacha::{ use std::io; -// use ratatui::{ -// crossterm::event::{self, KeyCode, KeyEventKind}, -// style::Stylize, -// widgets::Paragraph, -// DefaultTerminal, -// }; - -// use node_template_runtime::{self, MurmurCall, RuntimeCall, BalancesCall}; - use subxt::ext::codec::Encode; use beefy::{known_payloads, Payload, Commitment, VersionedFinalityProof}; use sp_core::{Bytes, Decode}; @@ -87,9 +78,6 @@ use rand_core::OsRng; use w3f_bls::{EngineBLS, TinyBLS377, SerializableToBytes, DoublePublicKey}; -// use sp_keyring::AccountKeyring; -// use frame_support::{BoundedVec, traits::ConstU32}; - use std::time::Instant; /// Command line @@ -453,35 +441,3 @@ fn write_mmr_store(mmr_store: MurmurStore) { mod tests { // pub fn test_can_read_write_mmr_store() { } } - - - - - -// // use sha3::Digest; - -// fn main() -> Result<(), Box> { -// // let mut terminal = ratatui::init(); -// // terminal.clear()?; -// // let app_result = run(terminal); -// // ratatui::restore(); -// // app_result -// Ok(()) -// } - -// // fn run(mut terminal: DefaultTerminal) -> io::Result<()> { -// // loop { -// // terminal.draw(|frame| { -// // let greeting = Paragraph::new("Hello Ratatui! (press 'q' to quit)") -// // .white() -// // .on_blue(); -// // frame.render_widget(greeting, frame.area()); -// // })?; - -// // if let event::Event::Key(key) = event::read()? { -// // if key.kind == KeyEventKind::Press && key.code == KeyCode::Char('q') { -// // return Ok(()); -// // } -// // } -// // } -// // } diff --git a/test-utils/src/lib.rs b/test-utils/src/lib.rs index 56ef3ff..a2a95b4 100644 --- a/test-utils/src/lib.rs +++ b/test-utils/src/lib.rs @@ -13,16 +13,11 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -#![no_std] - + //! various utilities helpful for testing extern crate alloc; -// mod murmur_core; - -#[cfg(test)] pub use murmur_core::otp::BOTPGenerator; -#[cfg(test)] pub use murmur_core::murmur::MurmurStore; From 82af57610f4f080c7ac2ea38125952fb255bc332 Mon Sep 17 00:00:00 2001 From: driemworks Date: Wed, 25 Sep 2024 11:20:29 -0500 Subject: [PATCH 11/20] feat: test utils --- core/src/murmur.rs | 2 +- test-utils/Cargo.toml | 11 ++--------- test-utils/src/lib.rs | 3 ++- 3 files changed, 5 insertions(+), 11 deletions(-) diff --git a/core/src/murmur.rs b/core/src/murmur.rs index 208b3b2..0aba20d 100644 --- a/core/src/murmur.rs +++ b/core/src/murmur.rs @@ -112,7 +112,7 @@ impl MurmurStore { /// build the parameters needed to use a murmur wallet /// note: this rebuilds the entire mmr /// we can look into ways to optimize this in the future - /// the main issue is that he MemStore is not serializable +/// the main issue is that he MemStore is not serializable /// a possible fix is to externalize mmr logic /// /// TODO: this should probably be a result, not option diff --git a/test-utils/Cargo.toml b/test-utils/Cargo.toml index 1a350c2..6a4a03b 100644 --- a/test-utils/Cargo.toml +++ b/test-utils/Cargo.toml @@ -31,9 +31,7 @@ ark-serialize = { version = "0.4.0", default-features = false } w3f-bls = { version = "0.1.3", default-features = false } hex = { version = "0.4.3", default-features = false } array-bytes = { version = "6.1", default-features = false } -murmur-core = { path = "../core", default-features = false, features = []} -# add zeroize -# 1.8.1 +murmur-core = { package = "murmur-core", path = "../core/", features = ["client"] } [features] default = ["std"] @@ -51,9 +49,4 @@ std = [ "hex/std", "murmur-core/std", ] -no_std = [] -client = [ - "totp-rs", - "getrandom", - "rand_core", -] \ No newline at end of file +no_std = [] \ No newline at end of file diff --git a/test-utils/src/lib.rs b/test-utils/src/lib.rs index a2a95b4..c29fd14 100644 --- a/test-utils/src/lib.rs +++ b/test-utils/src/lib.rs @@ -13,7 +13,8 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - +#![no_std] + //! various utilities helpful for testing extern crate alloc; From d4fe411912ef5e8412a7aa55081d96d562ac3f11 Mon Sep 17 00:00:00 2001 From: driemworks Date: Wed, 25 Sep 2024 12:43:20 -0500 Subject: [PATCH 12/20] chore: address clippy, address review feedback --- Cargo.lock | 23 ++++++++++++++++ Cargo.toml | 5 ++-- README.md | 9 +------ cli/Cargo.toml | 11 ++------ cli/README.md | 21 +++++++++------ cli/src/main.rs | 61 ++++++++----------------------------------- core/Cargo.toml | 3 +-- core/src/lib.rs | 2 +- core/src/murmur.rs | 31 +++++++++++----------- core/src/otp.rs | 14 +++++++--- core/src/types.rs | 9 ++++--- test | 1 - test-utils/Cargo.toml | 1 + test-utils/README.md | 4 ++- 14 files changed, 89 insertions(+), 106 deletions(-) delete mode 100644 test diff --git a/Cargo.lock b/Cargo.lock index 0dfd239..0ca43cc 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2644,6 +2644,28 @@ dependencies = [ "w3f-bls", ] +[[package]] +name = "murmur-test-utils" +version = "0.1.0" +dependencies = [ + "ark-bls12-377", + "ark-ff", + "ark-serialize", + "ark-std", + "array-bytes", + "ckb-merkle-mountain-range", + "etf-crypto-primitives 0.2.4 (git+https://github.com/ideal-lab5/etf-sdk/?branch=tony/dev)", + "getrandom", + "hex", + "murmur-core", + "parity-scale-codec", + "rand_core", + "serde", + "sha3", + "totp-rs", + "w3f-bls", +] + [[package]] name = "no-std-net" version = "0.6.0" @@ -4178,6 +4200,7 @@ dependencies = [ [[package]] name = "sp-consensus-beefy-etf" version = "13.0.0" +source = "git+https://github.com/ideal-lab5/etf.git?branch=murmur#47eff7c36775c43674cbbadb25a8daef7c182d49" dependencies = [ "ark-serialize", "ark-std", diff --git a/Cargo.toml b/Cargo.toml index 72df582..5740d3c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,8 +1,8 @@ [workspace] members = [ - # "core/", + "core/", "cli/", - # "test-utils/", + "test-utils/", ] resolver = "2" @@ -11,6 +11,7 @@ edition = "2021" authors = ["Ideal Labs "] repository = "https://github.com/ideal-lab5/etf" homepage = "https://idealabs.network" +license = "Apache-2.0" [workspace.lints.rust] suspicious_double_ref_op = { level = "allow", priority = 2 } diff --git a/README.md b/README.md index 12f7987..86f8a07 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # Murmur -Murmur is an air-gapped keyless crypto wallet protocol that runs on the Ideal Network. It is based on the [Hours of Horus](https://eprint.iacr.org/2021/715) protocol, where it enables keyless crypto wallets that require knowledge of future OTP codes rather than signatures in order to execute calls. +Murmur is an air-gapped keyless crypto wallet protocol that runs on the Ideal Network. It is based on the [Hours of Horus](https://eprint.iacr.org/2021/715) protocol, where it enables keyless crypto wallets that require knowledge of future OTP codes rather than signatures in order to execute calls. This repository contains the core implementation of the murmur protocol and a CLI to allow fully non-custodial usage of murmur wallets on the Ideal Network. ## Setup @@ -13,10 +13,3 @@ cargo build ``` cargo test ``` - -## TODOs - -- [ ] create and add latex doc -- [ ] add zeroize for safety -- [ ] look into using ratatui -- [ ] performance and storage optimizations \ No newline at end of file diff --git a/cli/Cargo.toml b/cli/Cargo.toml index e3c85d6..3e439ba 100644 --- a/cli/Cargo.toml +++ b/cli/Cargo.toml @@ -3,8 +3,7 @@ name = "murmur-cli" version = "0.1.0" edition = "2021" authors.workspace = true - -# # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html +license.workspace = true [dependencies] subxt = "0.35.2" @@ -18,18 +17,12 @@ ckb-merkle-mountain-range = "0.5.2" sha3 = "0.10.8" serde_cbor = "0.11.2" serde_json = "1.0.108" -# sp-keyring = { git = "https://github.com/ideal-lab5/polkadot-sdk.git", branch = "testing" } -# frame-support = { git = "https://github.com/ideal-lab5/polkadot-sdk.git", branch = "testing" } -# node-template-runtime = { git = "https://github.com/ideal-lab5/etf.git", branch = "tony/dev" } codec = { package = "parity-scale-codec", version = "3.6.12", features = [ "derive", ] } serde = { version = "1.0.188", features = ["alloc", "derive"] } sp-core = { git = "https://github.com/ideal-lab5/polkadot-sdk.git", branch = "testing", features = ["bls-experimental"] } -# sp-runtime = { git = "https://github.com/ideal-lab5/polkadot-sdk.git", branch = "testing" } -# beefy = { package = "sp-consensus-beefy-etf", git = "https://github.com/ideal-lab5/etf.git", branch = "tony/dev", features = ["bls-experimental"] } -beefy = { package = "sp-consensus-beefy-etf", path = "../../etf/primitives/consensus/beefy-etf/", features = ["bls-experimental"] } -# sp-application-crypto = { git = "https://github.com/ideal-lab5/polkadot-sdk.git", branch = "testing", features = ["bls-experimental"] } +beefy = { package = "sp-consensus-beefy-etf", git = "https://github.com/ideal-lab5/etf.git", branch = "murmur", features = ["bls-experimental"] } ark-bls12-377 = "0.4.0" ark-std = "0.4.0" diff --git a/cli/README.md b/cli/README.md index 7bb97dd..c2e4e3d 100644 --- a/cli/README.md +++ b/cli/README.md @@ -2,13 +2,13 @@ An implementation of the Murmur protocol as a CLI. -It allows for the creation and exeuction of ephemeral 'murmur' wallets for use on the Ideal Network. +It allows for the creation and exeuction of ephemeral 'murmur' wallets on the Ideal Network. ## Setup To setup a dev environment: -- run an IDN node -- +- run a local [IDN solochain node](https://github.com/ideal-lab5/etf) +- [generate metadata](#generating-metadata-for-the-chain) ### Build @@ -16,13 +16,18 @@ To setup a dev environment: ### Usage +##### Create a wallet + ``` shell # generate a wallet valid for the next 1000 blocks -./target/debug/murmur-cli new --name test --seed my_secret_key --valid-for 1000 +./target/debug/murmur-cli new --name test --seed my_secret_key --validity 1000 +``` + +##### Execute a balance transfer + +``` shell # send a balance transfer now ./target/debug/murmur-cli execute --name test --seed my_secret_key --amount 100 -# schedule a balance transfer -./target/debug/murmur-cli schedule-execute --name test --seed my_secret_key --when 100 --amount 100 ``` ## Test @@ -37,9 +42,9 @@ git clone git@github.com:ideal-lab5/etf.git cd etf cargo +stable build # run a local node -./target/debug/node --tmp --dev --alice --unsafe-rpc-external --rpc-cors all +./target/debug/node --dev # use subxt to prepare metadata -cd /path/to/otp-wallet/ +cd /path/to/murmur/ mkdir artifacts cargo install subxt-cli # Download and save all of the metadata: diff --git a/cli/src/main.rs b/cli/src/main.rs index 0aa62ad..710b3c1 100644 --- a/cli/src/main.rs +++ b/cli/src/main.rs @@ -18,7 +18,7 @@ use subxt::{ client::OnlineClient, config::SubstrateConfig, - backend::rpc::{RpcClient, RpcParams}, + backend::rpc::RpcClient, }; use subxt_signer::sr25519::dev; @@ -26,57 +26,23 @@ use subxt_signer::sr25519::dev; #[subxt::subxt(runtime_metadata_path = "artifacts/metadata.scale")] pub mod etf {} -use std::collections::BTreeMap; -use std::ops::Index; -use std::io::{Read, Write, BufRead, BufReader}; use std::fs::File; -use std::time::Duration; -use std::collections::HashMap; - -use clap::{Args, Parser, Subcommand}; - -use ckb_merkle_mountain_range::{ - helper::leaf_index_to_pos, - MerkleProof, - MMR, Merge, Result as MMRResult, MMRStore, - util::{ - MemMMR, - MemStore - }, -}; -use rand_chacha::{ - ChaCha20Rng, - rand_core::SeedableRng, -}; - -use std::io; +use clap::{Parser, Subcommand}; use subxt::ext::codec::Encode; -use beefy::{known_payloads, Payload, Commitment, VersionedFinalityProof}; -use sp_core::{Bytes, Decode}; +use beefy::{known_payloads, Payload, Commitment}; use murmur_core::{ types::{ BlockNumber, - Leaf, - MergeLeaves, Identity, IdentityBuilder, - Ciphertext, }, murmur::MurmurStore, }; -use etf_crypto_primitives::{ - ibe::fullident::{IBESecret}, - encryption::tlock::{TLECiphertext, tle} -}; -use ark_serialize::CanonicalDeserialize; -use ark_ff::UniformRand; -use rand_core::OsRng; - -use w3f_bls::{EngineBLS, TinyBLS377, SerializableToBytes, DoublePublicKey}; +use w3f_bls::{TinyBLS377, SerializableToBytes, DoublePublicKey}; use std::time::Instant; @@ -180,7 +146,7 @@ async fn main() -> Result<(), Box> { let mut schedule: Vec = Vec::new(); for i in 2..args.validity + 2 { // wallet is 'active' in 2 blocks - let next_block = current_block_number.clone() + i as u32; + let next_block = current_block_number + i; schedule.push(next_block); } // 2. create mmr @@ -196,7 +162,7 @@ async fn main() -> Result<(), Box> { // TODO: make the origin configurable // sign and send the call let from = dev::alice(); - let events = etf + let _events = etf .tx() .sign_and_submit_then_watch_default(&call, &from) .await?; @@ -259,7 +225,7 @@ async fn main() -> Result<(), Box> { balance_transfer_call, ).await; // submit the tx using alice to sign it - etf.tx() + let _result = etf.tx() .sign_and_submit_then_watch_default(&tx, &dev::alice()) .await; }, @@ -297,7 +263,7 @@ pub async fn create( let call = etf::tx() .murmur() .create( - root.0.into(), + root.0, mmr_store.metadata.len() as u64, etf::runtime_types::bounded_collections::bounded_vec::BoundedVec(name)); (call, mmr_store) @@ -318,15 +284,10 @@ pub async fn prepare_execute( when: BlockNumber, store: MurmurStore, call: etf::runtime_types::node_template_runtime::RuntimeCall, -) -> subxt::tx::Payload { - let call_data = call.encode(); - - let root = store.root.clone(); - +) -> subxt::tx::Payload { let (proof, commitment, ciphertext, pos) = store.execute( seed.clone(), when, call.encode().to_vec(), ).unwrap(); - let proof_items: Vec> = proof.proof_items().iter() .map(|leaf| leaf.0.to_vec().clone()) .collect::>(); @@ -430,8 +391,8 @@ fn load_mmr_store() -> MurmurStore { /// Write the MMR data to a file (no seed) fn write_mmr_store(mmr_store: MurmurStore) { - let mut mmr_store_file = File::create("mmr_store") - .expect("should be ok"); + let mmr_store_file = File::create("mmr_store") + .expect("It should create the file"); // TODO: error handling serde_cbor::to_writer(mmr_store_file, &mmr_store) .unwrap(); diff --git a/core/Cargo.toml b/core/Cargo.toml index 229697b..26ce4e5 100644 --- a/core/Cargo.toml +++ b/core/Cargo.toml @@ -3,6 +3,7 @@ name = "murmur-core" version = "0.1.0" edition = "2021" authors.workspace = true +license.workspace = true [lib] name = "murmur" @@ -31,8 +32,6 @@ ark-serialize = { version = "0.4.0", default-features = false } w3f-bls = { version = "0.1.3", default-features = false } hex = { version = "0.4.3", default-features = false } array-bytes = { version = "6.1", default-features = false } -# add zeroize -# 1.8.1 [features] default = ["std"] diff --git a/core/src/lib.rs b/core/src/lib.rs index e640c3d..e47ddb9 100644 --- a/core/src/lib.rs +++ b/core/src/lib.rs @@ -13,9 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -// #![no_std] #![cfg_attr(not(feature = "std"), no_std)] //! the murmur core library + extern crate alloc; #[cfg(feature = "client")] diff --git a/core/src/murmur.rs b/core/src/murmur.rs index 0aba20d..04d31e6 100644 --- a/core/src/murmur.rs +++ b/core/src/murmur.rs @@ -47,29 +47,27 @@ use ckb_merkle_mountain_range::{ use sha3::Digest; +/// Error types for murmur wallet usage #[derive(Debug)] pub enum Error { ExecuteError, MMRError, } -/// the murmur store +/// The murmur store contains minimal data required to use a murmur wallet #[cfg(feature = "client")] #[derive(Clone, serde::Serialize, serde::Deserialize)] pub struct MurmurStore { - /// map block numbers to positions in the mmr + /// A map of block numbers to leaf positions in the mmr pub metadata: BTreeMap, - /// the root of the mmr + /// The root of the mmr pub root: Leaf, } #[cfg(feature = "client")] impl MurmurStore { - /// creates the leaves needed to generate an MMR - /// This function generates otp codes for the given block schedule - /// then it encrypts the resulting codes and constructs leaves - /// the leaves can be used to generate an MMR + /// Create a new Murmur store /// /// * `seed`: An any-length seed (i.e. password) /// * `block_schedule`: The blocks for which OTP codes will be generated @@ -109,10 +107,10 @@ impl MurmurStore { } } - /// build the parameters needed to use a murmur wallet + /// Build data required (proof and commitment) to execute a valid call from a murmur wallet /// note: this rebuilds the entire mmr /// we can look into ways to optimize this in the future -/// the main issue is that he MemStore is not serializable + /// the main issue is that he MemStore is not serializable /// a possible fix is to externalize mmr logic /// /// TODO: this should probably be a result, not option @@ -138,9 +136,12 @@ impl MurmurStore { None } - /// use the seed to commit to some data at a specific block number - /// i.e. this commit cannot be verified until there is a signature - /// output from IDN for `when` + /// Generate a commitment (hash) to commit to executing a call at a specific block number + /// + /// * `seed`: The seed used to generated the MMR + /// * `when`: The block number when the commitment is verifiable + /// * `data`: The data to commit to + /// fn commit(seed: Vec, when: BlockNumber, data: &[u8]) -> Vec { let botp = build_generator(&seed); let otp_code = botp.generate(when); @@ -151,7 +152,7 @@ impl MurmurStore { hasher.finalize().to_vec() } - /// builds an mmr from the mmr store + /// Builds an mmr from the mmr store /// /// * `mmr`: a MemMMR instance (to be populated) /// @@ -167,7 +168,7 @@ impl MurmurStore { } #[cfg(feature = "client")] -/// timelock encryption function +/// Timelock encryption helper function pub fn timelock_encrypt( identity: Identity, pk: E::PublicKeyGroup, @@ -248,7 +249,6 @@ mod tests { #[test] pub fn it_can_generate_mmr_data_store() { let keypair = w3f_bls::KeypairVT::::generate(&mut OsRng); - // let msk = keypair.secret.0; // can destroy this let double_public: DoublePublicKey = DoublePublicKey( keypair.into_public_key_in_signature_group().0, keypair.public.0, @@ -265,7 +265,6 @@ mod tests { double_public, ); - // assert!(murmur_store.metadata.keys().len() == 3); } diff --git a/core/src/otp.rs b/core/src/otp.rs index 2f8c887..f217beb 100644 --- a/core/src/otp.rs +++ b/core/src/otp.rs @@ -20,14 +20,17 @@ use alloc::{ string::String, }; -/// a block based otp generator +/// A block based otp generator pub struct BOTPGenerator { - /// the time-based otp generator + /// The time-based otp generator totp: TOTP } impl BOTPGenerator { - /// create a new BOTP generator with the given seed + /// Create a new BOTP generator with the given seed + /// + /// * `seed`: The seed used to generate OTP codes + /// pub fn new(seed: Vec) -> Self { let secret = Secret::Raw(seed.to_vec()).to_bytes().unwrap(); let totp = TOTP::new( @@ -41,7 +44,10 @@ impl BOTPGenerator { BOTPGenerator { totp } } - /// generate an otp code + /// Generate an otp code + /// + /// * `block_height`: The block for which the code is valid + /// pub fn generate(&self, block_height: u32) -> String { self.totp.generate(block_height as u64) } diff --git a/core/src/types.rs b/core/src/types.rs index d8e68a6..567c487 100644 --- a/core/src/types.rs +++ b/core/src/types.rs @@ -19,13 +19,14 @@ pub use etf_crypto_primitives::ibe::fullident::Identity; use sha3::Digest; use alloc::vec::Vec; -/// the type to represent a block number +/// The type to represent a block number pub type BlockNumber = u32; +/// An opaque ciphertext type pub type Ciphertext = Vec; /// A leaf in the MMR -/// the payload is an opaque, any-length vec +/// The payload is an opaque, any-length vec #[derive( Eq, PartialEq, Clone, Debug, Default, serde::Serialize, serde::Deserialize @@ -40,7 +41,7 @@ impl From> for Leaf { } } -/// merge leaves together with a sha256 hasher +/// Merge leaves together with a sha256 hasher #[derive(Debug)] pub struct MergeLeaves; impl Merge for MergeLeaves { @@ -54,7 +55,7 @@ impl Merge for MergeLeaves { } } -/// something that builds unique identities (e.g. using crypto hash function) for any block number +/// Something that builds unique identities (e.g. using crypto hash function) for any block number pub trait IdentityBuilder { fn build_identity(at: BlockNumber) -> Identity; } \ No newline at end of file diff --git a/test b/test deleted file mode 100644 index d409212..0000000 --- a/test +++ /dev/null @@ -1 +0,0 @@ -adsfadsfasdfasdfasdf \ No newline at end of file diff --git a/test-utils/Cargo.toml b/test-utils/Cargo.toml index 6a4a03b..bbea827 100644 --- a/test-utils/Cargo.toml +++ b/test-utils/Cargo.toml @@ -3,6 +3,7 @@ name = "murmur-test-utils" version = "0.1.0" edition = "2021" authors.workspace = true +license.workspace = true [lib] name = "murmur_test_utils" diff --git a/test-utils/README.md b/test-utils/README.md index a002bdd..1f3ffd5 100644 --- a/test-utils/README.md +++ b/test-utils/README.md @@ -1 +1,3 @@ -# Murmur test utilities \ No newline at end of file +# Murmur test utilities + +Various test utilities for murmur. \ No newline at end of file From 990808ddf11054168398663dfe727a42704c15d4 Mon Sep 17 00:00:00 2001 From: driemworks Date: Wed, 25 Sep 2024 12:44:48 -0500 Subject: [PATCH 13/20] chore: update casing --- core/src/murmur.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/murmur.rs b/core/src/murmur.rs index 04d31e6..6d39db5 100644 --- a/core/src/murmur.rs +++ b/core/src/murmur.rs @@ -187,7 +187,7 @@ pub fn timelock_encrypt( ct_bytes } -/// build a block-otp generator from the seed +/// Build a block-otp generator from the seed #[cfg(feature = "client")] fn build_generator(seed: &[u8]) -> BOTPGenerator { let mut hasher = sha3::Sha3_256::default(); From dcb8acd3959ac4e92fe3edcfce5e394e5387d175 Mon Sep 17 00:00:00 2001 From: Juan Girini Date: Fri, 27 Sep 2024 16:42:40 +0200 Subject: [PATCH 14/20] feat: create a murmur lib for create and prepare_execute --- Cargo.lock | 11 ++++++++++- Cargo.toml | 1 + 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/Cargo.lock b/Cargo.lock index 3b3f2c5..10503ae 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4610,6 +4610,16 @@ dependencies = [ "w3f-bls", ] +[[package]] +name = "murmur-lib" +version = "0.1.0" +dependencies = [ + "murmur-core", + "sp-consensus-beefy-etf 13.0.0 (git+https://github.com/ideal-lab5/etf.git?branch=tony/dev)", + "subxt", + "w3f-bls", +] + [[package]] name = "nalgebra" version = "0.32.6" @@ -6044,7 +6054,6 @@ dependencies = [ "frame-support", "frame-system", "log", - "murmur-core", "pallet-proxy 28.1.0", "pallet-randomness-beacon", "parity-scale-codec", diff --git a/Cargo.toml b/Cargo.toml index 19696be..bf0f956 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -2,6 +2,7 @@ members = [ "core/", "cli/", + "lib/", ] resolver = "2" From 634fd929f1ce0b6c7d468a7d2dd81a27772c1d79 Mon Sep 17 00:00:00 2001 From: Juan Girini Date: Fri, 27 Sep 2024 16:43:21 +0200 Subject: [PATCH 15/20] feat: create a murmur lib for create and prepare_execute --- lib/Cargo.toml | 11 ++++ lib/artifacts/metadata.scale | Bin 0 -> 619314 bytes lib/src/lib.rs | 101 +++++++++++++++++++++++++++++++++++ 3 files changed, 112 insertions(+) create mode 100644 lib/Cargo.toml create mode 100644 lib/artifacts/metadata.scale create mode 100644 lib/src/lib.rs diff --git a/lib/Cargo.toml b/lib/Cargo.toml new file mode 100644 index 0000000..a444921 --- /dev/null +++ b/lib/Cargo.toml @@ -0,0 +1,11 @@ +[package] +name = "murmur-lib" +version = "0.1.0" +edition = "2021" +authors.workspace = true + +[dependencies] +beefy = { package = "sp-consensus-beefy-etf", git = "https://github.com/ideal-lab5/etf.git", branch = "tony/dev", features = ["bls-experimental"] } +murmur-core = { package = "murmur-core", path = "../core/", features = ["client"] } +subxt = "0.35.2" +w3f-bls = "0.1.3" \ No newline at end of file diff --git a/lib/artifacts/metadata.scale b/lib/artifacts/metadata.scale new file mode 100644 index 0000000000000000000000000000000000000000..d74dc51ccac22fc54aa26eb62afbdef16c8504e1 GIT binary patch literal 619314 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