diff --git a/Cargo.lock b/Cargo.lock index 00616fdd..9519f590 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -11,7 +11,7 @@ dependencies = [ "macroific", "proc-macro2", "quote", - "syn 2.0.110", + "syn 2.0.117", ] [[package]] @@ -38,7 +38,7 @@ checksum = "b169f7a6d4742236a0a00c541b845991d0ac43e546831af1249753ab4c3aa3a0" dependencies = [ "cfg-if 1.0.4", "cipher", - "cpufeatures", + "cpufeatures 0.2.17", ] [[package]] @@ -63,6 +63,12 @@ dependencies = [ "memchr", ] +[[package]] +name = "allocator-api2" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" + [[package]] name = "android_system_properties" version = "0.1.5" @@ -74,15 +80,18 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.100" +version = "1.0.102" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a23eb6b1614318a8071c9b2521f36b424b2c83db5eb3a0fead4a6c0809af6e61" +checksum = "7f202df86484c868dbad7eaa557ef785d5c66295e41b460ef922eca0723b842c" [[package]] name = "arc-swap" -version = "1.7.1" +version = "1.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69f7f8c3906b62b754cd5326047894316021dcfe5a194c8ea52bdd94934a3457" +checksum = "6a3a1fd6f75306b68087b831f025c712524bcb19aad54e557b1129cfa0a2b207" +dependencies = [ + "rustversion", +] [[package]] name = "argon2" @@ -92,10 +101,237 @@ checksum = "3c3610892ee6e0cbce8ae2700349fcf8f98adb0dbfbee85aec3c9179d29cc072" dependencies = [ "base64ct", "blake2", - "cpufeatures", + "cpufeatures 0.2.17", "password-hash", ] +[[package]] +name = "ark-bn254" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6bc66f96ebe2a17a499475b4f94791d379817592ef494171586967ffdc6f95db" +dependencies = [ + "ark-ec", + "ark-ff", + "ark-std", +] + +[[package]] +name = "ark-crypto-primitives" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "31b3409b1846fe459d19c95df039481575ac6d5842ae63858ad75cc31219bfc1" +dependencies = [ + "ahash", + "ark-crypto-primitives-macros", + "ark-ec", + "ark-ff", + "ark-r1cs-std", + "ark-relations", + "ark-serialize", + "ark-snark", + "ark-std", + "blake2", + "blake3", + "derivative", + "digest", + "fnv", + "merlin", + "num-bigint", + "rayon", + "sha2", +] + +[[package]] +name = "ark-crypto-primitives-macros" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7e89fe77d1f0f4fe5b96dfc940923d88d17b6a773808124f21e764dfb063c6a" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "ark-ec" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8352a2b2aedf6ba2cc38f7520fc51191d518dde96175c729af19f2d059f191c4" +dependencies = [ + "ahash", + "ark-ff", + "ark-poly", + "ark-serialize", + "ark-std", + "educe", + "fnv", + "hashbrown 0.17.0", + "itertools 0.14.0", + "num-bigint", + "num-integer", + "num-traits", + "rayon", + "zeroize", +] + +[[package]] +name = "ark-ff" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7a806ac6c8307b929df4645776290a50ee2aac754ad09d8bdf73391309e43af" +dependencies = [ + "ark-ff-asm", + "ark-ff-macros", + "ark-serialize", + "ark-std", + "digest", + "educe", + "num-bigint", + "num-traits", + "rayon", + "zeroize", +] + +[[package]] +name = "ark-ff-asm" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1479009684adc073dff49a1025d3a7065b317a9ead25aaaca38cdc70058ba8a2" +dependencies = [ + "quote", + "syn 2.0.117", +] + +[[package]] +name = "ark-ff-macros" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a0691ed21ef00ef89c1e9bda832eba493dda3ec2f8d892fb25b705f73f06bb8" +dependencies = [ + "num-bigint", + "num-traits", + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "ark-groth16" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a293328aa422e65527e285614ce5d1dceb0bd7b8b18d18b1b63191ee1f74cb41" +dependencies = [ + "ark-crypto-primitives", + "ark-ec", + "ark-ff", + "ark-poly", + "ark-relations", + "ark-serialize", + "ark-snark", + "ark-std", + "rayon", +] + +[[package]] +name = "ark-poly" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75f55af10b672002b8d953e230282c51206842e20e5791a94432219b4201de5c" +dependencies = [ + "ahash", + "ark-ff", + "ark-serialize", + "ark-std", + "educe", + "fnv", + "hashbrown 0.17.0", + "rayon", +] + +[[package]] +name = "ark-r1cs-std" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "291f1c6628bfcac79b0dc2adbe401aa9100e2e96daa971645e0b18fc94de9a98" +dependencies = [ + "ark-ec", + "ark-ff", + "ark-relations", + "ark-std", + "educe", + "itertools 0.14.0", + "num-bigint", + "num-integer", + "num-traits", + "tracing", +] + +[[package]] +name = "ark-relations" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe4c11c797a64b8a23e22bf4e77bf582ac27bb21395e3183a9a506ba2561e9f9" +dependencies = [ + "ark-ff", + "ark-poly", + "ark-serialize", + "ark-std", + "foldhash 0.1.5", + "indexmap 2.14.0", + "rayon", + "tracing", + "tracing-subscriber", +] + +[[package]] +name = "ark-serialize" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a74dd304fd536fb95d0a328e72be759209cc496a9da094c5bc56e5fea4f9e86b" +dependencies = [ + "ark-serialize-derive", + "ark-std", + "digest", + "num-bigint", + "rayon", + "serde_with", +] + +[[package]] +name = "ark-serialize-derive" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4f153690697a2b91e5e1251ff98411ee5371500a111a0fd317a70e588eb300f9" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "ark-snark" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5bdb461d2be9b2bd6f303c79fffc89f5858790a7b4d33257bca3178e2c071fb9" +dependencies = [ + "ark-ff", + "ark-relations", + "ark-serialize", + "ark-std", +] + +[[package]] +name = "ark-std" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "367c9c827ed431bff6868b7aa926e05b16eb46603cc8b6e768e4a5553fa1d155" +dependencies = [ + "num-traits", + "rand 0.8.6", + "rayon", +] + [[package]] name = "arrayref" version = "0.3.9" @@ -143,9 +379,9 @@ dependencies = [ [[package]] name = "async-executor" -version = "1.13.3" +version = "1.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "497c00e0fd83a72a79a39fcbd8e3e2f055d6f6c7e025f3b3d91f4f8e76527fb8" +checksum = "c96bf972d85afc50bf5ab8fe2d54d1586b4e0b46c97c50a0c9e71e2f7bcd812a" dependencies = [ "async-task", "concurrent-queue", @@ -190,9 +426,9 @@ dependencies = [ [[package]] name = "async-lock" -version = "3.4.1" +version = "3.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5fd03604047cee9b6ce9de9f70c6cd540a0520c813cbd49bae61f33ab80ed1dc" +checksum = "290f7f2596bd5b78a9fec8088ccd89180d7f9f55b94b0576823bbbdc72ee8311" dependencies = [ "event-listener 5.4.1", "event-listener-strategy", @@ -240,7 +476,7 @@ checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.110", + "syn 2.0.117", ] [[package]] @@ -274,9 +510,9 @@ checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" [[package]] name = "base64ct" -version = "1.8.1" +version = "1.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e050f626429857a27ddccb31e0aca21356bfa709c04041aefddac081a8f068a" +checksum = "2af50177e190e07a26ab74f8b1efbfe2ef87da2116221318cb1c2e82baf7de06" [[package]] name = "bincode" @@ -289,9 +525,15 @@ dependencies = [ [[package]] name = "bitflags" -version = "2.10.0" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bitflags" +version = "2.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "812e12b5285cc515a9c72a5c1d3b6d46a19dac5acfef5265968c166106e31dd3" +checksum = "c4512299f36f043ab09a583e57bceb5a5aab7a73db1805848e8fef3c9e8c78b3" [[package]] name = "blake2" @@ -304,15 +546,35 @@ dependencies = [ [[package]] name = "blake2b_simd" -version = "1.0.3" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06e903a20b159e944f91ec8499fe1e55651480c541ea0a584f5d967c49ad9d99" +checksum = "b79834656f71332577234b50bfc009996f7449e0c056884e6a02492ded0ca2f3" dependencies = [ "arrayref", "arrayvec", "constant_time_eq", ] +[[package]] +name = "blake3" +version = "1.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0aa83c34e62843d924f905e0f5c866eb1dd6545fc4d719e803d9ba6030371fce" +dependencies = [ + "arrayref", + "arrayvec", + "cc", + "cfg-if 1.0.4", + "constant_time_eq", + "cpufeatures 0.3.0", +] + +[[package]] +name = "block" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d8c1fef690941d3e7788d328517591fecc684c084084702d6ff1641e993699a" + [[package]] name = "block-buffer" version = "0.10.4" @@ -346,25 +608,26 @@ dependencies = [ [[package]] name = "borsh" -version = "1.6.0" +version = "1.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1da5ab77c1437701eeff7c88d968729e7766172279eab0676857b3d63af7a6f" +checksum = "cfd1e3f8955a5d7de9fab72fc8373fade9fb8a703968cb200ae3dc6cf08e185a" dependencies = [ "borsh-derive", + "bytes", "cfg_aliases", ] [[package]] name = "borsh-derive" -version = "1.6.0" +version = "1.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0686c856aa6aac0c4498f936d7d6a02df690f614c03e4d906d1018062b5c5e2c" +checksum = "bfcfdc083699101d5a7965e49925975f2f55060f94f9a05e7187be95d530ca59" dependencies = [ "once_cell", "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.110", + "syn 2.0.117", ] [[package]] @@ -379,9 +642,29 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.19.0" +version = "3.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d20789868f4b01b2f2caec9f5c4e0213b41e3e5702a50157d699ae31ced2fcb" + +[[package]] +name = "bytemuck" +version = "1.25.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43" +checksum = "c8efb64bd706a16a1bdde310ae86b351e4d21550d98d056f22f8a7f7a2183fec" +dependencies = [ + "bytemuck_derive", +] + +[[package]] +name = "bytemuck_derive" +version = "1.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9abbd1bc6865053c427f7198e6af43bfdedc55ab791faed4fbd361d789575ff" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] [[package]] name = "byteorder" @@ -391,15 +674,15 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" -version = "1.11.0" +version = "1.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b35204fbdc0b3f4446b89fc1ac2cf84a8a68971995d0bf2e925ec7cd960f9cb3" +checksum = "1e748733b7cbc798e1434b6ac524f0c1ff2ab456fe201501e6497c8417a4fc33" [[package]] name = "camino" -version = "1.2.1" +version = "1.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "276a59bf2b2c967788139340c9f0c5b12d7fd6630315c15c217e559de85d2609" +checksum = "e629a66d692cb9ff1a1c664e41771b3dcaf961985a9774c0eb0bd1b51cf60a48" dependencies = [ "serde_core", ] @@ -429,9 +712,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.2.48" +version = "1.2.61" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c481bdbf0ed3b892f6f806287d72acd515b352a4ec27a208489b8c1bc839633a" +checksum = "d16d90359e986641506914ba71350897565610e87ce0ad9e6f28569db3dd5c6d" dependencies = [ "find-msvc-tools", "shlex", @@ -472,7 +755,18 @@ checksum = "c3613f74bd2eac03dad61bd53dbe620703d4371614fe0bc3b9f04dd36fe4e818" dependencies = [ "cfg-if 1.0.4", "cipher", - "cpufeatures", + "cpufeatures 0.2.17", +] + +[[package]] +name = "chacha20" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f8d983286843e49675a4b7a2d174efe136dc93a18d69130dd18198a6c167601" +dependencies = [ + "cfg-if 1.0.4", + "cpufeatures 0.3.0", + "rand_core 0.10.1", ] [[package]] @@ -482,7 +776,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "10cd79432192d1c0f4e1a0fef9527696cc039165d729fb41b3f4f4f354c2dc35" dependencies = [ "aead", - "chacha20", + "chacha20 0.9.1", "cipher", "poly1305", "zeroize", @@ -502,13 +796,14 @@ dependencies = [ [[package]] name = "chrono" -version = "0.4.42" +version = "0.4.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "145052bdd345b87320e369255277e3fb5152762ad123a901ef5c262dd38fe8d2" +checksum = "c673075a2e0e5f4a1dde27ce9dee1ea4558c7ffe648f576438a20ca1d2acc4b0" dependencies = [ "iana-time-zone", "js-sys", "num-traits", + "serde", "wasm-bindgen", "windows-link", ] @@ -524,6 +819,15 @@ dependencies = [ "zeroize", ] +[[package]] +name = "cobs" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fa961b519f0b462e3a3b4a34b64d119eeaca1d59af726fe450bbba07a9fc0a1" +dependencies = [ + "thiserror 2.0.18", +] + [[package]] name = "concurrent-queue" version = "2.5.0" @@ -546,11 +850,17 @@ dependencies = [ "windows-sys 0.59.0", ] +[[package]] +name = "const-oid" +version = "0.9.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" + [[package]] name = "constant_time_eq" -version = "0.3.1" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c74b8349d32d297c9134b8c88677813a227df8f779daa29bfc29c183fe3dca6" +checksum = "3d52eff69cd5e647efe296129160853a42795992097e8af39800e1060caeea9b" [[package]] name = "convert_case" @@ -583,12 +893,33 @@ dependencies = [ "libc", ] +[[package]] +name = "core-foundation" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2a6cd9ae233e7f62ba4e9353e81a88df7fc8a5987b8d445b4d90c879bd156f6" +dependencies = [ + "core-foundation-sys", + "libc", +] + [[package]] name = "core-foundation-sys" version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" +[[package]] +name = "core-graphics-types" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "45390e6114f68f718cc7a830514a96f903cccd70d02a8f6d9f643ac4ba45afaf" +dependencies = [ + "bitflags 1.3.2", + "core-foundation 0.9.4", + "libc", +] + [[package]] name = "cpufeatures" version = "0.2.17" @@ -598,6 +929,15 @@ dependencies = [ "libc", ] +[[package]] +name = "cpufeatures" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b2a41393f66f16b0823bb79094d54ac5fbd34ab292ddafb9a0456ac9f87d201" +dependencies = [ + "libc", +] + [[package]] name = "crc32fast" version = "1.5.0" @@ -656,7 +996,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "16182b4f39a82ec8a6851155cc4c0cda3065bb1db33651726a29e1951de0f009" dependencies = [ "aead", - "chacha20", + "chacha20 0.9.1", "crypto_secretbox", "curve25519-dalek", "salsa20", @@ -671,7 +1011,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b9d6cf87adf719ddf43a805e92c6870a531aedda35ff640442cbaf8674e141e1" dependencies = [ "aead", - "chacha20", + "chacha20 0.9.1", "cipher", "generic-array", "poly1305", @@ -682,12 +1022,12 @@ dependencies = [ [[package]] name = "ctrlc" -version = "3.5.1" +version = "3.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73736a89c4aff73035ba2ed2e565061954da00d4970fc9ac25dcc85a2a20d790" +checksum = "e0b1fab2ae45819af2d0731d60f2afe17227ebb1a1538a236da84c93e9a60162" dependencies = [ "dispatch2", - "nix 0.30.1", + "nix", "windows-sys 0.61.2", ] @@ -698,7 +1038,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "97fb8b7c4503de7d6ae7b42ab72a5a59857b4c937ec27a3d4539dba95b5ab2be" dependencies = [ "cfg-if 1.0.4", - "cpufeatures", + "cpufeatures 0.2.17", "curve25519-dalek-derive", "fiat-crypto", "rustc_version", @@ -714,7 +1054,7 @@ checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.110", + "syn 2.0.117", ] [[package]] @@ -723,18 +1063,8 @@ version = "0.20.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fc7f46116c46ff9ab3eb1597a45688b6715c6e628b5c133e288e709a29bcb4ee" dependencies = [ - "darling_core 0.20.11", - "darling_macro 0.20.11", -] - -[[package]] -name = "darling" -version = "0.21.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9cdf337090841a411e2a7f3deb9187445851f91b309c0c0a29e05f74a00a48c0" -dependencies = [ - "darling_core 0.21.3", - "darling_macro 0.21.3", + "darling_core", + "darling_macro", ] [[package]] @@ -748,21 +1078,7 @@ dependencies = [ "proc-macro2", "quote", "strsim", - "syn 2.0.110", -] - -[[package]] -name = "darling_core" -version = "0.21.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1247195ecd7e3c85f83c8d2a366e4210d588e802133e1e355180a9870b517ea4" -dependencies = [ - "fnv", - "ident_case", - "proc-macro2", - "quote", - "strsim", - "syn 2.0.110", + "syn 2.0.117", ] [[package]] @@ -771,20 +1087,9 @@ version = "0.20.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead" dependencies = [ - "darling_core 0.20.11", - "quote", - "syn 2.0.110", -] - -[[package]] -name = "darling_macro" -version = "0.21.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d38308df82d1080de0afee5d069fa14b0326a88c14f15c5ccda35b4a6c414c81" -dependencies = [ - "darling_core 0.21.3", + "darling_core", "quote", - "syn 2.0.110", + "syn 2.0.117", ] [[package]] @@ -803,9 +1108,9 @@ dependencies = [ [[package]] name = "data-encoding" -version = "2.9.0" +version = "2.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a2330da5de22e8a3cb63252ce2abb30116bf5265e89c0e01bc17015ce30a476" +checksum = "a4ae5f15dda3c708c0ade84bfee31ccab44a3da4f88015ed22f63732abe300c8" [[package]] name = "delegate-display" @@ -816,16 +1121,17 @@ dependencies = [ "macroific", "proc-macro2", "quote", - "syn 2.0.110", + "syn 2.0.117", ] [[package]] name = "deranged" -version = "0.5.5" +version = "0.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ececcb659e7ba858fb4f10388c250a7252eb0a27373f1a72b8748afdd248e587" +checksum = "7cd812cc2bc1d69d4764bd80df88b4317eaef9e773c75226407d9bc0876b211c" dependencies = [ "powerfmt", + "serde_core", ] [[package]] @@ -854,10 +1160,10 @@ version = "0.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2d5bcf7b024d6835cfb3d473887cd966994907effbe9227e8c8219824d06c4e8" dependencies = [ - "darling 0.20.11", + "darling", "proc-macro2", "quote", - "syn 2.0.110", + "syn 2.0.117", ] [[package]] @@ -867,7 +1173,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ab63b0e2bf4d5928aff72e83a7dace85d7bba5fe12dcc3c5a572d78caffd3f3c" dependencies = [ "derive_builder_core", - "syn 2.0.110", + "syn 2.0.117", ] [[package]] @@ -880,27 +1186,28 @@ dependencies = [ "proc-macro2", "quote", "rustc_version", - "syn 2.0.110", + "syn 2.0.117", ] [[package]] name = "derive_more" -version = "2.0.1" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "093242cf7570c207c83073cf82f79706fe7b8317e98620a47d5be7c3d8497678" +checksum = "d751e9e49156b02b44f9c1815bcb94b984cdcc4396ecc32521c739452808b134" dependencies = [ "derive_more-impl", ] [[package]] name = "derive_more-impl" -version = "2.0.1" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bda628edc44c4bb645fbe0f758797143e4e07926f7ebf4e9bdfbd3d2ce621df3" +checksum = "799a97264921d8623a957f6c3b9011f3b5492f557bbb7a5a19b7fa6d06ba8dcb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.110", + "rustc_version", + "syn 2.0.117", "unicode-xid", ] @@ -923,6 +1230,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ "block-buffer", + "const-oid", "crypto-common", "subtle", ] @@ -950,11 +1258,11 @@ dependencies = [ [[package]] name = "dispatch2" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89a09f22a6c6069a18470eb92d2298acf25463f14256d24778e1230d789a2aec" +checksum = "1e0e367e4e7da84520dedcac1901e4da967309406d1e51017ae1abfb97adbd38" dependencies = [ - "bitflags", + "bitflags 2.11.1", "block2", "libc", "objc2", @@ -968,7 +1276,7 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.110", + "syn 2.0.117", ] [[package]] @@ -984,15 +1292,21 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "75b325c5dbd37f80359721ad39aca5a29fb04c89279657cffdda8736d0c0b9d2" [[package]] -name = "duct" -version = "0.13.7" +name = "dyn-clone" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0881ea181b1df73ff77ffaaf9c7544ecc11e82fba9b5f27b262a3c73a332555" + +[[package]] +name = "educe" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4ab5718d1224b63252cd0c6f74f6480f9ffeb117438a2e0f5cf6d9a4798929c" +checksum = "1d7bc049e1bd8cdeb31b68bbd586a9464ecf9f3944af3958a7a9d0f8b9799417" dependencies = [ - "libc", - "once_cell", - "os_pipe", - "shared_child", + "enum-ordinalize", + "proc-macro2", + "quote", + "syn 2.0.117", ] [[package]] @@ -1001,6 +1315,24 @@ version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" +[[package]] +name = "elf" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4445909572dbd556c457c849c4ca58623d84b27c8fff1e74b0b4227d8b90d17b" + +[[package]] +name = "embedded-io" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef1a6892d9eef45c8fa6b9e0086428a2cca8491aca8f787c534a3d6d0bcb3ced" + +[[package]] +name = "embedded-io" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edd0f118536f44f5ccd48bcb8b111bdc3de888b58c74639dfb034a357d0f206d" + [[package]] name = "encode_unicode" version = "1.0.0" @@ -1016,6 +1348,26 @@ dependencies = [ "cfg-if 1.0.4", ] +[[package]] +name = "enum-ordinalize" +version = "4.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a1091a7bb1f8f2c4b28f1fe2cef4980ca2d410a3d727d67ecc3178c9b0800f0" +dependencies = [ + "enum-ordinalize-derive", +] + +[[package]] +name = "enum-ordinalize-derive" +version = "4.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ca9601fb2d62598ee17836250842873a413586e5d7ed88b356e38ddbb0ec631" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + [[package]] name = "equivalent" version = "1.0.2" @@ -1077,7 +1429,7 @@ dependencies = [ "macroific", "proc-macro2", "quote", - "syn 2.0.110", + "syn 2.0.117", ] [[package]] @@ -1091,9 +1443,9 @@ dependencies = [ [[package]] name = "fastrand" -version = "2.3.0" +version = "2.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" +checksum = "9f1f227452a390804cdb637b74a86990f2a7d7ba4b7d5693aac9b4dd6defd8d6" [[package]] name = "fiat-crypto" @@ -1103,21 +1455,20 @@ checksum = "28dea519a9695b9977216879a3ebfddf92f1c08c05d984f8996aecd6ecdc811d" [[package]] name = "filetime" -version = "0.2.26" +version = "0.2.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc0505cd1b6fa6580283f6bdf70a73fcf4aba1184038c90902b92b3dd0df63ed" +checksum = "f98844151eee8917efc50bd9e8318cb963ae8b297431495d3f758616ea5c57db" dependencies = [ "cfg-if 1.0.4", "libc", "libredox", - "windows-sys 0.60.2", ] [[package]] name = "find-msvc-tools" -version = "0.1.5" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a3076410a55c90011c298b04d0cfa770b00fa04e1e3c97d3f6c9de105a03844" +checksum = "5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582" [[package]] name = "fixedstr" @@ -1130,9 +1481,9 @@ dependencies = [ [[package]] name = "flate2" -version = "1.1.5" +version = "1.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfe33edd8e85a12a67454e37f8c75e730830d83e313556ab9ebf9ee7fbeb3bfb" +checksum = "843fba2746e448b37e26a819579957415c8cef339bf08564fe8b7ddbd959573c" dependencies = [ "crc32fast", "miniz_oxide", @@ -1144,13 +1495,46 @@ version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" +[[package]] +name = "foldhash" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" + +[[package]] +name = "foldhash" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77ce24cb58228fbb8aa041425bb1050850ac19177686ea6e0f41a70416f56fdb" + [[package]] name = "foreign-types" version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" dependencies = [ - "foreign-types-shared", + "foreign-types-shared 0.1.1", +] + +[[package]] +name = "foreign-types" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d737d9aa519fb7b749cbc3b962edcf310a8dd1f4b67c91c4f83975dbdd17d965" +dependencies = [ + "foreign-types-macros", + "foreign-types-shared 0.3.1", +] + +[[package]] +name = "foreign-types-macros" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", ] [[package]] @@ -1159,6 +1543,12 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" +[[package]] +name = "foreign-types-shared" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa9a19cbb55df58761df49b23516a86d432839add4af60fc256da840f66ed35b" + [[package]] name = "form_urlencoded" version = "1.2.2" @@ -1170,9 +1560,9 @@ dependencies = [ [[package]] name = "futures" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" +checksum = "8b147ee9d1f6d097cef9ce628cd2ee62288d963e16fb287bd9286455b241382d" dependencies = [ "futures-channel", "futures-core", @@ -1185,9 +1575,9 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" +checksum = "07bbe89c50d7a535e539b8c17bc0b49bdb77747034daa8087407d655f3f7cc1d" dependencies = [ "futures-core", "futures-sink", @@ -1195,15 +1585,15 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" +checksum = "7e3450815272ef58cec6d564423f6e755e25379b217b0bc688e295ba24df6b1d" [[package]] name = "futures-executor" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" +checksum = "baf29c38818342a3b26b5b923639e7b1f4a61fc5e76102d4b1981c6dc7a7579d" dependencies = [ "futures-core", "futures-task", @@ -1212,9 +1602,9 @@ dependencies = [ [[package]] name = "futures-io" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" +checksum = "cecba35d7ad927e23624b22ad55235f2239cfa44fd10428eecbeba6d6a717718" [[package]] name = "futures-lite" @@ -1231,32 +1621,32 @@ dependencies = [ [[package]] name = "futures-macro" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" +checksum = "e835b70203e41293343137df5c0664546da5745f82ec9b84d40be8336958447b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.110", + "syn 2.0.117", ] [[package]] name = "futures-sink" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" +checksum = "c39754e157331b013978ec91992bde1ac089843443c49cbc7f46150b0fad0893" [[package]] name = "futures-task" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" +checksum = "037711b3d59c33004d3856fbdc83b99d4ff37a24768fa1be9ce3538a1cde4393" [[package]] name = "futures-util" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" +checksum = "389ca41296e6190b48053de0321d02a77f32f8a5d2461dd38762c0593805c6d6" dependencies = [ "futures-channel", "futures-core", @@ -1266,7 +1656,6 @@ dependencies = [ "futures-task", "memchr", "pin-project-lite", - "pin-utils", "slab", ] @@ -1292,9 +1681,9 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.16" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" +checksum = "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0" dependencies = [ "cfg-if 1.0.4", "js-sys", @@ -1312,11 +1701,25 @@ dependencies = [ "cfg-if 1.0.4", "js-sys", "libc", - "r-efi", + "r-efi 5.3.0", "wasip2", "wasm-bindgen", ] +[[package]] +name = "getrandom" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0de51e6874e94e7bf76d726fc5d13ba782deca734ff60d5bb2fb2607c7406555" +dependencies = [ + "cfg-if 1.0.4", + "libc", + "r-efi 6.0.0", + "rand_core 0.10.1", + "wasip2", + "wasip3", +] + [[package]] name = "gloo-timers" version = "0.3.0" @@ -1331,9 +1734,9 @@ dependencies = [ [[package]] name = "h2" -version = "0.4.12" +version = "0.4.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3c0b69cfcb4e1b9f1bf2f53f95f766e4661169728ec61cd3fe5a0166f2d1386" +checksum = "2f44da3a8150a6703ed5d34e164b875fd14c2cdab9af1252a9a1020bde2bdc54" dependencies = [ "atomic-waker", "bytes", @@ -1341,7 +1744,7 @@ dependencies = [ "futures-core", "futures-sink", "http", - "indexmap", + "indexmap 2.14.0", "slab", "tokio", "tokio-util", @@ -1357,13 +1760,25 @@ dependencies = [ "byteorder", ] +[[package]] +name = "hashbrown" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" + [[package]] name = "hashbrown" version = "0.14.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" + +[[package]] +name = "hashbrown" +version = "0.15.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" dependencies = [ - "ahash", + "foldhash 0.1.5", ] [[package]] @@ -1371,6 +1786,18 @@ name = "hashbrown" version = "0.16.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" +dependencies = [ + "foldhash 0.2.0", +] + +[[package]] +name = "hashbrown" +version = "0.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4f467dd6dccf739c208452f8014c75c18bb8301b050ad1cfb27153803edb0f51" +dependencies = [ + "allocator-api2", +] [[package]] name = "heapless" @@ -1412,6 +1839,12 @@ dependencies = [ "serde", ] +[[package]] +name = "hex-literal" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6fe2267d4ed49bc07b63801559be28c718ea06c4738b7a03c94df7386d2cde46" + [[package]] name = "hexplay" version = "0.3.0" @@ -1487,9 +1920,9 @@ checksum = "135b12329e5e3ce057a9f972339ea52bc954fe1e9358ef27f95e89716fbc5424" [[package]] name = "hyper" -version = "1.8.1" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ab2d4f250c3d7b1c9fcdff1cece94ea4e2dfbec68614f7b87cb205f24ca9d11" +checksum = "6299f016b246a94207e63da54dbe807655bf9e00044f73ded42c3ac5305fbcca" dependencies = [ "atomic-waker", "bytes", @@ -1501,7 +1934,6 @@ dependencies = [ "httparse", "itoa", "pin-project-lite", - "pin-utils", "smallvec", "tokio", "want", @@ -1509,31 +1941,29 @@ 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", "rustls", - "rustls-pki-types", "tokio", "tokio-rustls", "tower-service", - "webpki-roots 1.0.4", + "webpki-roots 1.0.7", ] [[package]] name = "hyper-util" -version = "0.1.18" +version = "0.1.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52e9a2a24dc5c6821e71a7030e1e14b7b632acac55c40e9d2e082c621261bb56" +checksum = "96547c2556ec9d12fb1578c4eaf448b04993e7fb79cbaad930a656880a6bdfa0" dependencies = [ "base64", "bytes", "futures-channel", - "futures-core", "futures-util", "http", "http-body", @@ -1552,9 +1982,9 @@ dependencies = [ [[package]] name = "iana-time-zone" -version = "0.1.64" +version = "0.1.65" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33e57f83510bb73707521ebaffa789ec8caf86f9657cad665b092b581d40e9fb" +checksum = "e31bc9ad994ba00e440a8aa5c9ef0ec67d5cb5e5cb0cc7f8b744a35b389cc470" dependencies = [ "android_system_properties", "core-foundation-sys", @@ -1562,7 +1992,7 @@ dependencies = [ "js-sys", "log", "wasm-bindgen", - "windows-core 0.62.2", + "windows-core", ] [[package]] @@ -1576,12 +2006,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", @@ -1589,9 +2020,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", @@ -1602,9 +2033,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", @@ -1616,15 +2047,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.1" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e93fcd3157766c0c8da2f8cff6ce651a31f0810eaa1c51ec363ef790bbb5fb99" +checksum = "bee3b67d0ea5c2cca5003417989af8996f8604e34fb9ddf96208a033901e70de" dependencies = [ "icu_collections", "icu_locale_core", @@ -1636,15 +2067,15 @@ dependencies = [ [[package]] name = "icu_properties_data" -version = "2.1.1" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02845b3647bb045f1100ecd6480ff52f34c35f82d9880e029d329c21d1054899" +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", @@ -1655,6 +2086,12 @@ 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" @@ -1674,9 +2111,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", @@ -1693,7 +2130,7 @@ dependencies = [ "delegate-display", "fancy_constructor", "js-sys", - "uuid 1.18.1", + "uuid", "wasm-bindgen", "wasm-bindgen-futures", "web-sys", @@ -1701,12 +2138,25 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.12.1" +version = "1.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" +dependencies = [ + "autocfg", + "hashbrown 0.12.3", + "serde", +] + +[[package]] +name = "indexmap" +version = "2.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ad4bb2b565bca0645f4d68c5c9af97fba094e9791da685bf83cb5f3ce74acf2" +checksum = "d466e9454f08e4a911e14806c24e16fba1b4c121d1ea474396f396069cf949d9" dependencies = [ "equivalent", - "hashbrown 0.16.1", + "hashbrown 0.17.0", + "serde", + "serde_core", ] [[package]] @@ -1739,49 +2189,26 @@ dependencies = [ "web-sys", ] -[[package]] -name = "intertrait" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f00fc6ef7d878dfcf59d9e556ef1b368d7f55b9da5813ed481a3573eef485a01" -dependencies = [ - "intertrait-macros", - "linkme", - "once_cell", -] - -[[package]] -name = "intertrait-macros" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d56984da2d4c9d6d7de8463892e65a9354f4238f641c246fe99176150e97bb8" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", - "uuid 0.8.2", -] - [[package]] name = "inventory" -version = "0.3.21" +version = "0.3.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc61209c082fbeb19919bee74b176221b27223e27b65d781eb91af24eb1fb46e" +checksum = "a4f0c30c76f2f4ccee3fe55a2435f691ca00c0e4bd87abe4f4a851b1d4dac39b" dependencies = [ "rustversion", ] [[package]] name = "ipnet" -version = "2.11.0" +version = "2.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" +checksum = "d98f6fed1fde3f8c21bc40a1abb88dd75e67924f9cffc3ef95607bad8017f8e2" [[package]] name = "iri-string" -version = "0.7.9" +version = "0.7.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f867b9d1d896b67beb18518eda36fdb77a32ea590de864f1325b294a6d14397" +checksum = "25e659a4bb38e810ebc252e53b5814ff908a8c58c2a9ce2fae1bbec24cbf4e20" dependencies = [ "memchr", "serde", @@ -1796,7 +2223,7 @@ dependencies = [ "heck", "proc-macro2", "quote", - "syn 2.0.110", + "syn 2.0.117", ] [[package]] @@ -1828,15 +2255,15 @@ dependencies = [ [[package]] name = "itoa" -version = "1.0.15" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" +checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" [[package]] name = "js-sys" -version = "0.3.83" +version = "0.3.77" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "464a3709c7f55f1f721e5389aa6ea4e3bc6aba669353300af094b29ffbdde1d8" +checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" dependencies = [ "once_cell", "wasm-bindgen", @@ -1844,14 +2271,14 @@ dependencies = [ [[package]] name = "kaspa-addresses" -version = "1.1.0" -source = "git+https://github.com/kaspanet/rusty-kaspa.git?rev=e97070f#e97070faa3826c590f477e327c82daaddd6178f4" +version = "2.0.0" +source = "git+https://github.com/kaspanet/rusty-kaspa.git?rev=90dbf07#90dbf074275d60c1fe74a3491883196f110970c0" dependencies = [ "borsh", "js-sys", "serde", "smallvec", - "thiserror 1.0.69", + "thiserror 2.0.18", "wasm-bindgen", "workflow-log", "workflow-wasm", @@ -1859,26 +2286,26 @@ dependencies = [ [[package]] name = "kaspa-bip32" -version = "1.1.0" -source = "git+https://github.com/kaspanet/rusty-kaspa.git?rev=e97070f#e97070faa3826c590f477e327c82daaddd6178f4" +version = "2.0.0" +source = "git+https://github.com/kaspanet/rusty-kaspa.git?rev=90dbf07#90dbf074275d60c1fe74a3491883196f110970c0" dependencies = [ "borsh", "bs58", - "getrandom 0.2.16", + "getrandom 0.2.17", "hmac", "js-sys", "kaspa-consensus-core", "kaspa-utils", "once_cell", "pbkdf2", - "rand 0.8.5", + "rand 0.8.6", "rand_core 0.6.4", "ripemd", "secp256k1", "serde", "sha2", "subtle", - "thiserror 1.0.69", + "thiserror 2.0.18", "wasm-bindgen", "workflow-wasm", "zeroize", @@ -1886,10 +2313,11 @@ dependencies = [ [[package]] name = "kaspa-consensus-client" -version = "1.1.0" -source = "git+https://github.com/kaspanet/rusty-kaspa.git?rev=e97070f#e97070faa3826c590f477e327c82daaddd6178f4" +version = "2.0.0" +source = "git+https://github.com/kaspanet/rusty-kaspa.git?rev=90dbf07#90dbf074275d60c1fe74a3491883196f110970c0" dependencies = [ "ahash", + "borsh", "cfg-if 1.0.4", "faster-hex", "hex", @@ -1902,12 +2330,12 @@ dependencies = [ "kaspa-txscript", "kaspa-utils", "kaspa-wasm-core", - "rand 0.8.5", + "rand 0.8.6", "secp256k1", "serde", "serde-wasm-bindgen", "serde_json", - "thiserror 1.0.69", + "thiserror 2.0.18", "wasm-bindgen", "workflow-log", "workflow-wasm", @@ -1915,17 +2343,17 @@ dependencies = [ [[package]] name = "kaspa-consensus-core" -version = "1.1.0" -source = "git+https://github.com/kaspanet/rusty-kaspa.git?rev=e97070f#e97070faa3826c590f477e327c82daaddd6178f4" +version = "2.0.0" +source = "git+https://github.com/kaspanet/rusty-kaspa.git?rev=90dbf07#90dbf074275d60c1fe74a3491883196f110970c0" dependencies = [ "arc-swap", "async-trait", - "bitflags", + "bitflags 2.11.1", "borsh", "cfg-if 1.0.4", "faster-hex", "futures-util", - "getrandom 0.2.16", + "getrandom 0.2.17", "itertools 0.13.0", "js-sys", "kaspa-addresses", @@ -1934,15 +2362,17 @@ dependencies = [ "kaspa-math", "kaspa-merkle", "kaspa-muhash", + "kaspa-smt", "kaspa-txscript-errors", "kaspa-utils", - "rand 0.8.5", + "rand 0.8.6", "secp256k1", "serde", + "serde-value", "serde-wasm-bindgen", "serde_json", "smallvec", - "thiserror 1.0.69", + "thiserror 2.0.18", "wasm-bindgen", "workflow-core", "workflow-log", @@ -1952,8 +2382,8 @@ dependencies = [ [[package]] name = "kaspa-consensus-notify" -version = "1.1.0" -source = "git+https://github.com/kaspanet/rusty-kaspa.git?rev=e97070f#e97070faa3826c590f477e327c82daaddd6178f4" +version = "2.0.0" +source = "git+https://github.com/kaspanet/rusty-kaspa.git?rev=90dbf07#90dbf074275d60c1fe74a3491883196f110970c0" dependencies = [ "async-channel 2.5.0", "cfg-if 1.0.4", @@ -1966,14 +2396,14 @@ dependencies = [ "kaspa-utils", "log", "paste", - "thiserror 1.0.69", + "thiserror 2.0.18", "triggered", ] [[package]] name = "kaspa-consensus-wasm" -version = "1.1.0" -source = "git+https://github.com/kaspanet/rusty-kaspa.git?rev=e97070f#e97070faa3826c590f477e327c82daaddd6178f4" +version = "2.0.0" +source = "git+https://github.com/kaspanet/rusty-kaspa.git?rev=90dbf07#90dbf074275d60c1fe74a3491883196f110970c0" dependencies = [ "cfg-if 1.0.4", "faster-hex", @@ -1984,12 +2414,12 @@ dependencies = [ "kaspa-hashes", "kaspa-txscript", "kaspa-utils", - "rand 0.8.5", + "rand 0.8.6", "secp256k1", "serde", "serde-wasm-bindgen", "serde_json", - "thiserror 1.0.69", + "thiserror 2.0.18", "wasm-bindgen", "workflow-log", "workflow-wasm", @@ -1997,18 +2427,18 @@ dependencies = [ [[package]] name = "kaspa-core" -version = "1.1.0" -source = "git+https://github.com/kaspanet/rusty-kaspa.git?rev=e97070f#e97070faa3826c590f477e327c82daaddd6178f4" +version = "2.0.0" +source = "git+https://github.com/kaspanet/rusty-kaspa.git?rev=90dbf07#90dbf074275d60c1fe74a3491883196f110970c0" dependencies = [ "anyhow", "cfg-if 1.0.4", "ctrlc", + "downcast", "futures-util", - "intertrait", "log", "log4rs", "num_cpus", - "thiserror 1.0.69", + "thiserror 2.0.18", "tokio", "triggered", "wasm-bindgen", @@ -2017,27 +2447,29 @@ dependencies = [ [[package]] name = "kaspa-hashes" -version = "1.1.0" -source = "git+https://github.com/kaspanet/rusty-kaspa.git?rev=e97070f#e97070faa3826c590f477e327c82daaddd6178f4" +version = "2.0.0" +source = "git+https://github.com/kaspanet/rusty-kaspa.git?rev=90dbf07#90dbf074275d60c1fe74a3491883196f110970c0" dependencies = [ "blake2b_simd", + "blake3", "borsh", "cc", "faster-hex", "js-sys", "kaspa-utils", "keccak", - "once_cell", "serde", "sha2", + "sha2-const-stable", "wasm-bindgen", "workflow-wasm", + "zerocopy", ] [[package]] name = "kaspa-index-core" -version = "1.1.0" -source = "git+https://github.com/kaspanet/rusty-kaspa.git?rev=e97070f#e97070faa3826c590f477e327c82daaddd6178f4" +version = "2.0.0" +source = "git+https://github.com/kaspanet/rusty-kaspa.git?rev=90dbf07#90dbf074275d60c1fe74a3491883196f110970c0" dependencies = [ "async-channel 2.5.0", "async-trait", @@ -2050,14 +2482,14 @@ dependencies = [ "log", "paste", "serde", - "thiserror 1.0.69", + "thiserror 2.0.18", "triggered", ] [[package]] name = "kaspa-math" -version = "1.1.0" -source = "git+https://github.com/kaspanet/rusty-kaspa.git?rev=e97070f#e97070faa3826c590f477e327c82daaddd6178f4" +version = "2.0.0" +source = "git+https://github.com/kaspanet/rusty-kaspa.git?rev=90dbf07#90dbf074275d60c1fe74a3491883196f110970c0" dependencies = [ "borsh", "faster-hex", @@ -2067,7 +2499,7 @@ dependencies = [ "malachite-nz", "serde", "serde-wasm-bindgen", - "thiserror 1.0.69", + "thiserror 2.0.18", "wasm-bindgen", "workflow-core", "workflow-log", @@ -2076,16 +2508,16 @@ dependencies = [ [[package]] name = "kaspa-merkle" -version = "1.1.0" -source = "git+https://github.com/kaspanet/rusty-kaspa.git?rev=e97070f#e97070faa3826c590f477e327c82daaddd6178f4" +version = "2.0.0" +source = "git+https://github.com/kaspanet/rusty-kaspa.git?rev=90dbf07#90dbf074275d60c1fe74a3491883196f110970c0" dependencies = [ "kaspa-hashes", ] [[package]] name = "kaspa-metrics-core" -version = "1.1.0" -source = "git+https://github.com/kaspanet/rusty-kaspa.git?rev=e97070f#e97070faa3826c590f477e327c82daaddd6178f4" +version = "2.0.0" +source = "git+https://github.com/kaspanet/rusty-kaspa.git?rev=90dbf07#90dbf074275d60c1fe74a3491883196f110970c0" dependencies = [ "async-trait", "borsh", @@ -2094,24 +2526,24 @@ dependencies = [ "kaspa-rpc-core", "separator", "serde", - "thiserror 1.0.69", + "thiserror 2.0.18", "workflow-core", "workflow-log", ] [[package]] name = "kaspa-mining-errors" -version = "1.1.0" -source = "git+https://github.com/kaspanet/rusty-kaspa.git?rev=e97070f#e97070faa3826c590f477e327c82daaddd6178f4" +version = "2.0.0" +source = "git+https://github.com/kaspanet/rusty-kaspa.git?rev=90dbf07#90dbf074275d60c1fe74a3491883196f110970c0" dependencies = [ "kaspa-consensus-core", - "thiserror 1.0.69", + "thiserror 2.0.18", ] [[package]] name = "kaspa-muhash" -version = "1.1.0" -source = "git+https://github.com/kaspanet/rusty-kaspa.git?rev=e97070f#e97070faa3826c590f477e327c82daaddd6178f4" +version = "2.0.0" +source = "git+https://github.com/kaspanet/rusty-kaspa.git?rev=90dbf07#90dbf074275d60c1fe74a3491883196f110970c0" dependencies = [ "kaspa-hashes", "kaspa-math", @@ -2121,8 +2553,8 @@ dependencies = [ [[package]] name = "kaspa-notify" -version = "1.1.0" -source = "git+https://github.com/kaspanet/rusty-kaspa.git?rev=e97070f#e97070faa3826c590f477e327c82daaddd6178f4" +version = "2.0.0" +source = "git+https://github.com/kaspanet/rusty-kaspa.git?rev=90dbf07#90dbf074275d60c1fe74a3491883196f110970c0" dependencies = [ "async-channel 2.5.0", "async-trait", @@ -2130,7 +2562,7 @@ dependencies = [ "derive_more 0.99.20", "futures", "futures-util", - "indexmap", + "indexmap 2.14.0", "itertools 0.13.0", "kaspa-addresses", "kaspa-consensus-core", @@ -2142,9 +2574,9 @@ dependencies = [ "log", "parking_lot", "paste", - "rand 0.8.5", + "rand 0.8.6", "serde", - "thiserror 1.0.69", + "thiserror 2.0.18", "triggered", "workflow-core", "workflow-log", @@ -2176,13 +2608,13 @@ dependencies = [ "pyo3-async-runtimes", "pyo3-log", "pyo3-stub-gen", - "rand 0.8.5", + "rand 0.8.6", "regex", "secp256k1", "serde", "serde-pyobject", "serde_json", - "thiserror 2.0.17", + "thiserror 2.0.18", "workflow-core", "workflow-log", "workflow-rpc", @@ -2191,8 +2623,8 @@ dependencies = [ [[package]] name = "kaspa-rpc-core" -version = "1.1.0" -source = "git+https://github.com/kaspanet/rusty-kaspa.git?rev=e97070f#e97070faa3826c590f477e327c82daaddd6178f4" +version = "2.0.0" +source = "git+https://github.com/kaspanet/rusty-kaspa.git?rev=90dbf07#90dbf074275d60c1fe74a3491883196f110970c0" dependencies = [ "async-channel 2.5.0", "async-trait", @@ -2219,13 +2651,12 @@ dependencies = [ "kaspa-utils", "log", "paste", - "rand 0.8.5", + "rand 0.8.6", "serde", "serde-wasm-bindgen", - "serde_nested_with", "smallvec", - "thiserror 1.0.69", - "uuid 1.18.1", + "thiserror 2.0.18", + "uuid", "wasm-bindgen", "workflow-core", "workflow-serializer", @@ -2234,8 +2665,8 @@ dependencies = [ [[package]] name = "kaspa-rpc-macros" -version = "1.1.0" -source = "git+https://github.com/kaspanet/rusty-kaspa.git?rev=e97070f#e97070faa3826c590f477e327c82daaddd6178f4" +version = "2.0.0" +source = "git+https://github.com/kaspanet/rusty-kaspa.git?rev=90dbf07#90dbf074275d60c1fe74a3491883196f110970c0" dependencies = [ "convert_case 0.6.0", "proc-macro-error", @@ -2246,16 +2677,37 @@ dependencies = [ ] [[package]] -name = "kaspa-txscript" -version = "1.1.0" -source = "git+https://github.com/kaspanet/rusty-kaspa.git?rev=e97070f#e97070faa3826c590f477e327c82daaddd6178f4" +name = "kaspa-smt" +version = "2.0.0" +source = "git+https://github.com/kaspanet/rusty-kaspa.git?rev=90dbf07#90dbf074275d60c1fe74a3491883196f110970c0" dependencies = [ + "blake3", + "kaspa-hashes", + "thiserror 2.0.18", + "zerocopy", +] + +[[package]] +name = "kaspa-txscript" +version = "2.0.0" +source = "git+https://github.com/kaspanet/rusty-kaspa.git?rev=90dbf07#90dbf074275d60c1fe74a3491883196f110970c0" +dependencies = [ + "ark-bn254", + "ark-ec", + "ark-groth16", + "ark-relations", + "ark-serialize", + "ark-snark", "blake2b_simd", + "blake3", "borsh", + "cc", "cfg-if 1.0.4", + "faster-hex", "hexplay", - "indexmap", + "indexmap 2.14.0", "itertools 0.13.0", + "js-sys", "kaspa-addresses", "kaspa-consensus-core", "kaspa-hashes", @@ -2264,67 +2716,67 @@ dependencies = [ "kaspa-wasm-core", "log", "parking_lot", - "rand 0.8.5", + "rand 0.8.6", + "risc0-binfmt", + "risc0-circuit-recursion", + "risc0-core", + "risc0-zkp", "secp256k1", "serde", "serde-wasm-bindgen", "serde_json", "sha2", "smallvec", - "thiserror 1.0.69", + "thiserror 2.0.18", "wasm-bindgen", "workflow-wasm", ] [[package]] name = "kaspa-txscript-errors" -version = "1.1.0" -source = "git+https://github.com/kaspanet/rusty-kaspa.git?rev=e97070f#e97070faa3826c590f477e327c82daaddd6178f4" +version = "2.0.0" +source = "git+https://github.com/kaspanet/rusty-kaspa.git?rev=90dbf07#90dbf074275d60c1fe74a3491883196f110970c0" dependencies = [ + "borsh", + "kaspa-hashes", "secp256k1", - "thiserror 1.0.69", + "thiserror 2.0.18", ] [[package]] name = "kaspa-utils" -version = "1.1.0" -source = "git+https://github.com/kaspanet/rusty-kaspa.git?rev=e97070f#e97070faa3826c590f477e327c82daaddd6178f4" +version = "2.0.0" +source = "git+https://github.com/kaspanet/rusty-kaspa.git?rev=90dbf07#90dbf074275d60c1fe74a3491883196f110970c0" dependencies = [ - "arc-swap", "async-channel 2.5.0", "borsh", "cfg-if 1.0.4", - "duct", "event-listener 2.5.3", "faster-hex", "ipnet", "itertools 0.13.0", "log", - "mac_address", - "num_cpus", "once_cell", "parking_lot", - "rlimit", "serde", "sha2", "smallvec", - "sysinfo", - "thiserror 1.0.69", + "thiserror 2.0.18", "triggered", - "uuid 1.18.1", + "uuid", "wasm-bindgen", ] [[package]] name = "kaspa-wallet-core" -version = "1.1.0" -source = "git+https://github.com/kaspanet/rusty-kaspa.git?rev=e97070f#e97070faa3826c590f477e327c82daaddd6178f4" +version = "2.0.0" +source = "git+https://github.com/kaspanet/rusty-kaspa.git?rev=90dbf07#90dbf074275d60c1fe74a3491883196f110970c0" dependencies = [ "aes", "ahash", "argon2", "async-channel 2.5.0", - "async-std", + "async-lock", "async-trait", "base64", "borsh", @@ -2334,7 +2786,6 @@ dependencies = [ "convert_case 0.6.0", "crypto_box", "dashmap", - "derivative", "downcast", "evpkdf", "faster-hex", @@ -2368,7 +2819,7 @@ dependencies = [ "md-5", "pad", "pbkdf2", - "rand 0.8.5", + "rand 0.8.6", "regex", "ripemd", "secp256k1", @@ -2380,7 +2831,7 @@ dependencies = [ "sha2", "slugify-rs", "sorted-insert", - "thiserror 1.0.69", + "thiserror 2.0.18", "wasm-bindgen", "wasm-bindgen-futures", "web-sys", @@ -2396,8 +2847,8 @@ dependencies = [ [[package]] name = "kaspa-wallet-keys" -version = "1.1.0" -source = "git+https://github.com/kaspanet/rusty-kaspa.git?rev=e97070f#e97070faa3826c590f477e327c82daaddd6178f4" +version = "2.0.0" +source = "git+https://github.com/kaspanet/rusty-kaspa.git?rev=90dbf07#90dbf074275d60c1fe74a3491883196f110970c0" dependencies = [ "async-trait", "borsh", @@ -2412,14 +2863,14 @@ dependencies = [ "kaspa-txscript-errors", "kaspa-utils", "kaspa-wasm-core", - "rand 0.8.5", + "rand 0.8.6", "ripemd", "secp256k1", "serde", "serde-wasm-bindgen", "serde_json", "sha2", - "thiserror 1.0.69", + "thiserror 2.0.18", "wasm-bindgen", "wasm-bindgen-futures", "workflow-core", @@ -2429,8 +2880,8 @@ dependencies = [ [[package]] name = "kaspa-wallet-macros" -version = "1.1.0" -source = "git+https://github.com/kaspanet/rusty-kaspa.git?rev=e97070f#e97070faa3826c590f477e327c82daaddd6178f4" +version = "2.0.0" +source = "git+https://github.com/kaspanet/rusty-kaspa.git?rev=90dbf07#90dbf074275d60c1fe74a3491883196f110970c0" dependencies = [ "convert_case 0.5.0", "proc-macro-error", @@ -2443,8 +2894,8 @@ dependencies = [ [[package]] name = "kaspa-wallet-pskt" -version = "1.1.0" -source = "git+https://github.com/kaspanet/rusty-kaspa.git?rev=e97070f#e97070faa3826c590f477e327c82daaddd6178f4" +version = "2.0.0" +source = "git+https://github.com/kaspanet/rusty-kaspa.git?rev=90dbf07#90dbf074275d60c1fe74a3491883196f110970c0" dependencies = [ "bincode", "derive_builder", @@ -2465,15 +2916,15 @@ dependencies = [ "serde-wasm-bindgen", "serde_json", "serde_repr", - "thiserror 1.0.69", + "thiserror 2.0.18", "wasm-bindgen", "workflow-wasm", ] [[package]] name = "kaspa-wasm-core" -version = "1.1.0" -source = "git+https://github.com/kaspanet/rusty-kaspa.git?rev=e97070f#e97070faa3826c590f477e327c82daaddd6178f4" +version = "2.0.0" +source = "git+https://github.com/kaspanet/rusty-kaspa.git?rev=90dbf07#90dbf074275d60c1fe74a3491883196f110970c0" dependencies = [ "faster-hex", "hexplay", @@ -2484,10 +2935,10 @@ dependencies = [ [[package]] name = "kaspa-wrpc-client" -version = "1.1.0" -source = "git+https://github.com/kaspanet/rusty-kaspa.git?rev=e97070f#e97070faa3826c590f477e327c82daaddd6178f4" +version = "2.0.0" +source = "git+https://github.com/kaspanet/rusty-kaspa.git?rev=90dbf07#90dbf074275d60c1fe74a3491883196f110970c0" dependencies = [ - "async-std", + "async-lock", "async-trait", "borsh", "cfg-if 1.0.4", @@ -2500,13 +2951,13 @@ dependencies = [ "kaspa-rpc-core", "kaspa-rpc-macros", "paste", - "rand 0.8.5", + "rand 0.8.6", "regex", "rustls", "serde", "serde-wasm-bindgen", "serde_json", - "thiserror 1.0.69", + "thiserror 2.0.18", "toml 0.8.23", "wasm-bindgen", "wasm-bindgen-futures", @@ -2521,11 +2972,11 @@ dependencies = [ [[package]] name = "kaspa-wrpc-wasm" -version = "1.1.0" -source = "git+https://github.com/kaspanet/rusty-kaspa.git?rev=e97070f#e97070faa3826c590f477e327c82daaddd6178f4" +version = "2.0.0" +source = "git+https://github.com/kaspanet/rusty-kaspa.git?rev=90dbf07#90dbf074275d60c1fe74a3491883196f110970c0" dependencies = [ "ahash", - "async-std", + "async-lock", "cfg-if 1.0.4", "futures", "js-sys", @@ -2552,11 +3003,11 @@ dependencies = [ [[package]] name = "keccak" -version = "0.1.5" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ecc2af9a1119c51f12a14607e783cb977bde58bc069ff0c3da1095e635d70654" +checksum = "cb26cec98cce3a3d96cbb7bced3c4b16e3d13f27ec56dbd62cbc8f39cfb9d653" dependencies = [ - "cpufeatures", + "cpufeatures 0.2.17", ] [[package]] @@ -2579,61 +3030,51 @@ name = "lazy_static" version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" +dependencies = [ + "spin", +] + +[[package]] +name = "leb128fmt" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2" [[package]] name = "libc" -version = "0.2.177" +version = "0.2.186" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2874a2af47a2325c2001a6e6fad9b16a53b802102b528163885171cf92b15976" +checksum = "68ab91017fe16c622486840e4c83c9a37afeff978bd239b5293d61ece587de66" [[package]] name = "libm" -version = "0.2.15" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9fbbcab51052fe104eb5e5d351cf728d30a5be1fe14d9be8a3b097481fb97de" +checksum = "b6d2cec3eae94f9f509c767b45932f1ada8350c4bdb85af2fcab4a3c14807981" [[package]] name = "libredox" -version = "0.1.10" +version = "0.1.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "416f7e718bdb06000964960ffa43b4335ad4012ae8b99060261aa4a8088d5ccb" +checksum = "e02f3bb43d335493c96bf3fd3a321600bf6bd07ed34bc64118e9293bdffea46c" dependencies = [ - "bitflags", + "bitflags 2.11.1", "libc", - "redox_syscall", -] - -[[package]] -name = "linkme" -version = "0.2.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edd4ad156b9934dc21cad96fd17278a7cb6f30a5657a9d976cd7b71d6d49c02c" -dependencies = [ - "linkme-impl", -] - -[[package]] -name = "linkme-impl" -version = "0.2.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73fd9dc7072de7168cbdaba9125e8f742cd3a965aa12bde994b4611a174488d8" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", + "plain", + "redox_syscall 0.7.4", ] [[package]] name = "linux-raw-sys" -version = "0.11.0" +version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df1d3c3b53da64cf5760482273a98e575c651a67eec7f77df96b5b642de8f039" +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 = "lock_api" @@ -2646,11 +3087,11 @@ dependencies = [ [[package]] name = "log" -version = "0.4.28" +version = "0.4.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34080505efa8e45a4b816c349525ebe327ceaa8559756f0356cba97ef3bf7432" +checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897" dependencies = [ - "serde", + "serde_core", "value-bag", ] @@ -2669,7 +3110,7 @@ dependencies = [ "anyhow", "arc-swap", "chrono", - "derive_more 2.0.1", + "derive_more 2.1.1", "flate2", "fnv", "humantime", @@ -2678,12 +3119,12 @@ dependencies = [ "log-mdc", "mock_instant", "parking_lot", - "rand 0.9.2", + "rand 0.9.4", "serde", "serde-value", "serde_json", "serde_yaml", - "thiserror 2.0.17", + "thiserror 2.0.18", "thread-id", "typemap-ors", "unicode-segmentation", @@ -2696,16 +3137,6 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "112b39cec0b298b6c1999fee3e31427f74f676e4cb9879ed1a121b43661a4154" -[[package]] -name = "mac_address" -version = "1.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0aeb26bf5e836cc1c341c8106051b573f1766dfa05aa87f0b98be5e51b02303" -dependencies = [ - "nix 0.29.0", - "winapi", -] - [[package]] name = "macroific" version = "1.3.1" @@ -2726,7 +3157,7 @@ dependencies = [ "cfg-if 1.0.4", "proc-macro2", "quote", - "syn 2.0.110", + "syn 2.0.117", ] [[package]] @@ -2737,7 +3168,7 @@ checksum = "13198c120864097a565ccb3ff947672d969932b7975ebd4085732c9f09435e55" dependencies = [ "proc-macro2", "quote", - "syn 2.0.110", + "syn 2.0.117", ] [[package]] @@ -2750,37 +3181,47 @@ dependencies = [ "macroific_core", "proc-macro2", "quote", - "syn 2.0.110", + "syn 2.0.117", ] [[package]] name = "malachite-base" -version = "0.4.22" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ea0ed76adf7defc1a92240b5c36d5368cfe9251640dcce5bd2d0b7c1fd87aeb" +checksum = "a8b6f86fdbb1eb9955946be91775239dfcb0acdb1a51bb07d5fc9b8c854f5ccd" dependencies = [ - "hashbrown 0.14.5", - "itertools 0.11.0", + "hashbrown 0.16.1", + "itertools 0.14.0", "libm", "ryu", ] [[package]] name = "malachite-nz" -version = "0.4.22" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34a79feebb2bc9aa7762047c8e5495269a367da6b5a90a99882a0aeeac1841f7" +checksum = "0197a2f5cfee19d59178e282985c6ca79a9233e26a2adcf40acb693896aa09f6" dependencies = [ - "itertools 0.11.0", + "itertools 0.14.0", "libm", "malachite-base", + "wide", +] + +[[package]] +name = "malloc_buf" +version = "0.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62bb907fe88d54d8d9ce32a3cceab4218ed2f6b7d35617cafe9adf84e43919cb" +dependencies = [ + "libc", ] [[package]] name = "manual_future" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9dd540a422d875ab654f91534457d3bab82b5e2fdb5b5317427bb900649fac61" +checksum = "b0c72f11f1d8e0c453cbd8042dfb83c2b50384f78a5a5d41019627c5f2062ece" dependencies = [ "futures-util", ] @@ -2813,9 +3254,9 @@ dependencies = [ [[package]] name = "memchr" -version = "2.7.6" +version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f52b00d39961fc5b2736ea853c9cc86238e165017a493d1d5c8eac6bdc4cc273" +checksum = "f8ca58f447f06ed17d5fc4043ce1b10dd205e060fb3ce5b979b8ed8e59ff3f79" [[package]] name = "memoffset" @@ -2826,6 +3267,33 @@ dependencies = [ "autocfg", ] +[[package]] +name = "merlin" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "58c38e2799fc0978b65dfff8023ec7843e2330bb462f19198840b34b6582397d" +dependencies = [ + "byteorder", + "keccak", + "rand_core 0.6.4", + "zeroize", +] + +[[package]] +name = "metal" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ecfd3296f8c56b7c1f6fbac3c71cefa9d78ce009850c45000015f206dc7fa21" +dependencies = [ + "bitflags 2.11.1", + "block", + "core-graphics-types", + "foreign-types 0.5.0", + "log", + "objc", + "paste", +] + [[package]] name = "mime" version = "0.3.17" @@ -2844,9 +3312,9 @@ dependencies = [ [[package]] name = "mio" -version = "1.1.0" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69d83b0086dc8ecf3ce9ae2874b2d1290252e2a30720bea58a5c6639b0092873" +checksum = "50b7e5b27aa02a74bac8c3f23f448f8d87ff11f92d3aac1a6ed369ee08cc56c1" dependencies = [ "libc", "wasi", @@ -2865,14 +3333,14 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3ffa00dec017b5b1a8b7cf5e2c008bfda1aa7e0697ac1508b491fdf2622fb4d8" dependencies = [ - "rand 0.8.5", + "rand 0.8.6", ] [[package]] name = "native-tls" -version = "0.2.14" +version = "0.2.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87de3442987e9dbec73158d5c715e7ad9072fda936bb03d19d7fa10e00520f0e" +checksum = "465500e14ea162429d264d44189adc38b199b62b1c21eea9f69e4b73cb03bbf2" dependencies = [ "libc", "log", @@ -2887,9 +3355,9 @@ dependencies = [ [[package]] name = "ndarray" -version = "0.17.1" +version = "0.17.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c7c9125e8f6f10c9da3aad044cc918cf8784fa34de857b1aa68038eb05a50a9" +checksum = "520080814a7a6b4a6e9070823bb24b4531daac8c4627e08ba5de8c5ef2f2752d" dependencies = [ "matrixmultiply", "num-complex", @@ -2902,24 +3370,11 @@ dependencies = [ [[package]] name = "nix" -version = "0.29.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "71e2746dc3a24dd78b3cfcb7be93368c6de9963d30f43a6a73998a9cf4b17b46" -dependencies = [ - "bitflags", - "cfg-if 1.0.4", - "cfg_aliases", - "libc", - "memoffset", -] - -[[package]] -name = "nix" -version = "0.30.1" +version = "0.31.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74523f3a35e05aba87a1d978330aef40f67b0304ac79c1c00b294c9830543db6" +checksum = "5d6d0705320c1e6ba1d912b5e37cf18071b6c2e9b7fa8215a1e8a7651966f5d3" dependencies = [ - "bitflags", + "bitflags 2.11.1", "cfg-if 1.0.4", "cfg_aliases", "libc", @@ -2939,12 +3394,12 @@ dependencies = [ ] [[package]] -name = "ntapi" -version = "0.4.1" +name = "nu-ansi-term" +version = "0.50.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8a3895c6391c39d7fe7ebc444a87eb2991b2a0bc718fdabd071eec617fc68e4" +checksum = "7957b9740744892f114936ab4a57b3f487491bbeafaf8083688b16841a4240e5" dependencies = [ - "winapi", + "windows-sys 0.61.2", ] [[package]] @@ -2968,9 +3423,9 @@ dependencies = [ [[package]] name = "num-conv" -version = "0.1.0" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" +checksum = "c6673768db2d862beb9b39a78fdcb1a69439615d5794a1be50caa9bc92c81967" [[package]] name = "num-integer" @@ -2988,6 +3443,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" dependencies = [ "autocfg", + "libm", ] [[package]] @@ -3000,6 +3456,27 @@ dependencies = [ "libc", ] +[[package]] +name = "num_enum" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d0bca838442ec211fa11de3a8b0e0e8f3a4522575b5c4c06ed722e005036f26" +dependencies = [ + "num_enum_derive", + "rustversion", +] + +[[package]] +name = "num_enum_derive" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "680998035259dcfcafe653688bf2aa6d3e2dc05e98be6ab46afb089dc84f1df8" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + [[package]] name = "num_threads" version = "0.1.7" @@ -3022,14 +3499,23 @@ dependencies = [ "num-traits", "pyo3", "pyo3-build-config", - "rustc-hash 2.1.1", + "rustc-hash 2.1.2", +] + +[[package]] +name = "objc" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "915b1b472bc21c53464d6c8461c9d3af805ba1ef837e1cac254428f4a77177b1" +dependencies = [ + "malloc_buf", ] [[package]] name = "objc2" -version = "0.6.3" +version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7c2599ce0ec54857b29ce62166b0ed9b4f6f1a70ccc9a71165b6154caca8c05" +checksum = "3a12a8ed07aefc768292f076dc3ac8c48f3781c8f2d5851dd3d98950e8c5a89f" dependencies = [ "objc2-encode", ] @@ -3042,9 +3528,9 @@ checksum = "ef25abbcd74fb2609453eb695bd2f860d389e457f67dc17cafc8b8cbc89d0c33" [[package]] name = "once_cell" -version = "1.21.3" +version = "1.21.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" +checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50" [[package]] name = "opaque-debug" @@ -3054,13 +3540,13 @@ checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" [[package]] name = "openssl" -version = "0.10.73" +version = "0.10.78" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8505734d46c8ab1e19a1dce3aef597ad87dcb4c37e7188231769bd6bd51cebf8" +checksum = "f38c4372413cdaaf3cc79dd92d29d7d9f5ab09b51b10dded508fb90bb70b9222" dependencies = [ - "bitflags", + "bitflags 2.11.1", "cfg-if 1.0.4", - "foreign-types", + "foreign-types 0.3.2", "libc", "once_cell", "openssl-macros", @@ -3075,20 +3561,20 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.110", + "syn 2.0.117", ] [[package]] name = "openssl-probe" -version = "0.1.6" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" +checksum = "7c87def4c32ab89d880effc9e097653c8da5d6ef28e6b539d313baaacfbafcbe" [[package]] name = "openssl-sys" -version = "0.9.109" +version = "0.9.114" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90096e2e47630d78b7d1c20952dc621f957103f8bc2c8359ec81290d75238571" +checksum = "13ce1245cd07fcc4cfdb438f7507b0c7e4f3849a69fd84d52374c66d83741bb6" dependencies = [ "cc", "libc", @@ -3113,23 +3599,13 @@ dependencies = [ [[package]] name = "ordered-float" -version = "5.1.0" +version = "5.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f4779c6901a562440c3786d08192c6fbda7c1c2060edd10006b05ee35d10f2d" +checksum = "b7d950ca161dc355eaf28f82b11345ed76c6e1f6eb1f4f4479e0323b9e2fbd0e" dependencies = [ "num-traits", ] -[[package]] -name = "os_pipe" -version = "1.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d8fae84b431384b68627d0f9b3b1245fcf9f46f6c0e3dc902e9dce64edd1967" -dependencies = [ - "libc", - "windows-sys 0.61.2", -] - [[package]] name = "pad" version = "0.1.6" @@ -3163,7 +3639,7 @@ checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" dependencies = [ "cfg-if 1.0.4", "libc", - "redox_syscall", + "redox_syscall 0.5.18", "smallvec", "windows-link", ] @@ -3185,7 +3661,7 @@ checksum = "70d80829147ec6f1b27109c7daaea62fc3a21a0348cdddf22b4093f0c35ab25a" dependencies = [ "proc-macro2", "quote", - "syn 2.0.110", + "syn 2.0.117", ] [[package]] @@ -3247,7 +3723,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3c80231409c20246a13fddb31776fb942c38553c51e871f8cbd687a4cfb5843d" dependencies = [ "phf_shared", - "rand 0.8.5", + "rand 0.8.6", ] [[package]] @@ -3261,9 +3737,9 @@ dependencies = [ [[package]] name = "pin-project-lite" -version = "0.2.16" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" +checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd" [[package]] name = "pin-utils" @@ -3273,9 +3749,9 @@ checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" [[package]] name = "piper" -version = "0.2.4" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96c8c490f422ef9a4efd2cb5b42b76c8613d7e7dfc1caf667b8a3350a5acc066" +checksum = "c835479a4443ded371d6c535cbfd8d31ad92c5d23ae9770a61bc155e4992a3c1" dependencies = [ "atomic-waker", "fastrand", @@ -3284,9 +3760,15 @@ dependencies = [ [[package]] name = "pkg-config" -version = "0.3.32" +version = "0.3.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19f132c84eca552bf34cab8ec81f1c1dcc229b811638f9d283dceabe58c5569e" + +[[package]] +name = "plain" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" +checksum = "b4596b6d070b27117e987119b4dac604f3c58cfb0b191112e24771b2faeac1a6" [[package]] name = "polling" @@ -3308,31 +3790,43 @@ version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8159bd90725d2df49889a078b54f4f79e87f1f8a8444194cdca81d38f5393abf" dependencies = [ - "cpufeatures", + "cpufeatures 0.2.17", "opaque-debug", "universal-hash", ] [[package]] name = "portable-atomic" -version = "1.11.1" +version = "1.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f84267b20a16ea918e43c6a88433c2d54fa145c92a811b5b047ccbe153674483" +checksum = "c33a9471896f1c69cecef8d20cbe2f7accd12527ce60845ff44c153bb2a21b49" [[package]] name = "portable-atomic-util" -version = "0.2.4" +version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8a2f0d8d040d7848a709caf78912debcc3f33ee4b3cac47d73d1e1069e83507" +checksum = "c2a106d1259c23fac8e543272398ae0e3c0b8d33c88ed73d0cc71b0f1d902618" dependencies = [ "portable-atomic", ] +[[package]] +name = "postcard" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6764c3b5dd454e283a30e6dfe78e9b31096d9e32036b5d1eaac7a6119ccb9a24" +dependencies = [ + "cobs", + "embedded-io 0.4.0", + "embedded-io 0.6.1", + "serde", +] + [[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", ] @@ -3352,13 +3846,23 @@ dependencies = [ "zerocopy", ] +[[package]] +name = "prettyplease" +version = "0.2.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b" +dependencies = [ + "proc-macro2", + "syn 2.0.117", +] + [[package]] name = "proc-macro-crate" -version = "3.4.0" +version = "3.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "219cb19e96be00ab2e37d6e299658a0cfa83e52429179969b0f0121b4ac46983" +checksum = "e67ba7e9b2b56446f1d419b1d807906278ffa1a658a8a5d8a39dcb1f5a78614f" dependencies = [ - "toml_edit 0.23.7", + "toml_edit 0.25.11+spec-1.1.0", ] [[package]] @@ -3385,41 +3889,33 @@ dependencies = [ ] [[package]] -name = "proc-macro-error-attr2" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96de42df36bb9bba5542fe9f1a054b8cc87e172759a1868aa05c1f3acc89dfc5" -dependencies = [ - "proc-macro2", - "quote", -] - -[[package]] -name = "proc-macro-error2" -version = "2.0.1" +name = "proc-macro2" +version = "1.0.106" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11ec05c52be0a07b08061f7dd003e7d7092e0472bc731b4af7bb1ef876109802" +checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934" dependencies = [ - "proc-macro-error-attr2", - "proc-macro2", - "quote", - "syn 2.0.110", + "unicode-ident", ] [[package]] -name = "proc-macro2" -version = "1.0.103" +name = "proptest" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ee95bc4ef87b8d5ba32e8b7714ccc834865276eab0aed5c9958d00ec45f49e8" +checksum = "4b45fcc2344c680f5025fe57779faef368840d0bd1f42f216291f0dc4ace4744" dependencies = [ - "unicode-ident", + "bitflags 2.11.1", + "num-traits", + "rand 0.9.4", + "rand_chacha 0.9.0", + "rand_xorshift", + "unarray", ] [[package]] name = "pyo3" -version = "0.27.1" +version = "0.27.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37a6df7eab65fc7bee654a421404947e10a0f7085b6951bf2ea395f4659fb0cf" +checksum = "ab53c047fcd1a1d2a8820fe84f05d6be69e9526be40cb03b73f86b6b03e6d87d" dependencies = [ "indoc", "inventory", @@ -3448,18 +3944,18 @@ dependencies = [ [[package]] name = "pyo3-build-config" -version = "0.27.1" +version = "0.27.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f77d387774f6f6eec64a004eac0ed525aab7fa1966d94b42f743797b3e395afb" +checksum = "b455933107de8642b4487ed26d912c2d899dec6114884214a0b3bb3be9261ea6" dependencies = [ "target-lexicon", ] [[package]] name = "pyo3-ffi" -version = "0.27.1" +version = "0.27.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dd13844a4242793e02df3e2ec093f540d948299a6a77ea9ce7afd8623f542be" +checksum = "1c85c9cbfaddf651b1221594209aed57e9e5cff63c4d11d1feead529b872a089" dependencies = [ "libc", "pyo3-build-config", @@ -3467,9 +3963,9 @@ dependencies = [ [[package]] name = "pyo3-log" -version = "0.13.2" +version = "0.13.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f8bae9ad5ba08b0b0ed2bb9c2bdbaeccc69cafca96d78cf0fbcea0d45d122bb" +checksum = "26c2ec80932c5c3b2d4fbc578c9b56b2d4502098587edb8bef5b6bfcad43682e" dependencies = [ "arc-swap", "log", @@ -3478,27 +3974,27 @@ dependencies = [ [[package]] name = "pyo3-macros" -version = "0.27.1" +version = "0.27.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eaf8f9f1108270b90d3676b8679586385430e5c0bb78bb5f043f95499c821a71" +checksum = "0a5b10c9bf9888125d917fb4d2ca2d25c8df94c7ab5a52e13313a07e050a3b02" dependencies = [ "proc-macro2", "pyo3-macros-backend", "quote", - "syn 2.0.110", + "syn 2.0.117", ] [[package]] name = "pyo3-macros-backend" -version = "0.27.1" +version = "0.27.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70a3b2274450ba5288bc9b8c1b69ff569d1d61189d4bff38f8d22e03d17f932b" +checksum = "03b51720d314836e53327f5871d4c0cfb4fb37cc2c4a11cc71907a86342c40f9" dependencies = [ "heck", "proc-macro2", "pyo3-build-config", "quote", - "syn 2.0.110", + "syn 2.0.117", ] [[package]] @@ -3510,18 +4006,18 @@ dependencies = [ "anyhow", "chrono", "either", - "indexmap", + "indexmap 2.14.0", "inventory", "itertools 0.14.0", "log", "maplit", "num-complex", "numpy", - "ordered-float 5.1.0", + "ordered-float 5.3.0", "pyo3", "pyo3-stub-gen-derive", "serde", - "toml 0.9.10+spec-1.1.0", + "toml 0.9.12+spec-1.1.0", ] [[package]] @@ -3531,11 +4027,11 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2426ba759d848787239d80f9fdb1f223786976f87fb6c3da8188ca7c17744b28" dependencies = [ "heck", - "indexmap", + "indexmap 2.14.0", "proc-macro2", "quote", "rustpython-parser", - "syn 2.0.110", + "syn 2.0.117", ] [[package]] @@ -3549,10 +4045,10 @@ dependencies = [ "pin-project-lite", "quinn-proto", "quinn-udp", - "rustc-hash 2.1.1", + "rustc-hash 2.1.2", "rustls", "socket2", - "thiserror 2.0.17", + "thiserror 2.0.18", "tokio", "tracing", "web-time", @@ -3560,20 +4056,20 @@ dependencies = [ [[package]] name = "quinn-proto" -version = "0.11.13" +version = "0.11.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1906b49b0c3bc04b5fe5d86a77925ae6524a19b816ae38ce1e426255f1d8a31" +checksum = "434b42fec591c96ef50e21e886936e66d3cc3f737104fdb9b737c40ffb94c098" dependencies = [ "bytes", "getrandom 0.3.4", "lru-slab", - "rand 0.9.2", + "rand 0.9.4", "ring", - "rustc-hash 2.1.1", + "rustc-hash 2.1.2", "rustls", "rustls-pki-types", "slab", - "thiserror 2.0.17", + "thiserror 2.0.18", "tinyvec", "tracing", "web-time", @@ -3595,9 +4091,9 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.42" +version = "1.0.45" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a338cc41d27e6cc6dce6cefc13a0729dfbb81c262b1f519331575dd80ef3067f" +checksum = "41f2619966050689382d2b44f664f4bc593e129785a36d6ee376ddf37259b924" dependencies = [ "proc-macro2", ] @@ -3608,11 +4104,17 @@ version = "5.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" +[[package]] +name = "r-efi" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf" + [[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", @@ -3621,12 +4123,23 @@ dependencies = [ [[package]] name = "rand" -version = "0.9.2" +version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1" +checksum = "44c5af06bb1b7d3216d91932aed5265164bf384dc89cd6ba05cf59a35f5f76ea" dependencies = [ "rand_chacha 0.9.0", - "rand_core 0.9.3", + "rand_core 0.9.5", +] + +[[package]] +name = "rand" +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", + "rand_core 0.10.1", ] [[package]] @@ -3646,7 +4159,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" dependencies = [ "ppv-lite86", - "rand_core 0.9.3", + "rand_core 0.9.5", ] [[package]] @@ -3655,18 +4168,33 @@ version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" dependencies = [ - "getrandom 0.2.16", + "getrandom 0.2.17", ] [[package]] name = "rand_core" -version = "0.9.3" +version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" +checksum = "76afc826de14238e6e8c374ddcc1fa19e374fd8dd986b0d2af0d02377261d83c" dependencies = [ "getrandom 0.3.4", ] +[[package]] +name = "rand_core" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63b8176103e19a2643978565ca18b50549f6101881c443590420e4dc998a3c69" + +[[package]] +name = "rand_xorshift" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "513962919efc330f829edb2535844d1b912b0fbe2ca165d613e4e8788bb05a5a" +dependencies = [ + "rand_core 0.9.5", +] + [[package]] name = "rawpointer" version = "0.2.1" @@ -3675,9 +4203,9 @@ checksum = "60a357793950651c4ed0f3f52338f53b2f809f32d83a07f72909fa13e4c6c1e3" [[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", @@ -3699,7 +4227,16 @@ version = "0.5.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" dependencies = [ - "bitflags", + "bitflags 2.11.1", +] + +[[package]] +name = "redox_syscall" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f450ad9c3b1da563fb6948a8e0fb0fb9269711c9c73d9ea1de5058c79c8d643a" +dependencies = [ + "bitflags 2.11.1", ] [[package]] @@ -3708,16 +4245,36 @@ version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" dependencies = [ - "getrandom 0.2.16", + "getrandom 0.2.17", "libredox", "thiserror 1.0.69", ] +[[package]] +name = "ref-cast" +version = "1.0.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f354300ae66f76f1c85c5f84693f0ce81d747e2c3f21a45fef496d89c960bf7d" +dependencies = [ + "ref-cast-impl", +] + +[[package]] +name = "ref-cast-impl" +version = "1.0.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7186006dcb21920990093f30e3dea63b7d6e977bf1256be20c3563a5db070da" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + [[package]] name = "regex" -version = "1.12.2" +version = "1.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "843bc0191f75f3e22651ae5f1e72939ab2f72a4bc30fa80a066bd66edefc24d4" +checksum = "e10754a14b9137dd7b1e3e5b0493cc9171fdd105e0ab477f51b72e7f3ac0e276" dependencies = [ "aho-corasick", "memchr", @@ -3727,9 +4284,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.13" +version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5276caf25ac86c8d810222b3dbb938e512c55c6831a10f3e6ed1c93b84041f1c" +checksum = "6e1dd4122fc1595e8162618945476892eefca7b88c52820e74af6262213cae8f" dependencies = [ "aho-corasick", "memchr", @@ -3738,15 +4295,15 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.8.8" +version = "0.8.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a2d987857b319362043e95f5353c0535c1f58eec5336fdfcf626430af7def58" +checksum = "dc897dd8d9e8bd1ed8cdad82b5966c3e0ecae09fb1907d58efaa013543185d0a" [[package]] name = "reqwest" -version = "0.12.24" +version = "0.12.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d0946410b9f7b082a427e4ef5c8ff541a88b357bc6c637c40db3a68ac70a36f" +checksum = "eddd3ca559203180a307f12d114c268abf583f59b03cb906fd0b3ff8646c1147" dependencies = [ "base64", "bytes", @@ -3780,7 +4337,7 @@ dependencies = [ "wasm-bindgen", "wasm-bindgen-futures", "web-sys", - "webpki-roots 1.0.4", + "webpki-roots 1.0.7", ] [[package]] @@ -3791,7 +4348,7 @@ checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" dependencies = [ "cc", "cfg-if 1.0.4", - "getrandom 0.2.16", + "getrandom 0.2.17", "libc", "untrusted", "windows-sys 0.52.0", @@ -3806,6 +4363,89 @@ dependencies = [ "digest", ] +[[package]] +name = "risc0-binfmt" +version = "3.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1883f0c5d19b865f395209a137dcb29e56dc49951424967b8d0114c129f46e77" +dependencies = [ + "anyhow", + "borsh", + "bytemuck", + "derive_more 2.1.1", + "elf", + "lazy_static", + "postcard", + "risc0-zkp", + "risc0-zkvm-platform", + "ruint", + "semver", + "serde", + "tracing", +] + +[[package]] +name = "risc0-circuit-recursion" +version = "4.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2347e909c6b2a65584b5898f3802eec5b8c1b4b45329edfdd8587b6a04dd3357" +dependencies = [ + "anyhow", + "bytemuck", + "hex", + "metal", + "risc0-core", + "risc0-zkp", + "tracing", +] + +[[package]] +name = "risc0-core" +version = "3.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5b956a976b8ce4713694dcc6c370b522a42ccef4ba45da5b6e57dbf26cdb7b1" +dependencies = [ + "bytemuck", + "rand_core 0.9.5", +] + +[[package]] +name = "risc0-zkp" +version = "3.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f40d362a6c146ec6dc69208f539b92fd86e47b0dbc2083801423034a38155a2" +dependencies = [ + "anyhow", + "blake2", + "borsh", + "bytemuck", + "cfg-if 1.0.4", + "digest", + "hex", + "hex-literal", + "metal", + "paste", + "rand_core 0.9.5", + "risc0-core", + "risc0-zkvm-platform", + "serde", + "sha2", + "stability", + "tracing", +] + +[[package]] +name = "risc0-zkvm-platform" +version = "2.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4db893788c416287e2e1a87e6b8f5302511a04a45329e699d6a32a16874fd24f" +dependencies = [ + "cfg-if 1.0.4", + "num_enum", + "paste", + "stability", +] + [[package]] name = "rlimit" version = "0.10.2" @@ -3815,6 +4455,28 @@ dependencies = [ "libc", ] +[[package]] +name = "ruint" +version = "1.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0298da754d1395046b0afdc2f20ee76d29a8ae310cd30ffa84ed42acba9cb12a" +dependencies = [ + "borsh", + "proptest", + "rand 0.8.6", + "rand 0.9.4", + "ruint-macro", + "serde_core", + "valuable", + "zeroize", +] + +[[package]] +name = "ruint-macro" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48fd7bd8a6377e15ad9d42a8ec25371b94ddc67abe7c8b9127bec79bebaaae18" + [[package]] name = "rustc-hash" version = "1.1.0" @@ -3823,9 +4485,9 @@ checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" [[package]] name = "rustc-hash" -version = "2.1.1" +version = "2.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "357703d41365b4b27c590e3ed91eabb1b663f07c4c084095e60cbed4362dff0d" +checksum = "94300abf3f1ae2e2b8ffb7b58043de3d399c73fa6f4b73826402a5c457614dbe" [[package]] name = "rustc_version" @@ -3838,11 +4500,11 @@ dependencies = [ [[package]] name = "rustix" -version = "1.1.2" +version = "1.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd15f8a2c5551a84d56efdc1cd049089e409ac19a3072d5037a17fd70719ff3e" +checksum = "b6fe4565b9518b83ef4f91bb47ce29620ca828bd32cb7e408f0062e9930ba190" dependencies = [ - "bitflags", + "bitflags 2.11.1", "errno", "libc", "linux-raw-sys", @@ -3851,9 +4513,9 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.35" +version = "0.23.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "533f54bc6a7d4f647e46ad909549eda97bf5afc1585190ef692b4286b198bd8f" +checksum = "ef86cd5876211988985292b91c96a8f2d298df24e75989a43a3c73f2d4d8168b" dependencies = [ "once_cell", "ring", @@ -3865,9 +4527,9 @@ dependencies = [ [[package]] name = "rustls-pki-types" -version = "1.13.1" +version = "1.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "708c0f9d5f54ba0272468c1d306a52c495b31fa155e91bc25371e6df7996908c" +checksum = "30a7197ae7eb376e574fe940d068c30fe0462554a3ddbe4eca7838e049c937a9" dependencies = [ "web-time", "zeroize", @@ -3875,9 +4537,9 @@ dependencies = [ [[package]] name = "rustls-webpki" -version = "0.103.8" +version = "0.103.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ffdfa2f5286e2247234e03f680868ac2815974dc39e00ea15adc445d0aafe52" +checksum = "61c429a8649f110dddef65e2a5ad240f747e85f7758a6bccc7e5777bd33f756e" dependencies = [ "ring", "rustls-pki-types", @@ -3949,9 +4611,18 @@ checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" [[package]] name = "ryu" -version = "1.0.20" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9774ba4a74de5f7b1c1451ed6cd5285a32eddb5cccb8cc655a4e50009e06477f" + +[[package]] +name = "safe_arch" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" +checksum = "1f7caad094bd561859bcd467734a720c3c1f5d1f338995351fefe2190c45efed" +dependencies = [ + "bytemuck", +] [[package]] name = "salsa20" @@ -3964,11 +4635,35 @@ dependencies = [ [[package]] name = "schannel" -version = "0.1.27" +version = "0.1.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f29ebaa345f945cec9fbbc532eb307f0fdad8161f281b6369539c8d84876b3d" +checksum = "91c1b7e4904c873ef0710c1f407dde2e6287de2bebc1bbbf7d430bb7cbffd939" dependencies = [ - "windows-sys 0.59.0", + "windows-sys 0.61.2", +] + +[[package]] +name = "schemars" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cd191f9397d57d581cddd31014772520aa448f65ef991055d7f61582c65165f" +dependencies = [ + "dyn-clone", + "ref-cast", + "serde", + "serde_json", +] + +[[package]] +name = "schemars" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2b42f36aa1cd011945615b92222f6bf73c599a102a300334cd7f8dbeec726cc" +dependencies = [ + "dyn-clone", + "ref-cast", + "serde", + "serde_json", ] [[package]] @@ -3983,7 +4678,7 @@ version = "0.29.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9465315bc9d4566e1724f0fffcbcc446268cb522e60f9a27bcded6b19c108113" dependencies = [ - "rand 0.8.5", + "rand 0.8.6", "secp256k1-sys", "serde", ] @@ -3999,12 +4694,12 @@ dependencies = [ [[package]] name = "security-framework" -version = "2.11.1" +version = "3.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" +checksum = "b7f4bc775c73d9a02cde8bf7b2ec4c9d12743edf609006c7facc23998404cd1d" dependencies = [ - "bitflags", - "core-foundation", + "bitflags 2.11.1", + "core-foundation 0.10.1", "core-foundation-sys", "libc", "security-framework-sys", @@ -4012,9 +4707,9 @@ dependencies = [ [[package]] name = "security-framework-sys" -version = "2.14.0" +version = "2.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49db231d56a190491cb4aeda9527f1ad45345af50b0851622a7adb8c03b01c32" +checksum = "6ce2691df843ecc5d231c0b14ece2acc3efb62c0a398c7e1d875f3983ce020e3" dependencies = [ "core-foundation-sys", "libc", @@ -4022,9 +4717,9 @@ 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" dependencies = [ "serde", "serde_core", @@ -4095,7 +4790,7 @@ checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" dependencies = [ "proc-macro2", "quote", - "syn 2.0.110", + "syn 2.0.117", ] [[package]] @@ -4111,18 +4806,6 @@ dependencies = [ "zmij", ] -[[package]] -name = "serde_nested_with" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc84538493ef215370434907a7dca8117778d16ac1acd0482ce88a0f5cf19707" -dependencies = [ - "darling 0.21.3", - "proc-macro-error2", - "quote", - "syn 2.0.110", -] - [[package]] name = "serde_repr" version = "0.1.20" @@ -4131,7 +4814,7 @@ checksum = "175ee3e80ae9982737ca543e96133087cbd9a485eecc3bc4de9c1a37b47ea59c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.110", + "syn 2.0.117", ] [[package]] @@ -4145,9 +4828,9 @@ dependencies = [ [[package]] name = "serde_spanned" -version = "1.0.4" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8bbf91e5a4d6315eee45e704372590b30e260ee83af6639d64557f51b067776" +checksum = "6662b5879511e06e8999a8a235d848113e942c9124f211511b16466ee2995f26" dependencies = [ "serde_core", ] @@ -4164,13 +4847,31 @@ dependencies = [ "serde", ] +[[package]] +name = "serde_with" +version = "3.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f05839ce67618e14a09b286535c0d9c94e85ef25469b0e13cb4f844e5593eb19" +dependencies = [ + "base64", + "chrono", + "hex", + "indexmap 1.9.3", + "indexmap 2.14.0", + "schemars 0.9.0", + "schemars 1.2.1", + "serde_core", + "serde_json", + "time", +] + [[package]] name = "serde_yaml" version = "0.9.34+deprecated" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a8b1a1a2ebf674015cc02edccce75287f1a0130d394307b36743c2f5d504b47" dependencies = [ - "indexmap", + "indexmap 2.14.0", "itoa", "ryu", "serde", @@ -4184,7 +4885,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" dependencies = [ "cfg-if 1.0.4", - "cpufeatures", + "cpufeatures 0.2.17", "digest", ] @@ -4195,74 +4896,48 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" dependencies = [ "cfg-if 1.0.4", - "cpufeatures", + "cpufeatures 0.2.17", "digest", ] [[package]] -name = "shared_child" -version = "1.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e362d9935bc50f019969e2f9ecd66786612daae13e8f277be7bfb66e8bed3f7" -dependencies = [ - "libc", - "sigchld", - "windows-sys 0.60.2", -] - -[[package]] -name = "shlex" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" - -[[package]] -name = "sigchld" -version = "0.2.4" +name = "sha2-const-stable" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47106eded3c154e70176fc83df9737335c94ce22f821c32d17ed1db1f83badb1" -dependencies = [ - "libc", - "os_pipe", - "signal-hook", -] +checksum = "5f179d4e11094a893b82fff208f74d448a7512f99f5a0acbd5c679b705f83ed9" [[package]] -name = "signal-hook" -version = "0.3.18" +name = "sharded-slab" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d881a16cf4426aa584979d30bd82cb33429027e42122b169753d6ef1085ed6e2" +checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" dependencies = [ - "libc", - "signal-hook-registry", + "lazy_static", ] [[package]] -name = "signal-hook-registry" -version = "1.4.7" +name = "shlex" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7664a098b8e616bdfcc2dc0e9ac44eb231eedf41db4e9fe95d8d32ec728dedad" -dependencies = [ - "libc", -] +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" [[package]] name = "simd-adler32" -version = "0.3.7" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe" +checksum = "703d5c7ef118737c72f1af64ad2f6f8c5e1921f818cdcb97b8fe6fc69bf66214" [[package]] name = "siphasher" -version = "1.0.1" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56199f7ddabf13fe5074ce809e7d3f42b42ae711800501b5b16ea82ad029c39d" +checksum = "8ee5873ec9cce0195efcb7a4e9507a04cd49aec9c83d0389df45b1ef7ba2e649" [[package]] name = "slab" -version = "0.4.11" +version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a2ae44ef20feb57a68b23d846850f861394c2e02dc425a50098ae8c90267589" +checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5" [[package]] name = "slugify-rs" @@ -4285,12 +4960,12 @@ dependencies = [ [[package]] name = "socket2" -version = "0.6.1" +version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17129e116933cf371d018bb80ae557e889637989d8638274fb25622827b03881" +checksum = "3a766e1110788c36f4fa1c2b71b387a7815aa65f88ce0229841826633d93723e" dependencies = [ "libc", - "windows-sys 0.60.2", + "windows-sys 0.61.2", ] [[package]] @@ -4299,6 +4974,22 @@ version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eec75fe132d95908f1c030f93630bc20b76f3ebaeca789a6180553b770ddcd39" +[[package]] +name = "spin" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" + +[[package]] +name = "stability" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d904e7009df136af5297832a3ace3370cd14ff1546a232f4f185036c2736fcac" +dependencies = [ + "quote", + "syn 2.0.117", +] + [[package]] name = "stable_deref_trait" version = "1.2.1" @@ -4336,9 +5027,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.110" +version = "2.0.117" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a99801b5bd34ede4cf3fc688c5919368fea4e4814a4664359503e6015b280aea" +checksum = "e665b8803e7b1d2a727f4023456bbbbe74da67099c585258af0ad9c5013b9b99" dependencies = [ "proc-macro2", "quote", @@ -4362,31 +5053,17 @@ checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" dependencies = [ "proc-macro2", "quote", - "syn 2.0.110", -] - -[[package]] -name = "sysinfo" -version = "0.31.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "355dbe4f8799b304b05e1b0f05fc59b2a18d36645cf169607da45bde2f69a1be" -dependencies = [ - "core-foundation-sys", - "libc", - "memchr", - "ntapi", - "rayon", - "windows", + "syn 2.0.117", ] [[package]] name = "system-configuration" -version = "0.6.1" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b" +checksum = "a13f3d0daba03132c0aa9767f98351b3488edc2c100cda2d2ec2b04f3d8d3c8b" dependencies = [ - "bitflags", - "core-foundation", + "bitflags 2.11.1", + "core-foundation 0.9.4", "system-configuration-sys", ] @@ -4402,18 +5079,18 @@ dependencies = [ [[package]] name = "target-lexicon" -version = "0.13.3" +version = "0.13.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df7f62577c25e07834649fc3b39fafdc597c0a3527dc1c60129201ccfcbaa50c" +checksum = "adb6935a6f5c20170eeceb1a3835a49e12e19d792f6dd344ccc76a985ca5a6ca" [[package]] name = "tempfile" -version = "3.23.0" +version = "3.27.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d31c77bdf42a745371d260a26ca7163f1e0924b64afa0b688e61b5a9fa02f16" +checksum = "32497e9a4c7b38532efcdebeef879707aa9f794296a4f0244f6f69e9bc8574bd" dependencies = [ "fastrand", - "getrandom 0.3.4", + "getrandom 0.4.2", "once_cell", "rustix", "windows-sys 0.61.2", @@ -4439,11 +5116,11 @@ dependencies = [ [[package]] name = "thiserror" -version = "2.0.17" +version = "2.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f63587ca0f12b72a0600bcba1d40081f830876000bb46dd2337a3051618f4fc8" +checksum = "4288b5bcbc7920c07a1149a35cf9590a2aa808e0bc1eafaade0b80947865fbc4" dependencies = [ - "thiserror-impl 2.0.17", + "thiserror-impl 2.0.18", ] [[package]] @@ -4454,35 +5131,44 @@ checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.110", + "syn 2.0.117", ] [[package]] name = "thiserror-impl" -version = "2.0.17" +version = "2.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ff15c8ecd7de3849db632e14d18d2571fa09dfc5ed93479bc4485c7a517c913" +checksum = "ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5" dependencies = [ "proc-macro2", "quote", - "syn 2.0.110", + "syn 2.0.117", ] [[package]] name = "thread-id" -version = "5.0.0" +version = "5.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99043e46c5a15af379c06add30d9c93a6c0e8849de00d244c4a2c417da128d80" +checksum = "2010d27add3f3240c1fef7959f46c814487b216baee662af53be645ba7831c07" dependencies = [ "libc", - "windows-sys 0.59.0", + "windows-sys 0.61.2", +] + +[[package]] +name = "thread_local" +version = "1.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f60246a4944f24f6e018aa17cdeffb7818b76356965d03b07d6a9886e8962185" +dependencies = [ + "cfg-if 1.0.4", ] [[package]] name = "time" -version = "0.3.44" +version = "0.3.47" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91e7d9e3bb61134e77bde20dd4825b97c010155709965fedf0f49bb138e52a9d" +checksum = "743bd48c283afc0388f9b8827b976905fb217ad9e647fae3a379a9283c4def2c" dependencies = [ "deranged", "itoa", @@ -4490,22 +5176,22 @@ dependencies = [ "num-conv", "num_threads", "powerfmt", - "serde", + "serde_core", "time-core", "time-macros", ] [[package]] name = "time-core" -version = "0.1.6" +version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40868e7c1d2f0b8d73e4a8c7f0ff63af4f6d19be117e90bd73eb1d62cf831c6b" +checksum = "7694e1cfe791f8d31026952abf09c69ca6f6fa4e1a1229e18988f06a04a12dca" [[package]] name = "time-macros" -version = "0.2.24" +version = "0.2.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30cfb0125f12d9c277f35663a0a33f8c30190f4e4574868a330595412d34ebf3" +checksum = "2e70e4c5a0e0a8a4823ad65dfe1a6930e4f4d756dcd9dd7939022b5e8c501215" dependencies = [ "num-conv", "time-core", @@ -4522,9 +5208,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", @@ -4532,9 +5218,9 @@ dependencies = [ [[package]] name = "tinyvec" -version = "1.10.0" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfa5fdc3bce6191a1dbc8c02d5c8bffcf557bafa17c124c5264a458f1b0613fa" +checksum = "3e61e67053d25a4e82c844e8424039d9745781b3fc4f32b8d55ed50f5f667ef3" dependencies = [ "tinyvec_macros", ] @@ -4547,9 +5233,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.48.0" +version = "1.52.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff360e02eab121e0bc37a2d3b4d4dc622e6eda3a8e5253d5435ecf5bd4c68408" +checksum = "b67dee974fe86fd92cc45b7a95fdd2f99a36a6d7b0d431a231178d3d670bbcc6" dependencies = [ "bytes", "libc", @@ -4562,13 +5248,13 @@ dependencies = [ [[package]] name = "tokio-macros" -version = "2.6.0" +version = "2.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af407857209536a95c8e56f8231ef2c2e2aff839b22e07a1ffcbc617e9db9fa5" +checksum = "385a6cb71ab9ab790c5fe8d67f1645e6c450a7ce006a33de03daa956cf70a496" dependencies = [ "proc-macro2", "quote", - "syn 2.0.110", + "syn 2.0.117", ] [[package]] @@ -4611,9 +5297,9 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.7.17" +version = "0.7.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2efa149fe76073d6e8fd97ef4f4eca7b67f599660115591483572e406e165594" +checksum = "9ae9cec805b01e8fc3fd2fe289f89149a9b66dd16786abd8b19cfa7b48cb0098" dependencies = [ "bytes", "futures-core", @@ -4636,17 +5322,17 @@ dependencies = [ [[package]] name = "toml" -version = "0.9.10+spec-1.1.0" +version = "0.9.12+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0825052159284a1a8b4d6c0c86cbc801f2da5afd2b225fa548c72f2e74002f48" +checksum = "cf92845e79fc2e2def6a5d828f0801e29a2f8acc037becc5ab08595c7d5e9863" dependencies = [ - "indexmap", + "indexmap 2.14.0", "serde_core", - "serde_spanned 1.0.4", + "serde_spanned 1.1.1", "toml_datetime 0.7.5+spec-1.1.0", "toml_parser", "toml_writer", - "winnow", + "winnow 0.7.15", ] [[package]] @@ -4667,39 +5353,48 @@ dependencies = [ "serde_core", ] +[[package]] +name = "toml_datetime" +version = "1.1.1+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3165f65f62e28e0115a00b2ebdd37eb6f3b641855f9d636d3cd4103767159ad7" +dependencies = [ + "serde_core", +] + [[package]] name = "toml_edit" version = "0.22.27" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "41fe8c660ae4257887cf66394862d21dbca4a6ddd26f04a3560410406a2f819a" dependencies = [ - "indexmap", + "indexmap 2.14.0", "serde", "serde_spanned 0.6.9", "toml_datetime 0.6.11", "toml_write", - "winnow", + "winnow 0.7.15", ] [[package]] name = "toml_edit" -version = "0.23.7" +version = "0.25.11+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6485ef6d0d9b5d0ec17244ff7eb05310113c3f316f2d14200d4de56b3cb98f8d" +checksum = "0b59c4d22ed448339746c59b905d24568fcbb3ab65a500494f7b8c3e97739f2b" dependencies = [ - "indexmap", - "toml_datetime 0.7.5+spec-1.1.0", + "indexmap 2.14.0", + "toml_datetime 1.1.1+spec-1.1.0", "toml_parser", - "winnow", + "winnow 1.0.2", ] [[package]] name = "toml_parser" -version = "1.0.6+spec-1.1.0" +version = "1.1.2+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3198b4b0a8e11f09dd03e133c0280504d0801269e9afa46362ffde1cbeebf44" +checksum = "a2abe9b86193656635d2411dc43050282ca48aa31c2451210f4202550afb7526" dependencies = [ - "winnow", + "winnow 1.0.2", ] [[package]] @@ -4710,15 +5405,15 @@ checksum = "5d99f8c9a7727884afe522e9bd5edbfc91a3312b36a77b5fb8926e4c31a41801" [[package]] name = "toml_writer" -version = "1.0.6+spec-1.1.0" +version = "1.1.1+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab16f14aed21ee8bfd8ec22513f7287cd4a91aa92e44edfe2c17ddd004e92607" +checksum = "756daf9b1013ebe47a8776667b466417e2d4c5679d441c26230efd9ef78692db" [[package]] name = "tower" -version = "0.5.2" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9" +checksum = "ebe5ef63511595f1344e2d5cfa636d973292adc0eec1f0ad45fae9f0851ab1d4" dependencies = [ "futures-core", "futures-util", @@ -4731,11 +5426,11 @@ dependencies = [ [[package]] name = "tower-http" -version = "0.6.7" +version = "0.6.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9cf146f99d442e8e68e585f5d798ccd3cad9a7835b917e09728880a862706456" +checksum = "d4e6559d53cc268e5031cd8429d05415bc4cb4aefc4aa5d6cc35fbf5b924a1f8" dependencies = [ - "bitflags", + "bitflags 2.11.1", "bytes", "futures-util", "http", @@ -4761,21 +5456,60 @@ checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" [[package]] name = "tracing" -version = "0.1.43" +version = "0.1.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d15d90a0b5c19378952d479dc858407149d7bb45a14de0142f6c534b16fc647" +checksum = "63e71662fa4b2a2c3a26f570f037eb95bb1f85397f3cd8076caed2f026a6d100" dependencies = [ + "log", "pin-project-lite", + "tracing-attributes", "tracing-core", ] +[[package]] +name = "tracing-attributes" +version = "0.1.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + [[package]] name = "tracing-core" -version = "0.1.35" +version = "0.1.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a04e24fab5c89c6a36eb8558c9656f30d81de51dfa4d3b45f26b21d61fa0a6c" +checksum = "db97caf9d906fbde555dd62fa95ddba9eecfd14cb388e4f491a66d74cd5fb79a" dependencies = [ "once_cell", + "valuable", +] + +[[package]] +name = "tracing-log" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" +dependencies = [ + "log", + "once_cell", + "tracing-core", +] + +[[package]] +name = "tracing-subscriber" +version = "0.3.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb7f578e5945fb242538965c2d0b04418d38ec25c79d160cd279bf0731c8d319" +dependencies = [ + "nu-ansi-term", + "sharded-slab", + "smallvec", + "thread_local", + "tracing-core", + "tracing-log", ] [[package]] @@ -4803,7 +5537,7 @@ dependencies = [ "httparse", "log", "native-tls", - "rand 0.8.5", + "rand 0.8.6", "rustls", "rustls-pki-types", "sha1", @@ -4822,9 +5556,15 @@ dependencies = [ [[package]] name = "typenum" -version = "1.19.0" +version = "1.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb" +checksum = "40ce102ab67701b8526c123c1bab5cbe42d7040ccfd0f64af1a385808d2f43de" + +[[package]] +name = "unarray" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eaea85b334db583fe3274d12b4cd1880032beab409c0d774be044d4480ab9a94" [[package]] name = "unic-char-property" @@ -4880,15 +5620,15 @@ dependencies = [ [[package]] name = "unicode-ident" -version = "1.0.22" +version = "1.0.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9312f7c4f6ff9069b165498234ce8be658059c6728633667c526e27dc2cf1df5" +checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" [[package]] name = "unicode-segmentation" -version = "1.12.0" +version = "1.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" +checksum = "9629274872b2bfaf8d66f5f15725007f635594914870f65218920345aa11aa8c" [[package]] name = "unicode-width" @@ -4927,7 +5667,7 @@ dependencies = [ "getopts", "log", "phf_codegen", - "rand 0.8.5", + "rand 0.8.6", ] [[package]] @@ -4969,9 +5709,9 @@ checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" [[package]] name = "url" -version = "2.5.7" +version = "2.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08bc136a29a3d1758e07a9cca267be308aeebf5cfd5a10f3f67ab2097683ef5b" +checksum = "ff67a8a4397373c3ef660812acab3268222035010ab8680ec4215f38ba3d0eed" dependencies = [ "form_urlencoded", "idna", @@ -4993,25 +5733,22 @@ checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" [[package]] name = "uuid" -version = "0.8.2" +version = "1.23.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc5cf98d8186244414c848017f0e2676b3fcb46807f6668a97dfe67359a3c4b7" +checksum = "ddd74a9687298c6858e9b88ec8935ec45d22e8fd5e6394fa1bd4e99a87789c76" dependencies = [ - "getrandom 0.2.16", + "getrandom 0.4.2", + "js-sys", + "rand 0.10.1", + "serde_core", + "wasm-bindgen", ] [[package]] -name = "uuid" -version = "1.18.1" +name = "valuable" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f87b8aa10b915a06587d0dec516c282ff295b475d94abf425d62b57710070a2" -dependencies = [ - "getrandom 0.3.4", - "js-sys", - "rand 0.9.2", - "serde", - "wasm-bindgen", -] +checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" [[package]] name = "value-bag" @@ -5063,33 +5800,53 @@ checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" [[package]] name = "wasip2" -version = "1.0.1+wasi-0.2.4" +version = "1.0.3+wasi-0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20064672db26d7cdc89c7798c48a0fdfac8213434a1186e5ef29fd560ae223d6" +dependencies = [ + "wit-bindgen 0.57.1", +] + +[[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 = "0562428422c63773dad2c345a1882263bbf4d65cf3f42e90921f787ef5ad58e7" +checksum = "5428f8bf88ea5ddc08faddef2ac4a67e390b88186c703ce6dbd955e1c145aca5" dependencies = [ - "wit-bindgen", + "wit-bindgen 0.51.0", ] [[package]] name = "wasm-bindgen" -version = "0.2.106" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d759f433fa64a2d763d1340820e46e111a7a5ab75f993d1852d70b03dbb80fd" +checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" dependencies = [ "cfg-if 1.0.4", "once_cell", "rustversion", - "serde", - "serde_json", "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" +dependencies = [ + "bumpalo", + "log", + "proc-macro2", + "quote", + "syn 2.0.117", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-futures" -version = "0.4.56" +version = "0.4.50" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "836d9622d604feee9e5de25ac10e3ea5f2d65b41eac0d9ce72eb5deae707ce7c" +checksum = "555d470ec0bc3bb57890405e5d4322cc9ea83cebb085523ced7be4144dac1e61" dependencies = [ "cfg-if 1.0.4", "js-sys", @@ -5100,9 +5857,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.106" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48cb0d2638f8baedbc542ed444afc0644a29166f1595371af4fecf8ce1e7eeb3" +checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -5110,31 +5867,65 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.106" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cefb59d5cd5f92d9dcf80e4683949f15ca4b511f4ac0a6e14d4e1ac60c6ecd40" +checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" dependencies = [ - "bumpalo", "proc-macro2", "quote", - "syn 2.0.110", + "syn 2.0.117", + "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.106" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cbc538057e648b67f72a982e708d485b2efa771e1ac05fec311f9f63e5800db4" +checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" 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", +] + +[[package]] +name = "wasm-metadata" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb0e353e6a2fbdc176932bbaab493762eb1255a7900fe0fea1a2f96c296cc909" +dependencies = [ + "anyhow", + "indexmap 2.14.0", + "wasm-encoder", + "wasmparser", +] + +[[package]] +name = "wasmparser" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47b807c72e1bac69382b3a6fb3dbe8ea4c0ed87ff5629b8685ae6b9a611028fe" +dependencies = [ + "bitflags 2.11.1", + "hashbrown 0.15.5", + "indexmap 2.14.0", + "semver", +] + [[package]] name = "web-sys" -version = "0.3.83" +version = "0.3.77" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b32828d774c412041098d182a8b38b16ea816958e07cf40eec2bc080ae137ac" +checksum = "33b6dd2ef9186f1f2072e409e99cd22a975331a6b3591b12c764e0e55c60d5d2" dependencies = [ "js-sys", "wasm-bindgen", @@ -5156,18 +5947,28 @@ version = "0.26.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "521bc38abb08001b01866da9f51eb7c5d647a19260e00054a8c7fd5f9e57f7a9" dependencies = [ - "webpki-roots 1.0.4", + "webpki-roots 1.0.7", ] [[package]] name = "webpki-roots" -version = "1.0.4" +version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2878ef029c47c6e8cf779119f20fcf52bde7ad42a731b2a304bc221df17571e" +checksum = "52f5ee44c96cf55f1b349600768e3ece3a8f26010c05265ab73f945bb1a2eb9d" dependencies = [ "rustls-pki-types", ] +[[package]] +name = "wide" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9479f84a757f819cfab37295955906479181395de83add28f74975fde083141" +dependencies = [ + "bytemuck", + "safe_arch", +] + [[package]] name = "winapi" version = "0.3.9" @@ -5199,52 +6000,19 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" -[[package]] -name = "windows" -version = "0.57.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12342cb4d8e3b046f3d80effd474a7a02447231330ef77d71daa6fbc40681143" -dependencies = [ - "windows-core 0.57.0", - "windows-targets 0.52.6", -] - -[[package]] -name = "windows-core" -version = "0.57.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2ed2439a290666cd67ecce2b0ffaad89c2a56b976b736e6ece670297897832d" -dependencies = [ - "windows-implement 0.57.0", - "windows-interface 0.57.0", - "windows-result 0.1.2", - "windows-targets 0.52.6", -] - [[package]] name = "windows-core" version = "0.62.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb" dependencies = [ - "windows-implement 0.60.2", - "windows-interface 0.59.3", + "windows-implement", + "windows-interface", "windows-link", - "windows-result 0.4.1", + "windows-result", "windows-strings", ] -[[package]] -name = "windows-implement" -version = "0.57.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9107ddc059d5b6fbfbffdfa7a7fe3e22a226def0b2608f72e9d552763d3e1ad7" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.110", -] - [[package]] name = "windows-implement" version = "0.60.2" @@ -5253,18 +6021,7 @@ checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" dependencies = [ "proc-macro2", "quote", - "syn 2.0.110", -] - -[[package]] -name = "windows-interface" -version = "0.57.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29bee4b38ea3cde66011baa44dba677c432a78593e202392d1e9070cf2a7fca7" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.110", + "syn 2.0.117", ] [[package]] @@ -5275,7 +6032,7 @@ checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" dependencies = [ "proc-macro2", "quote", - "syn 2.0.110", + "syn 2.0.117", ] [[package]] @@ -5291,19 +6048,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "02752bf7fbdcce7f2a27a742f798510f3e5ad88dbe84871e5168e2120c3d5720" dependencies = [ "windows-link", - "windows-result 0.4.1", + "windows-result", "windows-strings", ] -[[package]] -name = "windows-result" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e383302e8ec8515204254685643de10811af0ed97ea37210dc26fb0032647f8" -dependencies = [ - "windows-targets 0.52.6", -] - [[package]] name = "windows-result" version = "0.4.1" @@ -5555,18 +6303,115 @@ checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" [[package]] name = "winnow" -version = "0.7.14" +version = "0.7.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df79d97927682d2fd8adb29682d1140b343be4ac0f08fd68b7765d9c059d3945" +dependencies = [ + "memchr", +] + +[[package]] +name = "winnow" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a5364e9d77fcdeeaa6062ced926ee3381faa2ee02d3eb83a5c27a8825540829" +checksum = "2ee1708bef14716a11bae175f579062d4554d95be2c6829f518df847b7b3fdd0" dependencies = [ "memchr", ] [[package]] name = "wit-bindgen" -version = "0.46.0" +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" +version = "0.57.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f17a85883d4e6d00e8a97c586de764dabcc06133f7f1d55dce5cdc070ad7fe59" +checksum = "1ebf944e87a7c253233ad6766e082e3cd714b5d03812acc24c318f549614536e" + +[[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 2.14.0", + "prettyplease", + "syn 2.0.117", + "wasm-metadata", + "wit-bindgen-core", + "wit-component", +] + +[[package]] +name = "wit-bindgen-rust-macro" +version = "0.51.0" +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.1", + "indexmap 2.14.0", + "log", + "serde", + "serde_derive", + "serde_json", + "wasm-encoder", + "wasm-metadata", + "wasmparser", + "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 2.14.0", + "log", + "semver", + "serde", + "serde_derive", + "serde_json", + "unicode-xid", + "wasmparser", +] [[package]] name = "workflow-chrome" @@ -5598,10 +6443,10 @@ dependencies = [ "dirs", "faster-hex", "futures", - "getrandom 0.2.16", + "getrandom 0.2.17", "instant", "js-sys", - "rand 0.8.5", + "rand 0.8.6", "rlimit", "serde", "serde-wasm-bindgen", @@ -5741,9 +6586,9 @@ dependencies = [ "downcast-rs", "futures", "futures-util", - "getrandom 0.2.16", + "getrandom 0.2.17", "manual_future", - "rand 0.8.5", + "rand 0.8.6", "serde", "serde_json", "thiserror 1.0.69", @@ -5904,9 +6749,9 @@ dependencies = [ [[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 = "xxhash-rust" @@ -5916,9 +6761,9 @@ checksum = "fdd20c5420375476fbd4394763288da7eb0cc0b8c11deed431a91562af7335d3" [[package]] name = "yoke" -version = "0.8.1" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72d6e5c6afb84d73944e5cedb052c4680d5657337201555f9f2a16b7406d4954" +checksum = "abe8c5fda708d9ca3df187cae8bfb9ceda00dd96231bed36e445a1a48e66f9ca" dependencies = [ "stable_deref_trait", "yoke-derive", @@ -5927,54 +6772,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.110", + "syn 2.0.117", "synstructure", ] [[package]] name = "zerocopy" -version = "0.8.30" +version = "0.8.48" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ea879c944afe8a2b25fef16bb4ba234f47c694565e97383b36f3a878219065c" +checksum = "eed437bf9d6692032087e337407a86f04cd8d6a16a37199ed57949d415bd68e9" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.8.30" +version = "0.8.48" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf955aa904d6040f70dc8e9384444cb1030aed272ba3cb09bbc4ab9e7c1f34f5" +checksum = "70e3cd084b1788766f53af483dd21f93881ff30d7320490ec3ef7526d203bad4" dependencies = [ "proc-macro2", "quote", - "syn 2.0.110", + "syn 2.0.117", ] [[package]] name = "zerofrom" -version = "0.1.6" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" +checksum = "69faa1f2a1ea75661980b013019ed6687ed0e83d069bc1114e2cc74c6c04c4df" 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.110", + "syn 2.0.117", "synstructure", ] @@ -5983,12 +6828,26 @@ name = "zeroize" version = "1.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b97154e67e32c85465826e8bcc1c59429aaaf107c1e4a9e53c8d8ccd5eff88d0" +dependencies = [ + "zeroize_derive", +] + +[[package]] +name = "zeroize_derive" +version = "1.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85a5b4158499876c763cb03bc4e49185d3cccbabb15b33c627f7884f43db852e" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] [[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", @@ -5997,9 +6856,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", @@ -6008,17 +6867,17 @@ 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.110", + "syn 2.0.117", ] [[package]] name = "zmij" -version = "1.0.12" +version = "1.0.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2fc5a66a20078bf1251bde995aa2fdcc4b800c70b5d92dd2c62abc5c60f679f8" +checksum = "b8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaa" diff --git a/Cargo.toml b/Cargo.toml index d036c909..26cd3f78 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -16,18 +16,18 @@ ahash = "0.8.12" bincode = "1.3.3" faster-hex = "0.9.0" futures = "0.3.31" -kaspa-addresses = { git = "https://github.com/kaspanet/rusty-kaspa.git", rev = "e97070f" } -kaspa-bip32 = { git = "https://github.com/kaspanet/rusty-kaspa.git", rev = "e97070f" } -kaspa-consensus-client = { git = "https://github.com/kaspanet/rusty-kaspa.git", rev = "e97070f" } -kaspa-consensus-core = { git = "https://github.com/kaspanet/rusty-kaspa.git", rev = "e97070f" } -kaspa-hashes = { git = "https://github.com/kaspanet/rusty-kaspa.git", rev = "e97070f" } -kaspa-notify = { git = "https://github.com/kaspanet/rusty-kaspa.git", rev = "e97070f" } -kaspa-rpc-core = { git = "https://github.com/kaspanet/rusty-kaspa.git", rev = "e97070f" } -kaspa-txscript = { git = "https://github.com/kaspanet/rusty-kaspa.git", rev = "e97070f", features = ["wasm32-sdk"]} -kaspa-utils = { git = "https://github.com/kaspanet/rusty-kaspa.git", rev = "e97070f" } -kaspa-wallet-core = { git = "https://github.com/kaspanet/rusty-kaspa.git", rev = "e97070f" } -kaspa-wallet-keys = { git = "https://github.com/kaspanet/rusty-kaspa.git", rev = "e97070f" } -kaspa-wrpc-client = { git = "https://github.com/kaspanet/rusty-kaspa.git", rev = "e97070f" } +kaspa-addresses = { git = "https://github.com/kaspanet/rusty-kaspa.git", rev = "90dbf07" } +kaspa-bip32 = { git = "https://github.com/kaspanet/rusty-kaspa.git", rev = "90dbf07" } +kaspa-consensus-client = { git = "https://github.com/kaspanet/rusty-kaspa.git", rev = "90dbf07" } +kaspa-consensus-core = { git = "https://github.com/kaspanet/rusty-kaspa.git", rev = "90dbf07" } +kaspa-hashes = { git = "https://github.com/kaspanet/rusty-kaspa.git", rev = "90dbf07" } +kaspa-notify = { git = "https://github.com/kaspanet/rusty-kaspa.git", rev = "90dbf07" } +kaspa-rpc-core = { git = "https://github.com/kaspanet/rusty-kaspa.git", rev = "90dbf07" } +kaspa-txscript = { git = "https://github.com/kaspanet/rusty-kaspa.git", rev = "90dbf07", features = ["wasm32-sdk"]} +kaspa-utils = { git = "https://github.com/kaspanet/rusty-kaspa.git", rev = "90dbf07" } +kaspa-wallet-core = { git = "https://github.com/kaspanet/rusty-kaspa.git", rev = "90dbf07" } +kaspa-wallet-keys = { git = "https://github.com/kaspanet/rusty-kaspa.git", rev = "90dbf07" } +kaspa-wrpc-client = { git = "https://github.com/kaspanet/rusty-kaspa.git", rev = "90dbf07" } paste = "1.0" pyo3 = { version = "0.27.1", features = ['multiple-pymethods'] } pyo3-async-runtimes = { version = "0.27.0", features = ['tokio-runtime'] } @@ -43,7 +43,7 @@ secp256k1 = { version = "0.29.0", features = [ serde = { version = "1.0.228", features = ["derive"] } serde-pyobject = "0.8.0" serde_json = "1.0.149" -thiserror = "2.0.17" +thiserror = "2.0.18" workflow-core = "0.18.0" workflow-log = "0.18.0" workflow-rpc = "0.18.0" diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index e5ea2260..91151a3d 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -26,8 +26,13 @@ search: - Examples under `examples/wallet/` demonstrating wallet usage - Pytest options `--network-id` and `--rpc-url` for targeting integration tests at a specific network / node. - TypedDicts for `RpcClient` subscription event payloads — `BlockAddedEvent`, `VirtualChainChangedEvent`, `FinalityConflictEvent`, `FinalityConflictResolvedEvent`, `UtxosChangedEvent`, `SinkBlueScoreChangedEvent`, `VirtualDaaScoreChangedEvent`, `PruningPointUtxoSetOverrideEvent`, `NewBlockTemplateEvent`, `ConnectEvent`, `DisconnectEvent` — and their notification body TypedDicts (`RpcBlockAddedNotification`, etc.) for typing event-listener callbacks. +- `RpcClient.get_block_reward_info(request)` — new RPC returning a block's reward info (header, block color, confirmation count, merging chain block hash, reward amount). +- `ScriptBuilder` covenant/engine flags: optional `covenants_enabled` and `sigop_script_units` arguments on `ScriptBuilder(...)` and `ScriptBuilder.from_script(...)`, plus read-only `covenants_enabled` / `sigop_script_units` properties (mirrors the WASM SDK's `ScriptBuilderOptions`). +- `Transaction.storage_mass` property and a `storageMass` key in the `Transaction` dict output (alongside the existing `mass`), mirroring the WASM SDK. ### Changed +- Bumped the pinned `rusty-kaspa` dependency from `d290179` to `90dbf07` (Toccata hardfork). The transaction mass field is now tracked internally as `storage_mass`; the Python-facing `mass` property, constructor argument, and dict key are retained as aliases. +- The network minimum relay fee was raised upstream to 100 sompi/gram (Toccata). Fees produced by the wallet and `Generator` reflect the new floor; explicit `fee_rate` values must meet it. - `py_error_map!` macro extended to register wallet exception variants into the `kaspa.exceptions` submodule. - Integration tests now default to `mainnet` (overridable via `--network-id` / `--rpc-url`). - `build-dev` script builds with `--strip` for smaller artifacts. @@ -59,7 +64,7 @@ search: - Added to `GeneratorSummary`: `to_dict()` method, properties `network_id`, `mass`, and `stages`. ### Changed -- Bumped rusty-kaspa dependency version to commit e97070f. +- Bumped rusty-kaspa dependency version to commit d290179. - Moved Kaspa Python SDK out of Rusty-Kaspa (as a workspace member crate) to its own dedicated repository. The internals of this project have changed significantly as a result. However, all APIs exposed to Python remain unchanged. - All Python-exposed structs and enums are prefixed with `Py` (e.g. `PyAddress`) internally. The corresponding Python class name has not changed (prefix is dropped in Python). - All Python-exposed functions are prefixed with `py_` (e.g. `py_sign_message`) internally. The corresponding Python function name has not changed (prefix is dropped in Python). diff --git a/docs/learn/rpc/calls.md b/docs/learn/rpc/calls.md index 02c33ee2..ef27fced 100644 --- a/docs/learn/rpc/calls.md +++ b/docs/learn/rpc/calls.md @@ -180,7 +180,7 @@ flow and `allowOrphan` semantics. fee = await client.get_fee_estimate() # { # "estimate": { -# "priorityBucket": {"feerate": 1.0, "estimatedSeconds": 1.0}, +# "priorityBucket": {"feerate": 100.0, "estimatedSeconds": 1.0}, # "normalBuckets": [...], # "lowBuckets": [...], # } diff --git a/docs/learn/transactions/mass-and-fees.md b/docs/learn/transactions/mass-and-fees.md index e805e1b3..d2ab6fbe 100644 --- a/docs/learn/transactions/mass-and-fees.md +++ b/docs/learn/transactions/mass-and-fees.md @@ -92,6 +92,11 @@ network's current rate, or `None` if the transaction's mass exceeds [`maximum_standard_transaction_mass()`](../../reference/Functions/maximum_standard_transaction_mass.md). Split the inputs across multiple transactions in that case. +Since the Toccata hardfork, the network minimum relay fee is **100 sompi per gram +of mass**. `calculate_transaction_fee` and the fee-estimate buckets are floored at +this rate, and any explicit `fee_rate` you supply must meet it or the node rejects +the transaction. + ## Querying the fee rate The network exposes a fee estimator over RPC — see diff --git a/docs/learn/wallet-sdk/tx-generator.md b/docs/learn/wallet-sdk/tx-generator.md index e1e9513a..8db00121 100644 --- a/docs/learn/wallet-sdk/tx-generator.md +++ b/docs/learn/wallet-sdk/tx-generator.md @@ -93,7 +93,7 @@ gen = Generator( priority_entries=priority, # UTXOs to consume first sig_op_count=1, # signature ops per input minimum_signatures=1, # for multisig mass estimation - fee_rate=2.0, # explicit sompi/gram override + fee_rate=120.0, # explicit sompi/gram override (>= network minimum) ) ``` diff --git a/examples/covenants/forced_recipient.py b/examples/covenants/forced_recipient.py new file mode 100644 index 00000000..54d1aa5a --- /dev/null +++ b/examples/covenants/forced_recipient.py @@ -0,0 +1,335 @@ +""" +Forced-Recipient Covenant — Kaspa KIP-17 Example +================================================= +A UTXO whose redeem script enforces that it can *only* be spent to a single +predetermined address. + +AI disclaimer - Credit to Claude for large parts of this example :) +We just provided the building blocks. +""" + +import asyncio +import os + +from kaspa import ( + Hash, + Keypair, + Opcodes, + PrivateKey, + RpcClient, + ScriptBuilder, + Transaction, + TransactionInput, + TransactionOutpoint, + TransactionOutput, + UtxoEntryReference, + address_from_script_public_key, + calculate_transaction_mass, + create_input_signature, + pay_to_address_script, + pay_to_script_hash_signature_script, + sign_transaction, +) + +# ============================================================================= +# Configuration +# ============================================================================= + +NETWORK_ID = "testnet-12" +NETWORK_TYPE = "testnet" +RPC_URL = os.environ.get("KASPA_RPC_URL") +SUBNETWORK_ID = bytes(20) + + +# ============================================================================= +# Covenant Script Construction +# ============================================================================= + +def build_covenant_redeem_script(recipient_spk, owner_xonly_pubkey_hex: str) -> ScriptBuilder: + """ + Build the P2SH redeem script that forces spending to a single recipient. + + Execution trace when spending (initial stack: []): + + OpTxOutputCount push number of outputs → [sig, N] + OpTrue push 1 → [sig, N, 1] + OpEqualVerify assert N == 1 → [sig] + OpFalse push 0 (output index) → [sig, 0] + OpTxOutputSpk push output[0].spk → [sig, spk0] + push hardcoded SPK → [sig, spk0, rec_spk] + OpEqualVerify assert spk0 == rec_spk → [sig] + push 32-byte x-only key → [sig, pubkey] + OpCheckSig verify Schnorr sig → [true] + """ + # OpTxOutputSpk pushes version (2 bytes, big-endian) + script bytes. + # bytes(spk) returns only the script; prepend the version to match. + spk_bytes = recipient_spk.version.to_bytes(2, 'big') + bytes(recipient_spk) + + return ( + ScriptBuilder() + .add_op(Opcodes.OpTxOutputCount) + .add_op(Opcodes.OpTrue) + .add_op(Opcodes.OpEqualVerify) + .add_op(Opcodes.OpFalse) + .add_op(Opcodes.OpTxOutputSpk) + .add_data(spk_bytes) + .add_op(Opcodes.OpEqualVerify) + .add_data(bytes.fromhex(owner_xonly_pubkey_hex)) + .add_op(Opcodes.OpCheckSig) + ) + + +# ============================================================================= +# Genesis — send funds into the covenant P2SH UTXO +# ============================================================================= + +async def genesis(client: RpcClient, owner_key: PrivateKey, funding_utxos: list): + """ + Create and broadcast the genesis transaction. + + Moves funds from the owner's regular P2PK address into a covenant + P2SH UTXO whose redeem script enforces a single spending destination. + """ + keypair = Keypair.from_private_key(owner_key) + owner_pubkey_hex = keypair.xonly_public_key + + # In this demo the recipient is the same keypair (self-contained). + # In a real use-case this is likely an independent (pre-agreed) address. + recipient_address = keypair.to_address(NETWORK_TYPE) + recipient_spk = pay_to_address_script(recipient_address) + + redeem_script = build_covenant_redeem_script(recipient_spk, owner_pubkey_hex) + covenant_spk = redeem_script.create_pay_to_script_hash_script() + covenant_address = address_from_script_public_key(covenant_spk, NETWORK_TYPE) + print(f" Covenant P2SH address : {covenant_address.to_string()}") + + # Use the largest funding UTXO + funding = max(funding_utxos, key=lambda u: u["utxoEntry"]["amount"]) + funding_amount = funding["utxoEntry"]["amount"] + funding_utxo_ref = UtxoEntryReference.from_dict(funding) + funding_outpoint = TransactionOutpoint( + Hash(funding["outpoint"]["transactionId"]), + funding["outpoint"]["index"], + ) + + # ── Mass / fee calculation ────────────────────────────────────────────── + ph_input = TransactionInput(funding_outpoint, b"", 0, 1, funding_utxo_ref) + ph_output = TransactionOutput(funding_amount, covenant_spk) + ph_tx = Transaction(0, [ph_input], [ph_output], 0, SUBNETWORK_ID, 0, b"", 0) + mass = calculate_transaction_mass(NETWORK_ID, ph_tx) + fee_rates = await client.get_fee_estimate() + fee = mass * int(fee_rates["estimate"]["priorityBucket"]["feerate"]) + covenant_amount = funding_amount - fee + + # ── Build & sign the genesis transaction ──────────────────────────────── + inp = TransactionInput(funding_outpoint, b"", 0, 1, funding_utxo_ref) + out = TransactionOutput(covenant_amount, covenant_spk) + tx = Transaction(0, [inp], [out], 0, SUBNETWORK_ID, 0, b"", mass) + + # sign_transaction handles standard P2PK inputs automatically + signed_tx = sign_transaction(tx, [owner_key], True) + + print(f" Fee: {fee} sompi") + print(f" Covenant amount: {covenant_amount} sompi") + + result = await client.submit_transaction({ + "transaction": signed_tx, + "allowOrphan": False, + }) + txid = result["transactionId"] + print(f" Genesis TXID: {txid}") + + outpoint = {"transactionId": txid, "index": 0} + return txid, outpoint, covenant_amount, redeem_script, covenant_spk + + +# ============================================================================= +# Spend — demonstrate that the covenant enforces the recipient +# ============================================================================= + +async def spend( + client: RpcClient, + owner_key: PrivateKey, + covenant_outpoint: dict, + covenant_amount: int, + redeem_script: ScriptBuilder, + covenant_spk, +) -> str: + """ + Spend the covenant UTXO. The script forces all funds to the recipient + encoded in the redeem script — any other destination fails script evaluation. + + Steps: + 1. Build the spending transaction with an empty signature script + 2. Sign with create_input_signature (P2SH Schnorr) + 3. Build the P2SH unlocking script: + 4. Submit + """ + keypair = Keypair.from_private_key(owner_key) + recipient_address = keypair.to_address(NETWORK_TYPE) + recipient_spk = pay_to_address_script(recipient_address) + covenant_address = address_from_script_public_key(covenant_spk, NETWORK_TYPE) + + # Build a UTXO reference for the covenant input + cov_utxo_ref = UtxoEntryReference.from_dict({ + "address": covenant_address.to_string(), + "outpoint": { + "transactionId": covenant_outpoint["transactionId"], + "index": covenant_outpoint["index"], + }, + "utxoEntry": { + "amount": covenant_amount, + "scriptPublicKey": {"version": 0, "script": covenant_spk.script}, + "blockDaaScore": 0, + "isCoinbase": False, + "covenantId": None, + }, + }) + cov_outpoint = TransactionOutpoint( + Hash(covenant_outpoint["transactionId"]), + covenant_outpoint["index"], + ) + + # ── Mass / fee calculation ────────────────────────────────────────────── + ph_input = TransactionInput(cov_outpoint, b"", 0, 1, cov_utxo_ref) + ph_output = TransactionOutput(covenant_amount, recipient_spk) + ph_tx = Transaction(0, [ph_input], [ph_output], 0, SUBNETWORK_ID, 0, b"", 0) + mass = calculate_transaction_mass(NETWORK_ID, ph_tx) + fee_rates = await client.get_fee_estimate() + fee = mass * int(fee_rates["estimate"]["priorityBucket"]["feerate"]) + spend_amount = covenant_amount - fee + + # ── Build the unsigned transaction ───────────────────────────────────── + # (empty sig script — the sighash does not commit to the sig script) + inp = TransactionInput(cov_outpoint, b"", 0, 1, cov_utxo_ref) + out = TransactionOutput(spend_amount, recipient_spk) + tx_unsigned = Transaction(0, [inp], [out], 0, SUBNETWORK_ID, 0, b"", mass) + + # ── Create the P2SH signature ─────────────────────────────────────────── + # create_input_signature returns hex of [OP_DATA65, 64_sig_bytes, sighash_type] + # pass the full bytes directly to pay_to_script_hash_signature_script + sig_hex = create_input_signature(tx_unsigned, 0, owner_key) + sig_bytes = bytes.fromhex(sig_hex) # full 66 bytes including push opcode + redeem_bytes = bytes.fromhex(redeem_script.to_string()) + unlock_script_hex = pay_to_script_hash_signature_script(redeem_bytes, sig_bytes) + + # ── Build and submit the final signed transaction ─────────────────────── + signed_inp = TransactionInput( + cov_outpoint, bytes.fromhex(unlock_script_hex), 0, 1, cov_utxo_ref + ) + tx = Transaction(0, [signed_inp], [out], 0, SUBNETWORK_ID, 0, b"", mass) + + print(f" Fee: {fee} sompi") + print(f" Spend amount: {spend_amount} sompi") + + result = await client.submit_transaction({ + "transaction": tx, + "allowOrphan": False, + }) + txid = result["transactionId"] + print(f" Spend TXID: {txid}") + return txid + + +# ============================================================================= +# Helpers — UTXO subscription and confirmation waiting +# ============================================================================= + +async def wait_for_utxos(client: RpcClient, address) -> list: + """Poll every 5 s until at least one UTXO exists at `address`.""" + result = await client.get_utxos_by_addresses({"addresses": [address]}) + entries = result.get("entries", []) + if entries: + return entries + + print(f" Waiting for funds — send KAS to:\n {address.to_string()}\n") + while True: + await asyncio.sleep(5) + result = await client.get_utxos_by_addresses({"addresses": [address]}) + entries = result.get("entries", []) + if entries: + return entries + + +async def wait_for_confirmation(client: RpcClient, txid: str): + """Poll the mempool every 1 s; once the tx leaves it has been accepted.""" + print(f" Waiting for confirmation of {txid}") + while True: + await asyncio.sleep(1) + try: + await client.get_mempool_entry({"transactionId": txid, "includeOrphanPool": True}) + except Exception: + print(" Confirmed!") + return + + +# ============================================================================= +# Main +# ============================================================================= + +async def main(): + keypair = Keypair.random() + owner_key = PrivateKey(keypair.private_key) + funding_address = keypair.to_address(NETWORK_TYPE) + + print("=" * 60) + print("Forced-Recipient Covenant — KIP-17 Demo") + print("=" * 60) + print(f"\nFund this testnet-12 address (owner key):") + print(f" {funding_address.to_string()}") + print("\nThe script detects incoming funds automatically.\n") + + client = RpcClient(url=RPC_URL, network_id=NETWORK_ID) + await client.connect() + print(f"Connected to {NETWORK_ID}\n") + + # ── Wait for funding ───────────────────────────────────────────────────── + utxos = await wait_for_utxos(client, funding_address) + total = sum(u["utxoEntry"]["amount"] for u in utxos) + print(f"Received {total} sompi across {len(utxos)} UTXO(s)\n") + + # ── Step 1: Genesis (lock funds into covenant P2SH) ────────────────────── + print("[Step 1/2] Broadcasting genesis transaction…") + txid, outpoint, covenant_amount, redeem_script, covenant_spk = await genesis( + client, owner_key, utxos + ) + await wait_for_confirmation(client, txid) + print() + + # ── Step 2: Spend to incorrect address ─────────────────────────────────── + # ── (recipient enforced by the covenant script, this will reject) ──────── + print("[Step 2/3] Broadcasting spend transaction to INCORRECT address…") + print(" Will reject, destination address does not match script enforced address.") + try: + spend_txid = await spend( + client, + PrivateKey(Keypair.random().private_key), + outpoint, + covenant_amount, + redeem_script, + covenant_spk + ) + except Exception as e: + print(f" Transaction properly rejected with error: {e}") + print() + + # ── Step 3: Spend to correct address ───────────────────────────────────── + # ── (recipient enforced by the covenant script, this will succeed) ─────── + print("[Step 3/3] Broadcasting spend transaction to CORRECT address…") + print(" Will succeed, destination address matches script enforced address.") + spend_txid = await spend( + client, owner_key, outpoint, covenant_amount, redeem_script, covenant_spk + ) + print() + + print("=" * 60) + print("Demo complete!") + print(f" Genesis TXID : {txid}") + print(f" Spend TXID : {spend_txid}") + print("=" * 60) + + await client.disconnect() + + +if __name__ == "__main__": + asyncio.run(main()) diff --git a/examples/covenants/populate_genesis_outputs.py b/examples/covenants/populate_genesis_outputs.py new file mode 100644 index 00000000..d52b8902 --- /dev/null +++ b/examples/covenants/populate_genesis_outputs.py @@ -0,0 +1,106 @@ +""" +Populate Genesis Covenant Outputs — Kaspa KIP-17 Example +======================================================== +Demonstrates populating genesis covenant bindings on transaction outputs, +converting to dict and back, and verifying the covenant data is preserved. +""" + +from kaspa import ( + GenesisCovenantGroup, + Keypair, + Opcodes, + ScriptBuilder, + Transaction, + TransactionInput, + TransactionOutpoint, + TransactionOutput, + Hash, + pay_to_address_script, +) + +NETWORK_TYPE = "testnet" +SUBNETWORK_ID = bytes(20) + + +def main(): + # Generate two keypairs: one for the funding input, one as a covenant recipient + funder = Keypair.random() + recipient = Keypair.random() + + funder_address = funder.to_address(NETWORK_TYPE) + recipient_address = recipient.to_address(NETWORK_TYPE) + + recipient_spk = pay_to_address_script(recipient_address) + + # Build a simple covenant redeem script (just owner pubkey + checksig for demo) + redeem_script = ( + ScriptBuilder() + .add_data(bytes.fromhex(funder.xonly_public_key)) + .add_op(Opcodes.OpCheckSig) + ) + covenant_spk = redeem_script.create_pay_to_script_hash_script() + + # --- Build a transaction with multiple outputs --- + dummy_txid = Hash("0" * 64) + outpoint = TransactionOutpoint(dummy_txid, 0) + inp = TransactionInput(outpoint, b"", 0, 1) + + # Three outputs: two covenant outputs, one regular change output + out0 = TransactionOutput(1_000, covenant_spk) + out1 = TransactionOutput(2_000, covenant_spk) + out2 = TransactionOutput(500, recipient_spk) # change / non-covenant + + tx = Transaction(0, [inp], [out0, out1, out2], 0, SUBNETWORK_ID, 0, b"", 0) + + # --- Verify outputs start without covenant bindings --- + outputs_before = tx.outputs + for i, out in enumerate(outputs_before): + d = out.to_dict() + assert d["covenant"] is None, f"Output {i} should have no covenant before populate" + print("Before populate: all outputs have covenant = None") + + # --- Populate genesis covenants --- + # Group: input 0 authorizes covenant outputs at indices 0 and 1 + group = GenesisCovenantGroup(authorizing_input=0, outputs=[0, 1]) + tx.populate_genesis_covenants([group]) + print("Called populate_genesis_covenants with group(input=0, outputs=[0, 1])") + + # --- Verify covenant bindings are now set --- + outputs_after = tx.outputs + for i, out in enumerate(outputs_after): + d = out.to_dict() + if i < 2: + assert d["covenant"] is not None, f"Output {i} should have a covenant binding" + print(f" Output {i}: covenant = {d['covenant']}") + else: + assert d["covenant"] is None, f"Output {i} (change) should remain None" + print(f" Output {i}: covenant = None (change output, as expected)") + + # --- Round-trip: Transaction -> dict -> Transaction --- + tx_dict = tx.to_dict() + print(f"\nTransaction dict keys: {list(tx_dict.keys())}") + + tx_restored = Transaction.from_dict(tx_dict) + + # Verify outputs survived the round-trip + restored_outputs = tx_restored.outputs + assert len(restored_outputs) == 3, "Should have 3 outputs after round-trip" + + for i, out in enumerate(restored_outputs): + d = out.to_dict() + if i < 2: + assert d["covenant"] is not None, f"Restored output {i} lost its covenant binding" + print(f" Restored output {i}: covenant = {d['covenant']}") + else: + assert d["covenant"] is None, f"Restored output {i} should remain None" + print(f" Restored output {i}: covenant = None (as expected)") + + # Verify equality between original and restored transaction + assert tx == tx_restored, "Restored transaction should equal the original" + print("\nRound-trip passed: original == restored") + + print("\nAll assertions passed!") + + +if __name__ == "__main__": + main() diff --git a/kaspa_rpc.pyi b/kaspa_rpc.pyi index 7819c0ea..4533fa76 100644 --- a/kaspa_rpc.pyi +++ b/kaspa_rpc.pyi @@ -26,12 +26,19 @@ class RpcScriptPublicKey(TypedDict): script: str +class RpcCovenantBinding(TypedDict): + """Binds a transaction output to the covenant and input authorizing its creation.""" + authorizingInput: int + covenantId: str + + class RpcUtxoEntry(TypedDict): """A UTXO entry.""" amount: int scriptPublicKey: RpcScriptPublicKey blockDaaScore: int isCoinbase: bool + covenantId: str | None class RpcUtxosByAddressesEntry(TypedDict): @@ -71,6 +78,7 @@ class RpcTransactionInput(TypedDict): signatureScript: str sequence: int sigOpCount: int + computeBudget: int verboseData: RpcVerboseData | None @@ -85,6 +93,7 @@ class RpcTransactionOutput(TypedDict): value: int scriptPublicKey: str verboseData: RpcTransactionOutputVerboseData | None + covenant: RpcCovenantBinding | None class RpcTransaction(TypedDict): @@ -601,6 +610,11 @@ class GetBlockTemplateRequest(TypedDict): extraData: str +class GetBlockRewardInfoRequest(TypedDict): + """Request for get_block_reward_info.""" + hash: str + + class GetCurrentBlockColorRequest(TypedDict): """Request for get_current_block_color.""" hash: str @@ -877,6 +891,15 @@ class GetBlockTemplateResponse(TypedDict): isSynced: bool +class GetBlockRewardInfoResponse(TypedDict): + """Response from get_block_reward_info.""" + header: RpcBlockHeader + blockColor: Literal["unknown", "blue", "red"] + confirmationCount: int | None + mergingChainBlockHash: str | None + rewardAmount: int | None + + class GetCurrentBlockColorResponse(TypedDict): """Response from get_current_block_color.""" blue: bool diff --git a/python/kaspa/__init__.pyi b/python/kaspa/__init__.pyi index b276a010..da8087e4 100644 --- a/python/kaspa/__init__.pyi +++ b/python/kaspa/__init__.pyi @@ -8,6 +8,13 @@ from . import exceptions @typing.final class AccountDescriptor: + r""" + A read-only snapshot describing a wallet account. + + Exposes the account's kind, id, name, balance, addresses, and derivation + metadata. Returned by `Wallet` account enumeration, creation, and + activation methods. + """ @property def kind(self) -> AccountKind: r""" @@ -362,6 +369,56 @@ class Binary: str: The Binary as a repr string. """ +@typing.final +class CovenantBinding: + r""" + Binds a transaction output to the covenant and input authorizing its creation. + """ + @property + def authorizing_input(self) -> builtins.int: + r""" + The index of the transaction input authorizing the covenant. + """ + @authorizing_input.setter + def authorizing_input(self, value: builtins.int) -> None: + r""" + Set the authorizing input index. + + Args: + value: The index of the transaction input authorizing the covenant. + """ + @property + def covenant_id(self) -> Hash: + r""" + The covenant id the output is bound to. + """ + @covenant_id.setter + def covenant_id(self, value: Hash) -> None: + r""" + Set the covenant id. + + Args: + value: The covenant id the output is bound to. + """ + def __new__(cls, authorizing_input: builtins.int, covenant_id: Hash) -> CovenantBinding: + r""" + Create a new CovenantBinding. + + Args: + authorizing_input: The index of the transaction input authorizing the covenant. + covenant_id: The covenant id the output is bound to. + + Returns: + CovenantBinding: A new CovenantBinding instance. + """ + def __repr__(self) -> builtins.str: + r""" + The detailed string representation. + + Returns: + str: The CovenantBinding as a repr string. + """ + @typing.final class DerivationPath: r""" @@ -609,6 +666,40 @@ class GeneratorSummary: str: The GeneratorSummary as a repr string. """ +@typing.final +class GenesisCovenantGroup: + r""" + A genesis covenant group for bulk covenant binding population. + + All listed outputs are bound to the same covenant id, derived from the + authorizing input outpoint and the exact ordered output list. Used with + `Transaction.populate_genesis_covenants`. + """ + @property + def authorizing_input(self) -> builtins.int: + r""" + The index of the transaction input authorizing the covenant. + """ + @authorizing_input.setter + def authorizing_input(self, value: builtins.int) -> None: + r""" + Set the authorizing input index. + + Args: + value: The index of the transaction input authorizing the covenant. + """ + def __new__(cls, authorizing_input: builtins.int, outputs: typing.Sequence[builtins.int]) -> GenesisCovenantGroup: + r""" + Create a new GenesisCovenantGroup. + + Args: + authorizing_input: The index of the transaction input authorizing the covenant. + outputs: The indices of the transaction outputs to bind to the covenant. + + Returns: + GenesisCovenantGroup: A new GenesisCovenantGroup instance. + """ + @typing.final class Hash: r""" @@ -992,6 +1083,19 @@ class PaymentOutput: address: The address to send this output to. amount: The amount, in sompi, to send on this output. """ + @staticmethod + def with_covenant(address: Address, amount: builtins.int, covenant: CovenantBinding) -> PaymentOutput: + r""" + Create a new Payment Output bound to a covenant. + + Args: + address: The address to send this output to. + amount: The amount, in sompi, to send on this output. + covenant: The covenant binding to attach to this output. + + Returns: + PaymentOutput: A new PaymentOutput instance. + """ def __eq__(self, other: PaymentOutput) -> builtins.bool: r""" Equality comparison. @@ -1322,6 +1426,13 @@ class PrvKeyDataId: @typing.final class PrvKeyDataInfo: + r""" + Metadata describing a private key data entry stored in a wallet file. + + Exposes the entry's id, optional user-assigned name, and whether the + underlying key material requires a payment secret (BIP39 passphrase). + Returned by `Wallet.prv_key_data_enumerate`. + """ @property def id(self) -> PrvKeyDataId: r""" @@ -1999,6 +2110,7 @@ class RpcClient: def get_block(self, request: GetBlockRequest) -> GetBlockResponse: ... def get_blocks(self, request: GetBlocksRequest) -> GetBlocksResponse: ... def get_block_template(self, request: GetBlockTemplateRequest) -> GetBlockTemplateResponse: ... + def get_block_reward_info(self, request: GetBlockRewardInfoRequest) -> GetBlockRewardInfoResponse: ... def get_current_block_color(self, request: GetCurrentBlockColorRequest) -> GetCurrentBlockColorResponse: ... def get_daa_score_timestamp_estimate(self, request: GetDaaScoreTimestampEstimateRequest) -> GetDaaScoreTimestampEstimateResponse: ... def get_fee_estimate_experimental(self, request: GetFeeEstimateExperimentalRequest) -> GetFeeEstimateExperimentalResponse: ... @@ -2026,20 +2138,46 @@ class ScriptBuilder: Used for creating complex spending conditions like multi-signature or time-locked transactions. """ - def __new__(cls) -> ScriptBuilder: + @property + def covenants_enabled(self) -> builtins.bool: + r""" + Whether covenant opcodes and post-Toccata script limits are enabled. + + Returns: + bool: True if covenants are enabled for this builder. + """ + @property + def sigop_script_units(self) -> builtins.int: + r""" + Script units charged for each signature operation. + + Returns: + int: The configured sigop script units. + """ + def __new__(cls, covenants_enabled: builtins.bool = False, sigop_script_units: typing.Optional[builtins.int] = None) -> ScriptBuilder: r""" Create a new empty script builder. + Args: + covenants_enabled: Enable covenant opcodes and post-Toccata script + limits (default: False). + sigop_script_units: Script units charged per signature operation. + Defaults to the native engine default when omitted. + Returns: ScriptBuilder: A new empty ScriptBuilder instance. """ @staticmethod - def from_script(script: Binary) -> ScriptBuilder: + def from_script(script: Binary, covenants_enabled: builtins.bool = False, sigop_script_units: typing.Optional[builtins.int] = None) -> ScriptBuilder: r""" Create a script builder from an existing script. Args: script: Existing script bytes as hex, bytes, or list. + covenants_enabled: Enable covenant opcodes and post-Toccata script + limits (default: False). + sigop_script_units: Script units charged per signature operation. + Defaults to the native engine default when omitted. Returns: ScriptBuilder: A new ScriptBuilder initialized with the script. @@ -2337,15 +2475,33 @@ class Transaction: def mass(self) -> builtins.int: r""" The transaction mass used for fee calculation. + + Alias of `storage_mass`, retained for compatibility with the WASM SDK + and earlier releases of this package. """ @mass.setter def mass(self, value: builtins.int) -> None: r""" Set the transaction mass. + Alias of `storage_mass`. + Args: value: The transaction mass value. """ + @property + def storage_mass(self) -> builtins.int: + r""" + The transaction storage mass used for fee calculation. + """ + @storage_mass.setter + def storage_mass(self, value: builtins.int) -> None: + r""" + Set the transaction storage mass. + + Args: + value: The transaction storage mass value. + """ @subnetwork_id.setter def subnetwork_id(self, value: builtins.str) -> None: r""" @@ -2401,6 +2557,24 @@ class Transaction: Returns: list[Address]: List of unique addresses referenced by inputs. """ + def populate_genesis_covenants(self, groups: typing.Sequence[GenesisCovenantGroup]) -> None: + r""" + Populate genesis covenant bindings for multiple output groups. + + For each group, computes the covenant id from the authorizing input + outpoint and the group's output list, then sets that binding on all + listed outputs. All groups are validated before the transaction is + mutated. + + Args: + groups: The genesis covenant groups to populate. + + Raises: + Exception: If a group references a non-existent input or output, + output indices are not strictly increasing, outputs overlap + across groups, or a targeted output already has a covenant + binding. + """ def to_dict(self) -> dict: r""" Get a dictionary representation of the Transaction. @@ -2494,6 +2668,19 @@ class TransactionInput: value: The number of signature operations. """ @property + def compute_budget(self) -> builtins.int: + r""" + The compute budget for this input. + """ + @compute_budget.setter + def compute_budget(self, value: builtins.int) -> None: + r""" + Set the compute budget for this input. + + Args: + value: The compute budget. + """ + @property def utxo(self) -> typing.Optional[UtxoEntryReference]: r""" The UTXO entry reference for transaction signing, or None if not set. @@ -2506,7 +2693,7 @@ class TransactionInput: Args: value: The signature script as bytes or hex string. """ - def __new__(cls, previous_outpoint: TransactionOutpoint, signature_script: Binary, sequence: builtins.int, sig_op_count: builtins.int, utxo: typing.Optional[UtxoEntryReference] = None) -> TransactionInput: + def __new__(cls, previous_outpoint: TransactionOutpoint, signature_script: Binary, sequence: builtins.int, sig_op_count: builtins.int, compute_budget: builtins.int = 0, utxo: typing.Optional[UtxoEntryReference] = None) -> TransactionInput: r""" Create a new transaction input. @@ -2515,6 +2702,7 @@ class TransactionInput: signature_script: The unlocking script (signature). sequence: Sequence number for relative time locks. sig_op_count: Number of signature operations. + compute_budget: Compute budget for this input (default: 0). utxo: Optional UTXO entry reference for signing. Returns: @@ -2539,6 +2727,7 @@ class TransactionInput: - 'signatureScript' (str | None): The signature script as hex string - 'sequence' (int): Sequence number - 'sigOpCount' (int): Signature operation count + - 'computeBudget' (int, optional): Compute budget for this input (default: 0) - 'utxo' (dict | None): Optional UTXO entry reference dict Returns: @@ -2669,13 +2858,14 @@ class TransactionOutput: Args: value: The script public key. """ - def __new__(cls, value: builtins.int, script_public_key: ScriptPublicKey) -> TransactionOutput: + def __new__(cls, value: builtins.int, script_public_key: ScriptPublicKey, covenant_id: typing.Optional[CovenantBinding] = None) -> TransactionOutput: r""" Create a new transaction output. Args: value: Amount in sompi (1 KAS = 100,000,000 sompi). script_public_key: The locking script. + covenant_id: The covenant ID. Returns: TransactionOutput: A new TransactionOutput instance. @@ -2697,6 +2887,7 @@ class TransactionOutput: dict: Dictionary containing transaction output fields with keys: - 'value' (int): The output value in sompi - 'scriptPublicKey' (dict): Dict with 'version' (int) and 'script' (str) keys + - 'covenant' (dict | None): The optional covenant binding. Returns: TransactionOutput: A new TransactionOutput instance. @@ -2925,6 +3116,7 @@ class UtxoEntry: - 'scriptPublicKey' (dict): Dict with 'version' (int) and 'script' (str) keys - 'blockDaaScore' (int): Block DAA score - 'isCoinbase' (bool): Whether from coinbase transaction + - 'covenantId' (str | None): The optional covenant ID of the UTXO. Returns: UtxoEntry: A new UtxoEntry instance. @@ -3016,11 +3208,12 @@ class UtxoEntryReference: - 'scriptPublicKey' (dict | str): Dict with 'version' and 'script', or hex string - 'blockDaaScore' (int): Block DAA score - 'isCoinbase' (bool): Whether from coinbase transaction + - 'covenantId' (str | None): The optional covenant ID of the UTXO. Nested format: - 'address' (str | None): The address string - 'outpoint' (dict): Transaction outpoint with 'transactionId' and 'index' - - 'utxoEntry' (dict): Nested dict containing amount, scriptPublicKey, blockDaaScore, isCoinbase + - 'utxoEntry' (dict): Nested dict containing amount, scriptPublicKey, blockDaaScore, isCoinbase, covenantId Returns: UtxoEntryReference: A new UtxoEntryReference instance. @@ -3140,6 +3333,15 @@ class UtxoProcessor: @typing.final class Wallet: + r""" + A managed Kaspa wallet with persistent encrypted on-disk storage. + + The SDK's high-level wallet. Provides encrypted storage for keys and + account metadata, multi-account management (BIP32 and keypair accounts), + address derivation and discovery, built-in send, transfer, and sweep + flows, transaction history tracking, and an event bus for chain + notifications (balance, maturity, reorg). + """ @property def rpc(self) -> RpcClient: r""" @@ -3743,6 +3945,12 @@ class Wallet: @typing.final class WalletDescriptor: + r""" + Describes a wallet file in the wallet store. + + Pairs the on-disk wallet filename with its optional user-assigned title. + Returned by `Wallet.wallet_enumerate`. + """ @property def title(self) -> typing.Optional[builtins.str]: r""" @@ -4331,7 +4539,7 @@ class Opcodes(enum.Enum): OpSwap = ... OpTuck = ... OpCat = ... - OpSubStr = ... + OpSubstr = ... OpLeft = ... OpRight = ... OpSize = ... @@ -4370,8 +4578,8 @@ class Opcodes(enum.Enum): OpMin = ... OpMax = ... OpWithin = ... - OpUnknown166 = ... - OpUnknown167 = ... + OpZkPrecompile = ... + OpBlake2bWithKey = ... OpSHA256 = ... OpCheckMultiSigECDSA = ... OpBlake2b = ... @@ -4382,47 +4590,47 @@ class Opcodes(enum.Enum): OpCheckMultiSigVerify = ... OpCheckLockTimeVerify = ... OpCheckSequenceVerify = ... - OpUnknown178 = ... - OpUnknown179 = ... - OpUnknown180 = ... - OpUnknown181 = ... - OpUnknown182 = ... - OpUnknown183 = ... - OpUnknown184 = ... - OpUnknown185 = ... - OpUnknown186 = ... - OpUnknown187 = ... - OpUnknown188 = ... - OpUnknown189 = ... - OpUnknown190 = ... - OpUnknown191 = ... - OpUnknown192 = ... - OpUnknown193 = ... - OpUnknown194 = ... - OpUnknown195 = ... - OpUnknown196 = ... - OpUnknown197 = ... - OpUnknown198 = ... - OpUnknown199 = ... - OpUnknown200 = ... - OpUnknown201 = ... + OpTxVersion = ... + OpTxInputCount = ... + OpTxOutputCount = ... + OpTxLockTime = ... + OpTxSubnetId = ... + OpTxGas = ... + OpTxPayloadSubstr = ... + OpTxInputIndex = ... + OpOutpointTxId = ... + OpOutpointIndex = ... + OpTxInputScriptSigSubstr = ... + OpTxInputSeq = ... + OpTxInputAmount = ... + OpTxInputSpk = ... + OpTxInputDaaScore = ... + OpTxInputIsCoinbase = ... + OpTxOutputAmount = ... + OpTxOutputSpk = ... + OpTxPayloadLen = ... + OpTxInputSpkLen = ... + OpTxInputSpkSubstr = ... + OpTxOutputSpkLen = ... + OpTxOutputSpkSubstr = ... + OpTxInputScriptSigLen = ... OpUnknown202 = ... - OpUnknown203 = ... - OpUnknown204 = ... - OpUnknown205 = ... - OpUnknown206 = ... - OpUnknown207 = ... - OpUnknown208 = ... - OpUnknown209 = ... - OpUnknown210 = ... - OpUnknown211 = ... - OpUnknown212 = ... - OpUnknown213 = ... + OpAuthOutputCount = ... + OpAuthOutputIdx = ... + OpNum2Bin = ... + OpBin2Num = ... + OpInputCovenantId = ... + OpCovInputCount = ... + OpCovInputIdx = ... + OpCovOutputCount = ... + OpCovOutputIdx = ... + OpChainblockSeqCommit = ... + OpOutputCovenantId = ... OpUnknown214 = ... - OpUnknown215 = ... - OpUnknown216 = ... - OpUnknown217 = ... - OpUnknown218 = ... + OpCheckSigFromStack = ... + OpCheckSigFromStackECDSA = ... + OpBlake3 = ... + OpBlake3WithKey = ... OpUnknown219 = ... OpUnknown220 = ... OpUnknown221 = ... @@ -4961,12 +5169,19 @@ class RpcScriptPublicKey(TypedDict): script: str +class RpcCovenantBinding(TypedDict): + """Binds a transaction output to the covenant and input authorizing its creation.""" + authorizingInput: int + covenantId: str + + class RpcUtxoEntry(TypedDict): """A UTXO entry.""" amount: int scriptPublicKey: RpcScriptPublicKey blockDaaScore: int isCoinbase: bool + covenantId: str | None class RpcUtxosByAddressesEntry(TypedDict): @@ -5006,6 +5221,7 @@ class RpcTransactionInput(TypedDict): signatureScript: str sequence: int sigOpCount: int + computeBudget: int verboseData: RpcVerboseData | None @@ -5020,6 +5236,7 @@ class RpcTransactionOutput(TypedDict): value: int scriptPublicKey: str verboseData: RpcTransactionOutputVerboseData | None + covenant: RpcCovenantBinding | None class RpcTransaction(TypedDict): @@ -5536,6 +5753,11 @@ class GetBlockTemplateRequest(TypedDict): extraData: str +class GetBlockRewardInfoRequest(TypedDict): + """Request for get_block_reward_info.""" + hash: str + + class GetCurrentBlockColorRequest(TypedDict): """Request for get_current_block_color.""" hash: str @@ -5812,6 +6034,15 @@ class GetBlockTemplateResponse(TypedDict): isSynced: bool +class GetBlockRewardInfoResponse(TypedDict): + """Response from get_block_reward_info.""" + header: RpcBlockHeader + blockColor: Literal["unknown", "blue", "red"] + confirmationCount: int | None + mergingChainBlockHash: str | None + rewardAmount: int | None + + class GetCurrentBlockColorResponse(TypedDict): """Response from get_current_block_color.""" blue: bool diff --git a/src/consensus/client/covenant.rs b/src/consensus/client/covenant.rs new file mode 100644 index 00000000..b70d90d2 --- /dev/null +++ b/src/consensus/client/covenant.rs @@ -0,0 +1,191 @@ +use crate::crypto::hashes::PyHash; +use kaspa_consensus_client::{CovenantBinding, GenesisCovenantGroup}; +use kaspa_consensus_core::tx::GenesisCovenantGroup as CoreGenesisCovenantGroup; +use pyo3::{ + prelude::*, + types::{PyAny, PyDict}, +}; +use pyo3_stub_gen::derive::{gen_stub_pyclass, gen_stub_pymethods}; + +/// Binds a transaction output to the covenant and input authorizing its creation. +#[gen_stub_pyclass] +#[pyclass(name = "CovenantBinding", skip_from_py_object)] +#[derive(Clone)] +pub struct PyCovenantBinding(CovenantBinding); + +#[gen_stub_pymethods] +#[pymethods] +impl PyCovenantBinding { + /// Create a new CovenantBinding. + /// + /// Args: + /// authorizing_input: The index of the transaction input authorizing the covenant. + /// covenant_id: The covenant id the output is bound to. + /// + /// Returns: + /// CovenantBinding: A new CovenantBinding instance. + #[new] + pub fn new(authorizing_input: u16, covenant_id: PyHash) -> Self { + let inner = CovenantBinding::new(authorizing_input, covenant_id.into()); + Self(inner) + } + + /// The index of the transaction input authorizing the covenant. + #[getter] + pub fn get_authorizing_input(&self) -> u16 { + self.0.get_authorizing_input() + } + + /// Set the authorizing input index. + /// + /// Args: + /// value: The index of the transaction input authorizing the covenant. + #[setter] + pub fn set_authorizing_input(&mut self, value: u16) { + self.0.set_authorizing_input(value); + } + + /// The covenant id the output is bound to. + #[getter] + pub fn get_covenant_id(&self) -> PyHash { + self.0.get_covenant_id().into() + } + + /// Set the covenant id. + /// + /// Args: + /// value: The covenant id the output is bound to. + #[setter] + pub fn set_covenant_id(&mut self, value: PyHash) { + self.0.set_covenant_id(value.into()); + } + + /// The detailed string representation. + /// + /// Returns: + /// str: The CovenantBinding as a repr string. + pub fn __repr__(&self) -> String { + format!( + "CovenantBinding(authorizing_input={}, covenant_id={})", + self.0.get_authorizing_input(), + self.get_covenant_id().__repr__(), + ) + } +} + +impl From for PyCovenantBinding { + fn from(value: CovenantBinding) -> Self { + Self(value) + } +} + +impl From for CovenantBinding { + fn from(value: PyCovenantBinding) -> Self { + value.0 + } +} + +impl TryFrom<&Bound<'_, PyDict>> for PyCovenantBinding { + type Error = PyErr; + + fn try_from(dict: &Bound<'_, PyDict>) -> Result { + let inner = serde_pyobject::from_pyobject(dict.clone())?; + + Ok(Self(inner)) + } +} + +impl<'a, 'py> FromPyObject<'a, 'py> for PyCovenantBinding { + type Error = PyErr; + + fn extract(ob: Borrowed<'a, 'py, PyAny>) -> PyResult { + // Try native CovenantBinding instance first, then fall back to dict + if let Ok(cb) = ob.cast::() { + return Ok(cb.to_owned().borrow().clone()); + } + let dict = ob.cast::()?.to_owned(); + Self::try_from(&dict) + } +} + +/// A genesis covenant group for bulk covenant binding population. +/// +/// All listed outputs are bound to the same covenant id, derived from the +/// authorizing input outpoint and the exact ordered output list. Used with +/// `Transaction.populate_genesis_covenants`. +#[gen_stub_pyclass] +#[pyclass(name = "GenesisCovenantGroup")] +#[derive(Clone)] +pub struct PyGenesisCovenantGroup(GenesisCovenantGroup); + +#[gen_stub_pymethods] +#[pymethods] +impl PyGenesisCovenantGroup { + /// Create a new GenesisCovenantGroup. + /// + /// Args: + /// authorizing_input: The index of the transaction input authorizing the covenant. + /// outputs: The indices of the transaction outputs to bind to the covenant. + /// + /// Returns: + /// GenesisCovenantGroup: A new GenesisCovenantGroup instance. + #[new] + pub fn constructor(authorizing_input: u16, outputs: Vec) -> Self { + // TODO this tmp construction process is temporary + // until client::GenesisCovenantGroup exposes new fn that takes rust native types + let tmp = CoreGenesisCovenantGroup::new(authorizing_input, outputs); + let inner = GenesisCovenantGroup::from(tmp); + Self(inner) + } + + /// The index of the transaction input authorizing the covenant. + #[getter] + pub fn get_authorizing_input(&self) -> u16 { + self.0.authorizing_input() + } + + /// Set the authorizing input index. + /// + /// Args: + /// value: The index of the transaction input authorizing the covenant. + #[setter] + pub fn set_authorizing_input(&mut self, value: u16) { + self.0.set_authorizing_input(value); + } + + // TODO blocked until GenesisCovenantGroup exposes non-WASM `outputs` fns + // `GenesisCovenantGroup::outputs -> NumberArray` instead of Vec return type + // NumberArray is WASM type, we should not convert from that here. + // Better solution is that native GenesisCovenantGroup exposes native Rust getter/setter + // #[getter] + // pub fn get_outputs(&self) -> Vec { + // self.0.outputs.clone() + // } + + // #[setter] + // pub fn set_outputs(&mut self, value: Vec) { + // self.0.outputs = value + // } +} + +impl From for PyGenesisCovenantGroup { + fn from(value: GenesisCovenantGroup) -> Self { + Self(value) + } +} + +impl From for GenesisCovenantGroup { + fn from(value: PyGenesisCovenantGroup) -> Self { + value.0.clone() + } +} + +impl TryFrom<&Bound<'_, PyDict>> for PyGenesisCovenantGroup { + type Error = PyErr; + + fn try_from(dict: &Bound<'_, PyDict>) -> Result { + let inner: GenesisCovenantGroup = serde_pyobject::from_pyobject(dict.clone())?; + + Ok(Self(inner)) + } +} diff --git a/src/consensus/client/input.rs b/src/consensus/client/input.rs index d41bd6bb..446faac3 100644 --- a/src/consensus/client/input.rs +++ b/src/consensus/client/input.rs @@ -30,17 +30,19 @@ impl PyTransactionInput { /// signature_script: The unlocking script (signature). /// sequence: Sequence number for relative time locks. /// sig_op_count: Number of signature operations. + /// compute_budget: Compute budget for this input (default: 0). /// utxo: Optional UTXO entry reference for signing. /// /// Returns: /// TransactionInput: A new TransactionInput instance. #[new] - #[pyo3(signature = (previous_outpoint, signature_script, sequence, sig_op_count, utxo=None))] + #[pyo3(signature = (previous_outpoint, signature_script, sequence, sig_op_count, compute_budget=0, utxo=None))] pub fn constructor( previous_outpoint: PyTransactionOutpoint, signature_script: PyBinary, sequence: u64, sig_op_count: u8, + compute_budget: u16, utxo: Option, ) -> PyResult { let inner = TransactionInput::new( @@ -48,6 +50,7 @@ impl PyTransactionInput { Some(signature_script.into()), sequence, sig_op_count, + compute_budget, utxo.map(UtxoEntryReference::from), ); Ok(Self(inner)) @@ -119,6 +122,21 @@ impl PyTransactionInput { self.0.inner().sig_op_count = value; } + /// The compute budget for this input. + #[getter] + pub fn get_compute_budget(&self) -> u16 { + self.0.inner().compute_budget + } + + /// Set the compute budget for this input. + /// + /// Args: + /// value: The compute budget. + #[setter] + pub fn set_compute_budget(&mut self, value: u16) { + self.0.inner().compute_budget = value; + } + /// The UTXO entry reference for transaction signing, or None if not set. #[getter] pub fn get_utxo(&self) -> Option { @@ -142,6 +160,7 @@ impl PyTransactionInput { /// - 'signatureScript' (str | None): The signature script as hex string /// - 'sequence' (int): Sequence number /// - 'sigOpCount' (int): Signature operation count + /// - 'computeBudget' (int, optional): Compute budget for this input (default: 0) /// - 'utxo' (dict | None): Optional UTXO entry reference dict /// /// Returns: @@ -233,6 +252,12 @@ impl TryFrom<&Bound<'_, PyDict>> for PyTransactionInput { .ok_or_else(|| PyKeyError::new_err("Key `sigOpCount` not present"))? .extract()?; + // Parse computeBudget (optional, defaults to 0) + let compute_budget: u16 = match dict.get_item("computeBudget")? { + Some(item) if !item.is_none() => item.extract()?, + _ => 0, + }; + // Parse utxo (optional) let utxo: Option = if let Some(utxo_item) = dict.get_item("utxo")? { if utxo_item.is_none() { @@ -250,6 +275,7 @@ impl TryFrom<&Bound<'_, PyDict>> for PyTransactionInput { signature_script, sequence, sig_op_count, + compute_budget, utxo, ); Ok(Self(input)) diff --git a/src/consensus/client/mod.rs b/src/consensus/client/mod.rs index eecfc11d..160199c2 100644 --- a/src/consensus/client/mod.rs +++ b/src/consensus/client/mod.rs @@ -1,3 +1,4 @@ +pub mod covenant; pub mod input; pub mod outpoint; pub mod output; diff --git a/src/consensus/client/output.rs b/src/consensus/client/output.rs index ce7b3cf3..2e7a38e4 100644 --- a/src/consensus/client/output.rs +++ b/src/consensus/client/output.rs @@ -7,6 +7,7 @@ use pyo3::{ use pyo3_stub_gen::derive::{gen_stub_pyclass, gen_stub_pymethods}; use crate::{ + consensus::client::covenant::PyCovenantBinding, consensus::core::script_public_key::PyScriptPublicKey, traits::TryToPyDict, types::PyBinary, }; @@ -27,12 +28,22 @@ impl PyTransactionOutput { /// Args: /// value: Amount in sompi (1 KAS = 100,000,000 sompi). /// script_public_key: The locking script. + /// covenant_id: The covenant ID. /// /// Returns: /// TransactionOutput: A new TransactionOutput instance. #[new] - pub fn ctor(value: u64, script_public_key: PyScriptPublicKey) -> Self { - let inner = TransactionOutput::new(value, script_public_key.into()); + #[pyo3(signature = (value, script_public_key, covenant_id=None))] + pub fn ctor( + value: u64, + script_public_key: PyScriptPublicKey, + covenant_id: Option, + ) -> Self { + let inner = TransactionOutput::new( + value, + script_public_key.into(), + covenant_id.map(PyCovenantBinding::into), + ); Self(inner) } @@ -81,6 +92,7 @@ impl PyTransactionOutput { /// dict: Dictionary containing transaction output fields with keys: /// - 'value' (int): The output value in sompi /// - 'scriptPublicKey' (dict): Dict with 'version' (int) and 'script' (str) keys + /// - 'covenant' (dict | None): The optional covenant binding. /// /// Returns: /// TransactionOutput: A new TransactionOutput instance. @@ -153,6 +165,11 @@ impl TryFrom<&Bound<'_, PyDict>> for PyTransactionOutput { )); }; - Ok(Self::ctor(value, spk)) + let covenant_id = dict + .as_any() + .get_item("covenant")? + .extract::>()?; + + Ok(Self::ctor(value, spk, covenant_id)) } } diff --git a/src/consensus/client/transaction.rs b/src/consensus/client/transaction.rs index 7de73b77..7e7e0e81 100644 --- a/src/consensus/client/transaction.rs +++ b/src/consensus/client/transaction.rs @@ -1,11 +1,15 @@ use crate::address::PyAddress; +use crate::consensus::client::covenant::PyGenesisCovenantGroup; use crate::consensus::client::input::PyTransactionInput; use crate::consensus::client::output::PyTransactionOutput; use crate::consensus::core::network::PyNetworkType; use crate::crypto::hashes::PyHash; use crate::traits::TryToPyDict; use crate::types::PyBinary; -use kaspa_consensus_client::{Transaction, TransactionInput, TransactionOutput}; +use kaspa_consensus_client::{ + GenesisCovenantGroup as ClientGenesisCovenantGroup, Transaction, TransactionInput, + TransactionOutput, +}; use kaspa_consensus_core::network::NetworkType; use kaspa_consensus_core::subnets; use kaspa_consensus_core::subnets::SubnetworkId; @@ -271,18 +275,67 @@ impl PyTransaction { } /// The transaction mass used for fee calculation. + /// + /// Alias of `storage_mass`, retained for compatibility with the WASM SDK + /// and earlier releases of this package. #[getter] pub fn get_mass(&self) -> u64 { - self.0.inner().mass + self.0.inner().storage_mass } /// Set the transaction mass. /// + /// Alias of `storage_mass`. + /// /// Args: /// value: The transaction mass value. #[setter] pub fn set_mass(&mut self, value: u64) { - self.0.inner().mass = value; + self.0.inner().storage_mass = value; + } + + /// The transaction storage mass used for fee calculation. + #[getter] + pub fn get_storage_mass(&self) -> u64 { + self.0.inner().storage_mass + } + + /// Set the transaction storage mass. + /// + /// Args: + /// value: The transaction storage mass value. + #[setter] + pub fn set_storage_mass(&mut self, value: u64) { + self.0.inner().storage_mass = value; + } + + /// Populate genesis covenant bindings for multiple output groups. + /// + /// For each group, computes the covenant id from the authorizing input + /// outpoint and the group's output list, then sets that binding on all + /// listed outputs. All groups are validated before the transaction is + /// mutated. + /// + /// Args: + /// groups: The genesis covenant groups to populate. + /// + /// Raises: + /// Exception: If a group references a non-existent input or output, + /// output indices are not strictly increasing, outputs overlap + /// across groups, or a targeted output already has a covenant + /// binding. + pub fn populate_genesis_covenants(&self, groups: Vec) -> PyResult<()> { + let groups = groups + .into_iter() + .map(|g| { + let client_group: ClientGenesisCovenantGroup = g.into(); + cctx::GenesisCovenantGroup::from(client_group) + }) + .collect::>(); + self.0 + .populate_genesis_covenants(groups.as_slice()) + .map_err(|e| PyException::new_err(format!("{}", e)))?; + Ok(()) } /// Get a dictionary representation of the Transaction. @@ -415,11 +468,16 @@ impl TryFrom<&Bound<'_, PyDict>> for PyTransaction { Vec::from_hex(&payload_str).map_err(|err| PyException::new_err(err.to_string()))? }; - // Parse mass - let mass: u64 = dict - .get_item("mass")? - .ok_or_else(|| PyKeyError::new_err("Key `mass` not present"))? - .extract()?; + // Parse mass. Accept `storageMass` (WASM SDK) or the legacy/alias `mass`, + // preferring `storageMass` when both are present. + let mass: u64 = match (dict.get_item("storageMass")?, dict.get_item("mass")?) { + (Some(value), _) | (None, Some(value)) => value.extract()?, + (None, None) => { + return Err(PyKeyError::new_err( + "Key `mass` or `storageMass` not present", + )); + } + }; // Parse inputs let inputs_list = dict diff --git a/src/consensus/client/utxo.rs b/src/consensus/client/utxo.rs index e41ea4ea..e292345c 100644 --- a/src/consensus/client/utxo.rs +++ b/src/consensus/client/utxo.rs @@ -1,7 +1,7 @@ use super::outpoint::PyTransactionOutpoint; use crate::{ - address::PyAddress, consensus::core::script_public_key::PyScriptPublicKey, traits::TryToPyDict, - types::PyBinary, + address::PyAddress, consensus::core::script_public_key::PyScriptPublicKey, + crypto::hashes::PyHash, traits::TryToPyDict, types::PyBinary, }; use kaspa_consensus_client::{UtxoEntry, UtxoEntryReference}; use kaspa_utils::hex::FromHex; @@ -80,6 +80,7 @@ impl PyUtxoEntry { /// - 'scriptPublicKey' (dict): Dict with 'version' (int) and 'script' (str) keys /// - 'blockDaaScore' (int): Block DAA score /// - 'isCoinbase' (bool): Whether from coinbase transaction + /// - 'covenantId' (str | None): The optional covenant ID of the UTXO. /// /// Returns: /// UtxoEntry: A new UtxoEntry instance. @@ -193,6 +194,11 @@ impl TryFrom<&Bound<'_, PyDict>> for PyUtxoEntry { .ok_or_else(|| PyKeyError::new_err("Key `isCoinbase` not present"))? .extract()?; + let covenant_id: Option = dict + .get_item("covenantId")? + .ok_or_else(|| PyKeyError::new_err("Key `covenantId` not present"))? + .extract()?; + let utxo = UtxoEntry { address: address.map(|a| a.into()), outpoint: outpoint.into(), @@ -200,6 +206,7 @@ impl TryFrom<&Bound<'_, PyDict>> for PyUtxoEntry { script_public_key: script_public_key.into(), block_daa_score, is_coinbase, + covenant_id: covenant_id.map(PyHash::into), }; Ok(Self(utxo)) @@ -373,11 +380,12 @@ impl PyUtxoEntryReference { /// - 'scriptPublicKey' (dict | str): Dict with 'version' and 'script', or hex string /// - 'blockDaaScore' (int): Block DAA score /// - 'isCoinbase' (bool): Whether from coinbase transaction + /// - 'covenantId' (str | None): The optional covenant ID of the UTXO. /// /// Nested format: /// - 'address' (str | None): The address string /// - 'outpoint' (dict): Transaction outpoint with 'transactionId' and 'index' - /// - 'utxoEntry' (dict): Nested dict containing amount, scriptPublicKey, blockDaaScore, isCoinbase + /// - 'utxoEntry' (dict): Nested dict containing amount, scriptPublicKey, blockDaaScore, isCoinbase, covenantId /// /// Returns: /// UtxoEntryReference: A new UtxoEntryReference instance. @@ -494,6 +502,11 @@ impl TryFrom<&Bound<'_, PyDict>> for PyUtxoEntryReference { .ok_or_else(|| PyKeyError::new_err("Key `isCoinbase` not present"))? .extract()?; + let covenant_id: Option = source_dict + .get_item("covenantId")? + .ok_or_else(|| PyKeyError::new_err("Key `covenantId` not present"))? + .extract()?; + let utxo = UtxoEntry { address: address.map(|a| a.into()), outpoint: outpoint.into(), @@ -501,6 +514,7 @@ impl TryFrom<&Bound<'_, PyDict>> for PyUtxoEntryReference { script_public_key: script_public_key.into(), block_daa_score, is_coinbase, + covenant_id: covenant_id.map(PyHash::into), }; let inner = UtxoEntryReference { diff --git a/src/consensus/convert.rs b/src/consensus/convert.rs index 2c7582bf..15ecf729 100644 --- a/src/consensus/convert.rs +++ b/src/consensus/convert.rs @@ -1,3 +1,4 @@ +use crate::crypto::hashes::PyHash; use crate::traits::TryToPyDict; use kaspa_consensus_client::{ Transaction, TransactionInput, TransactionOutpoint, TransactionOutput, UtxoEntry, @@ -50,6 +51,7 @@ impl TryToPyDict for UtxoEntryReference { )?; dict.set_item("blockDaaScore", self.block_daa_score())?; dict.set_item("isCoinbase", self.is_coinbase())?; + dict.set_item("covenantId", self.utxo.covenant_id.map(PyHash::from))?; Ok(dict) } @@ -84,6 +86,9 @@ impl TryToPyDict for UtxoEntry { // Set `isCoinbase` key dict.set_item("isCoinbase", self.is_coinbase())?; + // Set `covenantId` key + dict.set_item("covenantId", self.covenant_id.map(PyHash::from))?; + Ok(dict) } } @@ -130,6 +135,11 @@ impl TryToPyDict for TransactionOutput { inner.script_public_key.try_to_pydict(py)?, )?; + dict.set_item( + "covenant", + serde_pyobject::to_pyobject(py, &inner.covenant)?, + )?; + Ok(dict) } } @@ -179,8 +189,9 @@ impl TryToPyDict for Transaction { // Set `payload` key dict.set_item("payload", inner.payload.to_hex())?; - // Set `mass` - dict.set_item("mass", inner.mass)?; + // Set `mass` (alias) and `storageMass` (WASM SDK parity) + dict.set_item("mass", inner.storage_mass)?; + dict.set_item("storageMass", inner.storage_mass)?; Ok(dict) } diff --git a/src/consensus/core/hashing.rs b/src/consensus/core/hashing.rs index ee2e18a9..aa4bdd5e 100644 --- a/src/consensus/core/hashing.rs +++ b/src/consensus/core/hashing.rs @@ -1,8 +1,16 @@ +use kaspa_consensus_client as cctx; +use kaspa_consensus_core::hashing::covenant_id::covenant_id; use kaspa_consensus_core::hashing::wasm::SighashType; +use kaspa_consensus_core::tx as ctx; use pyo3::{exceptions::PyException, prelude::*}; use pyo3_stub_gen::derive::gen_stub_pyclass_enum; use std::str::FromStr; +use crate::{ + consensus::client::{outpoint::PyTransactionOutpoint, output::PyTransactionOutput}, + crypto::hashes::PyHash, +}; + crate::wrap_unit_enum_for_py!( /// Kaspa signature hash types for transaction signing. PySighashType, "SighashType", SighashType, { @@ -45,3 +53,22 @@ impl<'py> FromPyObject<'_, 'py> for PySighashType { } } } + +#[pyfunction] +#[pyo3(name = "covenant_id")] +pub fn py_covenant_id( + outpoint: PyTransactionOutpoint, + auth_outputs: Vec, +) -> PyHash { + let outpoint: cctx::TransactionOutpoint = outpoint.into(); + let auth_outputs = auth_outputs + .into_iter() + .map(|py_output| ctx::TransactionOutput::from(&cctx::TransactionOutput::from(py_output))) + .collect::>(); + let indexed: Vec<(u32, &ctx::TransactionOutput)> = auth_outputs + .iter() + .enumerate() + .map(|(i, o)| (i as u32, o)) + .collect(); + covenant_id(outpoint.into(), indexed.into_iter()).into() +} diff --git a/src/crypto/txscript/builder.rs b/src/crypto/txscript/builder.rs index d4b2a15b..1ab49d43 100644 --- a/src/crypto/txscript/builder.rs +++ b/src/crypto/txscript/builder.rs @@ -2,7 +2,8 @@ use crate::{ consensus::core::script_public_key::PyScriptPublicKey, crypto::txscript::opcodes::PyOpcodes, types::PyBinary, }; -use kaspa_txscript::{script_builder as native, standard}; +use kaspa_consensus_core::mass::ScriptUnits; +use kaspa_txscript::{EngineFlags, script_builder as native, standard}; use pyo3::{exceptions::PyException, prelude::*}; use pyo3_stub_gen::derive::{gen_stub_pyclass, gen_stub_pymethods}; use std::sync::{Arc, Mutex, MutexGuard}; @@ -36,29 +37,69 @@ impl Default for PyScriptBuilder { impl PyScriptBuilder { /// Create a new empty script builder. /// + /// Args: + /// covenants_enabled: Enable covenant opcodes and post-Toccata script + /// limits (default: False). + /// sigop_script_units: Script units charged per signature operation. + /// Defaults to the native engine default when omitted. + /// /// Returns: /// ScriptBuilder: A new empty ScriptBuilder instance. #[new] - pub fn new() -> Self { - Self::default() + #[pyo3(signature = (covenants_enabled=false, sigop_script_units=None))] + pub fn new(covenants_enabled: bool, sigop_script_units: Option) -> Self { + let flags = build_engine_flags(covenants_enabled, sigop_script_units); + Self(Arc::new(Mutex::new(native::ScriptBuilder::with_flags( + flags, + )))) } /// Create a script builder from an existing script. /// /// Args: /// script: Existing script bytes as hex, bytes, or list. + /// covenants_enabled: Enable covenant opcodes and post-Toccata script + /// limits (default: False). + /// sigop_script_units: Script units charged per signature operation. + /// Defaults to the native engine default when omitted. /// /// Returns: /// ScriptBuilder: A new ScriptBuilder initialized with the script. #[staticmethod] - pub fn from_script(script: PyBinary) -> PyResult { - let builder = PyScriptBuilder::default(); + #[pyo3(signature = (script, covenants_enabled=false, sigop_script_units=None))] + pub fn from_script( + script: PyBinary, + covenants_enabled: bool, + sigop_script_units: Option, + ) -> PyResult { + let flags = build_engine_flags(covenants_enabled, sigop_script_units); + let builder = Self(Arc::new(Mutex::new(native::ScriptBuilder::with_flags( + flags, + )))); let script: Vec = script.into(); builder.inner().script_mut().extend(&script); Ok(builder) } + /// Whether covenant opcodes and post-Toccata script limits are enabled. + /// + /// Returns: + /// bool: True if covenants are enabled for this builder. + #[getter] + pub fn get_covenants_enabled(&self) -> bool { + self.inner().flags().covenants_enabled + } + + /// Script units charged for each signature operation. + /// + /// Returns: + /// int: The configured sigop script units. + #[getter] + pub fn get_sigop_script_units(&self) -> u64 { + self.inner().flags().sigop_script_units.0 + } + /// Add a single opcode to the script. /// /// Args: @@ -248,9 +289,13 @@ impl PyScriptBuilder { pub fn pay_to_script_hash_signature_script(&self, signature: PyBinary) -> PyResult { let inner = self.inner(); let script = inner.script(); - let generated_script = - standard::pay_to_script_hash_signature_script(script.into(), signature.into()) - .map_err(|err| PyException::new_err(format!("{}", err)))?; + let flags = inner.flags(); + let generated_script = standard::pay_to_script_hash_signature_script_with_flags( + script.into(), + signature.into(), + flags, + ) + .map_err(|err| PyException::new_err(format!("{}", err)))?; Ok(generated_script.to_hex()) } @@ -283,6 +328,20 @@ impl PyScriptBuilder { } } +// Builds script engine flags from the Python-facing kwargs, mirroring the WASM +// SDK's `ScriptBuilderOptions { flags: { covenantsEnabled, sigopScriptUnits } }`. +// `sigop_script_units` falls back to the native engine default when omitted. +fn build_engine_flags(covenants_enabled: bool, sigop_script_units: Option) -> EngineFlags { + let mut flags = EngineFlags { + covenants_enabled, + ..Default::default() + }; + if let Some(units) = sigop_script_units { + flags.sigop_script_units = ScriptUnits(units); + } + flags +} + // TODO change to PyOpcode struct and handle similar to PyBinary? // Extracts multiple opcodes from a Python list[int | Opcodes] fn extract_ops(input: &Bound) -> PyResult> { diff --git a/src/crypto/txscript/opcodes.rs b/src/crypto/txscript/opcodes.rs index 0c947289..1a7c6b89 100644 --- a/src/crypto/txscript/opcodes.rs +++ b/src/crypto/txscript/opcodes.rs @@ -9,6 +9,7 @@ crate::wrap_c_enum_for_py!( /// unlocking scripts for Kaspa transactions. PyOpcodes, "Opcodes", Opcodes, { OpFalse = 0x00, + OpData1 = 0x01, OpData2 = 0x02, OpData3 = 0x03, @@ -84,12 +85,17 @@ crate::wrap_c_enum_for_py!( OpData73 = 0x49, OpData74 = 0x4a, OpData75 = 0x4b, + OpPushData1 = 0x4c, OpPushData2 = 0x4d, OpPushData4 = 0x4e, + Op1Negate = 0x4f, + OpReserved = 0x50, + OpTrue = 0x51, + Op2 = 0x52, Op3 = 0x53, Op4 = 0x54, @@ -105,18 +111,21 @@ crate::wrap_c_enum_for_py!( Op14 = 0x5e, Op15 = 0x5f, Op16 = 0x60, + OpNop = 0x61, OpVer = 0x62, OpIf = 0x63, OpNotIf = 0x64, OpVerIf = 0x65, OpVerNotIf = 0x66, + OpElse = 0x67, OpEndIf = 0x68, OpVerify = 0x69, OpReturn = 0x6a, OpToAltStack = 0x6b, OpFromAltStack = 0x6c, + Op2Drop = 0x6d, Op2Dup = 0x6e, Op3Dup = 0x6f, @@ -130,23 +139,33 @@ crate::wrap_c_enum_for_py!( OpNip = 0x77, OpOver = 0x78, OpPick = 0x79, + OpRoll = 0x7a, OpRot = 0x7b, OpSwap = 0x7c, OpTuck = 0x7d, + + // Splice opcodes OpCat = 0x7e, - OpSubStr = 0x7f, + OpSubstr = 0x7f, OpLeft = 0x80, OpRight = 0x81, + OpSize = 0x82, + + // Bitwise logic opcodes OpInvert = 0x83, OpAnd = 0x84, OpOr = 0x85, OpXor = 0x86, + OpEqual = 0x87, OpEqualVerify = 0x88, + OpReserved1 = 0x89, OpReserved2 = 0x8a, + + // Numeric related opcodes Op1Add = 0x8b, Op1Sub = 0x8c, Op2Mul = 0x8d, @@ -155,6 +174,7 @@ crate::wrap_c_enum_for_py!( OpAbs = 0x90, OpNot = 0x91, Op0NotEqual = 0x92, + OpAdd = 0x93, OpSub = 0x94, OpMul = 0x95, @@ -162,11 +182,14 @@ crate::wrap_c_enum_for_py!( OpMod = 0x97, OpLShift = 0x98, OpRShift = 0x99, + OpBoolAnd = 0x9a, OpBoolOr = 0x9b, + OpNumEqual = 0x9c, OpNumEqualVerify = 0x9d, OpNumNotEqual = 0x9e, + OpLessThan = 0x9f, OpGreaterThan = 0xa0, OpLessThanOrEqual = 0xa1, @@ -174,10 +197,16 @@ crate::wrap_c_enum_for_py!( OpMin = 0xa3, OpMax = 0xa4, OpWithin = 0xa5, - OpUnknown166 = 0xa6, - OpUnknown167 = 0xa7, + + // Undefined opcodes + OpZkPrecompile = 0xa6, + OpBlake2bWithKey = 0xa7, + + // Crypto opcodes OpSHA256 = 0xa8, + OpCheckMultiSigECDSA = 0xa9, + OpBlake2b = 0xaa, OpCheckSigECDSA = 0xab, OpCheckSig = 0xac, @@ -186,47 +215,49 @@ crate::wrap_c_enum_for_py!( OpCheckMultiSigVerify = 0xaf, OpCheckLockTimeVerify = 0xb0, OpCheckSequenceVerify = 0xb1, - OpUnknown178 = 0xb2, - OpUnknown179 = 0xb3, - OpUnknown180 = 0xb4, - OpUnknown181 = 0xb5, - OpUnknown182 = 0xb6, - OpUnknown183 = 0xb7, - OpUnknown184 = 0xb8, - OpUnknown185 = 0xb9, - OpUnknown186 = 0xba, - OpUnknown187 = 0xbb, - OpUnknown188 = 0xbc, - OpUnknown189 = 0xbd, - OpUnknown190 = 0xbe, - OpUnknown191 = 0xbf, - OpUnknown192 = 0xc0, - OpUnknown193 = 0xc1, - OpUnknown194 = 0xc2, - OpUnknown195 = 0xc3, - OpUnknown196 = 0xc4, - OpUnknown197 = 0xc5, - OpUnknown198 = 0xc6, - OpUnknown199 = 0xc7, - OpUnknown200 = 0xc8, - OpUnknown201 = 0xc9, + + // Undefined opcodes + OpTxVersion = 0xb2, + OpTxInputCount = 0xb3, + OpTxOutputCount = 0xb4, + OpTxLockTime = 0xb5, + OpTxSubnetId = 0xb6, + OpTxGas = 0xb7, + OpTxPayloadSubstr = 0xb8, + OpTxInputIndex = 0xb9, + OpOutpointTxId = 0xba, + OpOutpointIndex = 0xbb, + OpTxInputScriptSigSubstr = 0xbc, + OpTxInputSeq = 0xbd, + OpTxInputAmount = 0xbe, + OpTxInputSpk = 0xbf, + OpTxInputDaaScore = 0xc0, + OpTxInputIsCoinbase = 0xc1, + OpTxOutputAmount = 0xc2, + OpTxOutputSpk = 0xc3, + OpTxPayloadLen = 0xc4, + OpTxInputSpkLen = 0xc5, + OpTxInputSpkSubstr = 0xc6, + OpTxOutputSpkLen = 0xc7, + OpTxOutputSpkSubstr = 0xc8, + OpTxInputScriptSigLen = 0xc9, OpUnknown202 = 0xca, - OpUnknown203 = 0xcb, - OpUnknown204 = 0xcc, - OpUnknown205 = 0xcd, - OpUnknown206 = 0xce, - OpUnknown207 = 0xcf, - OpUnknown208 = 0xd0, - OpUnknown209 = 0xd1, - OpUnknown210 = 0xd2, - OpUnknown211 = 0xd3, - OpUnknown212 = 0xd4, - OpUnknown213 = 0xd5, + OpAuthOutputCount = 0xcb, + OpAuthOutputIdx = 0xcc, + OpNum2Bin = 0xcd, + OpBin2Num = 0xce, + OpInputCovenantId = 0xcf, + OpCovInputCount = 0xd0, + OpCovInputIdx = 0xd1, + OpCovOutputCount = 0xd2, + OpCovOutputIdx = 0xd3, + OpChainblockSeqCommit = 0xd4, + OpOutputCovenantId = 0xd5, OpUnknown214 = 0xd6, - OpUnknown215 = 0xd7, - OpUnknown216 = 0xd8, - OpUnknown217 = 0xd9, - OpUnknown218 = 0xda, + OpCheckSigFromStack = 0xd7, + OpCheckSigFromStackECDSA = 0xd8, + OpBlake3 = 0xd9, + OpBlake3WithKey = 0xda, OpUnknown219 = 0xdb, OpUnknown220 = 0xdc, OpUnknown221 = 0xdd, @@ -258,6 +289,7 @@ crate::wrap_c_enum_for_py!( OpUnknown247 = 0xf7, OpUnknown248 = 0xf8, OpUnknown249 = 0xf9, + OpSmallInteger = 0xfa, OpPubKeys = 0xfb, OpUnknown252 = 0xfc, diff --git a/src/lib.rs b/src/lib.rs index f3b7ab9d..5436298f 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -31,6 +31,8 @@ fn kaspa(py: Python, m: &Bound<'_, PyModule>) -> PyResult<()> { m.add_class::()?; m.add_class::()?; + m.add_class::()?; + m.add_class::()?; m.add_class::()?; m.add_class::()?; m.add_class::()?; @@ -69,6 +71,10 @@ fn kaspa(py: Python, m: &Bound<'_, PyModule>) -> PyResult<()> { )?)?; m.add_class::()?; + m.add_function(wrap_pyfunction!( + consensus::core::hashing::py_covenant_id, + m + )?)?; m.add_class::()?; m.add_class::()?; m.add_class::()?; diff --git a/src/rpc/messages.rs b/src/rpc/messages.rs index 4df4b695..4a688f80 100644 --- a/src/rpc/messages.rs +++ b/src/rpc/messages.rs @@ -59,6 +59,7 @@ impl_try_from_pydict!([ GetBlock, GetBlocks, GetBlockTemplate, + GetBlockRewardInfo, GetCurrentBlockColor, GetDaaScoreTimestampEstimate, GetFeeEstimateExperimental, @@ -236,10 +237,10 @@ try_from_args! ( dict : PySubmitTransactionRequest, { inputs, outputs, lock_time: inner.lock_time, - subnetwork_id: inner.subnetwork_id.clone(), + subnetwork_id: inner.subnetwork_id, gas: inner.gas, payload: inner.payload.clone(), - mass: inner.mass, + storage_mass: inner.storage_mass, verbose_data: None, }; diff --git a/src/rpc/model.rs b/src/rpc/model.rs index 2d60497e..f2280515 100644 --- a/src/rpc/model.rs +++ b/src/rpc/model.rs @@ -48,6 +48,7 @@ define_py_request_types!([ GetBlock, GetBlocks, GetBlockTemplate, + GetBlockRewardInfo, GetCurrentBlockColor, GetDaaScoreTimestampEstimate, GetFeeEstimateExperimental, diff --git a/src/rpc/wrpc/client.rs b/src/rpc/wrpc/client.rs index 8e98a9e1..be1f1408 100644 --- a/src/rpc/wrpc/client.rs +++ b/src/rpc/wrpc/client.rs @@ -1067,6 +1067,7 @@ build_wrpc_python_interface_with_args!([ GetBlock, GetBlocks, GetBlockTemplate, + GetBlockRewardInfo, GetCurrentBlockColor, GetDaaScoreTimestampEstimate, GetFeeEstimateExperimental, diff --git a/src/wallet/core/account/descriptor.rs b/src/wallet/core/account/descriptor.rs index 2896733b..23c0d486 100644 --- a/src/wallet/core/account/descriptor.rs +++ b/src/wallet/core/account/descriptor.rs @@ -13,6 +13,11 @@ use kaspa_wallet_core::{ use pyo3::prelude::*; use pyo3_stub_gen::derive::{gen_stub_pyclass, gen_stub_pymethods}; +/// A read-only snapshot describing a wallet account. +/// +/// Exposes the account's kind, id, name, balance, addresses, and derivation +/// metadata. Returned by `Wallet` account enumeration, creation, and +/// activation methods. #[gen_stub_pyclass] #[pyclass(name = "AccountDescriptor")] #[derive(Clone)] diff --git a/src/wallet/core/storage/interface.rs b/src/wallet/core/storage/interface.rs index cc204c49..c7c4f040 100644 --- a/src/wallet/core/storage/interface.rs +++ b/src/wallet/core/storage/interface.rs @@ -2,6 +2,10 @@ use kaspa_wallet_core::storage::WalletDescriptor; use pyo3::prelude::*; use pyo3_stub_gen::derive::*; +/// Describes a wallet file in the wallet store. +/// +/// Pairs the on-disk wallet filename with its optional user-assigned title. +/// Returned by `Wallet.wallet_enumerate`. #[gen_stub_pyclass] #[pyclass(name = "WalletDescriptor")] pub struct PyWalletDescriptor(WalletDescriptor); diff --git a/src/wallet/core/storage/keydata.rs b/src/wallet/core/storage/keydata.rs index 52e85dae..81aa35ff 100644 --- a/src/wallet/core/storage/keydata.rs +++ b/src/wallet/core/storage/keydata.rs @@ -141,6 +141,11 @@ impl<'py> FromPyObject<'_, 'py> for PyPrvKeyDataId { } } +/// Metadata describing a private key data entry stored in a wallet file. +/// +/// Exposes the entry's id, optional user-assigned name, and whether the +/// underlying key material requires a payment secret (BIP39 passphrase). +/// Returned by `Wallet.prv_key_data_enumerate`. #[gen_stub_pyclass] #[pyclass(name = "PrvKeyDataInfo")] pub struct PyPrvKeyDataInfo(PrvKeyDataInfo); diff --git a/src/wallet/core/tx/payment.rs b/src/wallet/core/tx/payment.rs index 6bdc05f0..7843c567 100644 --- a/src/wallet/core/tx/payment.rs +++ b/src/wallet/core/tx/payment.rs @@ -1,3 +1,4 @@ +use kaspa_consensus_client::CovenantBinding; use kaspa_wallet_core::tx::payment::PaymentOutput; use pyo3::{ exceptions::{PyException, PyKeyError}, @@ -6,7 +7,7 @@ use pyo3::{ }; use pyo3_stub_gen::derive::{gen_stub_pyclass, gen_stub_pymethods}; -use crate::address::PyAddress; +use crate::{address::PyAddress, consensus::client::covenant::PyCovenantBinding}; /// A payment destination with address and amount. /// @@ -30,6 +31,24 @@ impl PyPaymentOutput { Self(PaymentOutput::new(address.into(), amount)) } + /// Create a new Payment Output bound to a covenant. + /// + /// Args: + /// address: The address to send this output to. + /// amount: The amount, in sompi, to send on this output. + /// covenant: The covenant binding to attach to this output. + /// + /// Returns: + /// PaymentOutput: A new PaymentOutput instance. + #[staticmethod] + fn with_covenant(address: PyAddress, amount: u64, covenant: PyCovenantBinding) -> Self { + Self(PaymentOutput::with_covenant( + address.into(), + amount, + covenant.into(), + )) + } + /// Equality comparison. /// /// Args: @@ -51,9 +70,13 @@ impl PyPaymentOutput { /// str: The PaymentOutput as a repr string. fn __repr__(&self) -> String { format!( - "PaymentOutput(address='{}', amount={})", + "PaymentOutput(address='{}', amount={}, covenant={})", self.0.address.address_to_string(), - self.0.amount + self.0.amount, + match &self.0.covenant { + Some(covenant) => PyCovenantBinding::from(*covenant).__repr__(), + None => "None".to_string(), + } ) } } @@ -86,7 +109,16 @@ impl TryFrom<&Bound<'_, PyDict>> for PyPaymentOutput { .ok_or_else(|| PyKeyError::new_err("Key `amount` not present"))? .extract()?; - let inner = PaymentOutput::new(address.into(), amount); + let covenant_id = value + .as_any() + .get_item("covenant")? + .extract::>()?; + + let inner = PaymentOutput { + address: address.into(), + amount, + covenant: covenant_id.map(CovenantBinding::from), + }; Ok(Self(inner)) } diff --git a/src/wallet/core/tx/utils.rs b/src/wallet/core/tx/utils.rs index f0badca9..7faaf34b 100644 --- a/src/wallet/core/tx/utils.rs +++ b/src/wallet/core/tx/utils.rs @@ -55,6 +55,7 @@ pub fn py_create_transaction( None, sequence as u64, sig_op_count, + 0, Some(reference), ) }) diff --git a/src/wallet/core/wallet.rs b/src/wallet/core/wallet.rs index 8fe3d692..5aade35f 100644 --- a/src/wallet/core/wallet.rs +++ b/src/wallet/core/wallet.rs @@ -81,6 +81,13 @@ impl Inner { } } +/// A managed Kaspa wallet with persistent encrypted on-disk storage. +/// +/// The SDK's high-level wallet. Provides encrypted storage for keys and +/// account metadata, multi-account management (BIP32 and keypair accounts), +/// address derivation and discovery, built-in send, transfer, and sweep +/// flows, transaction history tracking, and an event bus for chain +/// notifications (balance, maturity, reorg). #[gen_stub_pyclass] #[pyclass(name = "Wallet")] #[derive(Clone)] diff --git a/tests/unit/test_dict_conversion.py b/tests/unit/test_dict_conversion.py index 04a2eb49..77c84c9f 100644 --- a/tests/unit/test_dict_conversion.py +++ b/tests/unit/test_dict_conversion.py @@ -120,6 +120,25 @@ def test_transaction_to_dict(self): assert "gas" in d assert "payload" in d assert "mass" in d + assert "storageMass" in d + assert d["mass"] == d["storageMass"] + + def test_transaction_storage_mass_alias(self): + """`storage_mass` mirrors `mass` (kept as an alias for WASM & back-compat).""" + tx_hash = Hash("0" * 64) + outpoint = TransactionOutpoint(tx_hash, 0) + input = TransactionInput(outpoint, "", 0, 1) + spk = ScriptPublicKey(0, "51") + output = TransactionOutput(1000000, spk) + + tx = Transaction(0, [input], [output], 100, "0" * 40, 0, "", 1234) + assert tx.mass == 1234 + assert tx.storage_mass == 1234 + + tx.storage_mass = 5678 + assert tx.mass == 5678 + tx.mass = 99 + assert tx.storage_mass == 99 def test_transaction_from_dict_roundtrip(self): """Test Transaction to_dict/from_dict round-trip.""" @@ -150,6 +169,7 @@ def test_utxo_entry_to_dict(self): "scriptPublicKey": {"version": 0, "script": "20852be1b87fca94453a35027c550a3ccdbebb5913106029f3a8bf18152bf93bffac"}, "blockDaaScore": 12345, "isCoinbase": False, + "covenantId": None, } entry = UtxoEntry.from_dict(entry_dict) @@ -171,6 +191,7 @@ def test_utxo_entry_from_dict_roundtrip(self): "scriptPublicKey": {"version": 0, "script": "20852be1b87fca94453a35027c550a3ccdbebb5913106029f3a8bf18152bf93bffac"}, "blockDaaScore": 12345, "isCoinbase": False, + "covenantId": None, } original = UtxoEntry.from_dict(entry_dict) @@ -192,6 +213,7 @@ def test_utxo_entry_reference_to_dict(self): "scriptPublicKey": {"version": 0, "script": "20852be1b87fca94453a35027c550a3ccdbebb5913106029f3a8bf18152bf93bffac"}, "blockDaaScore": 12345, "isCoinbase": False, + "covenantId": None, } entry_ref = UtxoEntryReference.from_dict(entry_dict) @@ -216,6 +238,7 @@ def test_utxo_entry_reference_from_dict_flat_format(self): "scriptPublicKey": {"version": 0, "script": "20852be1b87fca94453a35027c550a3ccdbebb5913106029f3a8bf18152bf93bffac"}, "blockDaaScore": 12345, "isCoinbase": False, + "covenantId": None, } entry_ref = UtxoEntryReference.from_dict(entry_dict) assert entry_ref.amount == 1000000 @@ -230,6 +253,7 @@ def test_utxo_entry_reference_from_dict_nested_format(self): "scriptPublicKey": {"version": 0, "script": "20852be1b87fca94453a35027c550a3ccdbebb5913106029f3a8bf18152bf93bffac"}, "blockDaaScore": 12345, "isCoinbase": False, + "covenantId": None, }, } entry_ref = UtxoEntryReference.from_dict(entry_dict) @@ -244,6 +268,7 @@ def test_utxo_entry_reference_from_dict_roundtrip(self): "scriptPublicKey": {"version": 0, "script": "20852be1b87fca94453a35027c550a3ccdbebb5913106029f3a8bf18152bf93bffac"}, "blockDaaScore": 12345, "isCoinbase": False, + "covenantId": None, } original = UtxoEntryReference.from_dict(entry_dict)