diff --git a/Cargo.lock b/Cargo.lock index afce9a5..d0640ce 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -69,7 +69,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75" dependencies = [ "cfg-if", - "const-random", "getrandom 0.3.4", "once_cell", "version_check", @@ -292,7 +291,7 @@ dependencies = [ "ark-ff-macros 0.5.0", "ark-serialize 0.5.0", "ark-std 0.5.0", - "arrayvec 0.7.6", + "arrayvec 0.7.8", "digest 0.10.7", "educe", "itertools 0.13.0", @@ -319,7 +318,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "62945a2f7e6de02a31fe400aa489f0e0f5b2502e69f95f853adb82a96c7a6b60" dependencies = [ "quote", - "syn 2.0.117", + "syn 2.0.119", ] [[package]] @@ -345,7 +344,7 @@ dependencies = [ "num-traits", "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.119", ] [[package]] @@ -396,7 +395,7 @@ checksum = "3f4d068aaf107ebcd7dfb52bc748f8030e0fc930ac8e360146ca54c1203088f7" dependencies = [ "ark-serialize-derive 0.5.0", "ark-std 0.5.0", - "arrayvec 0.7.6", + "arrayvec 0.7.8", "digest 0.10.7", "num-bigint", ] @@ -420,7 +419,7 @@ checksum = "213888f660fddcca0d257e88e54ac05bca01885f258ccdf695bafd77031bb69d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.119", ] [[package]] @@ -430,7 +429,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94893f1e0c6eeab764ade8dc4c0db24caf4fe7cbbaafc0eba0a9030f447b5185" dependencies = [ "num-traits", - "rand 0.8.5", + "rand 0.8.6", ] [[package]] @@ -440,7 +439,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "246a225cc6131e9ee4f24619af0f19d67761fff15d7ccc22e42b80846e69449a" dependencies = [ "num-traits", - "rand 0.8.5", + "rand 0.8.6", ] [[package]] @@ -499,9 +498,9 @@ dependencies = [ [[package]] name = "arrayvec" -version = "0.7.6" +version = "0.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" +checksum = "d3fb67a6e08acf24fdeccbac2cb6ac4305825bd1f117462e0e6f2f193345ad56" [[package]] name = "async-channel" @@ -600,9 +599,9 @@ dependencies = [ [[package]] name = "async-signal" -version = "0.2.13" +version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43c070bbf59cd3570b6b2dd54cd772527c7c3620fce8be898406dd3ed6adc64c" +checksum = "52b5aaafa020cf5053a01f2a60e8ff5dccf550f0f77ec54a4e47285ac2bab485" dependencies = [ "async-io", "async-lock", @@ -624,13 +623,13 @@ checksum = "8b75356056920673b02621b35afd0f7dda9306d03c79a30f5c56c44cf256e3de" [[package]] name = "async-trait" -version = "0.1.89" +version = "0.1.91" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" +checksum = "ae36dc4177970ef04fde5178d3e2429882def40e57a451f919c098f72baa6cec" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 3.0.3", ] [[package]] @@ -647,9 +646,9 @@ checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" [[package]] name = "autocfg" -version = "1.5.0" +version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" +checksum = "f2032f911046de80f0a198e0901378627c33f59ea0ac00e363d481118bd70a53" [[package]] name = "backtrace" @@ -708,7 +707,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "90dbd31c98227229239363921e60fcf5e558e43ec69094d46fc4996f08d1d5bc" dependencies = [ "bitcoin_hashes", - "rand 0.8.5", + "rand 0.8.6", "rand_core 0.6.4", "serde", "unicode-normalization", @@ -716,9 +715,9 @@ dependencies = [ [[package]] name = "bitcoin_hashes" -version = "0.14.1" +version = "0.14.101" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26ec84b80c482df901772e931a9a681e26a1b9ee2302edeff23cb30328745c8b" +checksum = "bca4c7abb40c8817d77403c880988cfd484f23ab2365726afb2f798363e2c4a2" dependencies = [ "hex-conservative", ] @@ -731,15 +730,15 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.11.0" +version = "2.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "843867be96c8daad0d758b57df9392b6d8d271134fce549de6ce169ff98a92af" +checksum = "b588b76d00fde79687d7646a9b5bdf3cc0f655e0bbd080335a95d7e96f3587da" [[package]] name = "bitvec" -version = "1.0.1" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" +checksum = "ddcec3d12c579d40898fe0a9a358a803c23e9c52ca3c425707f81c9436211837" dependencies = [ "funty", "radium", @@ -773,18 +772,18 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b79834656f71332577234b50bfc009996f7449e0c056884e6a02492ded0ca2f3" dependencies = [ "arrayref", - "arrayvec 0.7.6", + "arrayvec 0.7.8", "constant_time_eq 0.4.2", ] [[package]] name = "blake3" -version = "1.8.4" +version = "1.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d2d5991425dfd0785aed03aedcf0b321d61975c9b5b3689c774a2610ae0b51e" +checksum = "0aa83c34e62843d924f905e0f5c866eb1dd6545fc4d719e803d9ba6030371fce" dependencies = [ "arrayref", - "arrayvec 0.7.6", + "arrayvec 0.7.8", "cc", "cfg-if", "constant_time_eq 0.4.2", @@ -846,9 +845,9 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.20.2" +version = "3.20.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d20789868f4b01b2f2caec9f5c4e0213b41e3e5702a50157d699ae31ced2fcb" +checksum = "72f5acc6cb2ba439de613abc23857ec3d78374d8ed5ac84e9d11336e87da8649" [[package]] name = "byte-slice-cast" @@ -864,15 +863,15 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" -version = "1.11.1" +version = "1.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e748733b7cbc798e1434b6ac524f0c1ff2ab456fe201501e6497c8417a4fc33" +checksum = "fc652a48c352aef3ea3aed32080501cf3ef6ed5da78602a020c991775b0aff04" [[package]] name = "cc" -version = "1.2.58" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1e928d4b69e3077709075a938a05ffbedfa53a84c8f766efbf8220bb1ff60e1" +checksum = "c89588d05638b5b4594a3348a2d6c20277e43a7f5c5202b05cc56888475a47b8" dependencies = [ "find-msvc-tools", "shlex", @@ -892,9 +891,9 @@ checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" [[package]] name = "cfg_aliases" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" +checksum = "f079e83a288787bcd14a6aea84cee5c87a67c5a3e660c30f557a3d24761b3527" [[package]] name = "chacha20" @@ -909,9 +908,9 @@ dependencies = [ [[package]] name = "chacha20" -version = "0.10.0" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f8d983286843e49675a4b7a2d174efe136dc93a18d69130dd18198a6c167601" +checksum = "d524456ba66e72eb8b115ff89e01e497f8e6d11d78b70b1aa13c0fbd97540a81" dependencies = [ "cfg-if", "cpufeatures 0.3.0", @@ -920,9 +919,9 @@ dependencies = [ [[package]] name = "chrono" -version = "0.4.44" +version = "0.4.45" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c673075a2e0e5f4a1dde27ce9dee1ea4558c7ffe648f576438a20ca1d2acc4b0" +checksum = "1aa79e62e7697b8e29b513a68abacf485adcd1fe8284a4316c5ae868e6633327" dependencies = [ "iana-time-zone", "js-sys", @@ -944,9 +943,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.6.0" +version = "4.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b193af5b67834b676abd72466a96c1024e6a6ad978a1f484bd90b85c94041351" +checksum = "1ddb117e43bbf7dacf0a4190fef4d345b9bad68dfc649cb349e7d17d28428e51" dependencies = [ "clap_builder", "clap_derive", @@ -966,14 +965,14 @@ dependencies = [ [[package]] name = "clap_derive" -version = "4.6.0" +version = "4.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1110bd8a634a1ab8cb04345d8d878267d57c3cf1b38d91b71af6686408bbca6a" +checksum = "f2ce8604710f6733aa641a2b3731eaa1e8b3d9973d5e3565da11800813f997a9" dependencies = [ "heck", "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.119", ] [[package]] @@ -1024,9 +1023,9 @@ dependencies = [ [[package]] name = "console" -version = "0.16.3" +version = "0.16.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d64e8af5551369d19cf50138de61f1c42074ab970f74e99be916646777f8fc87" +checksum = "4fe5f465a4f6fee88fad41b85d990f84c835335e85b5d9e6e63e0d06d28cba7c" dependencies = [ "encode_unicode", "libc", @@ -1040,33 +1039,14 @@ version = "0.9.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" -[[package]] -name = "const-random" -version = "0.1.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87e00182fe74b066627d63b85fd550ac2998d4b0bd86bfed477a0ae4c7c71359" -dependencies = [ - "const-random-macro", -] - -[[package]] -name = "const-random-macro" -version = "0.1.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9d839f2a20b0aee515dc581a6172f2321f96cab76c1a38a4c584a194955390e" -dependencies = [ - "getrandom 0.2.17", - "once_cell", - "tiny-keccak", -] - [[package]] name = "const_format" -version = "0.2.35" +version = "0.2.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7faa7469a93a566e9ccc1c73fe783b4a65c274c5ace346038dca9c39fe0030ad" +checksum = "4481a617ad9a412be3b97c5d403fef8ed023103368908b9c50af598ff467cc1e" dependencies = [ "const_format_proc_macros", + "konst", ] [[package]] @@ -1181,9 +1161,9 @@ checksum = "790eea4361631c5e7d22598ecd5723ff611904e3344ce8720784c93e3d83d40b" [[package]] name = "crossbeam-deque" -version = "0.8.6" +version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51" +checksum = "5181e0de7b61eb03a81e347d6dd8797bae9da5146707b51077e2d71a54ec0ceb" dependencies = [ "crossbeam-epoch", "crossbeam-utils", @@ -1191,27 +1171,27 @@ dependencies = [ [[package]] name = "crossbeam-epoch" -version = "0.9.18" +version = "0.9.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" +checksum = "2d6914041f254d6e9176c01941b21115dcfb7089e55135a35411081bd106ef3f" dependencies = [ "crossbeam-utils", ] [[package]] name = "crossbeam-queue" -version = "0.3.12" +version = "0.3.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f58bbc28f91df819d0aa2a2c00cd19754769c2fad90579b3592b1c9ba7a3115" +checksum = "803d13fb3b09d88be9f4dbc29062c66b19bf7170867ceb746d2a8689bf6c7a26" dependencies = [ "crossbeam-utils", ] [[package]] name = "crossbeam-utils" -version = "0.8.21" +version = "0.8.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" +checksum = "61803da095bee82a81bb1a452ecc25d3b2f1416d1897eb86430c6159ef717c17" [[package]] name = "crunchy" @@ -1285,7 +1265,7 @@ checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.119", ] [[package]] @@ -1309,7 +1289,7 @@ dependencies = [ "proc-macro2", "quote", "strsim", - "syn 2.0.117", + "syn 2.0.119", ] [[package]] @@ -1320,7 +1300,7 @@ checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead" dependencies = [ "darling_core", "quote", - "syn 2.0.117", + "syn 2.0.119", ] [[package]] @@ -1339,9 +1319,6 @@ name = "deranged" version = "0.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7cd812cc2bc1d69d4764bd80df88b4317eaef9e773c75226407d9bc0876b211c" -dependencies = [ - "powerfmt", -] [[package]] name = "derivative" @@ -1362,7 +1339,7 @@ checksum = "d65d7ce8132b7c0e54497a4d9a55a1c2a0912a0d786cf894472ba818fba45762" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.119", ] [[package]] @@ -1373,7 +1350,7 @@ checksum = "d08b3a0bcc0d079199cd476b2cae8435016ec11d1c0986c6901c5ac223041534" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.119", ] [[package]] @@ -1384,7 +1361,7 @@ checksum = "1e567bd82dcff979e4b03460c307b3cdc9e96fde3d73bed1496d2bc75d9dd62a" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.119", ] [[package]] @@ -1413,7 +1390,7 @@ checksum = "cb7330aeadfbe296029522e6c40f315320aba36fc43a5b3632f3795348f3bd22" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.119", ] [[package]] @@ -1426,7 +1403,7 @@ dependencies = [ "proc-macro2", "quote", "rustc_version", - "syn 2.0.117", + "syn 2.0.119", "unicode-xid", ] @@ -1474,13 +1451,13 @@ dependencies = [ [[package]] name = "displaydoc" -version = "0.2.5" +version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" +checksum = "1ac70aa55017e108007fbaf5aa0f54b021c98f92ff8af59d42eda9da96e3dd4f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.119", ] [[package]] @@ -1504,7 +1481,7 @@ dependencies = [ "proc-macro2", "quote", "regex", - "syn 2.0.117", + "syn 2.0.119", "termcolor", "toml 0.8.23", "walkdir", @@ -1596,14 +1573,14 @@ dependencies = [ "enum-ordinalize", "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.119", ] [[package]] name = "either" -version = "1.15.0" +version = "1.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" +checksum = "91622ff5e7162018101f2fea40d6ebf4a78bbe5a49736a2020649edf9693679e" [[package]] name = "elliptic-curve" @@ -1642,22 +1619,22 @@ dependencies = [ [[package]] name = "enum-ordinalize" -version = "4.3.2" +version = "4.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a1091a7bb1f8f2c4b28f1fe2cef4980ca2d410a3d727d67ecc3178c9b0800f0" +checksum = "07f808d588c10e464ea6f7d3eaed500049eff30aaac103460f61828c2d65b3eb" dependencies = [ "enum-ordinalize-derive", ] [[package]] name = "enum-ordinalize-derive" -version = "4.3.2" +version = "4.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ca9601fb2d62598ee17836250842873a413586e5d7ed88b356e38ddbb0ec631" +checksum = "42e528e2d34ba8a67a1a650b86beae8ef69fc5fdb638016f386b973226590432" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.119", ] [[package]] @@ -1715,26 +1692,26 @@ dependencies = [ "prettyplease", "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.119", ] [[package]] name = "fastbloom" -version = "0.14.1" +version = "0.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e7f34442dbe69c60fe8eaf58a8cafff81a1f278816d8ab4db255b3bef4ac3c4" +checksum = "ef975e30683b2d965054bb0a836f8973857c4ebf6acf274fe46617cd285060d8" dependencies = [ - "getrandom 0.3.4", + "foldhash 0.2.0", "libm", - "rand 0.9.4", + "portable-atomic", "siphasher", ] [[package]] name = "fastrand" -version = "2.3.0" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" +checksum = "da7c62ceae207dd37ea5b845da6a0696c799f85e97da1ab5b7910be3c1c80223" [[package]] name = "ff" @@ -1794,7 +1771,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "835c052cb0c08c1acf6ffd71c022172e18723949c8282f2b9f27efbc51e64534" dependencies = [ "byteorder", - "rand 0.8.5", + "rand 0.8.6", "rustc-hex", "static_assertions", ] @@ -1882,9 +1859,9 @@ checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" [[package]] name = "futures" -version = "0.3.32" +version = "0.3.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b147ee9d1f6d097cef9ce628cd2ee62288d963e16fb287bd9286455b241382d" +checksum = "a88cf1f829d945f548cf8fec32c61b1f202b6d93b45848602fc02af4b12ad218" dependencies = [ "futures-channel", "futures-core", @@ -1897,9 +1874,9 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.32" +version = "0.3.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07bbe89c50d7a535e539b8c17bc0b49bdb77747034daa8087407d655f3f7cc1d" +checksum = "262590f4fe6afeb0bc83be1daa64e52657fe185690a958af7f3ad0e92085c5ae" dependencies = [ "futures-core", "futures-sink", @@ -1907,15 +1884,15 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.32" +version = "0.3.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e3450815272ef58cec6d564423f6e755e25379b217b0bc688e295ba24df6b1d" +checksum = "2cd50c473c80f6d7c3670a752354b8e569b1a7cbfdc0419ec88e5edad85e0dc7" [[package]] name = "futures-executor" -version = "0.3.32" +version = "0.3.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf29c38818342a3b26b5b923639e7b1f4a61fc5e76102d4b1981c6dc7a7579d" +checksum = "6754879cc9f2c66f88c6e5c35344bb0bdb0708b0352b1201815667c7eabc7458" dependencies = [ "futures-core", "futures-task", @@ -1924,9 +1901,9 @@ dependencies = [ [[package]] name = "futures-io" -version = "0.3.32" +version = "0.3.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cecba35d7ad927e23624b22ad55235f2239cfa44fd10428eecbeba6d6a717718" +checksum = "4577ecaa3c4f96589d473f679a71b596316f6641bc350038b962a5daf0085d7a" [[package]] name = "futures-lite" @@ -1943,32 +1920,32 @@ dependencies = [ [[package]] name = "futures-macro" -version = "0.3.32" +version = "0.3.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e835b70203e41293343137df5c0664546da5745f82ec9b84d40be8336958447b" +checksum = "2d6d3cde68c518367be28956066ddfef33813991b77a55005a69dae04bf3b10b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.119", ] [[package]] name = "futures-sink" -version = "0.3.32" +version = "0.3.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c39754e157331b013978ec91992bde1ac089843443c49cbc7f46150b0fad0893" +checksum = "e34418ac499d6305c2fb5ad0ed2f6ac998c5f8ca209b4510f7f94242c647e307" [[package]] name = "futures-task" -version = "0.3.32" +version = "0.3.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "037711b3d59c33004d3856fbdc83b99d4ff37a24768fa1be9ce3538a1cde4393" +checksum = "b231ed28831efb4a61a08580c4bc233ec56bc009f4cd8f52da2c3cb97df0c109" [[package]] name = "futures-timer" -version = "3.0.3" +version = "3.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f288b0a4f20f9a56b5d1da57e2227c661b7b16168e2f72365f57b63326e29b24" +checksum = "af43fadb8a98512d547e37b4e92e0ced13e205c061b87b4623eff01d918d6968" dependencies = [ "gloo-timers", "send_wrapper", @@ -1976,9 +1953,9 @@ dependencies = [ [[package]] name = "futures-util" -version = "0.3.32" +version = "0.3.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "389ca41296e6190b48053de0321d02a77f32f8a5d2461dd38762c0593805c6d6" +checksum = "a77a90a256fce34da66415271e30f94ee91c57b04b8a2c042d9cf3220179deaa" dependencies = [ "futures-channel", "futures-core", @@ -2022,25 +1999,23 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" dependencies = [ "cfg-if", - "js-sys", "libc", "r-efi 5.3.0", "wasip2", - "wasm-bindgen", ] [[package]] name = "getrandom" -version = "0.4.2" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0de51e6874e94e7bf76d726fc5d13ba782deca734ff60d5bb2fb2607c7406555" +checksum = "300e883d756b2e4ec94e02791f39b04b522276138852cfc41d9fb7e904106099" dependencies = [ "cfg-if", + "js-sys", "libc", "r-efi 6.0.0", "rand_core 0.10.1", - "wasip2", - "wasip3", + "wasm-bindgen", ] [[package]] @@ -2049,7 +2024,7 @@ version = "0.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6ea1015b5a70616b688dc230cfe50c8af89d972cb132d5a622814d29773b10b9" dependencies = [ - "rand 0.8.5", + "rand 0.8.6", "rand_core 0.6.4", ] @@ -2092,9 +2067,9 @@ dependencies = [ [[package]] name = "gloo-timers" -version = "0.2.6" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b995a66bb87bebce9a0f4a95aed01daca4872c050bfcb21653361c03bc35e5c" +checksum = "482ce8a491a501da4cd806bd190275363d674f2845005c6ddbd5d3e1dd54495d" dependencies = [ "futures-channel", "futures-core", @@ -2128,9 +2103,9 @@ dependencies = [ [[package]] name = "h2" -version = "0.4.13" +version = "0.4.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f44da3a8150a6703ed5d34e164b875fd14c2cdab9af1252a9a1020bde2bdc54" +checksum = "6cb093c84e8bd9b188d4c4a8cb6579fc016968d14c99882163cd3ff402a4f155" dependencies = [ "atomic-waker", "bytes", @@ -2204,6 +2179,12 @@ dependencies = [ "foldhash 0.2.0", ] +[[package]] +name = "hashbrown" +version = "0.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed5909b6e89a2db4456e54cd5f673791d7eca6732202bbf2a9cc504fe2f9b84a" + [[package]] name = "heck" version = "0.5.0" @@ -2228,7 +2209,7 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fda06d18ac606267c40c04e41b9947729bf8b9efe74bd4e82b61a5f26a510b9f" dependencies = [ - "arrayvec 0.7.6", + "arrayvec 0.7.8", ] [[package]] @@ -2269,9 +2250,9 @@ dependencies = [ [[package]] name = "http" -version = "1.4.0" +version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3ba2a386d7f85a81f119ad7498ebe444d2e22c2af0b86b069416ace48b3311a" +checksum = "6970f50e31d6fc17d3fa27329444bfa74e196cf62e95052a3f6fee181dba6425" dependencies = [ "bytes", "itoa", @@ -2279,9 +2260,9 @@ dependencies = [ [[package]] name = "http-body" -version = "1.0.1" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" +checksum = "ca2a8f2913ee65f60facd6a5905613afaa448497a0230cc41ce022d93290bc2c" dependencies = [ "bytes", "http", @@ -2289,9 +2270,9 @@ dependencies = [ [[package]] name = "http-body-util" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" +checksum = "e9f41fd6a08e4d4ec69df65976da761afd5ad5e58a9d4acb46bd1c953a9e3ff2" dependencies = [ "bytes", "futures-core", @@ -2314,9 +2295,9 @@ checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" [[package]] name = "hyper" -version = "1.8.1" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ab2d4f250c3d7b1c9fcdff1cece94ea4e2dfbec68614f7b87cb205f24ca9d11" +checksum = "d22053281f852e11534f5198498373cbb59295120a20771d90f7ed1897490a72" dependencies = [ "atomic-waker", "bytes", @@ -2329,7 +2310,6 @@ dependencies = [ "httpdate", "itoa", "pin-project-lite", - "pin-utils", "smallvec", "tokio", "want", @@ -2337,16 +2317,15 @@ dependencies = [ [[package]] name = "hyper-rustls" -version = "0.27.7" +version = "0.27.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3c93eb611681b207e1fe55d5a71ecf91572ec8a6705cdb6857f7d8d5242cf58" +checksum = "33ca68d021ef39cf6463ab54c1d0f5daf03377b70561305bb89a8f83aab66e0f" dependencies = [ "http", "hyper", "hyper-util", "log", "rustls", - "rustls-pki-types", "tokio", "tokio-rustls", "tower-service", @@ -2402,12 +2381,13 @@ dependencies = [ [[package]] name = "icu_collections" -version = "2.1.1" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c6b649701667bbe825c3b7e6388cb521c23d88644678e83c0c4d0a621a34b43" +checksum = "2984d1cd16c883d7935b9e07e44071dca8d917fd52ecc02c04d5fa0b5a3f191c" dependencies = [ "displaydoc", "potential_utf", + "utf8_iter", "yoke", "zerofrom", "zerovec", @@ -2415,9 +2395,9 @@ dependencies = [ [[package]] name = "icu_locale_core" -version = "2.1.1" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edba7861004dd3714265b4db54a3c390e880ab658fec5f7db895fae2046b5bb6" +checksum = "92219b62b3e2b4d88ac5119f8904c10f8f61bf7e95b640d25ba3075e6cac2c29" dependencies = [ "displaydoc", "litemap", @@ -2428,9 +2408,9 @@ dependencies = [ [[package]] name = "icu_normalizer" -version = "2.1.1" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f6c8828b67bf8908d82127b2054ea1b4427ff0230ee9141c54251934ab1b599" +checksum = "c56e5ee99d6e3d33bd91c5d85458b6005a22140021cc324cea84dd0e72cff3b4" dependencies = [ "icu_collections", "icu_normalizer_data", @@ -2442,15 +2422,15 @@ dependencies = [ [[package]] name = "icu_normalizer_data" -version = "2.1.1" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7aedcccd01fc5fe81e6b489c15b247b8b0690feb23304303a9e560f37efc560a" +checksum = "da3be0ae77ea334f4da67c12f149704f19f81d1adf7c51cf482943e84a2bad38" [[package]] name = "icu_properties" -version = "2.1.2" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "020bfc02fe870ec3a66d93e677ccca0562506e5872c650f893269e08615d74ec" +checksum = "bee3b67d0ea5c2cca5003417989af8996f8604e34fb9ddf96208a033901e70de" dependencies = [ "icu_collections", "icu_locale_core", @@ -2462,15 +2442,15 @@ dependencies = [ [[package]] name = "icu_properties_data" -version = "2.1.2" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "616c294cf8d725c6afcd8f55abc17c56464ef6211f9ed59cccffe534129c77af" +checksum = "8e2bbb201e0c04f7b4b3e14382af113e17ba4f63e2c9d2ee626b720cbce54a14" [[package]] name = "icu_provider" -version = "2.1.1" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85962cf0ce02e1e0a629cc34e7ca3e373ce20dda4c4d7294bbd0bf1fdb59e614" +checksum = "139c4cf31c8b5f33d7e199446eff9c1e02decfc2f0eec2c8d71f65befa45b421" dependencies = [ "displaydoc", "icu_locale_core", @@ -2481,12 +2461,6 @@ dependencies = [ "zerovec", ] -[[package]] -name = "id-arena" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d3067d79b975e8844ca9eb072e16b31c3c1c36928edf9c6789548c524d0d954" - [[package]] name = "ident_case" version = "1.0.1" @@ -2506,9 +2480,9 @@ dependencies = [ [[package]] name = "idna_adapter" -version = "1.2.1" +version = "1.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" +checksum = "cb68373c0d6620ef8105e855e7745e18b0d00d3bdb07fb532e434244cdb9a714" dependencies = [ "icu_normalizer", "icu_properties", @@ -2551,26 +2525,24 @@ checksum = "a0eb5a3343abf848c0984fe4604b2b105da9539376e24fc0a3b0007411ae4fd9" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.119", ] [[package]] name = "indexmap" -version = "2.13.0" +version = "2.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7714e70437a7dc3ac8eb7e6f8df75fd8eb422675fc7678aff7364301092b1017" +checksum = "d466e9454f08e4a911e14806c24e16fba1b4c121d1ea474396f396069cf949d9" dependencies = [ "equivalent", - "hashbrown 0.16.1", - "serde", - "serde_core", + "hashbrown 0.17.1", ] [[package]] name = "indicatif" -version = "0.18.4" +version = "0.18.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25470f23803092da7d239834776d653104d551bc4d7eacaf31e6837854b8e9eb" +checksum = "9433806cd6b4ec1aba79c021c7e4c58fb4c3b9977c085062e611ac929998fb0c" dependencies = [ "console", "portable-atomic", @@ -2603,16 +2575,6 @@ version = "2.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d98f6fed1fde3f8c21bc40a1abb88dd75e67924f9cffc3ef95607bad8017f8e2" -[[package]] -name = "iri-string" -version = "0.7.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25e659a4bb38e810ebc252e53b5814ff908a8c58c2a9ce2fae1bbec24cbf4e20" -dependencies = [ - "memchr", - "serde", -] - [[package]] name = "is_terminal_polyfill" version = "1.70.2" @@ -2667,7 +2629,7 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cb948eace373d99de60501a02fb17125d30ac632570de20dccc74370cdd611b9" dependencies = [ - "arrayvec 0.7.6", + "arrayvec 0.7.8", "bitvec", "byte-slice-cast", "const_format", @@ -2686,7 +2648,7 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.119", ] [[package]] @@ -2730,26 +2692,25 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "38c0b942f458fe50cdac086d2f946512305e5631e720728f2a61aabcd47a6264" dependencies = [ "quote", - "syn 2.0.117", + "syn 2.0.119", ] [[package]] name = "js-sys" -version = "0.3.92" +version = "0.3.103" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc4c90f45aa2e6eacbe8645f77fdea542ac97a494bcd117a67df9ff4d611f995" +checksum = "53b44bfcdb3f8d5837a46dae1ca9660a837176eee74a28b229bc626816589102" dependencies = [ "cfg-if", "futures-util", - "once_cell", "wasm-bindgen", ] [[package]] name = "jsonrpsee" -version = "0.24.10" +version = "0.24.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e281ae70cc3b98dac15fced3366a880949e65fc66e345ce857a5682d152f3e62" +checksum = "72c4b1f204b655b36b24dc4939af20366c649431d4711863bbbae5c495f3eeb4" dependencies = [ "jsonrpsee-client-transport", "jsonrpsee-core", @@ -2761,9 +2722,9 @@ dependencies = [ [[package]] name = "jsonrpsee-client-transport" -version = "0.24.10" +version = "0.24.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc4280b709ac3bb5e16cf3bad5056a0ec8df55fa89edfe996361219aadc2c7ea" +checksum = "b3e1420b1792cff778e2a1ebaa44115f156ee62a94dd106eaa51163f037d2023" dependencies = [ "base64", "futures-channel", @@ -2786,9 +2747,9 @@ dependencies = [ [[package]] name = "jsonrpsee-core" -version = "0.24.10" +version = "0.24.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "348ee569eaed52926b5e740aae20863762b16596476e943c9e415a6479021622" +checksum = "f49bfa9334963e1c85866b39dff3ffcc81f1c286eb23334267c5cb97677543a4" dependencies = [ "async-trait", "bytes", @@ -2811,9 +2772,9 @@ dependencies = [ [[package]] name = "jsonrpsee-http-client" -version = "0.24.10" +version = "0.24.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f50c389d6e6a52eb7c3548a6600c90cf74d9b71cb5912209833f00a5479e9a01" +checksum = "c215647e43482d478a6c21f021a013b50d64cf63431c1176eda9ef925dc54ec8" dependencies = [ "async-trait", "base64", @@ -2836,9 +2797,9 @@ dependencies = [ [[package]] name = "jsonrpsee-types" -version = "0.24.10" +version = "0.24.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0f05e0028e55b15dbd2107163b3c744cd3bb4474f193f95d9708acbf5677e44" +checksum = "41d86fc943f81dab0ecdd6c0240b6e0f55ad57a2ea9ad8ad7efe8456fb9cc7a4" dependencies = [ "http", "serde", @@ -2848,9 +2809,9 @@ dependencies = [ [[package]] name = "jsonrpsee-wasm-client" -version = "0.24.10" +version = "0.24.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e9d745e4f543fc10fc0e2b11aa1f3be506b1e475d412167e7191a65ecd239f1c" +checksum = "735df2088674c87f7fecdf51c80878a7aa19a8116b32d703b000f5b1a7acf95a" dependencies = [ "jsonrpsee-client-transport", "jsonrpsee-core", @@ -2859,9 +2820,9 @@ dependencies = [ [[package]] name = "jsonrpsee-ws-client" -version = "0.24.10" +version = "0.24.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78fc744f17e7926d57f478cf9ca6e1ee5d8332bf0514860b1a3cdf1742e614cc" +checksum = "9df5bd5c38c0906a6e8b3a38c8c22cc8525fda25fd1a03a3fe010686aea66b70" dependencies = [ "http", "jsonrpsee-client-transport", @@ -2914,22 +2875,31 @@ dependencies = [ ] [[package]] -name = "lazy_static" -version = "1.5.0" +name = "konst" +version = "0.2.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" +checksum = "128133ed7824fcd73d6e7b17957c5eb7bacb885649bd8c69708b2331a10bcefb" +dependencies = [ + "konst_macro_rules", +] [[package]] -name = "leb128fmt" -version = "0.1.0" +name = "konst_macro_rules" +version = "0.2.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2" +checksum = "a4933f3f57a8e9d9da04db23fb153356ecaf00cbd14aee46279c33dc80925c37" + +[[package]] +name = "lazy_static" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" [[package]] name = "libc" -version = "0.2.183" +version = "0.2.189" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5b646652bf6661599e1da8901b3b9522896f01e736bad5f723fe7a3a27f899d" +checksum = "3eaf3ede3fee6db1a4c2ee091bf8a8b4dccdc6d17f656fb07896ee72867612f2" [[package]] name = "libm" @@ -2939,9 +2909,9 @@ checksum = "b6d2cec3eae94f9f509c767b45932f1ada8350c4bdb85af2fcab4a3c14807981" [[package]] name = "libredox" -version = "0.1.15" +version = "0.1.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ddbf48fd451246b1f8c2610bd3b4ac0cc6e149d89832867093ab69a17194f08" +checksum = "c943259e342f1e06ff2da7a83eabdfe7f92ce10262688dbf1895ff0b3e6e4652" dependencies = [ "libc", ] @@ -2959,7 +2929,7 @@ dependencies = [ "libsecp256k1-core", "libsecp256k1-gen-ecmult", "libsecp256k1-gen-genmult", - "rand 0.8.5", + "rand 0.8.6", "serde", "sha2 0.9.9", "typenum", @@ -3002,9 +2972,9 @@ checksum = "32a66949e030da00e8c7d4434b251670a91556f4144941d37452769c25d58a53" [[package]] name = "litemap" -version = "0.8.1" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6373607a59f0be73a39b6fe456b8192fcc3585f602af20751600e974dd455e77" +checksum = "92daf443525c4cce67b150400bc2316076100ce0b3686209eb8cf3c31612e6f0" [[package]] name = "litrs" @@ -3053,9 +3023,9 @@ dependencies = [ [[package]] name = "memchr" -version = "2.8.0" +version = "2.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8ca58f447f06ed17d5fc4043ce1b10dd205e060fb3ce5b979b8ed8e59ff3f79" +checksum = "cf8baf1c55e62ffcace7a9f06f4bd9cd3f0c4beb022d3b367256b91b87513d98" [[package]] name = "memory-db" @@ -3092,9 +3062,9 @@ dependencies = [ [[package]] name = "mio" -version = "1.2.0" +version = "1.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50b7e5b27aa02a74bac8c3f23f448f8d87ff11f92d3aac1a6ed369ee08cc56c1" +checksum = "30d65c71f1ce40ab09135ce117d742b9f8a19ff91a41a8b57ed50bc2de59c427" dependencies = [ "libc", "wasi", @@ -3153,9 +3123,9 @@ dependencies = [ [[package]] name = "num-bigint" -version = "0.4.6" +version = "0.4.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" +checksum = "c89e69e7e0f03bea5ef08013795c25018e101932225a656383bd384495ecc367" dependencies = [ "num-integer", "num-traits", @@ -3172,9 +3142,9 @@ dependencies = [ [[package]] name = "num-conv" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6673768db2d862beb9b39a78fdcb1a69439615d5794a1be50caa9bc92c81967" +checksum = "521739c6d2bac4aa25192232afe6841231376b2b26d4d9fae5ecf8ca5772e441" [[package]] name = "num-format" @@ -3182,7 +3152,7 @@ version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a652d9771a63711fd3c3deb670acfbe5c30a4072e664d7a3bf5a9e1056ac72c3" dependencies = [ - "arrayvec 0.7.6", + "arrayvec 0.7.8", "itoa", ] @@ -3197,11 +3167,10 @@ dependencies = [ [[package]] name = "num-iter" -version = "0.1.45" +version = "0.1.46" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf" +checksum = "c92800bd69a1eac91786bcfe9da64a897eb72911b8dc3095decbd07429e8048b" dependencies = [ - "autocfg", "num-integer", "num-traits", ] @@ -3294,7 +3263,7 @@ dependencies = [ "p3-maybe-rayon", "p3-util", "paste", - "rand 0.9.4", + "rand 0.9.5", "serde", "tracing", ] @@ -3313,7 +3282,7 @@ dependencies = [ "p3-symmetric", "p3-util", "paste", - "rand 0.9.4", + "rand 0.9.5", "serde", ] @@ -3327,7 +3296,7 @@ dependencies = [ "p3-field", "p3-maybe-rayon", "p3-util", - "rand 0.9.4", + "rand 0.9.5", "serde", "tracing", "transpose", @@ -3349,7 +3318,7 @@ dependencies = [ "p3-field", "p3-symmetric", "p3-util", - "rand 0.9.4", + "rand 0.9.5", ] [[package]] @@ -3362,7 +3331,7 @@ dependencies = [ "p3-mds", "p3-symmetric", "p3-util", - "rand 0.9.4", + "rand 0.9.5", ] [[package]] @@ -3391,7 +3360,7 @@ version = "3.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "799781ae679d79a948e13d4824a40970bfa500058d245760dd857301059810fa" dependencies = [ - "arrayvec 0.7.6", + "arrayvec 0.7.8", "bitvec", "byte-slice-cast", "bytes", @@ -3411,7 +3380,7 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.119", ] [[package]] @@ -3487,22 +3456,22 @@ checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" [[package]] name = "pin-project" -version = "1.1.11" +version = "1.1.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1749c7ed4bcaf4c3d0a3efc28538844fb29bcdd7d2b67b2be7e20ba861ff517" +checksum = "2466b2336ed02bcdca6b294417127b90ec92038d1d5c4fbeac971a922e0e0924" dependencies = [ "pin-project-internal", ] [[package]] name = "pin-project-internal" -version = "1.1.11" +version = "1.1.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9b20ed30f105399776b9c883e68e536ef602a16ae6f596d2c473591d6ad64c6" +checksum = "c96395f0a926bc13b1c17622aaddda1ecb55d49c8f1bf9777e4d877800a43f8b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.119", ] [[package]] @@ -3511,12 +3480,6 @@ version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd" -[[package]] -name = "pin-utils" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" - [[package]] name = "piper" version = "0.2.5" @@ -3577,7 +3540,7 @@ dependencies = [ "polkavm-common", "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.119", ] [[package]] @@ -3587,7 +3550,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "581d34cafec741dc5ffafbb341933c205b6457f3d76257a9d99fb56687219c91" dependencies = [ "polkavm-derive-impl", - "syn 2.0.117", + "syn 2.0.119", ] [[package]] @@ -3629,15 +3592,15 @@ dependencies = [ [[package]] name = "portable-atomic" -version = "1.13.1" +version = "1.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c33a9471896f1c69cecef8d20cbe2f7accd12527ce60845ff44c153bb2a21b49" +checksum = "3d20d5497ef88037a52ff98267d066e7f11fcc5e99bbfbd58a42336193aacec3" [[package]] name = "potential_utf" -version = "0.1.4" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b73949432f5e2a09657003c25bca5e19a0e9c84f8058ca374f49e0ebe605af77" +checksum = "0103b1cef7ec0cf76490e969665504990193874ea05c85ff9bab8b911d0a0564" dependencies = [ "zerovec", ] @@ -3664,7 +3627,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b" dependencies = [ "proc-macro2", - "syn 2.0.117", + "syn 2.0.119", ] [[package]] @@ -3697,7 +3660,7 @@ version = "3.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e67ba7e9b2b56446f1d419b1d807906278ffa1a658a8a5d8a39dcb1f5a78614f" dependencies = [ - "toml_edit 0.25.8+spec-1.1.0", + "toml_edit 0.25.13+spec-1.1.0", ] [[package]] @@ -3719,14 +3682,14 @@ dependencies = [ "proc-macro-error-attr2", "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.119", ] [[package]] name = "proc-macro2" -version = "1.0.106" +version = "1.0.107" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934" +checksum = "985e7ec9bb745e6ce6535b544d84d6cd6f7ad8bd711c398938ae983b91a766d9" dependencies = [ "unicode-ident", ] @@ -3747,34 +3710,32 @@ dependencies = [ [[package]] name = "qp-dilithium-crypto" -version = "0.3.1" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "add1f1ae035a1c77d93ac6165caeaa07848a99760aa79ed7bde7720c1795e78e" +checksum = "0c08c0931c083cc461bd09795d528a0e4f34e6e4745e9bb52eadb3aad2e60469" dependencies = [ "log", "parity-scale-codec", - "qp-poseidon", - "qp-poseidon-core 1.5.0", + "qp-poseidon-core", "qp-rusty-crystals-dilithium", "qp-rusty-crystals-hdwallet", "scale-info", "sp-core", - "sp-io", "sp-runtime", - "thiserror 1.0.69", + "thiserror 2.0.18", ] [[package]] name = "qp-plonky2" -version = "1.5.1" +version = "1.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6db010db2fabb546251fa4c317e90a91a6a58bc96966d6685ba430228846479" +checksum = "ff530eb14bc9389c7c5dad8fc3b1a90a6a5784f34daf74a34b963a562b73b0d0" dependencies = [ "ahash", "anyhow", "critical-section", "hashbrown 0.14.5", - "itertools 0.11.0", + "itertools 0.13.0", "keccak-hash 0.8.0", "log", "num", @@ -3784,7 +3745,7 @@ dependencies = [ "qp-plonky2-core", "qp-plonky2-field", "qp-plonky2-verifier", - "qp-poseidon-core 2.1.0", + "qp-poseidon-core", "rand 0.10.1", "serde", "static_assertions", @@ -3794,14 +3755,14 @@ dependencies = [ [[package]] name = "qp-plonky2-core" -version = "1.5.1" +version = "1.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80dfd857190a8b36568a8be6c7cdcbd74e155993d23e610ef31e0b068ab744cf" +checksum = "7da3052436ca37dbb0540280e37846da1e826bd026745798853b6ffbb3b5e798" dependencies = [ "ahash", "anyhow", "hashbrown 0.14.5", - "itertools 0.11.0", + "itertools 0.13.0", "keccak-hash 0.8.0", "log", "num", @@ -3815,12 +3776,12 @@ dependencies = [ [[package]] name = "qp-plonky2-field" -version = "1.5.1" +version = "1.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aff3d551265f30da9325df10a0ed242e9051a9d860d033c6a1b1129171f725f1" +checksum = "518a71f954222caa0d87fd331254a1651b5ee09d8e21881899478b0a1c2cc42e" dependencies = [ "anyhow", - "itertools 0.11.0", + "itertools 0.13.0", "num", "plonky2_util", "rand 0.10.1", @@ -3832,15 +3793,15 @@ dependencies = [ [[package]] name = "qp-plonky2-verifier" -version = "1.5.1" +version = "1.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85ec868e56479bb8859275d0c300f06e7e8426a69829a31108ed0dde8471e7c1" +checksum = "f4d3c30ed97690849cf92eb0fdd1d4e6765ecc9e6be6b0a0e9b4dc4accb5145f" dependencies = [ "ahash", "anyhow", "critical-section", "hashbrown 0.14.5", - "itertools 0.11.0", + "itertools 0.13.0", "keccak-hash 0.8.0", "log", "num", @@ -3848,32 +3809,12 @@ dependencies = [ "plonky2_util", "qp-plonky2-core", "qp-plonky2-field", - "qp-poseidon-core 2.1.0", + "qp-poseidon-core", "serde", "static_assertions", "unroll", ] -[[package]] -name = "qp-poseidon" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6edc2f8ae69b5424cb407b9f4037f02910bedbd39e761d58f583d1d375d42d8f" -dependencies = [ - "log", - "p3-field", - "p3-goldilocks", - "parity-scale-codec", - "qp-poseidon-constants", - "qp-poseidon-core 1.5.0", - "scale-info", - "serde", - "sp-core", - "sp-runtime", - "sp-storage", - "sp-trie", -] - [[package]] name = "qp-poseidon-constants" version = "1.1.0" @@ -3883,64 +3824,51 @@ dependencies = [ "p3-field", "p3-goldilocks", "p3-poseidon2", - "rand 0.9.4", + "rand 0.9.5", "rand_chacha 0.9.0", ] [[package]] name = "qp-poseidon-core" -version = "1.5.0" +version = "3.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3117d3df79617ee2eb4d4576d2f76f6dbc9bf3f466d4477d188ee89acbd7b07" -dependencies = [ - "p3-field", - "p3-goldilocks", - "p3-poseidon2", - "p3-symmetric", - "qp-poseidon-constants", - "rand_chacha 0.9.0", -] - -[[package]] -name = "qp-poseidon-core" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78172860cd960773c72e97fba07ead9e5a1c13086c5746283744933e2e4a577b" +checksum = "55e32db7b3a5d70086f82f198ecfc021f17cb7ec70a416512dba3488f4a116c1" [[package]] name = "qp-rusty-crystals-dilithium" -version = "2.5.0" +version = "3.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6c16ed4031406f6d8ff14a4822a35f766b62617324c75931db7df8c3631a701" +checksum = "e0f6eb664c03395b3892f7f18d4f08bff0e256a967bb0146598a0f771d5e99ba" dependencies = [ "zeroize", ] [[package]] name = "qp-rusty-crystals-hdwallet" -version = "2.4.0" +version = "3.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2e068be8021f2bebbabeab77ee9107a359d6e537397323ae92aae8178922fab" +checksum = "7a9a9d975e8bfa2b6726f9668f32bd134a2556ccf65f4d336fed941658e4db67" dependencies = [ "bip39", "getrandom 0.2.17", "hex", "hex-literal", "hmac 0.12.1", - "qp-poseidon-core 2.1.0", + "qp-poseidon-core", "qp-rusty-crystals-dilithium", "serde", "serde_json", "sha2 0.10.9", "thiserror 2.0.18", + "unicode-normalization", "zeroize", ] [[package]] name = "qp-wormhole-aggregator" -version = "3.0.0" +version = "3.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9cd1dd3efde4e405a1d7c44852cee799fce30d82f0741c0b5c2b3ec024e3ae9" +checksum = "b6c3fb3ef7ce2fe519cab6f10e206bbbace8e3c7739318e1cfbe1eb16779a51d" dependencies = [ "anyhow", "hex", @@ -3949,7 +3877,7 @@ dependencies = [ "qp-wormhole-inputs", "qp-wormhole-prover", "qp-zk-circuits-common", - "rand 0.8.5", + "rand 0.8.6", "rayon", "serde", "serde_json", @@ -3957,9 +3885,9 @@ dependencies = [ [[package]] name = "qp-wormhole-circuit" -version = "3.0.0" +version = "3.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8c616ca2d392b3701fdd97982c3b894e272245b751e4e669fac7bf6aa4cd977" +checksum = "da895295e488eae1d5fbf63a94ccf388e580595b5607ef51b3e057ac0bef0539" dependencies = [ "anyhow", "hex", @@ -3970,9 +3898,9 @@ dependencies = [ [[package]] name = "qp-wormhole-circuit-builder" -version = "3.0.0" +version = "3.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dedb083e6b1567354837930881e7bead77c84973422707c0604ed1234f12b1fd" +checksum = "a65d2f36b1f6903679180d0a2cfb5a4147960229b8b74034779f0a9f4644930d" dependencies = [ "anyhow", "clap", @@ -3984,18 +3912,18 @@ dependencies = [ [[package]] name = "qp-wormhole-inputs" -version = "3.0.0" +version = "3.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6416e8b025382d5bc00d1418ca28a25c15f1fdfe351f793e83f6aae16b8ad2bf" +checksum = "06b7675995701fc2c229846055fcfdb860ea1118c46437357f3cf6f7c15b73aa" dependencies = [ "anyhow", ] [[package]] name = "qp-wormhole-prover" -version = "3.0.0" +version = "3.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "167337f6e3d65e6b67cace22f72537a86ee061b9880dc7fe6e5b617d33ad279b" +checksum = "f105bc62dbab0b4573ef43d4a7c87e6482ea2b7c8b99f18a1b3240c22956fb7f" dependencies = [ "anyhow", "qp-plonky2", @@ -4005,27 +3933,28 @@ dependencies = [ [[package]] name = "qp-wormhole-verifier" -version = "3.0.0" +version = "3.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce89292e75e323ad792d169c5c725a2b534b4b6ca6108400d1649b2c972681ff" +checksum = "474cfd8ae4cd3f76d23867378723f642844368f9d6e0812b3b1df66aa247e24c" dependencies = [ "anyhow", "qp-plonky2-verifier", "qp-wormhole-inputs", + "tiny-keccak", ] [[package]] name = "qp-zk-circuits-common" -version = "3.0.0" +version = "3.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39bb72c67529758341ab094f7b6576379c5d704992df254d09282e9a99eec856" +checksum = "3ac5d2eb980e702b7db1458601fbb7a2d5fc86c6713c5c324ecc0e28061fa955" dependencies = [ "anyhow", "qp-plonky2", "qp-poseidon-constants", - "qp-poseidon-core 2.1.0", + "qp-poseidon-core", "qp-wormhole-inputs", - "rand 0.8.5", + "rand 0.8.6", "serde", ] @@ -4048,7 +3977,8 @@ dependencies = [ "parity-scale-codec", "qp-dilithium-crypto", "qp-plonky2", - "qp-poseidon-core 2.1.0", + "qp-plonky2-verifier", + "qp-poseidon-core", "qp-rusty-crystals-dilithium", "qp-rusty-crystals-hdwallet", "qp-wormhole-aggregator", @@ -4059,7 +3989,7 @@ dependencies = [ "qp-wormhole-verifier", "qp-zk-circuits-common", "quinn-proto", - "rand 0.9.4", + "rand 0.9.5", "reqwest", "rpassword", "rustls-webpki", @@ -4089,9 +4019,9 @@ dependencies = [ [[package]] name = "quinn" -version = "0.11.9" +version = "0.11.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9e20a958963c291dc322d98411f541009df2ced7b5a4f2bd52337638cfccf20" +checksum = "0c1a41e437b6bbd489372cd4971de128e85c855f56c57f283d20ff016cf7c0a8" dependencies = [ "bytes", "cfg_aliases", @@ -4109,15 +4039,16 @@ dependencies = [ [[package]] name = "quinn-proto" -version = "0.11.14" +version = "0.11.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "434b42fec591c96ef50e21e886936e66d3cc3f737104fdb9b737c40ffb94c098" +checksum = "2f4bfc015262b9df63c8845072ce59068853ff5872180c2ce2f13038b970e560" dependencies = [ "bytes", "fastbloom", - "getrandom 0.3.4", + "getrandom 0.4.3", "lru-slab", - "rand 0.9.4", + "rand 0.10.1", + "rand_pcg", "ring", "rustc-hash", "rustls", @@ -4131,23 +4062,23 @@ dependencies = [ [[package]] name = "quinn-udp" -version = "0.5.14" +version = "0.5.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "addec6a0dcad8a8d96a771f815f0eaf55f9d1805756410b39f5fa81332574cbd" +checksum = "35a133f956daabe89a61a685c2649f13d82d5aa4bd5d12d1277e1072a21c0694" dependencies = [ "cfg_aliases", "libc", "once_cell", "socket2", "tracing", - "windows-sys 0.60.2", + "windows-sys 0.61.2", ] [[package]] name = "quote" -version = "1.0.45" +version = "1.0.47" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41f2619966050689382d2b44f664f4bc593e129785a36d6ee376ddf37259b924" +checksum = "1fbf4db142a473a8d80c26bbf18454ed458bf8d26c8219c331daecfdbd079001" dependencies = [ "proc-macro2", ] @@ -4172,9 +4103,9 @@ checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" [[package]] name = "rand" -version = "0.8.5" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +checksum = "5ca0ecfa931c29007047d1bc58e623ab12e5590e8c7cc53200d5202b69266d8a" dependencies = [ "libc", "rand_chacha 0.3.1", @@ -4183,9 +4114,9 @@ dependencies = [ [[package]] name = "rand" -version = "0.9.4" +version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44c5af06bb1b7d3216d91932aed5265164bf384dc89cd6ba05cf59a35f5f76ea" +checksum = "b9ef1d0d795eb7d84685bca4f72f3649f064e6641543d3a8c415898726a57b41" dependencies = [ "rand_chacha 0.9.0", "rand_core 0.9.5", @@ -4197,8 +4128,8 @@ version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d2e8e8bcc7961af1fdac401278c6a831614941f6164ee3bf4ce61b7edb162207" dependencies = [ - "chacha20 0.10.0", - "getrandom 0.4.2", + "chacha20 0.10.1", + "getrandom 0.4.3", "rand_core 0.10.1", ] @@ -4246,11 +4177,20 @@ version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "63b8176103e19a2643978565ca18b50549f6101881c443590420e4dc998a3c69" +[[package]] +name = "rand_pcg" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "caa0f4137e1c0a72f4c651489402276c8e8e1cf081f3b0ba156d2cbeef09e86a" +dependencies = [ + "rand_core 0.10.1", +] + [[package]] name = "rayon" -version = "1.11.0" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "368f01d005bf8fd9b1206fb6fa653e6c4a81ceb1466406b81792d87c5677a58f" +checksum = "fb39b166781f92d482534ef4b4b1b2568f42613b53e5b6c160e24cfbfa30926d" dependencies = [ "either", "rayon-core", @@ -4272,7 +4212,7 @@ version = "0.5.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.13.1", ] [[package]] @@ -4288,29 +4228,29 @@ dependencies = [ [[package]] name = "ref-cast" -version = "1.0.25" +version = "1.0.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f354300ae66f76f1c85c5f84693f0ce81d747e2c3f21a45fef496d89c960bf7d" +checksum = "216e8f773d7923bcba9ceb86a86c93cabb3903a11872fc3f138c49630e50b96d" dependencies = [ "ref-cast-impl", ] [[package]] name = "ref-cast-impl" -version = "1.0.25" +version = "1.0.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7186006dcb21920990093f30e3dea63b7d6e977bf1256be20c3563a5db070da" +checksum = "2c9283685feec7d69af75fb0e858d5e7378f33fe4fc699383b2916ab9273e03c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 3.0.3", ] [[package]] name = "regex" -version = "1.12.3" +version = "1.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e10754a14b9137dd7b1e3e5b0493cc9171fdd105e0ab477f51b72e7f3ac0e276" +checksum = "f020237b6c8eed93db2e2cb53c00c60a8e1bc73da7d073199a1180401450218d" dependencies = [ "aho-corasick", "memchr", @@ -4320,9 +4260,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.14" +version = "0.4.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e1dd4122fc1595e8162618945476892eefca7b88c52820e74af6262213cae8f" +checksum = "8fcfdb36bda0c880c5931cdc7a2bcdc8ba4556847b9d912bca70bc94708711ad" dependencies = [ "aho-corasick", "memchr", @@ -4331,9 +4271,9 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.8.10" +version = "0.8.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc897dd8d9e8bd1ed8cdad82b5966c3e0ecae09fb1907d58efaa013543185d0a" +checksum = "d6f6ff9a378485b298a5286656da665ba74413d36db0979633275d2e708145d4" [[package]] name = "reqwest" @@ -4402,36 +4342,36 @@ dependencies = [ [[package]] name = "rpassword" -version = "7.4.0" +version = "7.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "66d4c8b64f049c6721ec8ccec37ddfc3d641c4a7fca57e8f2a89de509c73df39" +checksum = "2da316a15f47e3d053de9cb2c439650bd8fa4aaeb9365f2e5f27f492ff73c196" dependencies = [ "libc", "rtoolbox", - "windows-sys 0.59.0", + "windows-sys 0.61.2", ] [[package]] name = "rtoolbox" -version = "0.0.3" +version = "0.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7cc970b249fbe527d6e02e0a227762c9108b2f49d81094fe357ffc6d14d7f6f" +checksum = "50a0e551c1e27e1731aba276dbeaeac73f53c7cd34d1bda485d02bd1e0f36844" dependencies = [ "libc", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] name = "rustc-demangle" -version = "0.1.27" +version = "0.1.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b50b8869d9fc858ce7266cce0194bd74df58b9d0e3f6df3a9fc8eb470d95c09d" +checksum = "b74b56ffa8bb2830709a538c2cbcae9aa062db0d2a42563bfb09bdaae44020eb" [[package]] name = "rustc-hash" -version = "2.1.2" +version = "2.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94300abf3f1ae2e2b8ffb7b58043de3d399c73fa6f4b73826402a5c457614dbe" +checksum = "6b1e7f9a428571be2dc5bc0505c13fb6bf936822b894ec87abf8a08a4e51742d" [[package]] name = "rustc-hex" @@ -4454,7 +4394,7 @@ version = "1.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b6fe4565b9518b83ef4f91bb47ce29620ca828bd32cb7e408f0062e9930ba190" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.13.1", "errno", "libc", "linux-raw-sys", @@ -4463,9 +4403,9 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.37" +version = "0.23.42" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "758025cb5fccfd3bc2fd74708fd4682be41d99e5dff73c377c0646c6012c73a4" +checksum = "3c54fcab019b409d04215d3a17cb438fd7fbf192ee61461f20f4fe18704bc138" dependencies = [ "log", "once_cell", @@ -4478,9 +4418,9 @@ dependencies = [ [[package]] name = "rustls-native-certs" -version = "0.8.3" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "612460d5f7bea540c490b2b6395d8e34a953e52b491accd6c86c8164c5932a63" +checksum = "dab5152771c58876a2146916e53e35057e1a4dfa2b9df0f0305b07f611fdea4d" dependencies = [ "openssl-probe", "rustls-pki-types", @@ -4490,9 +4430,9 @@ dependencies = [ [[package]] name = "rustls-pki-types" -version = "1.14.0" +version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be040f8b0a225e40375822a563fa9524378b9d63112f53e19ffff34df5d33fdd" +checksum = "764899a24af3980067ee14bc143654f297b22eaebfe3c7b6b211920a5a59b046" dependencies = [ "web-time", "zeroize", @@ -4538,15 +4478,15 @@ dependencies = [ [[package]] name = "rustversion" -version = "1.0.22" +version = "1.0.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" +checksum = "cf54715a573b99ac80df0bc206da022bcd442c974952c7b9720069370852e21f" [[package]] name = "ruzstd" -version = "0.8.2" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5ff0cc5e135c8870a775d3320910cd9b564ec036b4dc0b8741629020be63f01" +checksum = "a7c1c839d570d835527c9a5e4db7cb2198683a988cb9d7293fc8674e6bd58fc8" [[package]] name = "ryu" @@ -4599,7 +4539,7 @@ dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.119", ] [[package]] @@ -4627,7 +4567,7 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.119", ] [[package]] @@ -4653,7 +4593,7 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.119", ] [[package]] @@ -4675,7 +4615,7 @@ dependencies = [ "proc-macro2", "quote", "scale-info", - "syn 2.0.117", + "syn 2.0.119", "thiserror 2.0.18", ] @@ -4698,15 +4638,6 @@ dependencies = [ "yap", ] -[[package]] -name = "scc" -version = "2.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46e6f046b7fef48e2660c57ed794263155d713de679057f2d0c169bfc6e756cc" -dependencies = [ - "sdd", -] - [[package]] name = "schannel" version = "0.1.29" @@ -4735,7 +4666,7 @@ checksum = "6e9fcb6c2e176e86ec703e22560d99d65a5ee9056ae45a08e13e84ebf796296f" dependencies = [ "aead", "arrayref", - "arrayvec 0.7.6", + "arrayvec 0.7.8", "curve25519-dalek", "getrandom_or_panic", "merlin", @@ -4752,12 +4683,6 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" -[[package]] -name = "sdd" -version = "3.0.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "490dcfcbfef26be6800d11870ff2df8774fa6e86d047e3e8c8a76b25655e41ca" - [[package]] name = "sec1" version = "0.7.3" @@ -4806,7 +4731,7 @@ version = "3.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b7f4bc775c73d9a02cde8bf7b2ec4c9d12743edf609006c7facc23998404cd1d" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.13.1", "core-foundation", "core-foundation-sys", "libc", @@ -4862,15 +4787,15 @@ dependencies = [ [[package]] name = "semver" -version = "1.0.27" +version = "1.0.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2" +checksum = "8a7852d02fc848982e0c167ef163aaff9cd91dc640ba85e263cb1ce46fae51cd" [[package]] name = "send_wrapper" -version = "0.4.0" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f638d531eccd6e23b980caf34876660d38e265409d8e99b397ab71eb3612fad0" +checksum = "cd0b0ec5f1c1ca621c432a25813d8d60c88abe6d3e08a3eb9cf37d97a0fe3d73" [[package]] name = "serde" @@ -4909,14 +4834,14 @@ checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.119", ] [[package]] name = "serde_json" -version = "1.0.149" +version = "1.0.150" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83fc039473c5595ace860d8c4fafa220ff474b3fc6bfdb4293327f1a37e94d86" +checksum = "e8014e44b4736ed0538adeecded0fce2a272f22dc9578a7eb6b2d9993c74cfb9" dependencies = [ "itoa", "memchr", @@ -4936,9 +4861,9 @@ dependencies = [ [[package]] name = "serde_spanned" -version = "1.1.0" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "876ac351060d4f882bb1032b6369eb0aef79ad9df1ea8bc404874d8cc3d0cd98" +checksum = "6662b5879511e06e8999a8a235d848113e942c9124f211511b16466ee2995f26" dependencies = [ "serde_core", ] @@ -4967,35 +4892,34 @@ dependencies = [ [[package]] name = "serial_test" -version = "3.4.0" +version = "3.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "911bd979bf1070a3f3aa7b691a3b3e9968f339ceeec89e08c280a8a22207a32f" +checksum = "699f4197115b8a7e7ff19c9a315a4bd6fffec26cc4626ef45ecaea389e081c6d" dependencies = [ "futures-executor", "futures-util", "log", "once_cell", "parking_lot", - "scc", "serial_test_derive", ] [[package]] name = "serial_test_derive" -version = "3.4.0" +version = "3.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a7d91949b85b0d2fb687445e448b40d322b6b3e4af6b44a29b21d9a5f33e6d9" +checksum = "94e153fc76e1c6a068703d6d29c508a0b15c061c4b7e43da59cc097bc342673c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.119", ] [[package]] name = "sha1" -version = "0.10.6" +version = "0.10.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" +checksum = "a978451301f4db1d02937a4ab3ccce137717b81826e79b7d49ffe3244a13c3b8" dependencies = [ "cfg-if", "cpufeatures 0.2.17", @@ -5028,9 +4952,9 @@ dependencies = [ [[package]] name = "sha3" -version = "0.10.8" +version = "0.10.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75872d278a8f37ef87fa0ddbda7802605cb18344497949862c0d4dcb291eba60" +checksum = "77fd7028345d415a4034cf8777cd4f8ab1851274233b45f84e3d955502d93874" dependencies = [ "digest 0.10.7", "keccak", @@ -5047,9 +4971,9 @@ dependencies = [ [[package]] name = "shlex" -version = "1.3.0" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" +checksum = "f8fadd59c855ef2080decdef8ff161eb6661b86933c9d82e5ba29dc602a55aba" [[package]] name = "signal-hook-registry" @@ -5073,9 +4997,9 @@ dependencies = [ [[package]] name = "simd-adler32" -version = "0.3.9" +version = "0.3.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "703d5c7ef118737c72f1af64ad2f6f8c5e1921f818cdcb97b8fe6fc69bf66214" +checksum = "3a219298ac11a56ea9a6d2120044824d6f01aeb034955e7af7bc16858527deea" [[package]] name = "simple-mermaid" @@ -5085,9 +5009,9 @@ checksum = "620a1d43d70e142b1d46a929af51d44f383db9c7a2ec122de2cd992ccfcf3c18" [[package]] name = "siphasher" -version = "1.0.2" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2aa850e253778c88a04c3d7323b043aeda9d3e30d5971937c1855769763678e" +checksum = "8ee5873ec9cce0195efcb7a4e9507a04cd49aec9c83d0389df45b1ef7ba2e649" [[package]] name = "slab" @@ -5097,9 +5021,9 @@ checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5" [[package]] name = "smallvec" -version = "1.15.1" +version = "1.15.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" +checksum = "8ed6a63f02c8539c91a8685a86f4099661ba3da017932f6ebbea6de3f0fa7c90" [[package]] name = "smol" @@ -5124,7 +5048,7 @@ version = "0.19.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e16e5723359f0048bf64bfdfba64e5732a56847d42c4fd3fe56f18280c813413" dependencies = [ - "arrayvec 0.7.6", + "arrayvec 0.7.8", "async-lock", "atomic-take", "base64", @@ -5154,7 +5078,7 @@ dependencies = [ "pbkdf2", "pin-project", "poly1305", - "rand 0.8.5", + "rand 0.8.6", "rand_chacha 0.3.1", "ruzstd", "schnorrkel", @@ -5166,7 +5090,7 @@ dependencies = [ "slab", "smallvec", "soketto", - "twox-hash 2.1.2", + "twox-hash 2.1.3", "wasmi", "x25519-dalek", "zeroize", @@ -5197,7 +5121,7 @@ dependencies = [ "lru", "parking_lot", "pin-project", - "rand 0.8.5", + "rand 0.8.6", "rand_chacha 0.3.1", "serde", "serde_json", @@ -5210,9 +5134,9 @@ dependencies = [ [[package]] name = "socket2" -version = "0.6.3" +version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a766e1110788c36f4fa1c2b71b387a7815aa65f88ce0229841826633d93723e" +checksum = "c3d1e2c7f27f8d4cb10542a02c49005dbd6e93095799d6f3be745fae9f8fedd4" dependencies = [ "libc", "windows-sys 0.61.2", @@ -5240,7 +5164,7 @@ dependencies = [ "futures", "httparse", "log", - "rand 0.8.5", + "rand 0.8.6", "sha1", ] @@ -5300,7 +5224,7 @@ dependencies = [ "parking_lot", "paste", "primitive-types 0.13.1", - "rand 0.8.5", + "rand 0.8.6", "scale-info", "schnorrkel", "secp256k1", @@ -5342,7 +5266,7 @@ checksum = "48d09fa0a5f7299fb81ee25ae3853d26200f7a348148aed6de76be905c007dbe" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.119", ] [[package]] @@ -5421,7 +5345,7 @@ dependencies = [ "num-traits", "parity-scale-codec", "paste", - "rand 0.8.5", + "rand 0.8.6", "scale-info", "serde", "simple-mermaid", @@ -5467,7 +5391,7 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.119", ] [[package]] @@ -5480,7 +5404,7 @@ dependencies = [ "log", "parity-scale-codec", "parking_lot", - "rand 0.8.5", + "rand 0.8.6", "smallvec", "sp-core", "sp-externalities", @@ -5537,7 +5461,7 @@ dependencies = [ "nohash-hasher", "parity-scale-codec", "parking_lot", - "rand 0.8.5", + "rand 0.8.6", "scale-info", "schnellru", "sp-core", @@ -5578,9 +5502,9 @@ dependencies = [ [[package]] name = "spin" -version = "0.9.8" +version = "0.9.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" +checksum = "3763264f6b73151db08c50ff20d7d8a0b8796e021cdea7ceedad07b80155fa0e" [[package]] name = "spki" @@ -5650,7 +5574,7 @@ dependencies = [ "proc-macro2", "quote", "rustversion", - "syn 2.0.117", + "syn 2.0.119", ] [[package]] @@ -5737,7 +5661,7 @@ dependencies = [ "scale-info", "scale-typegen", "subxt-metadata", - "syn 2.0.117", + "syn 2.0.119", "thiserror 2.0.18", ] @@ -5802,7 +5726,7 @@ dependencies = [ "subxt-codegen", "subxt-metadata", "subxt-utils-fetchmetadata", - "syn 2.0.117", + "syn 2.0.119", ] [[package]] @@ -5868,9 +5792,20 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.117" +version = "2.0.119" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e665b8803e7b1d2a727f4023456bbbbe74da67099c585258af0ad9c5013b9b99" +checksum = "872831b642d1a07999a962a351ed35b955ea2cfc8f3862091e2a240a84f17297" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "3.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53e9bae58849f64dfa4f5d5ae372c8341f7305f82a3868709269343628b659a3" dependencies = [ "proc-macro2", "quote", @@ -5894,7 +5829,7 @@ checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.119", ] [[package]] @@ -5921,7 +5856,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32497e9a4c7b38532efcdebeef879707aa9f794296a4f0244f6f69e9bc8574bd" dependencies = [ "fastrand", - "getrandom 0.4.2", + "getrandom 0.4.3", "once_cell", "rustix", "windows-sys 0.61.2", @@ -5962,7 +5897,7 @@ checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.119", ] [[package]] @@ -5973,26 +5908,25 @@ checksum = "ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.119", ] [[package]] name = "thread_local" -version = "1.1.9" +version = "1.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f60246a4944f24f6e018aa17cdeffb7818b76356965d03b07d6a9886e8962185" +checksum = "1ad99c4c6d32803332c548b1af0540b357b3f5fc0be8f6c6bfe8b2e6ae784070" dependencies = [ "cfg-if", ] [[package]] name = "time" -version = "0.3.47" +version = "0.3.54" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "743bd48c283afc0388f9b8827b976905fb217ad9e647fae3a379a9283c4def2c" +checksum = "3e1d5e639ff6bab73cb6885cc7e7b1de96c3f32c68ec55f3952614bec1092244" dependencies = [ "deranged", - "itoa", "num-conv", "powerfmt", "serde_core", @@ -6002,15 +5936,15 @@ dependencies = [ [[package]] name = "time-core" -version = "0.1.8" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7694e1cfe791f8d31026952abf09c69ca6f6fa4e1a1229e18988f06a04a12dca" +checksum = "9e1c906769ad99c88eaa54e728060edef082f8e358ff32030cb7c7d315e81109" [[package]] name = "time-macros" -version = "0.2.27" +version = "0.2.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e70e4c5a0e0a8a4823ad65dfe1a6930e4f4d756dcd9dd7939022b5e8c501215" +checksum = "7e689342a48d2ea927c87ea50cabf8594854bf940e9310208848d680d668ed85" dependencies = [ "num-conv", "time-core", @@ -6027,9 +5961,9 @@ dependencies = [ [[package]] name = "tinystr" -version = "0.8.2" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42d3e9c45c09de15d06dd8acf5f4e0e399e85927b7f00711024eb7ae10fa4869" +checksum = "c8323304221c2a851516f22236c5722a72eaa19749016521d6dff0824447d96d" dependencies = [ "displaydoc", "zerovec", @@ -6037,9 +5971,9 @@ dependencies = [ [[package]] name = "tinyvec" -version = "1.11.0" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e61e67053d25a4e82c844e8424039d9745781b3fc4f32b8d55ed50f5f667ef3" +checksum = "bb4ebadaa0af04fab11ae01eb5f9fdb5f9c5b875506e210e71c07873528baa7f" dependencies = [ "tinyvec_macros", ] @@ -6052,9 +5986,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.50.0" +version = "1.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "27ad5e34374e03cfffefc301becb44e9dc3c17584f414349ebe29ed26661822d" +checksum = "202caea871b69668250d242070849eb495be178ed697a3e98aebce5bc81a0bed" dependencies = [ "bytes", "libc", @@ -6069,13 +6003,13 @@ dependencies = [ [[package]] name = "tokio-macros" -version = "2.6.1" +version = "2.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c55a2eff8b69ce66c84f85e1da1c233edc36ceb85a2058d11b0d6a3c7e7569c" +checksum = "6328af13490e73a9b4694030fafd93f8c8c6a9dede33e821c3fc63eddf8042ba" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.119", ] [[package]] @@ -6090,9 +6024,9 @@ dependencies = [ [[package]] name = "tokio-stream" -version = "0.1.18" +version = "0.1.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32da49809aab5c3bc678af03902d4ccddea2a87d028d86392a4b1560c6906c70" +checksum = "a3d06f0b082ba57c26b79407372e57cf2a1e28124f78e9479fe80322cf53420b" dependencies = [ "futures-core", "pin-project-lite", @@ -6101,14 +6035,15 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.7.18" +version = "0.7.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ae9cec805b01e8fc3fd2fe289f89149a9b66dd16786abd8b19cfa7b48cb0098" +checksum = "494815d09bf52b5548659851081238f0ca39ff638363907596da739561c62c52" dependencies = [ "bytes", "futures-core", "futures-io", "futures-sink", + "libc", "pin-project-lite", "tokio", ] @@ -6133,7 +6068,7 @@ checksum = "cf92845e79fc2e2def6a5d828f0801e29a2f8acc037becc5ab08595c7d5e9863" dependencies = [ "indexmap", "serde_core", - "serde_spanned 1.1.0", + "serde_spanned 1.1.1", "toml_datetime 0.7.5+spec-1.1.0", "toml_parser", "toml_writer", @@ -6160,9 +6095,9 @@ dependencies = [ [[package]] name = "toml_datetime" -version = "1.1.0+spec-1.1.0" +version = "1.1.1+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97251a7c317e03ad83774a8752a7e81fb6067740609f75ea2b585b569a59198f" +checksum = "3165f65f62e28e0115a00b2ebdd37eb6f3b641855f9d636d3cd4103767159ad7" dependencies = [ "serde_core", ] @@ -6183,23 +6118,23 @@ dependencies = [ [[package]] name = "toml_edit" -version = "0.25.8+spec-1.1.0" +version = "0.25.13+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16bff38f1d86c47f9ff0647e6838d7bb362522bdf44006c7068c2b1e606f1f3c" +checksum = "6975367e4d2ef766d86af01ffad14b622fecc8d4357a998fbc4deb6e9bacaf9b" dependencies = [ "indexmap", - "toml_datetime 1.1.0+spec-1.1.0", + "toml_datetime 1.1.1+spec-1.1.0", "toml_parser", - "winnow 1.0.0", + "winnow 1.0.4", ] [[package]] name = "toml_parser" -version = "1.1.0+spec-1.1.0" +version = "1.1.2+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2334f11ee363607eb04df9b8fc8a13ca1715a72ba8662a26ac285c98aabb4011" +checksum = "a2abe9b86193656635d2411dc43050282ca48aa31c2451210f4202550afb7526" dependencies = [ - "winnow 1.0.0", + "winnow 1.0.4", ] [[package]] @@ -6210,9 +6145,9 @@ checksum = "5d99f8c9a7727884afe522e9bd5edbfc91a3312b36a77b5fb8926e4c31a41801" [[package]] name = "toml_writer" -version = "1.1.0+spec-1.1.0" +version = "1.1.2+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d282ade6016312faf3e41e57ebbba0c073e4056dab1232ab1cb624199648f8ed" +checksum = "7d56353a2a665ad0f41a421187180aab746c8c325620617ad883a99a1cbe66d2" [[package]] name = "tower" @@ -6246,20 +6181,20 @@ dependencies = [ [[package]] name = "tower-http" -version = "0.6.8" +version = "0.6.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4e6559d53cc268e5031cd8429d05415bc4cb4aefc4aa5d6cc35fbf5b924a1f8" +checksum = "4cfcf7e2740e6fc6d4d688b4ef00650406bb94adf4731e43c096c3a19fe40840" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.13.1", "bytes", "futures-util", "http", "http-body", - "iri-string", "pin-project-lite", "tower 0.5.3", "tower-layer", "tower-service", + "url", ] [[package]] @@ -6294,7 +6229,7 @@ checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.119", ] [[package]] @@ -6349,9 +6284,9 @@ dependencies = [ [[package]] name = "trie-db" -version = "0.30.0" +version = "0.30.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c0670ab45a6b7002c7df369fee950a27cf29ae0474343fd3a15aa15f691e7a6" +checksum = "8768a658aaeca3b992933ee361e32f9e555f8056e7071d2a33e83c77b4db2df6" dependencies = [ "hash-db", "log", @@ -6388,21 +6323,21 @@ checksum = "97fee6b57c6a41524a810daee9286c02d7752c4253064d0b05472833a438f675" dependencies = [ "cfg-if", "digest 0.10.7", - "rand 0.8.5", + "rand 0.8.6", "static_assertions", ] [[package]] name = "twox-hash" -version = "2.1.2" +version = "2.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ea3136b675547379c4bd395ca6b938e5ad3c3d20fad76e7fe85f9e0d011419c" +checksum = "8464ec13c3691491391d9fce00f6416c9a48e46972f72d7865688be2080192c9" [[package]] name = "typenum" -version = "1.19.0" +version = "1.20.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb" +checksum = "b6f5e870be6c3b371b77fe0ee0bafb859fa4964b4404c27de1d380043c4dda20" [[package]] name = "uint" @@ -6445,9 +6380,9 @@ dependencies = [ [[package]] name = "unicode-segmentation" -version = "1.13.2" +version = "1.13.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9629274872b2bfaf8d66f5f15725007f635594914870f65218920345aa11aa8c" +checksum = "c6f5d3c3b1bf09027a88a6bc961fc00497d651009560b5463668dc81b0fa87a8" [[package]] name = "unicode-width" @@ -6589,7 +6524,7 @@ dependencies = [ "ark-serialize-derive 0.4.2", "arrayref", "digest 0.10.7", - "rand 0.8.5", + "rand 0.8.6", "rand_chacha 0.3.1", "rand_core 0.6.4", "sha2 0.10.9", @@ -6670,27 +6605,18 @@ checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" [[package]] name = "wasip2" -version = "1.0.2+wasi-0.2.9" +version = "1.0.4+wasi-0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9517f9239f02c069db75e65f174b3da828fe5f5b945c4dd26bd25d89c03ebcf5" -dependencies = [ - "wit-bindgen", -] - -[[package]] -name = "wasip3" -version = "0.4.0+wasi-0.3.0-rc-2026-01-06" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5428f8bf88ea5ddc08faddef2ac4a67e390b88186c703ce6dbd955e1c145aca5" +checksum = "b67efb37e106e55ce722a510d6b5f9c17f083e5fc79afc2badeb12cc313d9487" dependencies = [ "wit-bindgen", ] [[package]] name = "wasm-bindgen" -version = "0.2.115" +version = "0.2.126" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6523d69017b7633e396a89c5efab138161ed5aafcbc8d3e5c5a42ae38f50495a" +checksum = "4b067c0c11094aef6b7a801c1e34a26affafdf3d051dba08456b868789aaf9a4" dependencies = [ "cfg-if", "once_cell", @@ -6701,9 +6627,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-futures" -version = "0.4.65" +version = "0.4.76" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d1faf851e778dfa54db7cd438b70758eba9755cb47403f3496edd7c8fc212f0" +checksum = "c62df1340f32221cb9c54d6a27b030e3dba64361d4a95bed55f9aacb44da291d" dependencies = [ "js-sys", "wasm-bindgen", @@ -6711,9 +6637,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.115" +version = "0.2.126" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e3a6c758eb2f701ed3d052ff5737f5bfe6614326ea7f3bbac7156192dc32e67" +checksum = "167ce5e579f6bcf889c4f7175a8a5a585de84e8ff93976ce393efa5f2837aab1" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -6721,62 +6647,40 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.115" +version = "0.2.126" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "921de2737904886b52bcbb237301552d05969a6f9c40d261eb0533c8b055fedf" +checksum = "f3997c7839262f4ef12cf90b818d6340c18e80f263f1a94bf157d0ec4420380e" dependencies = [ "bumpalo", "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.119", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.115" +version = "0.2.126" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a93e946af942b58934c604527337bad9ae33ba1d5c6900bbb41c2c07c2364a93" +checksum = "dc1b4cb0cc549fcf58d7dfc081778139b3d283a081644e833e84682ad71cea24" dependencies = [ "unicode-ident", ] -[[package]] -name = "wasm-encoder" -version = "0.244.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "990065f2fe63003fe337b932cfb5e3b80e0b4d0f5ff650e6985b1048f62c8319" -dependencies = [ - "leb128fmt", - "wasmparser 0.244.0", -] - -[[package]] -name = "wasm-metadata" -version = "0.244.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb0e353e6a2fbdc176932bbaab493762eb1255a7900fe0fea1a2f96c296cc909" -dependencies = [ - "anyhow", - "indexmap", - "wasm-encoder", - "wasmparser 0.244.0", -] - [[package]] name = "wasmi" version = "0.40.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a19af97fcb96045dd1d6b4d23e2b4abdbbe81723dbc5c9f016eb52145b320063" dependencies = [ - "arrayvec 0.7.6", + "arrayvec 0.7.8", "multi-stash", "smallvec", "spin", "wasmi_collections", "wasmi_core", "wasmi_ir", - "wasmparser 0.221.3", + "wasmparser", ] [[package]] @@ -6810,26 +6714,14 @@ version = "0.221.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d06bfa36ab3ac2be0dee563380147a5b81ba10dd8885d7fbbc9eb574be67d185" dependencies = [ - "bitflags 2.11.0", -] - -[[package]] -name = "wasmparser" -version = "0.244.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47b807c72e1bac69382b3a6fb3dbe8ea4c0ed87ff5629b8685ae6b9a611028fe" -dependencies = [ - "bitflags 2.11.0", - "hashbrown 0.15.5", - "indexmap", - "semver", + "bitflags 2.13.1", ] [[package]] name = "web-sys" -version = "0.3.92" +version = "0.3.103" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84cde8507f4d7cfcb1185b8cb5890c494ffea65edbe1ba82cfd63661c805ed94" +checksum = "8622dcb61c0bcc9fffa6938bed81210af2da9a7e4a1a834b2e37a59b6dfb6141" dependencies = [ "js-sys", "wasm-bindgen", @@ -6851,23 +6743,23 @@ version = "0.26.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "75c7f0ef91146ebfb530314f5f1d24528d7f0767efbfd31dce919275413e393e" dependencies = [ - "webpki-root-certs 1.0.6", + "webpki-root-certs 1.0.9", ] [[package]] name = "webpki-root-certs" -version = "1.0.6" +version = "1.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "804f18a4ac2676ffb4e8b5b5fa9ae38af06df08162314f96a68d2a363e21a8ca" +checksum = "b96554aa2acc8ccdb7e1c9a58a7a68dd5d13bccc69cd124cb09406db612a1c9b" dependencies = [ "rustls-pki-types", ] [[package]] name = "webpki-roots" -version = "1.0.6" +version = "1.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22cfaf3c063993ff62e73cb4311efde4db1efb31ab78a3e5c457939ad5cc0bed" +checksum = "7dcd9d09a39985f5344844e66b0c530a33843579125f23e21e9f0f220850f22a" dependencies = [ "rustls-pki-types", ] @@ -6924,7 +6816,7 @@ checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.119", ] [[package]] @@ -6935,7 +6827,7 @@ checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.119", ] [[package]] @@ -6989,15 +6881,6 @@ dependencies = [ "windows-targets 0.52.6", ] -[[package]] -name = "windows-sys" -version = "0.60.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" -dependencies = [ - "windows-targets 0.53.5", -] - [[package]] name = "windows-sys" version = "0.61.2" @@ -7031,30 +6914,13 @@ dependencies = [ "windows_aarch64_gnullvm 0.52.6", "windows_aarch64_msvc 0.52.6", "windows_i686_gnu 0.52.6", - "windows_i686_gnullvm 0.52.6", + "windows_i686_gnullvm", "windows_i686_msvc 0.52.6", "windows_x86_64_gnu 0.52.6", "windows_x86_64_gnullvm 0.52.6", "windows_x86_64_msvc 0.52.6", ] -[[package]] -name = "windows-targets" -version = "0.53.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3" -dependencies = [ - "windows-link", - "windows_aarch64_gnullvm 0.53.1", - "windows_aarch64_msvc 0.53.1", - "windows_i686_gnu 0.53.1", - "windows_i686_gnullvm 0.53.1", - "windows_i686_msvc 0.53.1", - "windows_x86_64_gnu 0.53.1", - "windows_x86_64_gnullvm 0.53.1", - "windows_x86_64_msvc 0.53.1", -] - [[package]] name = "windows_aarch64_gnullvm" version = "0.42.2" @@ -7067,12 +6933,6 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53" - [[package]] name = "windows_aarch64_msvc" version = "0.42.2" @@ -7085,12 +6945,6 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" -[[package]] -name = "windows_aarch64_msvc" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006" - [[package]] name = "windows_i686_gnu" version = "0.42.2" @@ -7103,24 +6957,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" -[[package]] -name = "windows_i686_gnu" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a506593a3" - [[package]] name = "windows_i686_gnullvm" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" -[[package]] -name = "windows_i686_gnullvm" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c" - [[package]] name = "windows_i686_msvc" version = "0.42.2" @@ -7133,12 +6975,6 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" -[[package]] -name = "windows_i686_msvc" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2" - [[package]] name = "windows_x86_64_gnu" version = "0.42.2" @@ -7151,12 +6987,6 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" -[[package]] -name = "windows_x86_64_gnu" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499" - [[package]] name = "windows_x86_64_gnullvm" version = "0.42.2" @@ -7169,12 +6999,6 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1" - [[package]] name = "windows_x86_64_msvc" version = "0.42.2" @@ -7187,12 +7011,6 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" -[[package]] -name = "windows_x86_64_msvc" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" - [[package]] name = "winnow" version = "0.7.15" @@ -7204,106 +7022,24 @@ dependencies = [ [[package]] name = "winnow" -version = "1.0.0" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a90e88e4667264a994d34e6d1ab2d26d398dcdca8b7f52bec8668957517fc7d8" +checksum = "23b97319f7b8343df12cc98938e5c3eb436064524c8d2b4e30a1d3a36eecdf81" dependencies = [ "memchr", ] [[package]] name = "wit-bindgen" -version = "0.51.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7249219f66ced02969388cf2bb044a09756a083d0fab1e566056b04d9fbcaa5" -dependencies = [ - "wit-bindgen-rust-macro", -] - -[[package]] -name = "wit-bindgen-core" -version = "0.51.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea61de684c3ea68cb082b7a88508a8b27fcc8b797d738bfc99a82facf1d752dc" -dependencies = [ - "anyhow", - "heck", - "wit-parser", -] - -[[package]] -name = "wit-bindgen-rust" -version = "0.51.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7c566e0f4b284dd6561c786d9cb0142da491f46a9fbed79ea69cdad5db17f21" -dependencies = [ - "anyhow", - "heck", - "indexmap", - "prettyplease", - "syn 2.0.117", - "wasm-metadata", - "wit-bindgen-core", - "wit-component", -] - -[[package]] -name = "wit-bindgen-rust-macro" -version = "0.51.0" +version = "0.57.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c0f9bfd77e6a48eccf51359e3ae77140a7f50b1e2ebfe62422d8afdaffab17a" -dependencies = [ - "anyhow", - "prettyplease", - "proc-macro2", - "quote", - "syn 2.0.117", - "wit-bindgen-core", - "wit-bindgen-rust", -] - -[[package]] -name = "wit-component" -version = "0.244.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d66ea20e9553b30172b5e831994e35fbde2d165325bec84fc43dbf6f4eb9cb2" -dependencies = [ - "anyhow", - "bitflags 2.11.0", - "indexmap", - "log", - "serde", - "serde_derive", - "serde_json", - "wasm-encoder", - "wasm-metadata", - "wasmparser 0.244.0", - "wit-parser", -] - -[[package]] -name = "wit-parser" -version = "0.244.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ecc8ac4bc1dc3381b7f59c34f00b67e18f910c2c0f50015669dde7def656a736" -dependencies = [ - "anyhow", - "id-arena", - "indexmap", - "log", - "semver", - "serde", - "serde_derive", - "serde_json", - "unicode-xid", - "wasmparser 0.244.0", -] +checksum = "1ebf944e87a7c253233ad6766e082e3cd714b5d03812acc24c318f549614536e" [[package]] name = "writeable" -version = "0.6.2" +version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9edde0db4769d2dc68579893f2306b26c6ecfbe0ef499b013d731b7b9247e0b9" +checksum = "1ffae5123b2d3fc086436f8834ae3ab053a283cfac8fe0a0b8eaae044768a4c4" [[package]] name = "wyz" @@ -7344,9 +7080,9 @@ checksum = "bfe269e7b803a5e8e20cbd97860e136529cd83bf2c9c6d37b142467e7e1f051f" [[package]] name = "yoke" -version = "0.8.1" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72d6e5c6afb84d73944e5cedb052c4680d5657337201555f9f2a16b7406d4954" +checksum = "709fe23a0424b6a435d82152b1bd3fdfb0833487d5fa90d05d42762a9891fef5" dependencies = [ "stable_deref_trait", "yoke-derive", @@ -7355,54 +7091,54 @@ dependencies = [ [[package]] name = "yoke-derive" -version = "0.8.1" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b659052874eb698efe5b9e8cf382204678a0086ebf46982b79d6ca3182927e5d" +checksum = "de844c262c8848816172cef550288e7dc6c7b7814b4ee56b3e1553f275f1858e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.119", "synstructure", ] [[package]] name = "zerocopy" -version = "0.8.48" +version = "0.8.55" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eed437bf9d6692032087e337407a86f04cd8d6a16a37199ed57949d415bd68e9" +checksum = "b5a105cd7b140f6eeec8acff2ea38135d3cab283ada58540f629fe51e46696eb" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.8.48" +version = "0.8.55" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70e3cd084b1788766f53af483dd21f93881ff30d7320490ec3ef7526d203bad4" +checksum = "0fe976fb70c78cd64cccfe3a6fc142244e8a77b70959b30faf9d0ac37ee228eb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.119", ] [[package]] name = "zerofrom" -version = "0.1.6" +version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" +checksum = "0ec05a11813ea801ff6d75110ad09cd0824ddba17dfe17128ea0d5f68e6c5272" dependencies = [ "zerofrom-derive", ] [[package]] name = "zerofrom-derive" -version = "0.1.6" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" +checksum = "11532158c46691caf0f2593ea8358fed6bbf68a0315e80aae9bd41fbade684a1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.119", "synstructure", ] @@ -7417,20 +7153,20 @@ dependencies = [ [[package]] name = "zeroize_derive" -version = "1.4.3" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85a5b4158499876c763cb03bc4e49185d3cccbabb15b33c627f7884f43db852e" +checksum = "3c50655cbb0fe3fc43170059e702f1ce5e19b84cec58dc87b037a09935c2f328" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.119", ] [[package]] name = "zerotrie" -version = "0.2.3" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a59c17a5562d507e4b54960e8569ebee33bee890c70aa3fe7b97e85a9fd7851" +checksum = "0f9152d31db0792fa83f70fb2f83148effb5c1f5b8c7686c3459e361d9bc20bf" dependencies = [ "displaydoc", "yoke", @@ -7439,9 +7175,9 @@ dependencies = [ [[package]] name = "zerovec" -version = "0.11.5" +version = "0.11.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c28719294829477f525be0186d13efa9a3c602f7ec202ca9e353d310fb9a002" +checksum = "90f911cbc359ab6af17377d242225f4d75119aec87ea711a880987b18cd7b239" dependencies = [ "yoke", "zerofrom", @@ -7450,13 +7186,13 @@ dependencies = [ [[package]] name = "zerovec-derive" -version = "0.11.2" +version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eadce39539ca5cb3985590102671f2567e659fca9666581ad3411d59207951f3" +checksum = "625dc425cab0dca6dc3c3319506e6593dcb08a9f387ea3b284dbd52a92c40555" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.119", ] [[package]] @@ -7487,15 +7223,15 @@ dependencies = [ [[package]] name = "zlib-rs" -version = "0.6.4" +version = "0.6.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "977347db8caa080403f6b6b7c1cda9479a8e869316f7e13a59b19076a40f94e3" +checksum = "b142a20ec14a91d5bc708c1dc21b080c550113d8aa77afa29635673a65dd02c5" [[package]] name = "zmij" -version = "1.0.21" +version = "1.0.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaa" +checksum = "29666d0abbfad1e3dc4dcf6144730dd3a3ab225bbbdac83319345b1b44ccfc1b" [[package]] name = "zopfli" diff --git a/Cargo.toml b/Cargo.toml index 5acbbc1..c2fba39 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -50,9 +50,9 @@ argon2 = "0.5" # Password-based key derivation (quantum-safe) rand = "0.9" # Quantus crypto dependencies (aligned with chain) -qp-dilithium-crypto = { version = "0.3.1", features = ["serde"] } -qp-rusty-crystals-dilithium = { version = "2.4.0" } -qp-rusty-crystals-hdwallet = { version = "2.4.0" } +qp-dilithium-crypto = { version = "0.5.0", features = ["serde"] } +qp-rusty-crystals-dilithium = { version = "3.0.1" } +qp-rusty-crystals-hdwallet = { version = "3.0.1" } # HTTP client for Subsquid queries blake3 = "1.8" @@ -80,7 +80,7 @@ quinn-proto = "0.11.14" # Force patched version of rustls-webpki (RUSTSEC-2026-0098, RUSTSEC-2026-0099, RUSTSEC-2026-0104) rustls-webpki = "0.103.13" -# Blockchain deps: align with chain workspace; use chain primitives for qp-dilithium-crypto so sp-* versions match +# Blockchain deps: align with chain workspace codec = { package = "parity-scale-codec", version = "3.7", features = ["derive"] } jsonrpsee = { version = "0.24", features = ["client"] } sp-core = { version = "39.0.0" } @@ -93,23 +93,24 @@ subxt-metadata = "0.44" # ZK proof generation (aligned with chain) anyhow = "1.0" -qp-plonky2 = { version = "1.5.1", default-features = false, features = ["rand", "std"] } -qp-wormhole-aggregator = { version = "3.0.0", default-features = false, features = ["rayon", "std"] } -qp-wormhole-circuit = { version = "3.0.0", default-features = false, features = ["std"] } -qp-wormhole-circuit-builder = { version = "3.0.0" } -qp-wormhole-inputs = { version = "3.0.0", default-features = false, features = ["std"] } -qp-wormhole-prover = { version = "3.0.0", default-features = false, features = ["std"] } -qp-wormhole-verifier = { version = "3.0.0", default-features = false, features = ["std"] } -qp-zk-circuits-common = { version = "3.0.0", default-features = false, features = ["std"] } +qp-plonky2 = { version = "1.5.4", default-features = false, features = ["rand", "std"] } +qp-plonky2-verifier = { version = "1.5.4", default-features = false } +qp-wormhole-aggregator = { version = "3.1.0", default-features = false, features = ["rayon", "std"] } +qp-wormhole-circuit = { version = "3.1.0", default-features = false, features = ["std"] } +qp-wormhole-circuit-builder = { version = "3.1.0" } +qp-wormhole-inputs = { version = "3.1.0", default-features = false, features = ["std"] } +qp-wormhole-prover = { version = "3.1.0", default-features = false, features = ["std"] } +qp-wormhole-verifier = { version = "3.1.0", default-features = false, features = ["std"] } +qp-zk-circuits-common = { version = "3.1.0", default-features = false, features = ["std"] } [build-dependencies] hex = "0.4" -qp-poseidon-core = "2.1.0" -qp-wormhole-circuit-builder = { version = "3.0.0" } +qp-poseidon-core = "3.0.2" +qp-wormhole-circuit-builder = { version = "3.1.0" } [dev-dependencies] -qp-poseidon-core = "2.1.0" +qp-poseidon-core = "3.0.2" serial_test = "3.1" tempfile = "3.8.1" diff --git a/README.md b/README.md index 54b9fc4..c6a65f9 100644 --- a/README.md +++ b/README.md @@ -350,8 +350,8 @@ quantus developer build-circuits \ **What it does (3 steps):** 1. Clears stale artifacts from the CLI's `generated-bins/` directory. -2. Calls the `qp-wormhole-circuit-builder` library directly to regenerate binary files in `generated-bins/` (`verifier.bin`, `common.bin`, `aggregated_verifier.bin`, `aggregated_common.bin`, `config.json`, plus prover binaries unless `--skip-prover` is set). -3. Copies chain-relevant binaries (`aggregated_common.bin`, `aggregated_verifier.bin`, `config.json`) to `chain/pallets/wormhole/` and touches the pallet source. +2. Calls the `qp-wormhole-circuit-builder` library directly to regenerate binary files in `generated-bins/` (`verifier.bin`, `common.bin`, `private_batch_verifier.bin`, `private_batch_common.bin`, `config.json`, plus prover binaries unless `--skip-prover` is set). +3. Copies chain-relevant binaries (`private_batch_common.bin`, `private_batch_verifier.bin`, `config.json`) to `chain/pallets/wormhole/` and touches the pallet source. After running, rebuild the chain (`cargo build --release` in the chain directory) so `include_bytes!()` picks up the new binaries. diff --git a/build.rs b/build.rs index 2e5e101..4a4a53d 100644 --- a/build.rs +++ b/build.rs @@ -1,8 +1,10 @@ //! Build script for quantus-cli. //! -//! Generates circuit binaries (prover, verifier, aggregator) at build time. -//! This ensures the binaries are always consistent with the circuit crate version -//! and eliminates the need to manually run `quantus developer build-circuits`. +//! Generates circuit binaries (leaf verifier/common + private/public-batch +//! prover/verifier artifacts) at build time. The leaf circuit has no +//! `prover.bin` — proving uses an in-process fresh build. This keeps the +//! binaries consistent with the circuit crate version and eliminates the need +//! to manually run `quantus developer build-circuits`. //! //! Outputs are written to `OUT_DIR` (required by cargo) and, during local source //! builds only, linked/copied to `generated-bins/` in the project root. When the @@ -56,6 +58,10 @@ fn main() { .map(|v| v.parse().expect("QP_NUM_LEAF_PROOFS must be a valid usize")) .unwrap_or(DEFAULT_NUM_LEAF_PROOFS); + let num_private_batch_proofs: usize = env::var("QP_NUM_PRIVATE_BATCH_PROOFS") + .map(|v| v.parse().expect("QP_NUM_PRIVATE_BATCH_PROOFS must be a valid usize")) + .unwrap_or(DEFAULT_NUM_PRIVATE_BATCH_PROOFS); + // Re-run when QP_NUM_LEAF_PROOFS env var changes. Note: emitting any `rerun-if-*` // directive opts out of Cargo's default "re-run when any package file changes" // behavior. However, the important cases still work: @@ -66,10 +72,11 @@ fn main() { // For installed binaries, runtime detection in bins.rs `is_ready()` handles leaf // count mismatches by regenerating on first use. println!("cargo:rerun-if-env-changed=QP_NUM_LEAF_PROOFS"); + println!("cargo:rerun-if-env-changed=QP_NUM_PRIVATE_BATCH_PROOFS"); println!( - "cargo:warning=[quantus-cli] Generating ZK circuit binaries (num_leaf_proofs={})...", - num_leaf_proofs + "cargo:warning=[quantus-cli] Generating ZK circuit binaries (num_leaf_proofs={}, num_private_batch_proofs={})...", + num_leaf_proofs, num_private_batch_proofs ); let start = Instant::now(); @@ -81,7 +88,7 @@ fn main() { &build_output_dir, true, num_leaf_proofs, - None, + Some(num_private_batch_proofs), ) .expect("Failed to generate circuit binaries"); @@ -98,11 +105,13 @@ fn main() { // Print hashes of generated binaries print_bin_hash(&build_output_dir, "common.bin"); print_bin_hash(&build_output_dir, "verifier.bin"); - print_bin_hash(&build_output_dir, "prover.bin"); print_bin_hash(&build_output_dir, "dummy_proof.bin"); - print_bin_hash(&build_output_dir, "aggregated_common.bin"); - print_bin_hash(&build_output_dir, "aggregated_verifier.bin"); - print_bin_hash(&build_output_dir, "aggregated_prover.bin"); + print_bin_hash(&build_output_dir, "private_batch_common.bin"); + print_bin_hash(&build_output_dir, "private_batch_verifier.bin"); + print_bin_hash(&build_output_dir, "private_batch_prover.bin"); + print_bin_hash(&build_output_dir, "public_batch_common.bin"); + print_bin_hash(&build_output_dir, "public_batch_verifier.bin"); + print_bin_hash(&build_output_dir, "public_batch_prover.bin"); // Copy bins to project root for runtime access, but only during local source // builds — never during `cargo publish` verification (manifest_dir is inside diff --git a/examples/wormhole_sdk_e2e.rs b/examples/wormhole_sdk_e2e.rs index 76afc2f..3d36e7f 100644 --- a/examples/wormhole_sdk_e2e.rs +++ b/examples/wormhole_sdk_e2e.rs @@ -13,7 +13,7 @@ //! 6. compute_merkle_positions -> (siblings, positions) //! 7. wormhole_lib::generate_proof -> leaf proof bytes //! 8. aggregate_proofs([leaf]) -> agg.hex -//! 9. verify_aggregated_and_get_events -> minted NativeTransferred +//! 9. verify_private_batch_and_get_events -> minted NativeTransferred //! ``` //! //! All helpers are the same ones consumed by `stress-test`. The example is @@ -54,7 +54,7 @@ use quantus_cli::{ cli::{address_format::bytes_to_quantus_ss58, common::ExecutionMode, send::parse_amount}, compute_merkle_positions, compute_wormhole_address, decode_full_leaf_data, error::{QuantusError, Result}, - get_zk_merkle_proof, parse_transfer_events, transfer, verify_aggregated_and_get_events, + get_zk_merkle_proof, parse_transfer_events, transfer, verify_private_batch_and_get_events, wallet::WalletManager, wormhole_lib::{ self, ProofGenerationInput, NATIVE_ASSET_ID, SCALE_DOWN_FACTOR, VOLUME_FEE_BPS, @@ -307,10 +307,10 @@ async fn main() -> Result<()> { // 9. verify + submit ------------------------------------------------------- println!(); - println!("[8/9] verify_aggregated_and_get_events (off-chain verify + on-chain submit)"); + println!("[8/9] verify_private_batch_and_get_events (off-chain verify + on-chain submit)"); let verify_start = std::time::Instant::now(); let (mint_block, mint_tx, transfers) = - verify_aggregated_and_get_events(agg_path.to_str().unwrap(), &client).await?; + verify_private_batch_and_get_events(agg_path.to_str().unwrap(), &client).await?; println!(" verified+included in {:.2}s", verify_start.elapsed().as_secs_f64()); println!(" mint block : {:?}", mint_block); println!(" mint tx : {:?}", mint_tx); @@ -318,7 +318,7 @@ async fn main() -> Result<()> { println!(); println!("[9/9] minted NativeTransferred events:"); if transfers.is_empty() { - println!(" (none — verify_aggregated_proof did not emit any events?)"); + println!(" (none — verify_private_batch did not emit any events?)"); } for (i, ev) in transfers.iter().enumerate() { let to_ss58 = bytes_to_quantus_ss58(&ev.to.0); diff --git a/examples/wormhole_sdk_usage.rs b/examples/wormhole_sdk_usage.rs index d96eef2..b5a6a22 100644 --- a/examples/wormhole_sdk_usage.rs +++ b/examples/wormhole_sdk_usage.rs @@ -11,8 +11,8 @@ //! submitting anything: `at_best_block`, scans recent blocks for a real `NativeTransferred` //! event, runs `parse_transfer_events`, fetches the ZK Merkle proof via `get_zk_merkle_proof`, //! computes positions with `compute_merkle_positions` and decodes the leaf bytes with -//! `decode_full_leaf_data`. The submission path (`submit_unsigned_verify_aggregated_proof`, -//! `verify_aggregated_and_get_events`) is shown only as pseudocode — it requires a funded +//! `decode_full_leaf_data`. The submission path (`submit_unsigned_verify_private_batch`, +//! `verify_private_batch_and_get_events`) is shown only as pseudocode — it requires a funded //! deposit + ZK proof generation, which [`wormhole_sdk_e2e.rs`](./wormhole_sdk_e2e.rs) //! demonstrates end-to-end. If the node is unreachable the example exits cleanly with hints; CI //! without a node still builds and runs it green. @@ -34,8 +34,8 @@ //! aggregate_proofs(leaf_files, "agg.hex") → aggregated proof file //! │ //! ▼ -//! verify_aggregated_and_get_events("agg.hex", &client) -//! │ (locally verifies + submits unsigned `verify_aggregated_proof` +//! verify_private_batch_and_get_events("agg.hex", &client) +//! │ (locally verifies + submits unsigned `verify_private_batch` //! │ + waits for inclusion + collects NativeTransferred events) //! ▼ //! Vec with the minted amounts at the exit accounts @@ -219,7 +219,7 @@ async fn online_demo() -> Result<()> { println!( " This is normal on a fresh dev chain. Run examples/wormhole_sdk_e2e.rs first" ); - println!(" (it submits a deposit + verify_aggregated_proof) to populate the chain."); + println!(" (it submits a deposit + verify_private_batch) to populate the chain."); }, } @@ -332,13 +332,13 @@ fn print_online_recipe() { println!(" let bytes = std::fs::read(\"agg.hex\")?;"); println!(" let bytes = hex::decode(bytes.trim_ascii())?;"); println!(" let (included_at, block_hash, tx_hash) ="); - println!(" submit_unsigned_verify_aggregated_proof(&client, bytes).await?;"); + println!(" submit_unsigned_verify_private_batch(&client, bytes).await?;"); println!(" println!(\"included @ {{}} block={{:?}} tx={{:?}}\","); println!(" included_at, block_hash, tx_hash);"); println!(); println!(" // Or, with local verify + event collection:"); println!(" let (block_hash, tx_hash, transfers) ="); - println!(" verify_aggregated_and_get_events(\"agg.hex\", &client).await?;"); + println!(" verify_private_batch_and_get_events(\"agg.hex\", &client).await?;"); println!(" for ev in transfers {{"); println!(" println!(\" -> {{}} planck to {{}}\", ev.amount, ev.to.to_ss58check());"); println!(" }}"); diff --git a/src/batch_verifier.rs b/src/batch_verifier.rs new file mode 100644 index 0000000..3456ea3 --- /dev/null +++ b/src/batch_verifier.rs @@ -0,0 +1,202 @@ +//! Load private/public-batch `WormholeVerifier`s from generated circuit bins. +//! +//! `WormholeVerifier::new_from_bytes` pins artifacts to the canonical *leaf* +//! circuit via keccak256. Batch verifier bytes are sized by `QP_NUM_*` and +//! therefore cannot use that pin — the pallet uses the same deserialize + +//! profile-check path implemented here. + +use crate::error::{QuantusError, Result}; +use qp_plonky2_verifier::util::serialization::DefaultGateSerializer; +use qp_wormhole_aggregator::config::CircuitBinsConfig; +use qp_wormhole_verifier::{ + CircuitConfig, CommonCircuitData, VerifierCircuitData, VerifierOnlyCircuitData, + WormholeVerifier, D, F, MIN_LEAF_SECURITY_BITS, PUBLIC_INPUTS_FELTS_LEN, +}; +use std::path::Path; + +/// Header felts of the private-batch PI layout (must match pallet-wormhole / +/// `PrivateBatchPublicInputs::try_from_u64_slice`). +const PRIVATE_BATCH_PI_HEADER_FELTS: usize = 8; + +fn private_batch_expected_config() -> CircuitConfig { + // Must match `qp_zk_circuits_common::circuit::wormhole_private_batch_circuit_config`. + CircuitConfig { + num_wires: 135, + num_routed_wires: 60, + ..CircuitConfig::standard_recursion_zk_config() + } +} + +fn public_batch_expected_config() -> CircuitConfig { + // Must match `qp_zk_circuits_common::circuit::wormhole_public_batch_circuit_config`. + CircuitConfig::standard_recursion_config() +} + +fn private_batch_expected_public_inputs(num_leaf_proofs: usize) -> usize { + PRIVATE_BATCH_PI_HEADER_FELTS + num_leaf_proofs * PUBLIC_INPUTS_FELTS_LEN +} + +fn public_batch_expected_public_inputs( + num_private_batch_proofs: usize, + num_leaf_proofs: usize, +) -> usize { + qp_wormhole_inputs::public_batch_pi::pi_len(num_private_batch_proofs, num_leaf_proofs) +} + +fn ensure_batch_verifier_profile( + common: &CommonCircuitData, + expected_config: &CircuitConfig, + expected_public_inputs: usize, +) -> std::result::Result<(), String> { + if common.config != *expected_config { + return Err("circuit config does not match the canonical batch circuit config".to_string()); + } + if common.config.security_bits < MIN_LEAF_SECURITY_BITS { + return Err(format!( + "circuit config security_bits {} is below the minimum {}", + common.config.security_bits, MIN_LEAF_SECURITY_BITS + )); + } + if common.num_public_inputs != expected_public_inputs { + return Err(format!( + "public-input count {} does not match the compiled batch dimensions (expected {})", + common.num_public_inputs, expected_public_inputs + )); + } + Ok(()) +} + +fn load_batch_verifier_from_bytes( + verifier_bytes: &[u8], + common_bytes: &[u8], + expected_config: &CircuitConfig, + expected_public_inputs: usize, + name: &str, +) -> Result { + let verifier_only = + VerifierOnlyCircuitData::from_bytes(verifier_bytes.to_vec()).map_err(|e| { + QuantusError::Generic(format!("Failed to deserialize {name} verifier-only data: {e}")) + })?; + + let common = CommonCircuitData::from_bytes(common_bytes.to_vec(), &DefaultGateSerializer) + .map_err(|e| { + QuantusError::Generic(format!("Failed to deserialize {name} common circuit data: {e}")) + })?; + + if let Err(reason) = + ensure_batch_verifier_profile(&common, expected_config, expected_public_inputs) + { + return Err(QuantusError::Generic(format!( + "{name} verifier artifact rejected: {reason} \ + (security_bits={}, num_public_inputs={}, expected_public_inputs={})", + common.config.security_bits, common.num_public_inputs, expected_public_inputs + ))); + } + + Ok(WormholeVerifier { circuit_data: VerifierCircuitData { verifier_only, common } }) +} + +fn load_batch_verifier_from_files( + verifier_path: &Path, + common_path: &Path, + expected_config: &CircuitConfig, + expected_public_inputs: usize, + name: &str, +) -> Result { + let verifier_bytes = std::fs::read(verifier_path).map_err(|e| { + QuantusError::Generic(format!( + "Failed to read {name} verifier {}: {e}", + verifier_path.display() + )) + })?; + let common_bytes = std::fs::read(common_path).map_err(|e| { + QuantusError::Generic(format!( + "Failed to read {name} common {}: {e}", + common_path.display() + )) + })?; + load_batch_verifier_from_bytes( + &verifier_bytes, + &common_bytes, + expected_config, + expected_public_inputs, + name, + ) +} + +/// Load the private-batch verifier from `bins_dir`, applying batch profile checks +/// (not the leaf keccak256 pin). +pub fn load_private_batch_verifier(bins_dir: &Path) -> Result { + let config = CircuitBinsConfig::load(bins_dir).map_err(|e| { + QuantusError::Generic(format!( + "Failed to load circuit bins config from {}: {e}", + bins_dir.display() + )) + })?; + load_batch_verifier_from_files( + &bins_dir.join("private_batch_verifier.bin"), + &bins_dir.join("private_batch_common.bin"), + &private_batch_expected_config(), + private_batch_expected_public_inputs(config.num_leaf_proofs), + "private batch", + ) +} + +/// Load the public-batch verifier from `bins_dir`, applying batch profile checks +/// (not the leaf keccak256 pin). +pub fn load_public_batch_verifier(bins_dir: &Path) -> Result { + let config = CircuitBinsConfig::load(bins_dir).map_err(|e| { + QuantusError::Generic(format!( + "Failed to load circuit bins config from {}: {e}", + bins_dir.display() + )) + })?; + let num_private_batch_proofs = config.num_private_batch_proofs.ok_or_else(|| { + QuantusError::Generic( + "Circuit binaries lack public-batch support (num_private_batch_proofs missing in config.json); regenerate them" + .to_string(), + ) + })?; + load_batch_verifier_from_files( + &bins_dir.join("public_batch_verifier.bin"), + &bins_dir.join("public_batch_common.bin"), + &public_batch_expected_config(), + public_batch_expected_public_inputs(num_private_batch_proofs, config.num_leaf_proofs), + "public batch", + ) +} + +#[cfg(test)] +mod tests { + use super::*; + use std::path::PathBuf; + + fn bins_dir() -> PathBuf { + // Prefer project generated-bins (dev builds); fall back to OUT_DIR copy. + let root = PathBuf::from(env!("CARGO_MANIFEST_DIR")).join("generated-bins"); + if root.join("config.json").exists() { + root + } else { + panic!("generated-bins missing; run a full build first"); + } + } + + #[test] + fn loads_private_and_public_batch_verifiers() { + let dir = bins_dir(); + let private = load_private_batch_verifier(&dir).expect("private"); + let public = load_public_batch_verifier(&dir).expect("public"); + assert!(private.circuit_data.common.num_public_inputs > 0); + assert!(public.circuit_data.common.num_public_inputs > 0); + // Leaf pin path must still reject these bytes. + let v = std::fs::read(dir.join("private_batch_verifier.bin")).unwrap(); + let c = std::fs::read(dir.join("private_batch_common.bin")).unwrap(); + let leaf_err = WormholeVerifier::new_from_bytes(&v, &c).unwrap_err(); + assert!( + leaf_err + .to_string() + .contains("does not match the canonical Wormhole leaf circuit"), + "unexpected err: {leaf_err}" + ); + } +} diff --git a/src/bins.rs b/src/bins.rs index 42371c9..a6ec2c0 100644 --- a/src/bins.rs +++ b/src/bins.rs @@ -1,11 +1,13 @@ //! Circuit binaries path resolution and lazy generation. //! -//! The CLI needs access to several large ZK-circuit files (`prover.bin`, -//! `verifier.bin`, `aggregated_*.bin`, etc.). During `cargo build`/`cargo install` -//! these are produced by `build.rs` into `$OUT_DIR/generated-bins/`, but -//! `cargo install` does not copy build-script outputs alongside the installed -//! executable. To make installed binaries self-sufficient, this module resolves -//! a persistent storage location and regenerates the binaries there on demand. +//! The CLI needs access to ZK-circuit artifacts (`verifier.bin`, `common.bin`, +//! `private_batch_*.bin`, `public_batch_*.bin`, dummy proofs, etc.). The leaf +//! circuit no longer ships a `prover.bin` — `WormholeProver` builds fresh at +//! prove time. During `cargo build`/`cargo install` the remaining files are +//! produced by `build.rs` into `$OUT_DIR/generated-bins/`, but `cargo install` +//! does not copy build-script outputs alongside the installed executable. To +//! make installed binaries self-sufficient, this module resolves a persistent +//! storage location and regenerates the binaries there on demand. //! //! Resolution order: //! 1. `QUANTUS_BINS_DIR` env var (explicit override). @@ -24,14 +26,20 @@ include!("bins_consts.rs"); pub const BINS_DIR_ENV: &str = "QUANTUS_BINS_DIR"; /// Files that must be present for all wormhole operations to succeed. +/// +/// Note: there is no leaf `prover.bin` — qp-wormhole-circuit-builder 3.1.0+ does +/// not emit one; leaf proofs use `qp_wormhole_prover::build_fresh()`. const REQUIRED_FILES: &[&str] = &[ - "prover.bin", "verifier.bin", "common.bin", - "aggregated_prover.bin", - "aggregated_verifier.bin", - "aggregated_common.bin", + "private_batch_prover.bin", + "private_batch_verifier.bin", + "private_batch_common.bin", + "public_batch_prover.bin", + "public_batch_verifier.bin", + "public_batch_common.bin", "dummy_proof.bin", + "dummy_private_batch_proof.bin", "config.json", ]; @@ -72,7 +80,8 @@ pub fn ensure_bins_dir() -> Result { } let num_leaf_proofs = env_num_leaf_proofs(); - generate(&dir, num_leaf_proofs)?; + let num_private_batch_proofs = env_num_private_batch_proofs(); + generate(&dir, num_leaf_proofs, num_private_batch_proofs)?; Ok(dir) } @@ -88,17 +97,21 @@ fn is_ready(dir: &Path) -> bool { if !version_ok { return false; } - // Check num_leaf_proofs in config.json matches current setting + // Check circuit sizing in config.json matches current settings let config_path = dir.join("config.json"); match std::fs::read_to_string(&config_path) { Ok(content) => { - // Parse just the num_leaf_proofs field to avoid pulling in full config dependency + // Parse just the sizing fields to avoid pulling in full config dependency #[derive(serde::Deserialize)] struct ConfigCheck { num_leaf_proofs: usize, + #[serde(default, alias = "num_layer0_proofs")] + num_private_batch_proofs: Option, } match serde_json::from_str::(&content) { - Ok(config) => config.num_leaf_proofs == env_num_leaf_proofs(), + Ok(config) => + config.num_leaf_proofs == env_num_leaf_proofs() && + config.num_private_batch_proofs == Some(env_num_private_batch_proofs()), Err(_) => false, } }, @@ -113,7 +126,14 @@ fn env_num_leaf_proofs() -> usize { .unwrap_or(DEFAULT_NUM_LEAF_PROOFS) } -fn generate(dir: &Path, num_leaf_proofs: usize) -> Result<()> { +fn env_num_private_batch_proofs() -> usize { + std::env::var("QP_NUM_PRIVATE_BATCH_PROOFS") + .ok() + .and_then(|v| v.parse().ok()) + .unwrap_or(DEFAULT_NUM_PRIVATE_BATCH_PROOFS) +} + +fn generate(dir: &Path, num_leaf_proofs: usize, num_private_batch_proofs: usize) -> Result<()> { std::fs::create_dir_all(dir).map_err(|e| { QuantusError::Generic(format!("Failed to create bins directory {}: {}", dir.display(), e)) })?; @@ -122,12 +142,16 @@ fn generate(dir: &Path, num_leaf_proofs: usize) -> Result<()> { log_print!("🛠️ Generating ZK circuit binaries (first-time setup, ~30s)..."); log_print!(" Target: {}", dir.display()); log_print!(" num_leaf_proofs: {}", num_leaf_proofs); + log_print!(" num_private_batch_proofs: {}", num_private_batch_proofs); let start = std::time::Instant::now(); - qp_wormhole_circuit_builder::generate_all_circuit_binaries(dir, true, num_leaf_proofs, None) - .map_err(|e| { - QuantusError::Generic(format!("Failed to generate circuit binaries: {}", e)) - })?; + qp_wormhole_circuit_builder::generate_all_circuit_binaries( + dir, + true, + num_leaf_proofs, + Some(num_private_batch_proofs), + ) + .map_err(|e| QuantusError::Generic(format!("Failed to generate circuit binaries: {}", e)))?; std::fs::write(dir.join(VERSION_MARKER), env!("CARGO_PKG_VERSION")) .map_err(|e| QuantusError::Generic(format!("Failed to write version marker: {}", e)))?; diff --git a/src/bins_consts.rs b/src/bins_consts.rs index b0faf17..76fc4bf 100644 --- a/src/bins_consts.rs +++ b/src/bins_consts.rs @@ -13,3 +13,9 @@ const VERSION_MARKER: &str = ".quantus-cli-version"; /// - bins.rs: runtime lazy circuit generation /// - collect_rewards_lib.rs: batching proofs for aggregation pub const DEFAULT_NUM_LEAF_PROOFS: usize = 7; + +/// Number of private-batch proofs aggregated into a single public batch. +/// +/// Must match the chain's pallet-wormhole build default (QP_NUM_PRIVATE_BATCH_PROOFS) +/// or on-chain verification of public batches will fail. +pub const DEFAULT_NUM_PRIVATE_BATCH_PROOFS: usize = 4; diff --git a/src/chain/quantus_subxt.rs b/src/chain/quantus_subxt.rs index b07e4cc..acb17d2 100644 --- a/src/chain/quantus_subxt.rs +++ b/src/chain/quantus_subxt.rs @@ -1565,10 +1565,9 @@ pub mod api { "query_call_info", types::QueryCallInfo { call, len }, [ - 32u8, 234u8, 47u8, 160u8, 157u8, 142u8, 236u8, 40u8, 222u8, 22u8, 75u8, - 92u8, 244u8, 90u8, 235u8, 228u8, 137u8, 249u8, 207u8, 89u8, 87u8, - 244u8, 41u8, 20u8, 102u8, 145u8, 48u8, 54u8, 164u8, 114u8, 122u8, - 182u8, + 90u8, 50u8, 211u8, 137u8, 17u8, 184u8, 134u8, 190u8, 29u8, 156u8, 36u8, + 214u8, 214u8, 65u8, 28u8, 181u8, 114u8, 218u8, 8u8, 229u8, 48u8, 10u8, + 183u8, 105u8, 113u8, 49u8, 40u8, 174u8, 69u8, 246u8, 158u8, 197u8, ], ) } @@ -1586,10 +1585,9 @@ pub mod api { "query_call_fee_details", types::QueryCallFeeDetails { call, len }, [ - 135u8, 197u8, 88u8, 132u8, 222u8, 66u8, 219u8, 154u8, 162u8, 155u8, - 161u8, 58u8, 176u8, 115u8, 33u8, 214u8, 171u8, 221u8, 230u8, 21u8, - 60u8, 15u8, 36u8, 117u8, 182u8, 70u8, 181u8, 108u8, 125u8, 72u8, 252u8, - 40u8, + 34u8, 56u8, 164u8, 48u8, 105u8, 57u8, 32u8, 57u8, 215u8, 116u8, 66u8, + 5u8, 117u8, 168u8, 51u8, 154u8, 198u8, 60u8, 29u8, 154u8, 73u8, 240u8, + 9u8, 177u8, 134u8, 205u8, 14u8, 43u8, 39u8, 95u8, 12u8, 151u8, ], ) } @@ -1980,6 +1978,9 @@ pub mod api { pub fn scheduler(&self) -> scheduler::storage::StorageApi { scheduler::storage::StorageApi } + pub fn utility(&self) -> utility::storage::StorageApi { + utility::storage::StorageApi + } pub fn reversible_transfers(&self) -> reversible_transfers::storage::StorageApi { reversible_transfers::storage::StorageApi } @@ -2068,9 +2069,9 @@ pub mod api { .hash(); runtime_metadata_hash == [ - 0u8, 140u8, 5u8, 40u8, 237u8, 46u8, 42u8, 0u8, 228u8, 200u8, 1u8, 226u8, 132u8, - 185u8, 140u8, 253u8, 54u8, 127u8, 56u8, 200u8, 164u8, 237u8, 198u8, 151u8, 133u8, - 33u8, 239u8, 56u8, 190u8, 69u8, 228u8, 26u8, + 229u8, 9u8, 51u8, 78u8, 26u8, 145u8, 221u8, 175u8, 20u8, 81u8, 176u8, 15u8, 45u8, + 47u8, 171u8, 14u8, 83u8, 216u8, 26u8, 119u8, 216u8, 16u8, 55u8, 218u8, 129u8, + 104u8, 141u8, 209u8, 205u8, 155u8, 6u8, 144u8, ] } pub mod system { @@ -3198,9 +3199,10 @@ pub mod api { "Events", (), [ - 12u8, 200u8, 85u8, 114u8, 205u8, 35u8, 13u8, 101u8, 195u8, 51u8, 123u8, - 145u8, 74u8, 61u8, 217u8, 71u8, 184u8, 61u8, 132u8, 83u8, 214u8, 117u8, - 222u8, 18u8, 13u8, 229u8, 195u8, 147u8, 223u8, 19u8, 66u8, 105u8, + 13u8, 93u8, 203u8, 141u8, 208u8, 101u8, 248u8, 136u8, 160u8, 153u8, + 118u8, 135u8, 207u8, 11u8, 73u8, 51u8, 253u8, 137u8, 82u8, 57u8, 46u8, + 108u8, 144u8, 243u8, 99u8, 155u8, 153u8, 82u8, 114u8, 59u8, 251u8, + 89u8, ], ) } @@ -7317,9 +7319,10 @@ pub mod api { "batch", types::Batch { calls }, [ - 91u8, 52u8, 14u8, 228u8, 168u8, 75u8, 218u8, 19u8, 121u8, 112u8, 126u8, - 236u8, 87u8, 77u8, 194u8, 140u8, 196u8, 15u8, 84u8, 117u8, 80u8, 101u8, - 217u8, 62u8, 28u8, 83u8, 226u8, 233u8, 176u8, 2u8, 158u8, 79u8, + 135u8, 158u8, 49u8, 34u8, 225u8, 221u8, 148u8, 92u8, 90u8, 100u8, + 166u8, 203u8, 132u8, 97u8, 40u8, 94u8, 123u8, 153u8, 237u8, 174u8, + 111u8, 204u8, 191u8, 249u8, 58u8, 94u8, 185u8, 231u8, 204u8, 56u8, + 141u8, 234u8, ], ) } @@ -7349,10 +7352,10 @@ pub mod api { call: ::subxt::ext::subxt_core::alloc::boxed::Box::new(call), }, [ - 78u8, 239u8, 51u8, 124u8, 113u8, 201u8, 252u8, 171u8, 182u8, 113u8, - 155u8, 193u8, 125u8, 113u8, 241u8, 199u8, 215u8, 237u8, 55u8, 121u8, - 247u8, 255u8, 41u8, 35u8, 206u8, 143u8, 157u8, 90u8, 203u8, 106u8, - 252u8, 91u8, + 250u8, 88u8, 125u8, 217u8, 141u8, 180u8, 83u8, 152u8, 176u8, 72u8, + 192u8, 96u8, 124u8, 89u8, 66u8, 74u8, 237u8, 221u8, 238u8, 59u8, 40u8, + 119u8, 147u8, 155u8, 130u8, 213u8, 199u8, 186u8, 246u8, 227u8, 27u8, + 23u8, ], ) } @@ -7378,9 +7381,10 @@ pub mod api { "batch_all", types::BatchAll { calls }, [ - 9u8, 111u8, 191u8, 88u8, 100u8, 224u8, 185u8, 197u8, 208u8, 26u8, - 198u8, 42u8, 215u8, 246u8, 54u8, 120u8, 3u8, 148u8, 182u8, 44u8, 233u8, - 60u8, 26u8, 128u8, 101u8, 87u8, 141u8, 143u8, 9u8, 197u8, 184u8, 64u8, + 41u8, 34u8, 6u8, 168u8, 67u8, 1u8, 242u8, 173u8, 200u8, 209u8, 197u8, + 225u8, 4u8, 115u8, 216u8, 144u8, 128u8, 59u8, 200u8, 111u8, 188u8, + 123u8, 242u8, 181u8, 189u8, 132u8, 82u8, 254u8, 216u8, 14u8, 144u8, + 81u8, ], ) } @@ -7403,10 +7407,9 @@ pub mod api { call: ::subxt::ext::subxt_core::alloc::boxed::Box::new(call), }, [ - 252u8, 234u8, 74u8, 189u8, 195u8, 91u8, 133u8, 238u8, 206u8, 171u8, - 160u8, 141u8, 58u8, 250u8, 221u8, 113u8, 192u8, 201u8, 95u8, 103u8, - 209u8, 0u8, 110u8, 235u8, 38u8, 225u8, 79u8, 73u8, 19u8, 75u8, 138u8, - 146u8, + 229u8, 3u8, 92u8, 197u8, 150u8, 217u8, 187u8, 58u8, 48u8, 34u8, 206u8, + 72u8, 84u8, 115u8, 210u8, 133u8, 173u8, 206u8, 106u8, 64u8, 3u8, 27u8, + 65u8, 164u8, 175u8, 238u8, 237u8, 137u8, 246u8, 15u8, 79u8, 208u8, ], ) } @@ -7432,9 +7435,10 @@ pub mod api { "force_batch", types::ForceBatch { calls }, [ - 130u8, 189u8, 219u8, 64u8, 240u8, 89u8, 49u8, 86u8, 163u8, 42u8, 52u8, - 8u8, 152u8, 154u8, 147u8, 236u8, 209u8, 30u8, 243u8, 194u8, 123u8, - 97u8, 97u8, 239u8, 97u8, 57u8, 104u8, 191u8, 235u8, 221u8, 1u8, 227u8, + 100u8, 187u8, 166u8, 123u8, 181u8, 217u8, 198u8, 93u8, 192u8, 43u8, + 120u8, 250u8, 106u8, 187u8, 184u8, 212u8, 24u8, 105u8, 102u8, 29u8, + 145u8, 220u8, 193u8, 41u8, 113u8, 92u8, 208u8, 233u8, 80u8, 3u8, 72u8, + 142u8, ], ) } @@ -7457,9 +7461,10 @@ pub mod api { weight, }, [ - 22u8, 169u8, 85u8, 171u8, 100u8, 38u8, 252u8, 11u8, 198u8, 55u8, 150u8, - 190u8, 59u8, 5u8, 143u8, 123u8, 107u8, 23u8, 202u8, 0u8, 237u8, 255u8, - 77u8, 19u8, 113u8, 77u8, 133u8, 52u8, 176u8, 110u8, 214u8, 221u8, + 248u8, 233u8, 49u8, 17u8, 159u8, 160u8, 133u8, 104u8, 56u8, 56u8, 78u8, + 243u8, 14u8, 78u8, 193u8, 76u8, 133u8, 40u8, 212u8, 235u8, 214u8, + 120u8, 131u8, 18u8, 206u8, 27u8, 128u8, 210u8, 23u8, 109u8, 209u8, + 52u8, ], ) } @@ -7499,9 +7504,10 @@ pub mod api { fallback: ::subxt::ext::subxt_core::alloc::boxed::Box::new(fallback), }, [ - 210u8, 174u8, 69u8, 89u8, 81u8, 251u8, 211u8, 77u8, 44u8, 88u8, 137u8, - 153u8, 221u8, 116u8, 10u8, 183u8, 158u8, 145u8, 229u8, 108u8, 168u8, - 123u8, 100u8, 162u8, 121u8, 201u8, 158u8, 103u8, 96u8, 96u8, 89u8, 4u8, + 246u8, 98u8, 179u8, 32u8, 49u8, 82u8, 125u8, 199u8, 214u8, 143u8, + 112u8, 129u8, 243u8, 115u8, 206u8, 121u8, 121u8, 138u8, 185u8, 205u8, + 207u8, 224u8, 58u8, 32u8, 231u8, 51u8, 29u8, 0u8, 16u8, 237u8, 132u8, + 91u8, ], ) } @@ -7524,10 +7530,9 @@ pub mod api { call: ::subxt::ext::subxt_core::alloc::boxed::Box::new(call), }, [ - 68u8, 190u8, 238u8, 69u8, 88u8, 148u8, 111u8, 242u8, 200u8, 228u8, - 47u8, 232u8, 101u8, 173u8, 104u8, 140u8, 30u8, 113u8, 236u8, 193u8, - 48u8, 47u8, 116u8, 169u8, 97u8, 77u8, 17u8, 82u8, 37u8, 190u8, 158u8, - 66u8, + 13u8, 36u8, 191u8, 209u8, 109u8, 31u8, 206u8, 217u8, 67u8, 167u8, + 250u8, 116u8, 29u8, 37u8, 151u8, 20u8, 172u8, 101u8, 79u8, 112u8, 15u8, + 154u8, 96u8, 16u8, 249u8, 103u8, 208u8, 101u8, 119u8, 2u8, 44u8, 109u8, ], ) } @@ -7670,6 +7675,67 @@ pub mod api { const EVENT: &'static str = "IfElseFallbackCalled"; } } + pub mod storage { + use super::runtime_types; + pub mod types { + use super::runtime_types; + pub mod known_derivatives { + use super::runtime_types; + pub type KnownDerivatives = (); + pub type Param0 = ::subxt::ext::subxt_core::utils::AccountId32; + } + } + pub struct StorageApi; + impl StorageApi { + #[doc = " Derivative pseudonym accounts that have been used with [`Pallet::as_derivative`] at least"] + #[doc = " once and have therefore been revealed to the wormhole soundness counter."] + pub fn known_derivatives_iter( + &self, + ) -> ::subxt::ext::subxt_core::storage::address::StaticAddress< + (), + types::known_derivatives::KnownDerivatives, + (), + (), + ::subxt::ext::subxt_core::utils::Yes, + > { + ::subxt::ext::subxt_core::storage::address::StaticAddress::new_static( + "Utility", + "KnownDerivatives", + (), + [ + 7u8, 191u8, 89u8, 10u8, 69u8, 99u8, 173u8, 186u8, 52u8, 139u8, 104u8, + 183u8, 71u8, 107u8, 206u8, 3u8, 88u8, 160u8, 238u8, 53u8, 84u8, 31u8, + 171u8, 151u8, 88u8, 158u8, 134u8, 111u8, 200u8, 72u8, 151u8, 158u8, + ], + ) + } + #[doc = " Derivative pseudonym accounts that have been used with [`Pallet::as_derivative`] at least"] + #[doc = " once and have therefore been revealed to the wormhole soundness counter."] + pub fn known_derivatives( + &self, + _0: types::known_derivatives::Param0, + ) -> ::subxt::ext::subxt_core::storage::address::StaticAddress< + ::subxt::ext::subxt_core::storage::address::StaticStorageKey< + types::known_derivatives::Param0, + >, + types::known_derivatives::KnownDerivatives, + ::subxt::ext::subxt_core::utils::Yes, + (), + (), + > { + ::subxt::ext::subxt_core::storage::address::StaticAddress::new_static( + "Utility", + "KnownDerivatives", + ::subxt::ext::subxt_core::storage::address::StaticStorageKey::new(_0), + [ + 7u8, 191u8, 89u8, 10u8, 69u8, 99u8, 173u8, 186u8, 52u8, 139u8, 104u8, + 183u8, 71u8, 107u8, 206u8, 3u8, 88u8, 160u8, 238u8, 53u8, 84u8, 31u8, + 171u8, 151u8, 88u8, 158u8, 134u8, 111u8, 200u8, 72u8, 151u8, 158u8, + ], + ) + } + } + } pub mod constants { use super::runtime_types; pub struct ConstantsApi; @@ -11603,9 +11669,9 @@ pub mod api { call: ::subxt::ext::subxt_core::alloc::boxed::Box::new(call), }, [ - 83u8, 241u8, 200u8, 95u8, 176u8, 73u8, 86u8, 254u8, 102u8, 49u8, 113u8, - 102u8, 55u8, 250u8, 115u8, 98u8, 254u8, 96u8, 27u8, 19u8, 132u8, 79u8, - 207u8, 104u8, 114u8, 167u8, 142u8, 208u8, 170u8, 125u8, 198u8, 136u8, + 79u8, 227u8, 217u8, 50u8, 232u8, 47u8, 229u8, 224u8, 15u8, 184u8, + 179u8, 233u8, 18u8, 71u8, 96u8, 44u8, 175u8, 22u8, 130u8, 36u8, 30u8, + 185u8, 23u8, 164u8, 113u8, 47u8, 169u8, 99u8, 252u8, 61u8, 41u8, 21u8, ], ) } @@ -17559,46 +17625,98 @@ pub mod api { #[encode_as_type( crate_path = ":: subxt :: ext :: subxt_core :: ext :: scale_encode" )] - #[doc = "Verify an aggregated wormhole proof and process all transfers in the batch."] + #[doc = "Verify a private-batch wormhole proof and process all exits in the batch."] #[doc = ""] #[doc = "Returns `DispatchResultWithPostInfo` to allow weight correction on early failures."] #[doc = "If validation fails before ZK verification, we return minimal weight."] #[doc = "If ZK verification fails, we return full weight since the work was done."] - pub struct VerifyAggregatedProof { - pub proof_bytes: verify_aggregated_proof::ProofBytes, + pub struct VerifyPrivateBatch { + pub proof_bytes: verify_private_batch::ProofBytes, } - pub mod verify_aggregated_proof { + pub mod verify_private_batch { use super::runtime_types; pub type ProofBytes = ::subxt::ext::subxt_core::alloc::vec::Vec<::core::primitive::u8>; } - impl ::subxt::ext::subxt_core::blocks::StaticExtrinsic for VerifyAggregatedProof { + impl ::subxt::ext::subxt_core::blocks::StaticExtrinsic for VerifyPrivateBatch { const PALLET: &'static str = "Wormhole"; - const CALL: &'static str = "verify_aggregated_proof"; + const CALL: &'static str = "verify_private_batch"; + } + #[derive( + :: subxt :: ext :: subxt_core :: ext :: scale_decode :: DecodeAsType, + :: subxt :: ext :: subxt_core :: ext :: scale_encode :: EncodeAsType, + Debug, + )] + #[decode_as_type( + crate_path = ":: subxt :: ext :: subxt_core :: ext :: scale_decode" + )] + #[encode_as_type( + crate_path = ":: subxt :: ext :: subxt_core :: ext :: scale_encode" + )] + #[doc = "Verify a public-batch wormhole proof and process all valid exit segments."] + #[doc = ""] + #[doc = "Invalid segments (already-spent nullifiers) are denied individually; dummy-padded"] + #[doc = "segments (all-zero nullifiers) are skipped silently. A portion of the burn bucket"] + #[doc = "is minted to the proof's `aggregator_address`; if that mint fails (e.g. the"] + #[doc = "account doesn't exist and the rebate is below the existential deposit) the"] + #[doc = "rebate is burned instead of failing the users' exits."] + pub struct VerifyPublicBatch { + pub proof_bytes: verify_public_batch::ProofBytes, + } + pub mod verify_public_batch { + use super::runtime_types; + pub type ProofBytes = + ::subxt::ext::subxt_core::alloc::vec::Vec<::core::primitive::u8>; + } + impl ::subxt::ext::subxt_core::blocks::StaticExtrinsic for VerifyPublicBatch { + const PALLET: &'static str = "Wormhole"; + const CALL: &'static str = "verify_public_batch"; } } pub struct TransactionApi; impl TransactionApi { - #[doc = "Verify an aggregated wormhole proof and process all transfers in the batch."] + #[doc = "Verify a private-batch wormhole proof and process all exits in the batch."] #[doc = ""] #[doc = "Returns `DispatchResultWithPostInfo` to allow weight correction on early failures."] #[doc = "If validation fails before ZK verification, we return minimal weight."] #[doc = "If ZK verification fails, we return full weight since the work was done."] - pub fn verify_aggregated_proof( + pub fn verify_private_batch( &self, - proof_bytes: types::verify_aggregated_proof::ProofBytes, - ) -> ::subxt::ext::subxt_core::tx::payload::StaticPayload< - types::VerifyAggregatedProof, - > { + proof_bytes: types::verify_private_batch::ProofBytes, + ) -> ::subxt::ext::subxt_core::tx::payload::StaticPayload + { + ::subxt::ext::subxt_core::tx::payload::StaticPayload::new_static( + "Wormhole", + "verify_private_batch", + types::VerifyPrivateBatch { proof_bytes }, + [ + 138u8, 4u8, 114u8, 57u8, 176u8, 171u8, 151u8, 90u8, 93u8, 19u8, 57u8, + 176u8, 66u8, 92u8, 244u8, 111u8, 52u8, 102u8, 210u8, 239u8, 220u8, + 14u8, 150u8, 134u8, 251u8, 90u8, 34u8, 237u8, 117u8, 125u8, 115u8, + 69u8, + ], + ) + } + #[doc = "Verify a public-batch wormhole proof and process all valid exit segments."] + #[doc = ""] + #[doc = "Invalid segments (already-spent nullifiers) are denied individually; dummy-padded"] + #[doc = "segments (all-zero nullifiers) are skipped silently. A portion of the burn bucket"] + #[doc = "is minted to the proof's `aggregator_address`; if that mint fails (e.g. the"] + #[doc = "account doesn't exist and the rebate is below the existential deposit) the"] + #[doc = "rebate is burned instead of failing the users' exits."] + pub fn verify_public_batch( + &self, + proof_bytes: types::verify_public_batch::ProofBytes, + ) -> ::subxt::ext::subxt_core::tx::payload::StaticPayload + { ::subxt::ext::subxt_core::tx::payload::StaticPayload::new_static( "Wormhole", - "verify_aggregated_proof", - types::VerifyAggregatedProof { proof_bytes }, + "verify_public_batch", + types::VerifyPublicBatch { proof_bytes }, [ - 122u8, 42u8, 194u8, 153u8, 22u8, 66u8, 199u8, 173u8, 19u8, 107u8, - 232u8, 147u8, 77u8, 40u8, 115u8, 208u8, 183u8, 77u8, 46u8, 149u8, 56u8, - 225u8, 146u8, 168u8, 49u8, 248u8, 42u8, 195u8, 180u8, 91u8, 75u8, - 102u8, + 169u8, 13u8, 181u8, 227u8, 212u8, 168u8, 177u8, 140u8, 2u8, 34u8, 84u8, + 69u8, 178u8, 235u8, 250u8, 24u8, 126u8, 60u8, 52u8, 76u8, 79u8, 7u8, + 110u8, 1u8, 77u8, 209u8, 62u8, 137u8, 212u8, 98u8, 93u8, 4u8, ], ) } @@ -17691,6 +17809,52 @@ pub mod api { const PALLET: &'static str = "Wormhole"; const EVENT: &'static str = "ProofVerified"; } + #[derive( + :: subxt :: ext :: subxt_core :: ext :: scale_decode :: DecodeAsType, + :: subxt :: ext :: subxt_core :: ext :: scale_encode :: EncodeAsType, + Debug, + )] + #[decode_as_type(crate_path = ":: subxt :: ext :: subxt_core :: ext :: scale_decode")] + #[encode_as_type(crate_path = ":: subxt :: ext :: subxt_core :: ext :: scale_encode")] + #[doc = "The block author's share of the wormhole exit volume fee was minted."] + #[doc = ""] + #[doc = "NOTE: keep this as the last variant — indexers decode events by their"] + #[doc = "position in this enum, so existing variants must never be reordered."] + pub struct MinerVolumeFeePaid { + pub miner: miner_volume_fee_paid::Miner, + pub amount: miner_volume_fee_paid::Amount, + } + pub mod miner_volume_fee_paid { + use super::runtime_types; + pub type Miner = ::subxt::ext::subxt_core::utils::AccountId32; + pub type Amount = ::core::primitive::u128; + } + impl ::subxt::ext::subxt_core::events::StaticEvent for MinerVolumeFeePaid { + const PALLET: &'static str = "Wormhole"; + const EVENT: &'static str = "MinerVolumeFeePaid"; + } + #[derive( + :: subxt :: ext :: subxt_core :: ext :: scale_decode :: DecodeAsType, + :: subxt :: ext :: subxt_core :: ext :: scale_encode :: EncodeAsType, + Debug, + )] + #[decode_as_type(crate_path = ":: subxt :: ext :: subxt_core :: ext :: scale_decode")] + #[encode_as_type(crate_path = ":: subxt :: ext :: subxt_core :: ext :: scale_encode")] + #[doc = "Some segments of an exit bundle were denied (their nullifiers were already"] + #[doc = "used, e.g. because the underlying private batch landed on-chain separately)."] + #[doc = "The remaining segments were processed normally."] + pub struct SegmentsDenied { + pub indices: segments_denied::Indices, + } + pub mod segments_denied { + use super::runtime_types; + pub type Indices = + ::subxt::ext::subxt_core::alloc::vec::Vec<::core::primitive::u32>; + } + impl ::subxt::ext::subxt_core::events::StaticEvent for SegmentsDenied { + const PALLET: &'static str = "Wormhole"; + const EVENT: &'static str = "SegmentsDenied"; + } } pub mod storage { use super::runtime_types; @@ -17970,6 +18134,24 @@ pub mod api { ], ) } + #[doc = " For public-batch proofs, the proportion of the burn bucket redirected to the"] + #[doc = " aggregator instead of being destroyed. The miner's share is unchanged."] + #[doc = " Example: Permill::from_percent(50) means half the burn portion goes to the aggregator."] + pub fn volume_fees_aggregator_rate( + &self, + ) -> ::subxt::ext::subxt_core::constants::address::StaticAddress< + runtime_types::sp_arithmetic::per_things::Permill, + > { + ::subxt::ext::subxt_core::constants::address::StaticAddress::new_static( + "Wormhole", + "VolumeFeesAggregatorRate", + [ + 65u8, 93u8, 120u8, 165u8, 204u8, 81u8, 159u8, 163u8, 93u8, 135u8, + 114u8, 121u8, 147u8, 35u8, 215u8, 213u8, 4u8, 223u8, 83u8, 37u8, 225u8, + 200u8, 189u8, 156u8, 140u8, 36u8, 58u8, 46u8, 42u8, 232u8, 155u8, 0u8, + ], + ) + } } } } @@ -23429,12 +23611,24 @@ pub mod api { #[doc = "Contains a variant per dispatchable extrinsic that this pallet has."] pub enum Call { #[codec(index = 2)] - #[doc = "Verify an aggregated wormhole proof and process all transfers in the batch."] + #[doc = "Verify a private-batch wormhole proof and process all exits in the batch."] #[doc = ""] #[doc = "Returns `DispatchResultWithPostInfo` to allow weight correction on early failures."] #[doc = "If validation fails before ZK verification, we return minimal weight."] #[doc = "If ZK verification fails, we return full weight since the work was done."] - verify_aggregated_proof { + verify_private_batch { + proof_bytes: + ::subxt::ext::subxt_core::alloc::vec::Vec<::core::primitive::u8>, + }, + #[codec(index = 3)] + #[doc = "Verify a public-batch wormhole proof and process all valid exit segments."] + #[doc = ""] + #[doc = "Invalid segments (already-spent nullifiers) are denied individually; dummy-padded"] + #[doc = "segments (all-zero nullifiers) are skipped silently. A portion of the burn bucket"] + #[doc = "is minted to the proof's `aggregator_address`; if that mint fails (e.g. the"] + #[doc = "account doesn't exist and the rebate is below the existential deposit) the"] + #[doc = "rebate is burned instead of failing the users' exits."] + verify_public_batch { proof_bytes: ::subxt::ext::subxt_core::alloc::vec::Vec<::core::primitive::u8>, }, @@ -23455,27 +23649,35 @@ pub mod api { #[codec(index = 0)] InvalidPublicInputs, #[codec(index = 1)] + #[doc = "No segment of the bundle is spendable: every non-dummy segment contains a"] + #[doc = "nullifier that is already used (or the single segment of a private-batch"] + #[doc = "proof does)."] NullifierAlreadyUsed, #[codec(index = 2)] - BlockNotFound, + #[doc = "The bundle contains only dummy (all-zero) padding segments, so there is"] + #[doc = "nothing to exit. Distinct from [`Error::NullifierAlreadyUsed`], which is a"] + #[doc = "replay of real segments."] + NoValidSegments, #[codec(index = 3)] - AggregatedVerifierNotAvailable, + BlockNotFound, #[codec(index = 4)] - AggregatedProofDeserializationFailed, + VerifierNotAvailable, #[codec(index = 5)] - AggregatedVerificationFailed, + ProofDeserializationFailed, #[codec(index = 6)] - InvalidAggregatedPublicInputs, + ProofVerificationFailed, #[codec(index = 7)] + InvalidProofPublicInputs, + #[codec(index = 8)] #[doc = "The volume fee rate in the proof doesn't match the configured rate"] InvalidVolumeFeeRate, - #[codec(index = 8)] + #[codec(index = 9)] #[doc = "Transfer amount is below the minimum required"] TransferAmountBelowMinimum, - #[codec(index = 9)] + #[codec(index = 10)] #[doc = "Only native asset (asset_id = 0) is supported in this version"] NonNativeAssetNotSupported, - #[codec(index = 10)] + #[codec(index = 11)] #[doc = "Soundness invariant violated: total wormhole exits would exceed the value that could"] #[doc = "possibly have been deposited into wormhole addresses. This indicates a potential"] #[doc = "soundness bug in the ZK proof system, so the exit is rejected."] @@ -23526,6 +23728,22 @@ pub mod api { [::core::primitive::u8; 32usize], >, }, + #[codec(index = 3)] + #[doc = "The block author's share of the wormhole exit volume fee was minted."] + #[doc = ""] + #[doc = "NOTE: keep this as the last variant — indexers decode events by their"] + #[doc = "position in this enum, so existing variants must never be reordered."] + MinerVolumeFeePaid { + miner: ::subxt::ext::subxt_core::utils::AccountId32, + amount: ::core::primitive::u128, + }, + #[codec(index = 4)] + #[doc = "Some segments of an exit bundle were denied (their nullifiers were already"] + #[doc = "used, e.g. because the underlying private batch landed on-chain separately)."] + #[doc = "The remaining segments were processed normally."] + SegmentsDenied { + indices: ::subxt::ext::subxt_core::alloc::vec::Vec<::core::primitive::u32>, + }, } } } diff --git a/src/cli/exercise/scenarios/wormhole.rs b/src/cli/exercise/scenarios/wormhole.rs index 23ec9db..2fcf482 100644 --- a/src/cli/exercise/scenarios/wormhole.rs +++ b/src/cli/exercise/scenarios/wormhole.rs @@ -22,6 +22,7 @@ async fn multiround(ctx: &mut ExerciseCtx) -> Result { keep_files: false, output_dir: "/tmp/wormhole_exercise".to_string(), dry_run: false, + public: false, }; crate::cli::wormhole::handle_wormhole_command(command, &ctx.node_url).await?; Ok("wormhole multiround (5 rounds, 5 proofs each) completed".to_string()) diff --git a/src/cli/wormhole.rs b/src/cli/wormhole.rs index f1d8422..c1b1e82 100644 --- a/src/cli/wormhole.rs +++ b/src/cli/wormhole.rs @@ -18,12 +18,9 @@ use qp_rusty_crystals_hdwallet::{ derive_wormhole_from_mnemonic, generate_mnemonic, SensitiveBytes32, WormholePair, QUANTUS_WORMHOLE_CHAIN_ID, }; -use qp_wormhole_aggregator::{ - aggregator::{AggregationBackend, CircuitType}, - config::CircuitBinsConfig, -}; -use qp_wormhole_circuit::inputs::ParseAggregatedPublicInputs; -use qp_wormhole_inputs::AggregatedPublicCircuitInputs; +use qp_wormhole_aggregator::config::CircuitBinsConfig; +use qp_wormhole_circuit::inputs::ParsePrivateBatchPublicInputs; +use qp_wormhole_inputs::PrivateBatchPublicInputs; use qp_zk_circuits_common::{ circuit::{C, D, F}, utils::BytesDigest, @@ -696,6 +693,28 @@ pub enum WormholeCommands { #[arg(short, long, default_value = "aggregated_proof.hex")] proof: String, }, + /// Aggregate private-batch proofs into a public batch (delegated, non-private + /// aggregation). The aggregator address earns a rebate from the burn portion + /// of the volume fee when the proof is verified on-chain. + AggregatePublic { + /// Input private-batch proof files (hex-encoded, from `wormhole aggregate`) + #[arg(short, long, num_args = 1..)] + proofs: Vec, + + /// Aggregator address receiving the fee rebate (hex or SS58) + #[arg(short, long)] + aggregator: String, + + /// Output file for the public-batch proof + #[arg(short, long, default_value = "public_batch_proof.hex")] + output: String, + }, + /// Verify a public-batch wormhole proof on-chain + VerifyPublicBatch { + /// Path to the public-batch proof file (hex-encoded) + #[arg(short, long, default_value = "public_batch_proof.hex")] + proof: String, + }, /// Parse and display the contents of a proof file (for debugging) ParseProof { /// Path to the proof file (hex-encoded) @@ -703,9 +722,13 @@ pub enum WormholeCommands { proof: String, /// Parse as aggregated proof (default: false, parses as leaf proof) - #[arg(long)] + #[arg(long, conflicts_with = "public_batch")] aggregated: bool, + /// Parse as public-batch proof + #[arg(long)] + public_batch: bool, + /// Verify the proof cryptographically (local verification, not on-chain) #[arg(long)] verify: bool, @@ -747,6 +770,11 @@ pub enum WormholeCommands { /// Dry run - show what would be done without executing #[arg(long)] dry_run: bool, + + /// Route each round through a public batch (second aggregation layer). + /// The wallet address is used as the aggregator and earns the fee rebate. + #[arg(long)] + public: bool, }, /// Dissolve a large wormhole deposit into many small outputs for better privacy. /// @@ -948,10 +976,12 @@ pub async fn handle_wormhole_command( Ok(()) }, WormholeCommands::Aggregate { proofs, output } => aggregate_proofs(proofs, output).await, - WormholeCommands::VerifyAggregated { proof } => - verify_aggregated_proof(proof, node_url).await, - WormholeCommands::ParseProof { proof, aggregated, verify } => - parse_proof_file(proof, aggregated, verify).await, + WormholeCommands::VerifyAggregated { proof } => verify_private_batch(proof, node_url).await, + WormholeCommands::AggregatePublic { proofs, aggregator, output } => + aggregate_public_batch(proofs, aggregator, output).await, + WormholeCommands::VerifyPublicBatch { proof } => verify_public_batch(proof, node_url).await, + WormholeCommands::ParseProof { proof, aggregated, public_batch, verify } => + parse_proof_file(proof, aggregated, public_batch, verify).await, WormholeCommands::Multiround { num_proofs, rounds, @@ -962,6 +992,7 @@ pub async fn handle_wormhole_command( keep_files, output_dir, dry_run, + public, } => { // Convert DEV to planck and align to SCALE_DOWN_FACTOR for clean quantization let amount_planck = (amount * 1_000_000_000_000.0) as u128; @@ -976,6 +1007,7 @@ pub async fn handle_wormhole_command( keep_files, output_dir, dry_run, + public, node_url, ) .await @@ -1124,11 +1156,29 @@ pub async fn at_best_block( Ok(block) } +/// Load leaf-circuit common data for deserializing leaf proofs from `bins_dir`. +fn load_leaf_common_data( + bins_dir: &std::path::Path, +) -> crate::error::Result> { + use qp_wormhole_aggregator::common::utils::load_canonical_leaf_verifier_data; + + let common_bytes = std::fs::read(bins_dir.join("common.bin")).map_err(|e| { + crate::error::QuantusError::Generic(format!("Failed to read common.bin: {}", e)) + })?; + let verifier_bytes = std::fs::read(bins_dir.join("verifier.bin")).map_err(|e| { + crate::error::QuantusError::Generic(format!("Failed to read verifier.bin: {}", e)) + })?; + let leaf = load_canonical_leaf_verifier_data(&common_bytes, &verifier_bytes).map_err(|e| { + crate::error::QuantusError::Generic(format!("Failed to load leaf circuit data: {}", e)) + })?; + Ok(leaf.common) +} + pub async fn aggregate_proofs( proof_files: Vec, output_file: String, ) -> crate::error::Result<()> { - use qp_wormhole_aggregator::aggregator::{AggregationBackend, CircuitType, Layer0Aggregator}; + use qp_wormhole_aggregator::private_batch::prover::PrivateBatchProver; log_print!("Aggregating {} proofs...", proof_files.len()); @@ -1141,6 +1191,11 @@ pub async fn aggregate_proofs( })?; // Validate number of proofs before doing expensive work + if proof_files.is_empty() { + return Err(crate::error::QuantusError::Generic( + "At least one leaf proof is required".to_string(), + )); + } if proof_files.len() > agg_config.num_leaf_proofs { return Err(crate::error::QuantusError::Generic(format!( "Too many proofs: {} provided, max {} supported by circuit", @@ -1150,22 +1205,12 @@ pub async fn aggregate_proofs( } let num_padding_proofs = agg_config.num_leaf_proofs - proof_files.len(); + log_print!(" Loading private-batch prover (will pad with {} dummies)...", num_padding_proofs); + log_verbose!("Aggregation config: num_leaf_proofs={}", agg_config.num_leaf_proofs); - log_print!(" Loading aggregator and generating {} dummy proofs...", num_padding_proofs); - - let mut aggregator = Layer0Aggregator::new(&bins_dir).map_err(|e| { - crate::error::QuantusError::Generic(format!( - "Failed to load aggregator from pre-built bins: {}", - e - )) - })?; - - log_verbose!("Aggregation config: num_leaf_proofs={}", aggregator.batch_size()); - let common_data = aggregator.load_common_data(CircuitType::Leaf).map_err(|e| { - crate::error::QuantusError::Generic(format!("Failed to load leaf circuit data: {}", e)) - })?; + let common_data = load_leaf_common_data(&bins_dir)?; - // Load and add proofs using helper function + let mut proofs = Vec::with_capacity(proof_files.len()); for (idx, proof_file) in proof_files.iter().enumerate() { log_verbose!("Loading proof {}/{}: {}", idx + 1, proof_files.len(), proof_file); @@ -1180,23 +1225,27 @@ pub async fn aggregate_proofs( proof_file, e )) })?; - - aggregator.push_proof(proof).map_err(|e| { - crate::error::QuantusError::Generic(format!("Failed to add proof: {}", e)) - })?; + proofs.push(proof); } + let prover = PrivateBatchProver::new_from_binaries_dir(&bins_dir).map_err(|e| { + crate::error::QuantusError::Generic(format!( + "Failed to load private-batch prover from pre-built bins: {}", + e + )) + })?; + log_print!(" Running aggregation..."); let agg_start = std::time::Instant::now(); - let aggregated_proof = aggregator - .aggregate() + let aggregated_proof = prover + .aggregate(proofs) .map_err(|e| crate::error::QuantusError::Generic(format!("Aggregation failed: {}", e)))?; let agg_elapsed = agg_start.elapsed(); log_print!(" Aggregation: {:.2}s", agg_elapsed.as_secs_f64()); // Parse and display aggregated public inputs let aggregated_public_inputs = - AggregatedPublicCircuitInputs::try_from_felts(aggregated_proof.public_inputs.as_slice()) + PrivateBatchPublicInputs::try_from_felts(aggregated_proof.public_inputs.as_slice()) .map_err(|e| { crate::error::QuantusError::Generic(format!( "Failed to parse aggregated public inputs: {}", @@ -1229,14 +1278,27 @@ pub async fn aggregate_proofs( } } - // Verify the aggregated proof locally + // Verify via the verifier crate (byte round-trip keeps proof types aligned). log_verbose!("Verifying aggregated proof locally..."); - aggregator.verify(aggregated_proof.clone()).map_err(|e| { + let proof_bytes = aggregated_proof.to_bytes(); + let verifier = crate::batch_verifier::load_private_batch_verifier(&bins_dir).map_err(|e| { + crate::error::QuantusError::Generic(format!("Failed to load private-batch verifier: {}", e)) + })?; + let verify_proof = qp_wormhole_verifier::ProofWithPublicInputs::from_bytes( + proof_bytes.clone(), + &verifier.circuit_data.common, + ) + .map_err(|e| { + crate::error::QuantusError::Generic(format!( + "Failed to deserialize aggregated proof for verification: {}", + e + )) + })?; + verifier.verify(verify_proof).map_err(|e| { crate::error::QuantusError::Generic(format!("Aggregated proof verification failed: {}", e)) })?; - // Save aggregated proof using helper function - write_proof_file(&output_file, &aggregated_proof.to_bytes()).map_err(|e| { + write_proof_file(&output_file, &proof_bytes).map_err(|e| { crate::error::QuantusError::Generic(format!("Failed to write proof: {}", e)) })?; @@ -1251,11 +1313,169 @@ pub async fn aggregate_proofs( Ok(()) } +/// Aggregate private-batch proofs into a public batch with the given aggregator address. +/// +/// Partial batches are padded with dummy private-batch proofs by the prover, so any +/// number of proofs from 1 up to the circuit's `num_private_batch_proofs` is accepted. +pub async fn aggregate_public_batch( + proof_files: Vec, + aggregator_address_str: String, + output_file: String, +) -> crate::error::Result<()> { + use plonky2::field::types::PrimeField64; + use qp_wormhole_aggregator::aggregator::PublicBatchAggregator; + use qp_wormhole_inputs::PublicBatchPublicInputs; + + log_print!("Aggregating {} private-batch proofs into a public batch...", proof_files.len()); + + let aggregator_bytes = parse_exit_account(&aggregator_address_str).map_err(|e| { + crate::error::QuantusError::Generic(format!("Invalid aggregator address: {}", e)) + })?; + let aggregator_address = BytesDigest::try_from(aggregator_bytes).map_err(|e| { + crate::error::QuantusError::Generic(format!( + "Aggregator address is not representable as field elements (must be a hash-derived account): {}", + e + )) + })?; + log_print!(" Aggregator (fee rebate recipient): {}", slice_to_quantus_ss58(&aggregator_bytes)); + + let bins_dir = crate::bins::ensure_bins_dir()?; + let agg_config = CircuitBinsConfig::load(&bins_dir).map_err(|e| { + crate::error::QuantusError::Generic(format!( + "Failed to load circuit bins config from {:?}: {}", + bins_dir, e + )) + })?; + let num_private_batch_proofs = agg_config.num_private_batch_proofs.ok_or_else(|| { + crate::error::QuantusError::Generic( + "Circuit binaries were generated without public-batch support; \ + delete the generated-bins directory to regenerate them" + .to_string(), + ) + })?; + + if proof_files.is_empty() { + return Err(crate::error::QuantusError::Generic( + "At least one private-batch proof is required".to_string(), + )); + } + if proof_files.len() > num_private_batch_proofs { + return Err(crate::error::QuantusError::Generic(format!( + "Too many proofs: {} provided, max {} supported by circuit", + proof_files.len(), + num_private_batch_proofs + ))); + } + + let mut aggregator = + PublicBatchAggregator::new(&bins_dir, aggregator_address).map_err(|e| { + crate::error::QuantusError::Generic(format!( + "Failed to load public-batch aggregator from pre-built bins: {}", + e + )) + })?; + + // Inner proofs for the public-batch aggregator are private-batch proofs. + let common_data = aggregator.private_batch_common().clone(); + + let mut batch_key = None; + for (idx, proof_file) in proof_files.iter().enumerate() { + log_verbose!("Loading proof {}/{}: {}", idx + 1, proof_files.len(), proof_file); + let proof_bytes = read_hex_proof_file_to_bytes(proof_file)?; + let proof = ProofWithPublicInputs::::from_bytes(proof_bytes, &common_data) + .map_err(|e| { + crate::error::QuantusError::Generic(format!( + "Failed to deserialize private-batch proof from {}: {}", + proof_file, e + )) + })?; + let key = aggregator.push_proof(proof).map_err(|e| { + crate::error::QuantusError::Generic(format!("Failed to add proof: {}", e)) + })?; + match &batch_key { + None => batch_key = Some(key), + Some(existing) if existing != &key => { + return Err(crate::error::QuantusError::Generic(format!( + "Proof {} is incompatible with earlier proofs (block_hash/asset_id/fee mismatch)", + proof_file + ))); + }, + Some(_) => {}, + } + } + + let batch_key = batch_key.ok_or_else(|| { + crate::error::QuantusError::Generic("No private-batch proofs were admitted".to_string()) + })?; + + let num_dummies = num_private_batch_proofs - proof_files.len(); + if num_dummies > 0 { + log_print!(" Padding with {} dummy private-batch proof(s)...", num_dummies); + } + + log_print!(" Running public-batch aggregation..."); + let agg_start = std::time::Instant::now(); + let public_batch_proof = aggregator.aggregate(&batch_key).map_err(|e| { + crate::error::QuantusError::Generic(format!("Public-batch aggregation failed: {}", e)) + })?; + log_print!(" Aggregation: {:.2}s", agg_start.elapsed().as_secs_f64()); + + // Parse and display the public-batch public inputs + let pi_u64s: Vec = + public_batch_proof.public_inputs.iter().map(|f| f.to_canonical_u64()).collect(); + let public_inputs = PublicBatchPublicInputs::try_from_u64_slice( + &pi_u64s, + num_private_batch_proofs, + agg_config.num_leaf_proofs, + ) + .map_err(|e| { + crate::error::QuantusError::Generic(format!( + "Failed to parse public-batch public inputs: {}", + e + )) + })?; + + log_verbose!("Public-batch public inputs: {:#?}", public_inputs); + log_print!(" Exit accounts in public batch:"); + for (idx, account_data) in public_inputs.account_data.iter().enumerate() { + let exit_bytes: &[u8] = account_data.exit_account.as_ref(); + let is_dummy = exit_bytes.iter().all(|&b| b == 0) || account_data.summed_output_amount == 0; + if is_dummy { + log_verbose!(" [{}] DUMMY (skipped)", idx); + } else { + let dequantized_amount = + (account_data.summed_output_amount as u128) * SCALE_DOWN_FACTOR; + log_print!( + " [{}] {} -> {}", + idx, + slice_to_quantus_ss58(exit_bytes), + format_balance(dequantized_amount) + ); + } + } + + log_verbose!("Verifying public-batch proof locally..."); + aggregator.verify(public_batch_proof.clone()).map_err(|e| { + crate::error::QuantusError::Generic(format!( + "Public-batch proof verification failed: {}", + e + )) + })?; + + write_proof_file(&output_file, &public_batch_proof.to_bytes()).map_err(|e| { + crate::error::QuantusError::Generic(format!("Failed to write proof: {}", e)) + })?; + + log_success!("Public-batch aggregation complete!"); + log_success!("Output: {}", output_file); + Ok(()) +} + /// Where in the chain a submitted extrinsic has been observed. /// /// `Best` means it landed in the current best block (not yet finalised); /// `Finalized` means it's in a block past the finality gadget. Returned by -/// [`submit_unsigned_verify_aggregated_proof`] alongside the block + tx hash. +/// [`submit_unsigned_verify_private_batch`] alongside the block + tx hash. #[derive(Debug, Clone, Copy, PartialEq, Eq)] pub enum IncludedAt { Best, @@ -1289,15 +1509,15 @@ fn read_hex_proof_file_to_bytes(proof_file: &str) -> crate::error::Result, ) -> crate::error::Result<(IncludedAt, subxt::utils::H256, subxt::utils::H256)> { use subxt::tx::TxStatus; - let verify_tx = quantus_node::api::tx().wormhole().verify_aggregated_proof(proof_bytes); + let verify_tx = quantus_node::api::tx().wormhole().verify_private_batch(proof_bytes); let unsigned_tx = quantus_client.client().tx().create_unsigned(&verify_tx).map_err(|e| { crate::error::QuantusError::Generic(format!("Failed to create unsigned tx: {}", e)) @@ -1409,7 +1629,7 @@ async fn collect_wormhole_events_for_extrinsic( Ok((found_proof_verified, transfer_events)) } -async fn verify_aggregated_proof(proof_file: String, node_url: &str) -> crate::error::Result<()> { +async fn verify_private_batch(proof_file: String, node_url: &str) -> crate::error::Result<()> { log_print!("Verifying aggregated wormhole proof on-chain..."); let proof_bytes = read_hex_proof_file_to_bytes(&proof_file)?; @@ -1424,7 +1644,7 @@ async fn verify_aggregated_proof(proof_file: String, node_url: &str) -> crate::e log_verbose!("Submitting unsigned aggregated verification transaction..."); let (included_at, block_hash, tx_hash) = - submit_unsigned_verify_aggregated_proof(&quantus_client, proof_bytes).await?; + submit_unsigned_verify_private_batch(&quantus_client, proof_bytes).await?; // One unified check (no best/finalized copy-paste) let result = check_proof_verification_events( @@ -1454,6 +1674,97 @@ async fn verify_aggregated_proof(proof_file: String, node_url: &str) -> crate::e Err(crate::error::QuantusError::Generic(error_msg)) } +/// Submit unsigned verify_public_batch(proof_bytes) and return (included_at, block_hash, +/// tx_hash). +pub async fn submit_unsigned_verify_public_batch( + quantus_client: &QuantusClient, + proof_bytes: Vec, +) -> crate::error::Result<(IncludedAt, subxt::utils::H256, subxt::utils::H256)> { + use subxt::tx::TxStatus; + + let verify_tx = quantus_node::api::tx().wormhole().verify_public_batch(proof_bytes); + + let unsigned_tx = quantus_client.client().tx().create_unsigned(&verify_tx).map_err(|e| { + crate::error::QuantusError::Generic(format!("Failed to create unsigned tx: {}", e)) + })?; + + let mut tx_progress = unsigned_tx + .submit_and_watch() + .await + .map_err(|e| crate::error::QuantusError::Generic(format!("Failed to submit tx: {}", e)))?; + + while let Some(Ok(status)) = tx_progress.next().await { + match status { + TxStatus::InBestBlock(tx_in_block) => { + return Ok(( + IncludedAt::Best, + tx_in_block.block_hash(), + tx_in_block.extrinsic_hash(), + )); + }, + TxStatus::InFinalizedBlock(tx_in_block) => { + return Ok(( + IncludedAt::Finalized, + tx_in_block.block_hash(), + tx_in_block.extrinsic_hash(), + )); + }, + TxStatus::Error { message } | TxStatus::Invalid { message } => { + return Err(crate::error::QuantusError::Generic(format!( + "Transaction failed: {}", + message + ))); + }, + _ => continue, + } + } + + Err(crate::error::QuantusError::Generic("Transaction stream ended unexpectedly".to_string())) +} + +async fn verify_public_batch(proof_file: String, node_url: &str) -> crate::error::Result<()> { + log_print!("Verifying public-batch wormhole proof on-chain..."); + + let proof_bytes = read_hex_proof_file_to_bytes(&proof_file)?; + log_verbose!("Public-batch proof size: {} bytes", proof_bytes.len()); + + let quantus_client = QuantusClient::new(node_url) + .await + .map_err(|e| crate::error::QuantusError::Generic(format!("Failed to connect: {}", e)))?; + log_verbose!("Connected to node"); + + log_verbose!("Submitting unsigned public-batch verification transaction..."); + + let (included_at, block_hash, tx_hash) = + submit_unsigned_verify_public_batch(&quantus_client, proof_bytes).await?; + + let result = check_proof_verification_events( + quantus_client.client(), + &block_hash, + &tx_hash, + crate::log::is_verbose(), + ) + .await?; + + if result.success { + log_success!("Public-batch proof verified successfully on-chain!"); + if let Some(amount) = result.exit_amount { + log_success!("Total exit amount: {}", format_balance(amount)); + } + + log_print!(" Block: 0x{}", hex::encode(block_hash.0)); + log_print!(" Extrinsic: 0x{}", hex::encode(tx_hash.0)); + log_verbose!("Included in {}: {:?}", included_at.label(), block_hash); + return Ok(()); + } + + let error_msg = result.error_message.unwrap_or_else(|| { + "Public-batch proof verification failed - no ProofVerified event found".to_string() + }); + log_error!("❌ {}", error_msg); + Err(crate::error::QuantusError::Generic(error_msg)) +} + // ============================================================================ // Multi-round wormhole flow implementation // ============================================================================ @@ -1891,7 +2202,7 @@ async fn generate_round_proofs( // Generate proof with dual output assignment generate_proof( - &hex::encode(secret.secret), + &hex::encode(secret.secret.as_bytes()), transfer.amount, // Use actual transfer amount for storage key &output_assignments[i], &format!("0x{}", hex::encode(proof_block_hash.0)), @@ -2031,6 +2342,7 @@ async fn run_multiround( keep_files: bool, output_dir: String, dry_run: bool, + public: bool, node_url: &str, ) -> crate::error::Result<()> { use colored::Colorize; @@ -2177,11 +2489,24 @@ async fn run_multiround( log_print!(" Aggregated proof saved to {}", aggregated_file); - // Step 4: Verify aggregated proof on-chain - log_print!("{}", "Step 4: Submitting aggregated proof on-chain...".bright_yellow()); - - let (verification_block, extrinsic_hash, transfer_events) = - verify_aggregated_and_get_events(&aggregated_file, &quantus_client).await?; + // Step 4: Verify on-chain (optionally wrapping in a public batch first) + let (verification_block, extrinsic_hash, transfer_events) = if public { + log_print!( + "{}", + "Step 4: Wrapping in a public batch and submitting on-chain...".bright_yellow() + ); + let public_batch_file = format!("{}/public_batch.hex", round_dir); + aggregate_public_batch( + vec![aggregated_file.clone()], + wallet.wallet_address.clone(), + public_batch_file.clone(), + ) + .await?; + verify_public_batch_and_get_events(&public_batch_file, &quantus_client).await? + } else { + log_print!("{}", "Step 4: Submitting aggregated proof on-chain...".bright_yellow()); + verify_private_batch_and_get_events(&aggregated_file, &quantus_client).await? + }; log_print!( " {} Proof verified in block {} (extrinsic: 0x{})", @@ -2454,7 +2779,7 @@ pub fn decode_full_leaf_data(leaf_data: &[u8]) -> crate::error::Result<([u8; 32] } /// Verify an aggregated proof and return the block hash, extrinsic hash, and transfer events -pub async fn verify_aggregated_and_get_events( +pub async fn verify_private_batch_and_get_events( proof_file: &str, quantus_client: &QuantusClient, ) -> crate::error::Result<( @@ -2462,22 +2787,24 @@ pub async fn verify_aggregated_and_get_events( subxt::utils::H256, Vec, )> { - use qp_wormhole_verifier::WormholeVerifier; - let proof_bytes = read_hex_proof_file_to_bytes(proof_file)?; log_verbose!("Verifying aggregated proof locally before on-chain submission..."); let bins_dir = crate::bins::ensure_bins_dir()?; - let common_bytes = std::fs::read(bins_dir.join("aggregated_common.bin")).map_err(|e| { - crate::error::QuantusError::Generic(format!("Failed to read aggregated_common.bin: {}", e)) - })?; - let verifier_bytes = std::fs::read(bins_dir.join("aggregated_verifier.bin")).map_err(|e| { + let common_bytes = std::fs::read(bins_dir.join("private_batch_common.bin")).map_err(|e| { crate::error::QuantusError::Generic(format!( - "Failed to read aggregated_verifier.bin: {}", + "Failed to read private_batch_common.bin: {}", e )) })?; + let verifier_bytes = + std::fs::read(bins_dir.join("private_batch_verifier.bin")).map_err(|e| { + crate::error::QuantusError::Generic(format!( + "Failed to read private_batch_verifier.bin: {}", + e + )) + })?; log_verbose!( "Circuit binaries: common_bytes.len={}, verifier_bytes.len={}, common_hash={}, verifier_hash={}", common_bytes.len(), @@ -2486,11 +2813,7 @@ pub async fn verify_aggregated_and_get_events( hex::encode(blake3::hash(&verifier_bytes).as_bytes()), ); - let verifier = WormholeVerifier::new_from_files( - &bins_dir.join("aggregated_verifier.bin"), - &bins_dir.join("aggregated_common.bin"), - ) - .map_err(|e| { + let verifier = crate::batch_verifier::load_private_batch_verifier(&bins_dir).map_err(|e| { crate::error::QuantusError::Generic(format!("Failed to load aggregated verifier: {}", e)) })?; @@ -2516,7 +2839,7 @@ pub async fn verify_aggregated_and_get_events( // Submit unsigned tx + wait for inclusion (best or finalized) let (included_at, block_hash, tx_hash) = - submit_unsigned_verify_aggregated_proof(quantus_client, proof_bytes).await?; + submit_unsigned_verify_private_batch(quantus_client, proof_bytes).await?; log_verbose!( "Submitted tx included in {}: block={:?}, tx={:?}", @@ -2551,6 +2874,81 @@ pub async fn verify_aggregated_and_get_events( Ok((block_hash, tx_hash, transfer_events)) } +/// Verify a public-batch proof and return the block hash, extrinsic hash, and transfer events +pub async fn verify_public_batch_and_get_events( + proof_file: &str, + quantus_client: &QuantusClient, +) -> crate::error::Result<( + subxt::utils::H256, + subxt::utils::H256, + Vec, +)> { + let proof_bytes = read_hex_proof_file_to_bytes(proof_file)?; + + log_verbose!("Verifying public-batch proof locally before on-chain submission..."); + let bins_dir = crate::bins::ensure_bins_dir()?; + + let verifier = crate::batch_verifier::load_public_batch_verifier(&bins_dir).map_err(|e| { + crate::error::QuantusError::Generic(format!("Failed to load public-batch verifier: {}", e)) + })?; + + let proof = qp_wormhole_verifier::ProofWithPublicInputs::< + qp_wormhole_verifier::F, + qp_wormhole_verifier::C, + { qp_wormhole_verifier::D }, + >::from_bytes(proof_bytes.clone(), &verifier.circuit_data.common) + .map_err(|e| { + crate::error::QuantusError::Generic(format!( + "Failed to deserialize public-batch proof: {}", + e + )) + })?; + + verifier.verify(proof).map_err(|e| { + crate::error::QuantusError::Generic(format!( + "Local public-batch proof verification failed: {}", + e + )) + })?; + log_verbose!("Local verification passed!"); + + // Submit unsigned tx + wait for inclusion (best or finalized) + let (included_at, block_hash, tx_hash) = + submit_unsigned_verify_public_batch(quantus_client, proof_bytes).await?; + + log_verbose!( + "Submitted tx included in {}: block={:?}, tx={:?}", + included_at.label(), + block_hash, + tx_hash + ); + + // Collect events for our extrinsic only + let (found_proof_verified, transfer_events) = + collect_wormhole_events_for_extrinsic(quantus_client, block_hash, tx_hash).await?; + + if !found_proof_verified { + return Err(crate::error::QuantusError::Generic( + "Public-batch proof verification failed - no ProofVerified event".to_string(), + )); + } + + // Log minted amounts + log_print!(" Tokens minted (from NativeTransferred events):"); + for (idx, transfer) in transfer_events.iter().enumerate() { + let ss58_address = bytes_to_quantus_ss58(&transfer.to.0); + log_print!( + " [{}] {} -> {} planck ({})", + idx, + ss58_address, + transfer.amount, + format_balance(transfer.amount) + ); + } + + Ok((block_hash, tx_hash, transfer_events)) +} + /// Dry run - show what would happen without executing fn run_multiround_dry_run( mnemonic: &str, @@ -2617,6 +3015,7 @@ fn run_multiround_dry_run( async fn parse_proof_file( proof_file: String, aggregated: bool, + public_batch: bool, verify: bool, ) -> crate::error::Result<()> { use qp_wormhole_verifier::WormholeVerifier; @@ -2631,16 +3030,95 @@ async fn parse_proof_file( let bins_dir = crate::bins::ensure_bins_dir()?; - if aggregated { - // Load aggregated verifier - let verifier = WormholeVerifier::new_from_files( - &bins_dir.join("aggregated_verifier.bin"), - &bins_dir.join("aggregated_common.bin"), - ) + if public_batch { + use plonky2::field::types::PrimeField64; + use qp_wormhole_inputs::PublicBatchPublicInputs; + + let agg_config = CircuitBinsConfig::load(&bins_dir).map_err(|e| { + crate::error::QuantusError::Generic(format!("Failed to load bins config: {}", e)) + })?; + let num_private_batch_proofs = agg_config.num_private_batch_proofs.ok_or_else(|| { + crate::error::QuantusError::Generic( + "Circuit binaries lack public-batch support; regenerate them".to_string(), + ) + })?; + + let verifier = + crate::batch_verifier::load_public_batch_verifier(&bins_dir).map_err(|e| { + crate::error::QuantusError::Generic(format!("Failed to load verifier: {}", e)) + })?; + + let proof = qp_wormhole_verifier::ProofWithPublicInputs::< + qp_wormhole_verifier::F, + qp_wormhole_verifier::C, + { qp_wormhole_verifier::D }, + >::from_bytes(proof_bytes.clone(), &verifier.circuit_data.common) .map_err(|e| { - crate::error::QuantusError::Generic(format!("Failed to load verifier: {}", e)) + crate::error::QuantusError::Generic(format!( + "Failed to deserialize public-batch proof: {:?}", + e + )) })?; + log_print!("\nPublic inputs count: {}", proof.public_inputs.len()); + + let pi_u64s: Vec = proof.public_inputs.iter().map(|f| f.to_canonical_u64()).collect(); + match PublicBatchPublicInputs::try_from_u64_slice( + &pi_u64s, + num_private_batch_proofs, + agg_config.num_leaf_proofs, + ) { + Ok(inputs) => { + log_print!("\n=== Parsed Public-Batch Public Inputs ==="); + log_print!( + "Aggregator: 0x{} ({})", + hex::encode(inputs.aggregator_address.as_ref()), + slice_to_quantus_ss58(inputs.aggregator_address.as_ref()) + ); + log_print!("Asset ID: {}", inputs.asset_id); + log_print!("Volume Fee BPS: {}", inputs.volume_fee_bps); + log_print!("Block Hash: 0x{}", hex::encode(inputs.block_data.block_hash.as_ref())); + log_print!("Block Number: {}", inputs.block_data.block_number); + log_print!("Total Exit Slots: {}", inputs.total_exit_slots); + log_print!("\nAccount Data ({} slots):", inputs.account_data.len()); + for (i, acct) in inputs.account_data.iter().enumerate() { + log_print!( + " [{}] amount={}, exit=0x{}", + i, + acct.summed_output_amount, + hex::encode(acct.exit_account.as_ref()) + ); + } + log_print!("\nNullifiers ({} nullifiers):", inputs.nullifiers.len()); + for (i, nullifier) in inputs.nullifiers.iter().enumerate() { + log_print!(" [{}] 0x{}", i, hex::encode(nullifier.as_ref())); + } + }, + Err(e) => { + log_print!("Failed to parse as public-batch inputs: {}", e); + }, + } + + if verify { + log_print!("\n=== Verifying Proof ==="); + match verifier.verify(proof) { + Ok(()) => log_success!("Proof verification PASSED"), + Err(e) => { + log_error!("Proof verification FAILED: {}", e); + return Err(crate::error::QuantusError::Generic(format!( + "Proof verification failed: {}", + e + ))); + }, + } + } + } else if aggregated { + // Load aggregated verifier (batch profile checks; not the leaf keccak pin). + let verifier = + crate::batch_verifier::load_private_batch_verifier(&bins_dir).map_err(|e| { + crate::error::QuantusError::Generic(format!("Failed to load verifier: {}", e)) + })?; + // Deserialize proof using verifier's types let proof = qp_wormhole_verifier::ProofWithPublicInputs::< qp_wormhole_verifier::F, @@ -2658,7 +3136,7 @@ async fn parse_proof_file( log_verbose!("\nPublic inputs count: {}", proof.public_inputs.len()); // Try to parse as aggregated - match qp_wormhole_verifier::parse_aggregated_public_inputs(&proof) { + match qp_wormhole_verifier::parse_private_batch_public_inputs(&proof) { Ok(agg_inputs) => { log_print!("\n=== Parsed Aggregated Public Inputs ==="); log_print!("Asset ID: {}", agg_inputs.asset_id); @@ -2897,7 +3375,7 @@ async fn run_dissolve( .map_err(|e| crate::error::QuantusError::Generic(format!("Event decode error: {}", e)))?; let mut current_outputs = vec![DissolveOutput { - secret: initial_secret.secret, + secret: *initial_secret.secret.as_bytes(), amount, transfer_count: event.transfer_count, funding_account: funding_account.clone(), @@ -3005,7 +3483,7 @@ async fn run_dissolve( // Verify on-chain log_print!(" Verifying on-chain..."); let (verification_block, _extrinsic_hash, transfer_events) = - verify_aggregated_and_get_events(&aggregated_file, &quantus_client).await?; + verify_private_batch_and_get_events(&aggregated_file, &quantus_client).await?; log_success!(" Verified in block 0x{}", hex::encode(verification_block.0)); @@ -3031,7 +3509,7 @@ async fn run_dissolve( })?; all_next_outputs.push(DissolveOutput { - secret: target_address.secret, + secret: *target_address.secret.as_bytes(), amount: event.amount, transfer_count: event.transfer_count, funding_account: event.from.clone(), @@ -3247,17 +3725,12 @@ async fn run_collect_rewards( /// Helper to aggregate proof files and write the result (used by dissolve command) fn aggregate_proofs_to_file(proof_files: &[String], output_file: &str) -> crate::error::Result<()> { - use qp_wormhole_aggregator::aggregator::Layer0Aggregator; + use qp_wormhole_aggregator::private_batch::prover::PrivateBatchProver; let bins_dir = crate::bins::ensure_bins_dir()?; - let mut aggregator = Layer0Aggregator::new(&bins_dir).map_err(|e| { - crate::error::QuantusError::Generic(format!("Failed to create aggregator: {}", e)) - })?; - - let common_data = aggregator.load_common_data(CircuitType::Leaf).map_err(|e| { - crate::error::QuantusError::Generic(format!("Failed to load common data: {}", e)) - })?; + let common_data = load_leaf_common_data(&bins_dir)?; + let mut proofs = Vec::with_capacity(proof_files.len()); for proof_file in proof_files { let proof_bytes = read_hex_proof_file_to_bytes(proof_file)?; let proof = ProofWithPublicInputs::::from_bytes(proof_bytes, &common_data) @@ -3267,14 +3740,16 @@ fn aggregate_proofs_to_file(proof_files: &[String], output_file: &str) -> crate: proof_file, e )) })?; - aggregator.push_proof(proof).map_err(|e| { - crate::error::QuantusError::Generic(format!("Failed to push proof: {}", e)) - })?; + proofs.push(proof); } + let prover = PrivateBatchProver::new_from_binaries_dir(&bins_dir).map_err(|e| { + crate::error::QuantusError::Generic(format!("Failed to create private-batch prover: {}", e)) + })?; + let agg_start = std::time::Instant::now(); - let proof = aggregator - .aggregate() + let proof = prover + .aggregate(proofs) .map_err(|e| crate::error::QuantusError::Generic(format!("Aggregation failed: {}", e)))?; let agg_elapsed = agg_start.elapsed(); log_print!(" Aggregation: {:.2}s", agg_elapsed.as_secs_f64()); @@ -3356,9 +3831,7 @@ async fn run_check_nullifier( crate::error::QuantusError::Generic(format!("HD derivation failed: {:?}", e)) })?; - let secret: [u8; 32] = wormhole_pair.secret.as_ref().try_into().map_err(|_| { - crate::error::QuantusError::Generic("Invalid secret length".to_string()) - })?; + let secret: [u8; 32] = *wormhole_pair.secret.as_bytes(); log_print!("Derived wormhole secret from wallet '{}' (index {})", wallet, wormhole_index); secret } else { @@ -3712,12 +4185,22 @@ mod tests { // If the upstream adds/removes/renames fields, this test will catch it. let json = r#"{ "num_leaf_proofs": 8, - "num_layer0_proofs": null + "num_private_batch_proofs": null }"#; let config: CircuitBinsConfig = serde_json::from_str(json).unwrap(); assert_eq!(config.num_leaf_proofs, 8); - assert_eq!(config.num_layer0_proofs, None); + assert_eq!(config.num_private_batch_proofs, None); + + // Legacy config.json files (pre-rename) must still deserialize via the + // serde alias on the upstream field. + let legacy_json = r#"{ + "num_leaf_proofs": 8, + "num_layer0_proofs": 4 + }"#; + + let legacy: CircuitBinsConfig = serde_json::from_str(legacy_json).unwrap(); + assert_eq!(legacy.num_private_batch_proofs, Some(4)); } fn mk_accounts(n: usize) -> Vec<[u8; 32]> { diff --git a/src/collect_rewards_lib.rs b/src/collect_rewards_lib.rs index 1c26990..1dcba28 100644 --- a/src/collect_rewards_lib.rs +++ b/src/collect_rewards_lib.rs @@ -29,8 +29,7 @@ use crate::{ use plonky2::plonk::proof::ProofWithPublicInputs; use qp_rusty_crystals_hdwallet::{derive_wormhole_from_mnemonic, QUANTUS_WORMHOLE_CHAIN_ID}; use qp_wormhole_aggregator::{ - aggregator::{AggregationBackend, CircuitType, Layer0Aggregator}, - config::CircuitBinsConfig, + config::CircuitBinsConfig, private_batch::prover::PrivateBatchProver, }; use qp_zk_circuits_common::circuit::{C, D, F}; use sp_core::crypto::{AccountId32, Ss58Codec}; @@ -182,12 +181,7 @@ pub fn resolve_credential(credential: &WormholeCredential) -> Result<(String, [u let wormhole_pair = derive_wormhole_from_mnemonic(phrase, None, &path) .map_err(|e| CollectRewardsError::from(format!("HD derivation failed: {:?}", e)))?; let address_bytes: [u8; 32] = wormhole_pair.address; - let secret_bytes: [u8; 32] = - wormhole_pair.secret.as_ref().try_into().map_err(|_| { - CollectRewardsError::from( - "Invalid secret length from HD derivation".to_string(), - ) - })?; + let secret_bytes: [u8; 32] = *wormhole_pair.secret.as_bytes(); Ok((AccountId32::from(address_bytes).to_ss58check(), address_bytes, secret_bytes)) }, WormholeCredential::Secret { hex } => { @@ -211,7 +205,7 @@ pub struct CollectRewardsConfig { pub subsquid_url: String, /// Chain RPC node URL pub node_url: String, - /// Path to circuit binary files (prover.bin, common.bin, etc.) + /// Path to circuit binary directory (verifier/common + private/public-batch bins). pub bins_dir: String, /// Optional: specific amount to withdraw (None = withdraw all) pub amount: Option, @@ -753,27 +747,31 @@ fn aggregate_proof_bytes(proof_bytes_list: &[Vec], bins_dir: &Path) -> Resul ))); } - let mut aggregator = Layer0Aggregator::new(bins_dir) - .map_err(|e| CollectRewardsError::from(format!("Failed to load aggregator: {}", e)))?; - - let common_data = aggregator.load_common_data(CircuitType::Leaf).map_err(|e| { - CollectRewardsError::from(format!("Failed to load leaf circuit data: {}", e)) - })?; + let common_bytes = std::fs::read(bins_dir.join("common.bin")) + .map_err(|e| CollectRewardsError::from(format!("Failed to read common.bin: {}", e)))?; + let verifier_bytes = std::fs::read(bins_dir.join("verifier.bin")) + .map_err(|e| CollectRewardsError::from(format!("Failed to read verifier.bin: {}", e)))?; + let leaf = qp_wormhole_aggregator::common::utils::load_canonical_leaf_verifier_data( + &common_bytes, + &verifier_bytes, + ) + .map_err(|e| CollectRewardsError::from(format!("Failed to load leaf circuit data: {}", e)))?; - // Add proofs + let mut proofs = Vec::with_capacity(proof_bytes_list.len()); for proof_bytes in proof_bytes_list { - let proof = ProofWithPublicInputs::::from_bytes(proof_bytes.clone(), &common_data) + let proof = ProofWithPublicInputs::::from_bytes(proof_bytes.clone(), &leaf.common) .map_err(|e| { CollectRewardsError::from(format!("Failed to deserialize proof: {:?}", e)) })?; - aggregator - .push_proof(proof) - .map_err(|e| CollectRewardsError::from(format!("Failed to push proof: {}", e)))?; + proofs.push(proof); } - // Aggregate - let aggregated_proof = aggregator - .aggregate() + let prover = PrivateBatchProver::new_from_binaries_dir(bins_dir).map_err(|e| { + CollectRewardsError::from(format!("Failed to load private-batch prover: {}", e)) + })?; + + let aggregated_proof = prover + .aggregate(proofs) .map_err(|e| CollectRewardsError::from(format!("Aggregation failed: {}", e)))?; Ok(aggregated_proof.to_bytes()) @@ -787,11 +785,8 @@ async fn submit_and_get_events( ) -> Result<(subxt::utils::H256, subxt::utils::H256, Vec)> { // Verify locally first - let verifier = qp_wormhole_verifier::WormholeVerifier::new_from_files( - &bins_dir.join("aggregated_verifier.bin"), - &bins_dir.join("aggregated_common.bin"), - ) - .map_err(|e| CollectRewardsError::from(format!("Failed to load verifier: {}", e)))?; + let verifier = crate::batch_verifier::load_private_batch_verifier(bins_dir) + .map_err(|e| CollectRewardsError::from(format!("Failed to load verifier: {}", e)))?; let proof = qp_wormhole_verifier::ProofWithPublicInputs::< qp_wormhole_verifier::F, @@ -805,7 +800,7 @@ async fn submit_and_get_events( .map_err(|e| CollectRewardsError::from(format!("Local verification failed: {}", e)))?; // Parse public inputs to do pre-submission validation - let inputs = qp_wormhole_verifier::parse_aggregated_public_inputs(&proof).map_err(|e| { + let inputs = qp_wormhole_verifier::parse_private_batch_public_inputs(&proof).map_err(|e| { CollectRewardsError::from(format!("Failed to parse public inputs: {:?}", e)) })?; @@ -890,7 +885,7 @@ async fn submit_and_get_events( } // Submit unsigned tx - let verify_tx = quantus_node::api::tx().wormhole().verify_aggregated_proof(proof_bytes); + let verify_tx = quantus_node::api::tx().wormhole().verify_private_batch(proof_bytes); let unsigned_tx = quantus_client.client().tx().create_unsigned(&verify_tx).map_err(|e| { diff --git a/src/config/mod.rs b/src/config/mod.rs index a11c6c4..79a7b70 100644 --- a/src/config/mod.rs +++ b/src/config/mod.rs @@ -7,8 +7,10 @@ pub struct CompatibleRuntime { } /// Supported runtime / transaction version pairs. -pub const COMPATIBLE_RUNTIMES: &[CompatibleRuntime] = - &[CompatibleRuntime { spec_version: 134, transaction_version: 2 }]; +pub const COMPATIBLE_RUNTIMES: &[CompatibleRuntime] = &[ + CompatibleRuntime { spec_version: 134, transaction_version: 2 }, + CompatibleRuntime { spec_version: 135, transaction_version: 2 }, +]; /// Check whether a runtime version pair is supported by this CLI. pub fn is_runtime_compatible(spec_version: u32, transaction_version: u32) -> bool { diff --git a/src/lib.rs b/src/lib.rs index af8f9a9..e71fd2d 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -4,6 +4,7 @@ //! It can be used as a dependency in other Rust projects that need to interact with //! the Quantus blockchain. +pub mod batch_verifier; pub mod bins; pub mod chain; pub mod cli; @@ -50,7 +51,7 @@ pub use wormhole_lib::{ // Re-export wormhole on-chain helpers for SDK usage. // These are the on-chain side of the wormhole flow (proof aggregation, unsigned -// `verify_aggregated_proof` submission, transfer-event parsing, leaf decoding) +// `verify_private_batch` submission, transfer-event parsing, leaf decoding) // that complement the off-chain proof-generation functions in `wormhole_lib`. // // `NativeTransferred` is the subxt-generated event type required by @@ -60,7 +61,7 @@ pub use chain::quantus_subxt::api::wormhole::events::NativeTransferred; pub use cli::wormhole::{ aggregate_proofs, at_best_block, compute_merkle_positions, decode_full_leaf_data, get_zk_merkle_proof, parse_transfer_events, read_proof_file, - submit_unsigned_verify_aggregated_proof, verify_aggregated_and_get_events, write_proof_file, + submit_unsigned_verify_private_batch, verify_private_batch_and_get_events, write_proof_file, IncludedAt, TransferInfo, }; diff --git a/src/main.rs b/src/main.rs index e6c8824..9224fea 100644 --- a/src/main.rs +++ b/src/main.rs @@ -8,6 +8,7 @@ use clap::Parser; use colored::Colorize; +mod batch_verifier; mod bins; mod chain; mod cli; diff --git a/src/quantus_metadata.scale b/src/quantus_metadata.scale index 2ab234b..bbe6a33 100644 Binary files a/src/quantus_metadata.scale and b/src/quantus_metadata.scale differ diff --git a/src/wormhole_lib.rs b/src/wormhole_lib.rs index 27e4d33..52a63af 100644 --- a/src/wormhole_lib.rs +++ b/src/wormhole_lib.rs @@ -14,7 +14,6 @@ use qp_wormhole_circuit::{ nullifier::Nullifier, }; use qp_wormhole_inputs::PublicCircuitInputs; -use qp_wormhole_prover::WormholeProver; use qp_zk_circuits_common::{ utils::{digest_to_bytes, BytesDigest}, zk_merkle::SIBLINGS_PER_LEVEL, @@ -173,10 +172,14 @@ pub fn compute_output_amount(input_amount: u32, fee_bps: u32) -> u32 { /// This function takes all necessary data as raw bytes and generates a ZK proof. /// It does not require a chain client - all data must be pre-fetched. /// +/// The leaf prover is built fresh via [`qp_wormhole_prover::build_fresh`]; there +/// is no leaf `prover.bin` artifact. The path arguments are retained only for +/// API compatibility with existing callers and are ignored. +/// /// # Arguments /// * `input` - All input data for proof generation (including ZK Merkle proof) -/// * `prover_bin_path` - Path to prover.bin -/// * `common_bin_path` - Path to common.bin +/// * `prover_bin_path` - Ignored (legacy; leaf prover is built in-process) +/// * `common_bin_path` - Ignored (legacy; leaf prover is built in-process) /// /// # Returns /// Proof bytes and nullifier @@ -267,9 +270,10 @@ pub fn generate_proof( let circuit_inputs = CircuitInputs { public, private }; - // Load prover from pre-built bins - let prover = WormholeProver::new_from_files(prover_bin_path, common_bin_path) - .map_err(|e| WormholeLibError::from(format!("Failed to load prover: {}", e)))?; + // Leaf prover is built from the canonical circuit config (no longer loads prover.bin). + // Paths are kept for API compatibility with callers that still pass bin locations. + let _ = (prover_bin_path, common_bin_path); + let prover = qp_wormhole_prover::build_fresh(); let prover_with_inputs = prover .commit(&circuit_inputs)