From e31a3646ec303baaf0a55a8b38be73e36e5739bf Mon Sep 17 00:00:00 2001 From: wiesche Date: Fri, 7 Aug 2026 23:25:02 +0200 Subject: [PATCH 1/5] restore compatibility with grin staging --- Cargo.lock | 4794 ++++++++++++++++++++++----------------- Cargo.toml | 74 +- README.md | 23 +- doc/store.md | 10 +- doc/swap_api.md | 12 +- src/bin/mwixnet.rs | 284 ++- src/bin/mwixnet.yml | 35 +- src/config.rs | 154 +- src/http.rs | 25 +- src/mix_client.rs | 20 +- src/node.rs | 60 +- src/servers/mix.rs | 66 +- src/servers/mix_rpc.rs | 22 +- src/servers/swap.rs | 186 +- src/servers/swap_rpc.rs | 78 +- src/store.rs | 85 +- src/tor.rs | 308 ++- src/tx.rs | 75 +- src/wallet.rs | 11 +- tests/common/miner.rs | 7 +- tests/common/node.rs | 19 +- tests/common/server.rs | 87 +- tests/common/wallet.rs | 180 +- tests/e2e.rs | 86 +- 24 files changed, 4081 insertions(+), 2620 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 1fd90f2..01ad655 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1,6 +1,6 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. -version = 3 +version = 4 [[package]] name = "addr2line" @@ -34,23 +34,24 @@ checksum = "b169f7a6d4742236a0a00c541b845991d0ac43e546831af1249753ab4c3aa3a0" dependencies = [ "cfg-if 1.0.0", "cipher 0.4.4", - "cpufeatures", + "cpufeatures 0.2.11", "zeroize", ] [[package]] name = "age" -version = "0.7.1" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23100453ca2a1bbda9bfc6deac1bebb828d7e66ba481ebccfedfddf29321b6b9" +checksum = "caf6575916925dce67e5cc5588066ec50db90be641b5de10e2495d1a4045d55c" dependencies = [ "age-core", "base64 0.13.1", "bech32 0.8.1", "chacha20poly1305", + "cipher 0.4.4", "cookie-factory", - "hkdf 0.11.0", - "hmac 0.11.0", + "hkdf", + "hmac 0.12.1", "i18n-embed", "i18n-embed-fl", "lazy_static", @@ -60,6 +61,7 @@ dependencies = [ "rand 0.8.5", "rust-embed", "scrypt", + "sha2 0.10.8", "sha2 0.9.9", "subtle", "x25519-dalek 1.1.1", @@ -68,30 +70,19 @@ dependencies = [ [[package]] name = "age-core" -version = "0.7.1" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70afa630ef12a4fc666277713efbe6da2bc87bb3f3af0f1149415b701362c615" +checksum = "00a5c8d8a33abc74ad393896a6305351dd159d0e184788f4729e3c80e397fa45" dependencies = [ "base64 0.13.1", "chacha20poly1305", "cookie-factory", - "hkdf 0.11.0", + "hkdf", + "io_tee", "nom", "rand 0.8.5", - "secrecy 0.8.0", - "sha2 0.9.9", -] - -[[package]] -name = "ahash" -version = "0.8.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" -dependencies = [ - "cfg-if 1.0.0", - "once_cell", - "version_check", - "zerocopy", + "secrecy", + "sha2 0.10.8", ] [[package]] @@ -112,12 +103,6 @@ dependencies = [ "as-slice", ] -[[package]] -name = "allocator-api2" -version = "0.2.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0942ffc6dcaadf03badf6e6a2d0228460359d5e34b57ccdc720b7382dfbd5ec5" - [[package]] name = "amplify" version = "4.6.0" @@ -137,8 +122,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "759dcbfaf94d838367a86d493ec34ccc8aa6fe365cb7880d6bf89006de24d9c1" dependencies = [ "amplify_syn", - "proc-macro2 1.0.70", - "quote 1.0.33", + "proc-macro2 1.0.107", + "quote 1.0.47", "syn 1.0.109", ] @@ -157,17 +142,11 @@ version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7736fb8d473c0d83098b5bac44df6a561e20470375cd8bcae30516dc889fd62a" dependencies = [ - "proc-macro2 1.0.70", - "quote 1.0.33", + "proc-macro2 1.0.107", + "quote 1.0.47", "syn 1.0.109", ] -[[package]] -name = "android-tzdata" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" - [[package]] name = "android_system_properties" version = "0.1.5" @@ -183,7 +162,7 @@ version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d52a9bb7ec0cf484c551830a7ce27bd20d67eac647e1befb56b0be4ee39a55d2" dependencies = [ - "winapi 0.3.9", + "winapi", ] [[package]] @@ -192,12 +171,6 @@ version = "1.0.82" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f538837af36e6f6a9be0faa67f9a314f8119e4e4b5867c6ab40ed60360142519" -[[package]] -name = "arc-swap" -version = "0.4.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dabe5a181f83789739c194cbe5a897dde195078fac08568d09221fd6137a7ba8" - [[package]] name = "arc-swap" version = "1.6.0" @@ -221,29 +194,37 @@ checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711" [[package]] name = "arti-client" -version = "0.18.0" +version = "0.44.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38167a7335592fa9ae726f4de0f8cb37c62f53e8547f2564844e047bf9b8c103" +checksum = "841d54b6c87059a9b6562bfe585f3a637b72f90cddaa327ac29b5ddf082a54b4" dependencies = [ + "async-trait", "cfg-if 1.0.0", "derive-deftly", "derive_builder_fork_arti", "derive_more", "educe", "fs-mistrust", - "futures 0.3.29", + "futures 0.3.33", "hostname-validator", + "humantime", "humantime-serde", "libc", + "once_cell", "postage", + "rand 0.10.2", "safelog", "serde", - "thiserror", + "tempfile", + "thiserror 2.0.19", + "time", "tor-async-utils", "tor-basic-utils", "tor-chanmgr", "tor-circmgr", "tor-config", + "tor-config-path", + "tor-dircommon", "tor-dirmgr", "tor-error", "tor-guardmgr", @@ -253,32 +234,17 @@ dependencies = [ "tor-keymgr", "tor-linkspec", "tor-llcrypto", + "tor-memquota", "tor-netdir", "tor-netdoc", "tor-persist", "tor-proto", + "tor-protover", + "tor-ptmgr", "tor-rtcompat", "tracing", "void", -] - -[[package]] -name = "arti-hyper" -version = "0.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "990270b0c568f8e06386643962057a34204ae6ba5f68cba0a85650ace7b46b1e" -dependencies = [ - "anyhow", - "arti-client", - "educe", - "hyper 0.14.28", - "pin-project", - "thiserror", - "tls-api", - "tls-api-native-tls", - "tokio 1.37.0", - "tor-error", - "tor-rtcompat", + "web-time-compat", ] [[package]] @@ -296,6 +262,50 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d92bec98840b8f03a5ff5413de5293bfcd8bf96467cf5452609f939ec6f5de16" +[[package]] +name = "asn1-rs" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7f43a50ac4fdca5df8e885c21b835997f0a1cdee65494a6847694a98652d9d8" +dependencies = [ + "asn1-rs-derive", + "asn1-rs-impl", + "displaydoc", + "nom", + "num-traits 0.2.17", + "rusticata-macros", + "thiserror 2.0.19", +] + +[[package]] +name = "asn1-rs-derive" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3109e49b1e4909e9db6515a30c633684d68cdeaa252f215214cb4fa1a5bfee2c" +dependencies = [ + "proc-macro2 1.0.107", + "quote 1.0.47", + "syn 2.0.119", + "synstructure", +] + +[[package]] +name = "asn1-rs-impl" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b18050c2cd6fe86c3a76584ef5e0baf286d038cda203eb6223df2cc413565f7" +dependencies = [ + "proc-macro2 1.0.107", + "quote 1.0.47", + "syn 2.0.119", +] + +[[package]] +name = "assert_matches" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b34d609dfbaf33d6889b2b7106d3ca345eacad44200913df5ba02bfd31d2ba9" + [[package]] name = "async-channel" version = "1.9.0" @@ -317,7 +327,7 @@ dependencies = [ "event-listener 4.0.0", "event-listener-strategy", "futures-core", - "pin-project-lite 0.2.13", + "pin-project-lite", ] [[package]] @@ -330,7 +340,7 @@ dependencies = [ "futures-core", "futures-io", "memchr", - "pin-project-lite 0.2.13", + "pin-project-lite", "xz2", "zstd", "zstd-safe", @@ -345,7 +355,7 @@ dependencies = [ "async-lock 3.2.0", "async-task", "concurrent-queue", - "fastrand 2.0.1", + "fastrand 2.5.0", "futures-lite 2.1.0", "slab", ] @@ -363,7 +373,7 @@ dependencies = [ "blocking", "futures-lite 2.1.0", "once_cell", - "tokio 1.37.0", + "tokio", ] [[package]] @@ -422,56 +432,21 @@ checksum = "7125e42787d53db9dd54261812ef17e937c95a51e4d291373b670342fa44310c" dependencies = [ "event-listener 4.0.0", "event-listener-strategy", - "pin-project-lite 0.2.13", + "pin-project-lite", ] [[package]] name = "async-native-tls" -version = "0.5.0" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9343dc5acf07e79ff82d0c37899f079db3534d99f189a1837c8e549c99405bec" +checksum = "37dd6b179962fe4048a6f81d4c0d7ed419a21fdf49204b4c6b04971693358e79" dependencies = [ "futures-util", "native-tls", - "thiserror", + "thiserror 2.0.19", "url", ] -[[package]] -name = "async-process" -version = "1.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea6438ba0a08d81529c69b36700fa2f95837bfe3e776ab39cde9c14d9149da88" -dependencies = [ - "async-io 1.13.0", - "async-lock 2.8.0", - "async-signal", - "blocking", - "cfg-if 1.0.0", - "event-listener 3.1.0", - "futures-lite 1.13.0", - "rustix 0.38.25", - "windows-sys 0.48.0", -] - -[[package]] -name = "async-signal" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e47d90f65a225c4527103a8d747001fc56e375203592b25ad103e1ca13124c5" -dependencies = [ - "async-io 2.2.2", - "async-lock 2.8.0", - "atomic-waker", - "cfg-if 1.0.0", - "futures-core", - "futures-io", - "rustix 0.38.25", - "signal-hook-registry", - "slab", - "windows-sys 0.48.0", -] - [[package]] name = "async-std" version = "1.12.0" @@ -482,7 +457,6 @@ dependencies = [ "async-global-executor", "async-io 1.13.0", "async-lock 2.8.0", - "async-process", "crossbeam-utils", "futures-channel", "futures-core", @@ -493,12 +467,34 @@ dependencies = [ "log", "memchr", "once_cell", - "pin-project-lite 0.2.13", + "pin-project-lite", "pin-utils", "slab", "wasm-bindgen-futures", ] +[[package]] +name = "async-stream" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b5a71a6f37880a80d1d7f19efd781e4b5de42c88f0722cc13bcb6cc2cfe8476" +dependencies = [ + "async-stream-impl", + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "async-stream-impl" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d" +dependencies = [ + "proc-macro2 1.0.107", + "quote 1.0.47", + "syn 2.0.119", +] + [[package]] name = "async-task" version = "4.6.0" @@ -511,9 +507,9 @@ version = "0.1.74" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a66537f1bb974b254c98ed142ff995236e81b9d0fe4db0575f46612cb15eb0f9" dependencies = [ - "proc-macro2 1.0.70", - "quote 1.0.33", - "syn 2.0.39", + "proc-macro2 1.0.107", + "quote 1.0.47", + "syn 2.0.119", ] [[package]] @@ -522,14 +518,13 @@ version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a982d2f86de6137cc05c9db9a915a19886c97911f9790d04f174cede74be01a5" dependencies = [ - "async-std", "blanket", "futures-core", "futures-task", "futures-util", "pin-project", "rustc_version", - "tokio 1.37.0", + "tokio", ] [[package]] @@ -538,11 +533,11 @@ version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a860072022177f903e59730004fb5dc13db9275b79bb2aef7ba8ce831956c233" dependencies = [ - "bytes 1.5.0", + "bytes 1.12.1", "futures-sink", "futures-util", "memchr", - "pin-project-lite 0.2.13", + "pin-project-lite", ] [[package]] @@ -574,7 +569,7 @@ checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" dependencies = [ "hermit-abi 0.1.19", "libc", - "winapi 0.3.9", + "winapi", ] [[package]] @@ -623,12 +618,6 @@ dependencies = [ "safemem", ] -[[package]] -name = "base64" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b41b7ea54a0c9d92199de89e20e58d49f02f8e699814ef3fdf266f6f748d15c7" - [[package]] name = "base64" version = "0.12.3" @@ -647,11 +636,17 @@ version = "0.21.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "35636a1494ede3b646cc98f74f8e62c773a38a659ebc777a2cf26b9b74171df9" +[[package]] +name = "base64" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" + [[package]] name = "base64ct" -version = "1.6.0" +version = "1.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" +checksum = "2af50177e190e07a26ab74f8b1efbfe2ef87da2116221318cb1c2e82baf7de06" [[package]] name = "bech32" @@ -666,16 +661,29 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cf9ff0bbfd639f15c74af777d81383cf53efb7c93613f6cab67c6c11e05bbf8b" [[package]] -name = "bit-vec" -version = "0.6.3" +name = "bincode" +version = "1.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "349f9b6a179ed607305526ca489b34ad0a41aed5f7980fa90eb03160b69598fb" +checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad" +dependencies = [ + "serde", +] [[package]] -name = "bitflags" -version = "0.9.1" +name = "bincode" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36eaf5d7b090263e8150820482d5d93cd964a81e4019913c972f4edcc6edb740" +dependencies = [ + "serde", + "unty", +] + +[[package]] +name = "bit-vec" +version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4efd02e230a02e18f92fc2735f44597385ed02ad8f831e7c1c1156ee5e1ab3a5" +checksum = "349f9b6a179ed607305526ca489b34ad0a41aed5f7980fa90eb03160b69598fb" [[package]] name = "bitflags" @@ -685,9 +693,12 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.4.1" +version = "2.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "327762f6e5a765692301e5bb513e0d9fef63be86bbc14528052b1cd3e6f03e07" +checksum = "b588b76d00fde79687d7646a9b5bdf3cc0f655e0bbd080335a95d7e96f3587da" +dependencies = [ + "serde_core", +] [[package]] name = "bitvec" @@ -717,9 +728,9 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e0b121a9fe0df916e362fb3271088d071159cdf11db0e4182d02152850756eff" dependencies = [ - "proc-macro2 1.0.70", - "quote 1.0.33", - "syn 2.0.39", + "proc-macro2 1.0.107", + "quote 1.0.47", + "syn 2.0.119", ] [[package]] @@ -770,19 +781,13 @@ dependencies = [ "async-channel 2.1.1", "async-lock 3.2.0", "async-task", - "fastrand 2.0.1", + "fastrand 2.5.0", "futures-io", "futures-lite 2.1.0", "piper", "tracing", ] -[[package]] -name = "bounded-vec-deque" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2225b558afc76c596898f5f1b3fc35cfce0eb1b13635cbd7d1b2a7177dc10ccd" - [[package]] name = "bs58" version = "0.3.1" @@ -796,9 +801,19 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "542f33a8835a0884b006a0c3df3dadd99c0c3f296ed26c2fdc8028e01ad6230c" dependencies = [ "memchr", + "regex-automata 0.4.16", "serde", ] +[[package]] +name = "built" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c0e531d93d39c34eef561e929e8a7f86d77a5af08aac4f6d6e39976c51858e9" +dependencies = [ + "git2", +] + [[package]] name = "bumpalo" version = "3.14.0" @@ -829,16 +844,6 @@ version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" -[[package]] -name = "bytes" -version = "0.4.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "206fdffcfa2df7cbe15601ef46c813fce0965eb3286db6b56c583b814b51c81c" -dependencies = [ - "byteorder", - "iovec", -] - [[package]] name = "bytes" version = "0.5.6" @@ -847,24 +852,26 @@ checksum = "0e4cec68f03f32e44924783795810fa50a7035d8c8ebe78580ad7e6c703fba38" [[package]] name = "bytes" -version = "1.5.0" +version = "1.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2bd12c1caf447e69cd4528f47f94d203fd2582878ecb9e9465484c4148a8223" +checksum = "fc652a48c352aef3ea3aed32080501cf3ef6ed5da78602a020c991775b0aff04" [[package]] name = "caret" -version = "0.4.5" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d55bb9904b8ef817fd66664cba4ecacac936781105c1016b0d2e13b900218db" +checksum = "2bb840a063107846780a14acc022b55bf6c174997a393ffde8b58ff6630c1b56" [[package]] name = "cc" -version = "1.0.83" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0" +checksum = "5add81bb678e6cb321aff7fa0dc7689ad82b112dbc032cea19f91d6b8e3582b9" dependencies = [ + "find-msvc-tools", "jobserver", "libc", + "shlex", ] [[package]] @@ -887,7 +894,7 @@ checksum = "5c80e5460aa66fe3b91d40bcbdab953a597b60053e34d684ac6903f863b680a6" dependencies = [ "cfg-if 1.0.0", "cipher 0.3.0", - "cpufeatures", + "cpufeatures 0.2.11", "zeroize", ] @@ -899,7 +906,18 @@ checksum = "c3613f74bd2eac03dad61bd53dbe620703d4371614fe0bc3b9f04dd36fe4e818" dependencies = [ "cfg-if 1.0.0", "cipher 0.4.4", - "cpufeatures", + "cpufeatures 0.2.11", +] + +[[package]] +name = "chacha20" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d524456ba66e72eb8b115ff89e01e497f8e6d11d78b70b1aa13c0fbd97540a81" +dependencies = [ + "cfg-if 1.0.0", + "cpufeatures 0.3.0", + "rand_core 0.10.1", ] [[package]] @@ -917,17 +935,16 @@ dependencies = [ [[package]] name = "chrono" -version = "0.4.31" +version = "0.4.45" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f2c685bad3eb3d45a01354cedb7d5faa66194d1d58ba6e267a8de788f79db38" +checksum = "1aa79e62e7697b8e29b513a68abacf485adcd1fe8284a4316c5ae868e6633327" dependencies = [ - "android-tzdata", "iana-time-zone", "js-sys", "num-traits 0.2.17", "serde", "wasm-bindgen", - "windows-targets 0.48.5", + "windows-link", ] [[package]] @@ -963,7 +980,7 @@ dependencies = [ "textwrap", "unicode-width", "vec_map", - "yaml-rust 0.3.5", + "yaml-rust", ] [[package]] @@ -1009,9 +1026,12 @@ checksum = "245097e9a4535ee1e3e3931fcfcd55a796a44c643e8596ff6566d68f09b87bbc" [[package]] name = "convert_case" -version = "0.4.0" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" +checksum = "633458d4ef8c78b72454de2d54fd6ab2e60f9e02be22f3c6104cdc8a4e0fceb9" +dependencies = [ + "unicode-segmentation", +] [[package]] name = "cookie-factory" @@ -1021,41 +1041,44 @@ checksum = "396de984970346b0d9e93d1415082923c679e5ae5c3ee3dcbd104f5610af126b" [[package]] name = "core-foundation" -version = "0.7.0" +version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57d24c7a13c43e870e37c1556b74555437870a04514f7685f5b354e090567171" +checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" dependencies = [ - "core-foundation-sys 0.7.0", + "core-foundation-sys", "libc", ] [[package]] name = "core-foundation" -version = "0.9.4" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" +checksum = "b2a6cd9ae233e7f62ba4e9353e81a88df7fc8a5987b8d445b4d90c879bd156f6" dependencies = [ - "core-foundation-sys 0.8.6", + "core-foundation-sys", "libc", ] [[package]] name = "core-foundation-sys" -version = "0.7.0" +version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3a71ab494c0b5b860bdc8407ae08978052417070c2ced38573a9157ad75b8ac" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" [[package]] -name = "core-foundation-sys" -version = "0.8.6" +name = "cpufeatures" +version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" +checksum = "ce420fe07aecd3e67c5f910618fe65e94158f6dcc0adf44e00d69ce2bdfe0fd0" +dependencies = [ + "libc", +] [[package]] name = "cpufeatures" -version = "0.2.11" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce420fe07aecd3e67c5f910618fe65e94158f6dcc0adf44e00d69ce2bdfe0fd0" +checksum = "8b2a41393f66f16b0823bb79094d54ac5fbd34ab292ddafb9a0456ac9f87d201" dependencies = [ "libc", ] @@ -1170,7 +1193,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ac574ff4d437a7b5ad237ef331c17ccca63c46479e5b5453eb8e10bb99a759fe" dependencies = [ "csv-core", - "itoa 1.0.9", + "itoa", "ryu", "serde", ] @@ -1184,15 +1207,6 @@ dependencies = [ "memchr", ] -[[package]] -name = "ct-logs" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d3686f5fa27dbc1d76c751300376e167c5a43387f44bb451fd1c24776e49113" -dependencies = [ - "sct", -] - [[package]] name = "ctr" version = "0.9.2" @@ -1214,12 +1228,12 @@ dependencies = [ [[package]] name = "curve25519-dalek" -version = "2.1.3" +version = "3.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a9b85542f99a2dfa2a1b8e192662741c9859a846b296bef1c92ef9b58b5a216" +checksum = "0b9fdf9972b2bd6af2d913799d9ebc165ea4d2e65878e329d9c6b372c4491b61" dependencies = [ "byteorder", - "digest 0.8.1", + "digest 0.9.0", "rand_core 0.5.1", "subtle", "zeroize", @@ -1227,29 +1241,31 @@ dependencies = [ [[package]] name = "curve25519-dalek" -version = "3.2.0" +version = "4.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b9fdf9972b2bd6af2d913799d9ebc165ea4d2e65878e329d9c6b372c4491b61" +checksum = "0a677b8922c94e01bdbb12126b0bc852f00447528dee1782229af9c720c3f348" dependencies = [ - "byteorder", - "digest 0.9.0", - "rand_core 0.5.1", + "cfg-if 1.0.0", + "cpufeatures 0.2.11", + "curve25519-dalek-derive", + "digest 0.10.7", + "fiat-crypto 0.2.7", + "platforms", + "rustc_version", "subtle", "zeroize", ] [[package]] name = "curve25519-dalek" -version = "4.1.2" +version = "5.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a677b8922c94e01bdbb12126b0bc852f00447528dee1782229af9c720c3f348" +checksum = "b5eed333089e2e1c1ac8c6c0398e5e2497b4c9926ca6d0365ed1e099afa5bc23" dependencies = [ "cfg-if 1.0.0", - "cpufeatures", + "cpufeatures 0.3.0", "curve25519-dalek-derive", - "digest 0.10.7", - "fiat-crypto", - "platforms", + "fiat-crypto 0.3.0", "rustc_version", "subtle", "zeroize", @@ -1261,9 +1277,9 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" dependencies = [ - "proc-macro2 1.0.70", - "quote 1.0.33", - "syn 2.0.39", + "proc-macro2 1.0.107", + "quote 1.0.47", + "syn 2.0.119", ] [[package]] @@ -1275,16 +1291,6 @@ dependencies = [ "cfg-if 1.0.0", ] -[[package]] -name = "darling" -version = "0.13.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a01d95850c592940db9b8194bc39f4bc0e89dee5c4265e4b1807c34a9aba453c" -dependencies = [ - "darling_core 0.13.4", - "darling_macro 0.13.4", -] - [[package]] name = "darling" version = "0.14.4" @@ -1306,17 +1312,13 @@ dependencies = [ ] [[package]] -name = "darling_core" -version = "0.13.4" +name = "darling" +version = "0.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "859d65a907b6852c9361e3185c862aae7fafd2887876799fa55f5f99dc40d610" +checksum = "9cdf337090841a411e2a7f3deb9187445851f91b309c0c0a29e05f74a00a48c0" dependencies = [ - "fnv", - "ident_case", - "proc-macro2 1.0.70", - "quote 1.0.33", - "strsim 0.10.0", - "syn 1.0.109", + "darling_core 0.21.3", + "darling_macro 0.21.3", ] [[package]] @@ -1327,8 +1329,8 @@ checksum = "109c1ca6e6b7f82cc233a97004ea8ed7ca123a9af07a8230878fcfda9b158bf0" dependencies = [ "fnv", "ident_case", - "proc-macro2 1.0.70", - "quote 1.0.33", + "proc-macro2 1.0.107", + "quote 1.0.47", "strsim 0.10.0", "syn 1.0.109", ] @@ -1341,21 +1343,23 @@ checksum = "9c2cf1c23a687a1feeb728783b993c4e1ad83d99f351801977dd809b48d0a70f" dependencies = [ "fnv", "ident_case", - "proc-macro2 1.0.70", - "quote 1.0.33", + "proc-macro2 1.0.107", + "quote 1.0.47", "strsim 0.10.0", - "syn 2.0.39", + "syn 2.0.119", ] [[package]] -name = "darling_macro" -version = "0.13.4" +name = "darling_core" +version = "0.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c972679f83bdf9c42bd905396b6c3588a843a17f0f16dfcfa3e2c5d57441835" +checksum = "1247195ecd7e3c85f83c8d2a366e4210d588e802133e1e355180a9870b517ea4" dependencies = [ - "darling_core 0.13.4", - "quote 1.0.33", - "syn 1.0.109", + "fnv", + "ident_case", + "proc-macro2 1.0.107", + "quote 1.0.47", + "syn 2.0.119", ] [[package]] @@ -1365,7 +1369,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a4aab4dbc9f7611d8b55048a3a16d2d010c2c8334e46304b40ac1cc14bf3b48e" dependencies = [ "darling_core 0.14.4", - "quote 1.0.33", + "quote 1.0.47", "syn 1.0.109", ] @@ -1376,8 +1380,19 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a668eda54683121533a393014d8692171709ff57a7d61f187b6e782719f8933f" dependencies = [ "darling_core 0.20.8", - "quote 1.0.33", - "syn 2.0.39", + "quote 1.0.47", + "syn 2.0.119", +] + +[[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", + "quote 1.0.47", + "syn 2.0.119", ] [[package]] @@ -1388,9 +1403,9 @@ checksum = "978747c1d849a7d2ee5e8adc0159961c48fb7e5db2f06af6723b80123bb53856" dependencies = [ "cfg-if 1.0.0", "hashbrown 0.14.3", - "lock_api 0.4.11", + "lock_api", "once_cell", - "parking_lot_core 0.9.9", + "parking_lot_core 0.9.12", ] [[package]] @@ -1411,67 +1426,54 @@ dependencies = [ ] [[package]] -name = "deranged" -version = "0.3.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4" -dependencies = [ - "powerfmt", - "serde", -] - -[[package]] -name = "derive-adhoc" -version = "0.7.3" +name = "der-parser" +version = "10.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5283ac2881753c76c0892406705553f0d9ab30649f81e18964d3408f4501edb8" +checksum = "07da5016415d5a3c4dd39b11ed26f915f52fc4e0dc197d87908bc916e51bc1a6" dependencies = [ - "derive-adhoc-macros", - "heck 0.4.1", + "asn1-rs", + "cookie-factory", + "displaydoc", + "nom", + "num-traits 0.2.17", + "rusticata-macros", ] [[package]] -name = "derive-adhoc-macros" -version = "0.7.3" +name = "deranged" +version = "0.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c21b673a9b8c78c34908e6fcb42b922e11c4df2de5237f1c3f58d3285904a84b" +checksum = "7cd812cc2bc1d69d4764bd80df88b4317eaef9e773c75226407d9bc0876b211c" dependencies = [ - "heck 0.4.1", - "itertools 0.10.5", - "proc-macro-crate 1.3.1", - "proc-macro2 1.0.70", - "quote 1.0.33", - "sha3 0.10.8", - "strum 0.25.0", - "syn 1.0.109", - "void", + "serde_core", ] [[package]] name = "derive-deftly" -version = "0.10.5" +version = "1.11.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c173dfcd5b92893ab05a8efb18b9522db4db6e0b93db5740f397573c027ce1e" +checksum = "98e02cd118058400797c74550dca132b57cf2e6af0e9ea0672a83eb186fd655e" dependencies = [ "derive-deftly-macros", - "heck 0.4.1", + "heck 0.5.0", ] [[package]] name = "derive-deftly-macros" -version = "0.10.5" +version = "1.11.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "216fa20211bcd18cc359b75413bfb6cf89f62568fa27bc5fed3778a7a16e17af" +checksum = "ba91f619216e76a5eb2515783f7ec2e271938b51aadac592f4930517f4626863" dependencies = [ - "heck 0.4.1", - "indexmap 2.1.0", - "itertools 0.12.0", + "heck 0.5.0", + "indexmap 2.14.0", + "itertools 0.14.0", "proc-macro-crate 3.1.0", - "proc-macro2 1.0.70", - "quote 1.0.33", + "proc-macro2 1.0.107", + "quote 1.0.47", "sha3 0.10.8", - "strum 0.26.2", - "syn 2.0.39", + "strum 0.28.0", + "syn 3.0.3", + "unicode-ident", "void", ] @@ -1482,8 +1484,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "24c1b715c79be6328caa9a5e1a387a196ea503740f0722ec3dd8f67a9e72314d" dependencies = [ "darling 0.14.4", - "proc-macro2 1.0.70", - "quote 1.0.33", + "proc-macro2 1.0.107", + "quote 1.0.47", "syn 1.0.109", ] @@ -1508,17 +1510,33 @@ dependencies = [ [[package]] name = "derive_more" -version = "0.99.17" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d751e9e49156b02b44f9c1815bcb94b984cdcc4396ecc32521c739452808b134" +dependencies = [ + "derive_more-impl", +] + +[[package]] +name = "derive_more-impl" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fb810d30a7c1953f91334de7244731fc3f3c10d7fe163338a35b9f640960321" +checksum = "799a97264921d8623a957f6c3b9011f3b5492f557bbb7a5a19b7fa6d06ba8dcb" dependencies = [ "convert_case", - "proc-macro2 1.0.70", - "quote 1.0.33", + "proc-macro2 1.0.107", + "quote 1.0.47", "rustc_version", - "syn 1.0.109", + "syn 2.0.119", + "unicode-xid 0.2.6", ] +[[package]] +name = "destructure_traitobject" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c877555693c14d2f84191cfd3ad8582790fc52b5e2274b40b59cf5f5cea25c7" + [[package]] name = "digest" version = "0.8.1" @@ -1551,11 +1569,11 @@ dependencies = [ [[package]] name = "directories" -version = "5.0.1" +version = "6.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a49173b84e034382284f27f1af4dcbbd231ffa358c0fe316541a7337f376a35" +checksum = "16f5094c54661b38d03bd7e50df373292118db60b585c08a411c6d840017fe7d" dependencies = [ - "dirs-sys 0.4.1", + "dirs-sys 0.5.0", ] [[package]] @@ -1577,6 +1595,15 @@ dependencies = [ "dirs-sys 0.4.1", ] +[[package]] +name = "dirs" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3e8aa94d75141228480295a7d0e7feb620b1a5ad9f12bc40be62411e38cce4e" +dependencies = [ + "dirs-sys 0.5.0", +] + [[package]] name = "dirs-next" version = "2.0.0" @@ -1594,8 +1621,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b1d1d91c932ef41c0f2663aa8b0ca0342d444d842c06914aa0a7e352d0bada6" dependencies = [ "libc", - "redox_users", - "winapi 0.3.9", + "redox_users 0.4.4", + "winapi", ] [[package]] @@ -1606,10 +1633,22 @@ checksum = "520f05a5cbd335fae5a99ff7a6ab8627577660ee5cfd6a94a6a929b52ff0321c" dependencies = [ "libc", "option-ext", - "redox_users", + "redox_users 0.4.4", "windows-sys 0.48.0", ] +[[package]] +name = "dirs-sys" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e01a3366d27ee9890022452ee61b2b63a67e6f13f58900b651ff5665f0bb1fab" +dependencies = [ + "libc", + "option-ext", + "redox_users 0.5.2", + "windows-sys 0.61.2", +] + [[package]] name = "dirs-sys-next" version = "0.1.2" @@ -1617,8 +1656,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4ebda144c4fe02d1f7ea1a7d9641b6fc6b580adcfa024ae48797ecdeb6825b4d" dependencies = [ "libc", - "redox_users", - "winapi 0.3.9", + "redox_users 0.4.4", + "winapi", ] [[package]] @@ -1627,16 +1666,25 @@ version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "487585f4d0c6655fe74905e2504d8ad6908e4db67f744eb140876906c2f3175d" dependencies = [ - "proc-macro2 1.0.70", - "quote 1.0.33", - "syn 2.0.39", + "proc-macro2 1.0.107", + "quote 1.0.47", + "syn 2.0.119", ] [[package]] name = "downcast-rs" -version = "1.2.1" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "117240f60069e65410b3ae1bb213295bd828f707b5bec6596a1afc8793ce0cbc" + +[[package]] +name = "doxygen-rs" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75b325c5dbd37f80359721ad39aca5a29fb04c89279657cffdda8736d0c0b9d2" +checksum = "415b6ec780d34dcf624666747194393603d0373b7141eef01d12ee58881507d9" +dependencies = [ + "phf 0.11.2", +] [[package]] name = "dyn-clone" @@ -1679,19 +1727,10 @@ dependencies = [ "digest 0.10.7", "elliptic-curve", "rfc6979", - "signature 2.2.0", + "signature", "spki", ] -[[package]] -name = "ed25519" -version = "1.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91cff35c70bba8a626e3185d8cd48cc11b5437e1a5bcd15b9b5fa3c64b6dfee7" -dependencies = [ - "signature 1.6.4", -] - [[package]] name = "ed25519" version = "2.2.3" @@ -1699,31 +1738,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "115531babc129696a58c64a4fef0a8bf9e9698629fb97e9e40767d235cfbcd53" dependencies = [ "pkcs8", - "signature 2.2.0", -] - -[[package]] -name = "ed25519-dalek" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c762bae6dcaf24c4c84667b8579785430908723d5c889f469d76a41d59cc7a9d" -dependencies = [ - "curve25519-dalek 3.2.0", - "ed25519 1.5.3", - "rand 0.7.3", - "serde", - "sha2 0.9.9", - "zeroize", + "signature", ] [[package]] name = "ed25519-dalek" -version = "2.1.1" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a3daa8e81a3963a60642bcc1f90a670680bd4a77535faa384e9d1c79d620871" +checksum = "70e796c081cee67dc755e1a36a0a172b897fab85fc3f6bc48307991f64e4eca9" dependencies = [ "curve25519-dalek 4.1.2", - "ed25519 2.2.3", + "ed25519", "merlin", "rand_core 0.6.4", "serde", @@ -1739,8 +1764,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0f0042ff8246a363dbe77d2ceedb073339e85a804b9a47636c6e016a9a32c05f" dependencies = [ "enum-ordinalize", - "proc-macro2 1.0.70", - "quote 1.0.33", + "proc-macro2 1.0.107", + "quote 1.0.47", "syn 1.0.109", ] @@ -1792,9 +1817,21 @@ checksum = "1bf1fa3f06bbff1ea5b1a9c7b14aa992a39657db60a2759457328d7e058f49ee" dependencies = [ "num-bigint 0.4.4", "num-traits 0.2.17", - "proc-macro2 1.0.70", - "quote 1.0.33", - "syn 2.0.39", + "proc-macro2 1.0.107", + "quote 1.0.47", + "syn 2.0.119", +] + +[[package]] +name = "enum_dispatch" +version = "0.3.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa18ce2bc66555b3218614519ac839ddb759a7d6720732f979ef8d13be147ecd" +dependencies = [ + "once_cell", + "proc-macro2 1.0.107", + "quote 1.0.47", + "syn 2.0.119", ] [[package]] @@ -1807,16 +1844,24 @@ dependencies = [ ] [[package]] -name = "env_logger" -version = "0.5.13" +name = "enumset" +version = "1.1.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15b0a4d2e39f8420210be8b27eeda28029729e2fd4291019455016c348240c38" +checksum = "ccc5801fd11762e24d1e420d01d2ac518f2a2ca4329d4fbb6639f2412b6204e0" dependencies = [ - "atty", - "humantime 1.3.0", - "log", - "regex", - "termcolor", + "enumset_derive", +] + +[[package]] +name = "enumset_derive" +version = "0.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4bd536557b58c682b217b8fb199afdff47cd3eff260623f19e77074eb073d63a" +dependencies = [ + "darling 0.21.3", + "proc-macro2 1.0.107", + "quote 1.0.47", + "syn 2.0.119", ] [[package]] @@ -1841,17 +1886,6 @@ version = "2.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" -[[package]] -name = "event-listener" -version = "3.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d93877bcde0eb80ca09131a08d23f0a5c18a620b01db137dba666d18cd9b30c2" -dependencies = [ - "concurrent-queue", - "parking", - "pin-project-lite 0.2.13", -] - [[package]] name = "event-listener" version = "4.0.0" @@ -1860,7 +1894,7 @@ checksum = "770d968249b5d99410d61f5bf89057f3199a077a04d087092f58e7d10692baae" dependencies = [ "concurrent-queue", "parking", - "pin-project-lite 0.2.13", + "pin-project-lite", ] [[package]] @@ -1871,7 +1905,7 @@ checksum = "6d9944b8ca13534cdfb2800775f8dd4902ff3fc75a50101466decadfdf322a24" dependencies = [ "concurrent-queue", "parking", - "pin-project-lite 0.2.13", + "pin-project-lite", ] [[package]] @@ -1881,7 +1915,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "958e4d70b6d5e81971bebec42271ec641e7ff4e170a6fa605f2b8a8b65cb97d3" dependencies = [ "event-listener 4.0.0", - "pin-project-lite 0.2.13", + "pin-project-lite", ] [[package]] @@ -1907,9 +1941,9 @@ dependencies = [ [[package]] name = "fastrand" -version = "2.0.1" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25cbce373ec4653f1a01a31e8a5e5ec0c622dc27ff9c4e6606eefef5cbbed4a5" +checksum = "da7c62ceae207dd37ea5b845da6a0696c799f85e97da1ab5b7910be3c1c80223" [[package]] name = "ff" @@ -1927,6 +1961,12 @@ version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c007b1ae3abe1cb6f85a16305acd418b7ca6343b953633fee2b76d8f108b830f" +[[package]] +name = "fiat-crypto" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64cd1e32ddd350061ae6edb1b082d7c54915b5c672c389143b9a63403a109f24" + [[package]] name = "figment" version = "0.10.18" @@ -1961,6 +2001,12 @@ dependencies = [ "toml 0.5.11", ] +[[package]] +name = "find-msvc-tools" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582" + [[package]] name = "flate2" version = "1.0.28" @@ -2012,7 +2058,7 @@ version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c0abed97648395c902868fee9026de96483933faa54ea3b40d652f7dfe61ca78" dependencies = [ - "thiserror", + "thiserror 1.0.30", ] [[package]] @@ -2027,6 +2073,12 @@ 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 = "foreign-types" version = "0.3.2" @@ -2044,27 +2096,26 @@ checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" [[package]] name = "form_urlencoded" -version = "1.2.1" +version = "1.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" +checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" dependencies = [ "percent-encoding", ] [[package]] name = "fs-mistrust" -version = "0.7.9" +version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5764b75624acb3ec878488145198a8fed761ca18fe26759d4ac4c7543fd2373a" +checksum = "cd938e053fbfb6dba36106f4bcf27c53362e6152adc9341700c4bc2264cd4a8f" dependencies = [ "derive_builder_fork_arti", - "dirs 5.0.1", - "educe", + "dirs 6.0.0", "libc", - "once_cell", "pwd-grp", "serde", - "thiserror", + "thiserror 2.0.19", + "void", "walkdir", ] @@ -2075,7 +2126,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9564fc758e15025b46aa6643b1b77d047d1a56a1aea6e01002ac0c7026876213" dependencies = [ "libc", - "winapi 0.3.9", + "winapi", ] [[package]] @@ -2092,35 +2143,15 @@ dependencies = [ "windows-sys 0.48.0", ] -[[package]] -name = "fslock" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04412b8935272e3a9bae6f48c7bfff74c2911f60525404edfdd28e49884c3bfb" -dependencies = [ - "libc", - "winapi 0.3.9", -] - -[[package]] -name = "fslock-arti-fork" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b21bd626aaab7b904b20bef6d9e06298914a0c8d9fb8b010483766b2e532791" -dependencies = [ - "libc", - "winapi 0.3.9", -] - [[package]] name = "fslock-guard" -version = "0.1.2" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9267d03223dd8877b0a3f8341661d21b7ba6a18e90f60e92e550addd30bc32c7" +checksum = "b63307a37c3d90d55a90eefa5441ec12cbd291ff456b6bf1126656c5bc43b058" dependencies = [ - "fslock-arti-fork", - "thiserror", - "winapi 0.3.9", + "libc", + "thiserror 2.0.19", + "windows-sys 0.61.2", ] [[package]] @@ -2129,22 +2160,6 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a06f77d526c1a601b7c4cdd98f54b5eaabffc14d5f2f0296febdc7f357c6d3ba" -[[package]] -name = "fuchsia-zircon" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e9763c69ebaae630ba35f74888db465e49e259ba1bc0eda7d06f4a067615d82" -dependencies = [ - "bitflags 1.3.2", - "fuchsia-zircon-sys", -] - -[[package]] -name = "fuchsia-zircon-sys" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3dcaa9ae7725d12cdb85b3ad99a434db70b468c09ded17e012d86b5c1010f7a7" - [[package]] name = "function_name" version = "0.3.0" @@ -2174,9 +2189,9 @@ checksum = "3a471a38ef8ed83cd6e40aa59c1ffe17db6855c18e3604d9c4ed8c08ebc28678" [[package]] name = "futures" -version = "0.3.29" +version = "0.3.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da0290714b38af9b4a7b094b8a37086d1b4e61f2df9122c3cad2577669145335" +checksum = "a88cf1f829d945f548cf8fec32c61b1f202b6d93b45848602fc02af4b12ad218" dependencies = [ "futures-channel", "futures-core", @@ -2189,25 +2204,37 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.29" +version = "0.3.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff4dd66668b557604244583e3e1e1eada8c5c2e96a6d0d6653ede395b78bbacb" +checksum = "262590f4fe6afeb0bc83be1daa64e52657fe185690a958af7f3ad0e92085c5ae" dependencies = [ "futures-core", "futures-sink", ] +[[package]] +name = "futures-copy" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcad91f8ba72542347d5cc8ee43891abe4698429fa7b3de56f17f4bb6fa514c4" +dependencies = [ + "futures 0.3.33", + "libc", + "pin-project", + "windows-sys 0.61.2", +] + [[package]] name = "futures-core" -version = "0.3.29" +version = "0.3.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb1d22c66e66d9d72e1758f0bd7d4fd0bee04cad842ee34587d68c07e45d088c" +checksum = "2cd50c473c80f6d7c3670a752354b8e569b1a7cbfdc0419ec88e5edad85e0dc7" [[package]] name = "futures-executor" -version = "0.3.29" +version = "0.3.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f4fb8693db0cf099eadcca0efe2a5a22e4550f98ed16aba6c48700da29597bc" +checksum = "6754879cc9f2c66f88c6e5c35344bb0bdb0708b0352b1201815667c7eabc7458" dependencies = [ "futures-core", "futures-task", @@ -2216,9 +2243,9 @@ dependencies = [ [[package]] name = "futures-io" -version = "0.3.29" +version = "0.3.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8bf34a163b5c4c52d0478a4d757da8fb65cabef42ba90515efee0f6f9fa45aaa" +checksum = "4577ecaa3c4f96589d473f679a71b596316f6641bc350038b962a5daf0085d7a" [[package]] name = "futures-lite" @@ -2231,7 +2258,7 @@ dependencies = [ "futures-io", "memchr", "parking", - "pin-project-lite 0.2.13", + "pin-project-lite", "waker-fn", ] @@ -2241,52 +2268,41 @@ version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "aeee267a1883f7ebef3700f262d2d54de95dfaf38189015a74fdc4e0c7ad8143" dependencies = [ - "fastrand 2.0.1", + "fastrand 2.5.0", "futures-core", "futures-io", "parking", - "pin-project-lite 0.2.13", + "pin-project-lite", ] [[package]] name = "futures-macro" -version = "0.3.29" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53b153fd91e4b0147f4aced87be237c98248656bb01050b96bf3ee89220a8ddb" -dependencies = [ - "proc-macro2 1.0.70", - "quote 1.0.33", - "syn 2.0.39", -] - -[[package]] -name = "futures-rustls" -version = "0.26.0" +version = "0.3.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8f2f12607f92c69b12ed746fabf9ca4f5c482cba46679c1a75b874ed7c26adb" +checksum = "2d6d3cde68c518367be28956066ddfef33813991b77a55005a69dae04bf3b10b" dependencies = [ - "futures-io", - "rustls 0.23.5", - "rustls-pki-types", + "proc-macro2 1.0.107", + "quote 1.0.47", + "syn 2.0.119", ] [[package]] name = "futures-sink" -version = "0.3.29" +version = "0.3.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e36d3378ee38c2a36ad710c5d30c2911d752cb941c00c72dbabfb786a7970817" +checksum = "e34418ac499d6305c2fb5ad0ed2f6ac998c5f8ca209b4510f7f94242c647e307" [[package]] name = "futures-task" -version = "0.3.29" +version = "0.3.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "efd193069b0ddadc69c46389b740bbccdd97203899b48d09c5f7969591d6bae2" +checksum = "b231ed28831efb4a61a08580c4bc233ec56bc009f4cd8f52da2c3cb97df0c109" [[package]] name = "futures-util" -version = "0.3.29" +version = "0.3.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a19526d624e703a3179b3d322efec918b6246ea0fa51d41124525f00f1cc8104" +checksum = "a77a90a256fce34da66415271e30f94ee91c57b04b8a2c042d9cf3220179deaa" dependencies = [ "futures-channel", "futures-core", @@ -2295,17 +2311,10 @@ dependencies = [ "futures-sink", "futures-task", "memchr", - "pin-project-lite 0.2.13", - "pin-utils", + "pin-project-lite", "slab", ] -[[package]] -name = "gcc" -version = "0.3.55" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f5f3913fa0bfe7ee1fd8248b6b9f42a5af4b9d65ec2dd2c3c26132b950ecfc2" - [[package]] name = "generic-array" version = "0.12.4" @@ -2350,12 +2359,63 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "getrandom" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" +dependencies = [ + "cfg-if 1.0.0", + "js-sys", + "libc", + "r-efi 5.3.0", + "wasip2", + "wasm-bindgen", +] + +[[package]] +name = "getrandom" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "300e883d756b2e4ec94e02791f39b04b522276138852cfc41d9fb7e904106099" +dependencies = [ + "cfg-if 1.0.0", + "js-sys", + "libc", + "r-efi 6.0.0", + "rand_core 0.10.1", + "wasm-bindgen", +] + +[[package]] +name = "getset" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6cf442baaabe4213ce7d1239afc26c039180b6456da2cededa316ae2c8a77a77" +dependencies = [ + "proc-macro2 1.0.107", + "quote 1.0.47", + "syn 2.0.119", +] + [[package]] name = "gimli" version = "0.28.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" +[[package]] +name = "git2" +version = "0.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ddddbf932745a6be37109b6112d3ee09696106f848449069d3a57bba937ab82e" +dependencies = [ + "bitflags 2.13.1", + "libc", + "libgit2-sys", + "log", +] + [[package]] name = "glob-match" version = "0.2.1" @@ -2371,8 +2431,8 @@ dependencies = [ "aho-corasick", "bstr", "log", - "regex-automata 0.4.3", - "regex-syntax 0.8.2", + "regex-automata 0.4.16", + "regex-syntax 0.8.11", ] [[package]] @@ -2389,40 +2449,41 @@ dependencies = [ [[package]] name = "grin_api" -version = "5.4.0-alpha.0" -source = "git+https://github.com/mimblewimble/grin?branch=master#845c41de13e9bdeb0f0b4667fbc7ef8be921a2f4" +version = "5.5.1-alpha.0" +source = "git+https://github.com/mimblewimble/grin?branch=staging#857254bb1e98fdb039a4e2579a024835e1bd20cb" dependencies = [ - "bytes 0.5.6", + "bytes 1.12.1", "easy-jsonrpc-mw", - "futures 0.3.29", + "futures 0.3.33", "grin_chain", "grin_core", "grin_p2p", "grin_pool", - "grin_store", "grin_util", - "http 0.2.11", - "hyper 0.13.10", - "hyper-rustls 0.20.0", + "http-body-util", + "hyper 1.11.0", + "hyper-rustls", "hyper-timeout", + "hyper-util", "lazy_static", "log", "regex", - "ring 0.16.20", - "rustls 0.17.0", + "rustls", + "rustls-pemfile", "serde", "serde_derive", "serde_json", - "thiserror", - "tokio 0.2.25", - "tokio-rustls 0.13.1", + "subtle", + "thiserror 1.0.30", + "tokio", + "tokio-rustls", "url", ] [[package]] name = "grin_chain" -version = "5.4.0-alpha.0" -source = "git+https://github.com/mimblewimble/grin?branch=master#845c41de13e9bdeb0f0b4667fbc7ef8be921a2f4" +version = "5.5.1-alpha.0" +source = "git+https://github.com/mimblewimble/grin?branch=staging#857254bb1e98fdb039a4e2579a024835e1bd20cb" dependencies = [ "bit-vec", "bitflags 1.3.2", @@ -2439,13 +2500,13 @@ dependencies = [ "lru-cache", "serde", "serde_derive", - "thiserror", + "thiserror 1.0.30", ] [[package]] name = "grin_core" -version = "5.4.0-alpha.0" -source = "git+https://github.com/mimblewimble/grin?branch=master#845c41de13e9bdeb0f0b4667fbc7ef8be921a2f4" +version = "5.5.1-alpha.0" +source = "git+https://github.com/mimblewimble/grin?branch=staging#857254bb1e98fdb039a4e2579a024835e1bd20cb" dependencies = [ "blake2-rfc", "byteorder", @@ -2463,15 +2524,15 @@ dependencies = [ "rand 0.6.5", "serde", "serde_derive", - "siphasher", - "thiserror", + "siphasher 0.3.11", + "thiserror 1.0.30", "zeroize", ] [[package]] name = "grin_keychain" -version = "5.4.0-alpha.0" -source = "git+https://github.com/mimblewimble/grin?branch=master#845c41de13e9bdeb0f0b4667fbc7ef8be921a2f4" +version = "5.5.1-alpha.0" +source = "git+https://github.com/mimblewimble/grin?branch=staging#857254bb1e98fdb039a4e2579a024835e1bd20cb" dependencies = [ "blake2-rfc", "byteorder", @@ -2492,10 +2553,11 @@ dependencies = [ [[package]] name = "grin_p2p" -version = "5.4.0-alpha.0" -source = "git+https://github.com/mimblewimble/grin?branch=master#845c41de13e9bdeb0f0b4667fbc7ef8be921a2f4" +version = "5.5.1-alpha.0" +source = "git+https://github.com/mimblewimble/grin?branch=staging#857254bb1e98fdb039a4e2579a024835e1bd20cb" dependencies = [ "bitflags 1.3.2", + "built", "bytes 0.5.6", "chrono", "enum_primitive", @@ -2514,8 +2576,8 @@ dependencies = [ [[package]] name = "grin_pool" -version = "5.4.0-alpha.0" -source = "git+https://github.com/mimblewimble/grin?branch=master#845c41de13e9bdeb0f0b4667fbc7ef8be921a2f4" +version = "5.5.1-alpha.0" +source = "git+https://github.com/mimblewimble/grin?branch=staging#857254bb1e98fdb039a4e2579a024835e1bd20cb" dependencies = [ "blake2-rfc", "chrono", @@ -2526,14 +2588,14 @@ dependencies = [ "rand 0.6.5", "serde", "serde_derive", - "thiserror", + "thiserror 1.0.30", ] [[package]] name = "grin_secp256k1zkp" -version = "0.7.14" +version = "0.7.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06832645c3d28079245827908045946db48e5d62b4c54b40701c7e21327e2571" +checksum = "bf7bb95f155b1eede2648a1b9afbba82bc3d9f2af0518b478767559a572bd973" dependencies = [ "arrayvec 0.7.4", "cc", @@ -2546,12 +2608,13 @@ dependencies = [ [[package]] name = "grin_servers" -version = "5.4.0-alpha.0" -source = "git+https://github.com/mimblewimble/grin?branch=master#845c41de13e9bdeb0f0b4667fbc7ef8be921a2f4" +version = "5.5.1-alpha.0" +source = "git+https://github.com/mimblewimble/grin?branch=staging#857254bb1e98fdb039a4e2579a024835e1bd20cb" dependencies = [ + "async-stream", "chrono", "fs2", - "futures 0.3.29", + "futures 0.3.33", "grin_api", "grin_chain", "grin_core", @@ -2560,52 +2623,53 @@ dependencies = [ "grin_pool", "grin_store", "grin_util", - "http 0.2.11", - "hyper 0.13.10", - "hyper-rustls 0.20.0", - "lmdb-zero", + "http-body-util", + "hyper 1.11.0", + "hyper-rustls", + "hyper-util", "log", + "millisecond", "rand 0.6.5", "serde", "serde_derive", "serde_json", - "tokio 0.2.25", - "tokio-util 0.2.0", + "tokio", + "tokio-util 0.7.10", "walkdir", ] [[package]] name = "grin_store" -version = "5.4.0-alpha.0" -source = "git+https://github.com/mimblewimble/grin?branch=master#845c41de13e9bdeb0f0b4667fbc7ef8be921a2f4" +version = "5.5.1-alpha.0" +source = "git+https://github.com/mimblewimble/grin?branch=staging#857254bb1e98fdb039a4e2579a024835e1bd20cb" dependencies = [ "byteorder", "croaring", "grin_core", "grin_util", + "heed", "libc", - "lmdb-zero", "log", "memmap", "serde", "serde_derive", "tempfile", - "thiserror", + "thiserror 1.0.30", ] [[package]] name = "grin_util" -version = "5.4.0-alpha.0" -source = "git+https://github.com/mimblewimble/grin?branch=master#845c41de13e9bdeb0f0b4667fbc7ef8be921a2f4" +version = "5.5.1-alpha.0" +source = "git+https://github.com/mimblewimble/grin?branch=staging#857254bb1e98fdb039a4e2579a024835e1bd20cb" dependencies = [ + "anyhow", "backtrace", "base64 0.12.3", - "byteorder", "grin_secp256k1zkp", "lazy_static", "log", "log4rs", - "parking_lot 0.10.2", + "parking_lot 0.12.5", "rand 0.6.5", "serde", "serde_derive", @@ -2616,13 +2680,13 @@ dependencies = [ [[package]] name = "grin_wallet_api" -version = "5.4.0-contracts.0" -source = "git+https://github.com/mimblewimble/grin-wallet?branch=contracts#96b5d240bbc82df25e308ac5f90ec3b2b7b9fd94" +version = "5.4.1" +source = "git+https://github.com/wiesche89/grin-wallet?rev=fed6733a2209aec2ed963a5691d91c6f00b4261d#fed6733a2209aec2ed963a5691d91c6f00b4261d" dependencies = [ "base64 0.12.3", "chrono", "easy-jsonrpc-mw", - "ed25519-dalek 1.0.1", + "ed25519-dalek", "grin_core", "grin_keychain", "grin_util", @@ -2632,7 +2696,7 @@ dependencies = [ "grin_wallet_util", "log", "rand 0.6.5", - "ring 0.16.20", + "ring 0.17.14", "serde", "serde_derive", "serde_json", @@ -2641,28 +2705,28 @@ dependencies = [ [[package]] name = "grin_wallet_config" -version = "5.4.0-contracts.0" -source = "git+https://github.com/mimblewimble/grin-wallet?branch=contracts#96b5d240bbc82df25e308ac5f90ec3b2b7b9fd94" +version = "5.4.1" +source = "git+https://github.com/wiesche89/grin-wallet?rev=fed6733a2209aec2ed963a5691d91c6f00b4261d#fed6733a2209aec2ed963a5691d91c6f00b4261d" dependencies = [ "dirs 2.0.2", "grin_core", "grin_util", - "grin_wallet_util", + "lazy_static", "rand 0.6.5", "serde", "serde_derive", "toml 0.5.11", + "toml_edit 0.22.12", ] [[package]] name = "grin_wallet_controller" -version = "5.4.0-contracts.0" -source = "git+https://github.com/mimblewimble/grin-wallet?branch=contracts#96b5d240bbc82df25e308ac5f90ec3b2b7b9fd94" +version = "5.4.1" +source = "git+https://github.com/wiesche89/grin-wallet?rev=fed6733a2209aec2ed963a5691d91c6f00b4261d#fed6733a2209aec2ed963a5691d91c6f00b4261d" dependencies = [ - "chrono", "easy-jsonrpc-mw", - "futures 0.3.29", "grin_api", + "grin_chain", "grin_core", "grin_keychain", "grin_util", @@ -2671,66 +2735,73 @@ dependencies = [ "grin_wallet_impls", "grin_wallet_libwallet", "grin_wallet_util", - "hyper 0.13.10", + "http-body-util", + "hyper 1.11.0", "lazy_static", "log", "prettytable-rs", "qr_code", "rand 0.7.3", - "ring 0.16.20", "serde", - "serde_derive", "serde_json", "term 0.6.1", - "thiserror", - "tokio 0.2.25", - "url", + "thiserror 1.0.30", + "tokio", "uuid", ] [[package]] name = "grin_wallet_impls" -version = "5.4.0-contracts.0" -source = "git+https://github.com/mimblewimble/grin-wallet?branch=contracts#96b5d240bbc82df25e308ac5f90ec3b2b7b9fd94" +version = "5.4.1" +source = "git+https://github.com/wiesche89/grin-wallet?rev=fed6733a2209aec2ed963a5691d91c6f00b4261d#fed6733a2209aec2ed963a5691d91c6f00b4261d" dependencies = [ + "arti-client", "base64 0.12.3", "blake2-rfc", - "byteorder", + "bytes 1.12.1", "chrono", - "data-encoding", - "ed25519-dalek 1.0.1", - "futures 0.3.29", + "ed25519-dalek", + "fs-mistrust", + "fslock-guard", + "futures 0.3.33", "grin_api", "grin_chain", "grin_core", "grin_keychain", - "grin_store", "grin_util", "grin_wallet_config", "grin_wallet_libwallet", "grin_wallet_util", + "http-body-util", + "hyper 1.11.0", + "hyper-util", "lazy_static", "log", "rand 0.6.5", "regex", "reqwest", - "ring 0.16.20", + "ring 0.17.14", "serde", "serde_derive", "serde_json", - "sysinfo", - "thiserror", + "sha2 0.10.8", + "sysinfo 0.29.11", + "thiserror 1.0.30", "timer", - "tokio 0.2.25", + "tokio", + "tor-hscrypto", + "tor-hsrproxy", + "tor-hsservice", + "tor-keymgr", + "tor-llcrypto", + "tor-rtcompat", "url", - "uuid", - "x25519-dalek 0.6.0", ] [[package]] name = "grin_wallet_libwallet" -version = "5.4.0-contracts.0" -source = "git+https://github.com/mimblewimble/grin-wallet?branch=contracts#96b5d240bbc82df25e308ac5f90ec3b2b7b9fd94" +version = "5.4.1" +source = "git+https://github.com/wiesche89/grin-wallet?rev=fed6733a2209aec2ed963a5691d91c6f00b4261d#fed6733a2209aec2ed963a5691d91c6f00b4261d" dependencies = [ "age", "base64 0.9.3", @@ -2740,11 +2811,10 @@ dependencies = [ "byteorder", "chacha20 0.8.2", "chrono", - "curve25519-dalek 2.1.3", - "ed25519-dalek 1.0.1", + "curve25519-dalek 5.0.0", + "ed25519-dalek", "grin_core", "grin_keychain", - "grin_secp256k1zkp", "grin_store", "grin_util", "grin_wallet_config", @@ -2755,32 +2825,29 @@ dependencies = [ "num-bigint 0.2.6", "rand 0.6.5", "regex", - "secrecy 0.6.0", "serde", "serde_derive", "serde_json", - "serde_with 1.14.0", "sha2 0.10.8", "strum 0.18.0", "strum_macros 0.18.0", - "thiserror", + "thiserror 1.0.30", "uuid", - "x25519-dalek 0.6.0", + "x25519-dalek 2.0.1", ] [[package]] name = "grin_wallet_util" -version = "5.4.0-contracts.0" -source = "git+https://github.com/mimblewimble/grin-wallet?branch=contracts#96b5d240bbc82df25e308ac5f90ec3b2b7b9fd94" +version = "5.4.1" +source = "git+https://github.com/wiesche89/grin-wallet?rev=fed6733a2209aec2ed963a5691d91c6f00b4261d#fed6733a2209aec2ed963a5691d91c6f00b4261d" dependencies = [ "data-encoding", - "ed25519-dalek 1.0.1", + "ed25519-dalek", "grin_util", - "rand 0.6.5", "serde", "serde_derive", "sha3 0.8.2", - "thiserror", + "thiserror 1.0.30", ] [[package]] @@ -2808,22 +2875,21 @@ dependencies = [ [[package]] name = "h2" -version = "0.2.7" +version = "0.4.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e4728fd124914ad25e99e3d15a9361a879f6620f63cb56bbb08f95abb97a535" +checksum = "6cb093c84e8bd9b188d4c4a8cb6579fc016968d14c99882163cd3ff402a4f155" dependencies = [ - "bytes 0.5.6", + "atomic-waker", + "bytes 1.12.1", "fnv", "futures-core", "futures-sink", - "futures-util", - "http 0.2.11", - "indexmap 1.9.3", + "http 1.1.0", + "indexmap 2.14.0", "slab", - "tokio 0.2.25", - "tokio-util 0.3.1", + "tokio", + "tokio-util 0.7.10", "tracing", - "tracing-futures", ] [[package]] @@ -2837,18 +2903,29 @@ name = "hashbrown" version = "0.14.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" + +[[package]] +name = "hashbrown" +version = "0.15.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" dependencies = [ - "ahash", - "allocator-api2", + "foldhash", ] +[[package]] +name = "hashbrown" +version = "0.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed5909b6e89a2db4456e54cd5f673791d7eca6732202bbf2a9cc504fe2f9b84a" + [[package]] name = "hashlink" -version = "0.9.0" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "692eaaf7f7607518dd3cef090f1474b61edc5301d8012f09579920df68b725ee" +checksum = "7382cf6263419f2d8df38c55d7da83da5c18aef87fc7a7fc1fb1e344edfe14c1" dependencies = [ - "hashbrown 0.14.3", + "hashbrown 0.15.5", ] [[package]] @@ -2862,9 +2939,47 @@ dependencies = [ [[package]] name = "heck" -version = "0.4.1" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + +[[package]] +name = "heed" +version = "0.22.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" +checksum = "ad82d6598ccf1dac15c8b758a1bd282b755b6776be600429176757190a1b0202" +dependencies = [ + "bitflags 2.13.1", + "byteorder", + "heed-traits", + "heed-types", + "libc", + "lmdb-master-sys", + "once_cell", + "page_size", + "serde", + "synchronoise", + "url", +] + +[[package]] +name = "heed-traits" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb3130048d404c57ce5a1ac61a903696e8fcde7e8c2991e9fcfc1f27c3ef74ff" + +[[package]] +name = "heed-types" +version = "0.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13c255bdf46e07fb840d120a36dcc81f385140d7191c76a7391672675c01a55d" +dependencies = [ + "bincode 1.3.3", + "byteorder", + "heed-traits", + "serde", + "serde_json", +] [[package]] name = "hermit-abi" @@ -2887,16 +3002,6 @@ version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" -[[package]] -name = "hkdf" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01706d578d5c281058480e673ae4086a9f4710d8df1ad80a5b03e39ece5f886b" -dependencies = [ - "digest 0.9.0", - "hmac 0.11.0", -] - [[package]] name = "hkdf" version = "0.12.4" @@ -2937,9 +3042,9 @@ version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8947b1a6fad4393052c7ba1f4cd97bed3e953a95c79c92ad9b051a04611d9fbb" dependencies = [ - "bytes 1.5.0", + "bytes 1.12.1", "fnv", - "itoa 1.0.9", + "itoa", ] [[package]] @@ -2948,19 +3053,9 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "21b9ddb458710bc376481b842f5da65cdf31522de232c1ca8146abce2a358258" dependencies = [ - "bytes 1.5.0", + "bytes 1.12.1", "fnv", - "itoa 1.0.9", -] - -[[package]] -name = "http-body" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13d5ff830006f7646652e057693569bfe0d51760c0085a071769d142a205111b" -dependencies = [ - "bytes 0.5.6", - "http 0.2.11", + "itoa", ] [[package]] @@ -2969,9 +3064,9 @@ version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d5f38f16d184e36f2408a55281cd658ecbd3ca05cce6d6510a176eca393e26d1" dependencies = [ - "bytes 1.5.0", + "bytes 1.12.1", "http 0.2.11", - "pin-project-lite 0.2.13", + "pin-project-lite", ] [[package]] @@ -2980,34 +3075,28 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1cac85db508abc24a2e48553ba12a996e87244a0395ce011e62b37158745d643" dependencies = [ - "bytes 1.5.0", + "bytes 1.12.1", "http 1.1.0", ] [[package]] name = "http-body-util" -version = "0.1.1" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0475f8b2ac86659c21b64320d5d653f9efe42acd2a4e560073ec61a155a34f1d" +checksum = "e9f41fd6a08e4d4ec69df65976da761afd5ad5e58a9d4acb46bd1c953a9e3ff2" dependencies = [ - "bytes 1.5.0", + "bytes 1.12.1", "futures-core", "http 1.1.0", "http-body 1.0.0", - "pin-project-lite 0.2.13", + "pin-project-lite", ] [[package]] name = "httparse" -version = "1.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" - -[[package]] -name = "httpdate" -version = "0.3.2" +version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "494b4d60369511e7dea41cf646832512a94e542f68bb9c49e54518e0f468eb47" +checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" [[package]] name = "httpdate" @@ -3015,15 +3104,6 @@ version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" -[[package]] -name = "humantime" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df004cfca50ef23c36850aaaa59ad52cc70d0e90243c3c7737a4dd32dc7a3c4f" -dependencies = [ - "quick-error", -] - [[package]] name = "humantime" version = "2.1.0" @@ -3036,52 +3116,28 @@ version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "57a3db5ea5923d99402c94e9feb261dc5ee9b4efa158b0315f788cf549cc200c" dependencies = [ - "humantime 2.1.0", + "humantime", "serde", ] [[package]] name = "hyper" -version = "0.13.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a6f157065790a3ed2f88679250419b5cdd96e714a0d65f7797fd337186e96bb" -dependencies = [ - "bytes 0.5.6", - "futures-channel", - "futures-core", - "futures-util", - "h2", - "http 0.2.11", - "http-body 0.3.1", - "httparse", - "httpdate 0.3.2", - "itoa 0.4.8", - "pin-project", - "socket2 0.3.19", - "tokio 0.2.25", - "tower-service", - "tracing", - "want", -] - -[[package]] -name = "hyper" -version = "0.14.28" +version = "0.14.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf96e135eb83a2a8ddf766e426a841d8ddd7449d5f00d34ea02b41d2f19eef80" +checksum = "41dfc780fdec9373c01bae43289ea34c972e40ee3c9f6b3c8801a35f35586ce7" dependencies = [ - "bytes 1.5.0", + "bytes 1.12.1", "futures-channel", "futures-core", "futures-util", "http 0.2.11", "http-body 0.4.5", "httparse", - "httpdate 1.0.3", - "itoa 1.0.9", - "pin-project-lite 0.2.13", + "httpdate", + "itoa", + "pin-project-lite", "socket2 0.5.5", - "tokio 1.37.0", + "tokio", "tower-service", "tracing", "want", @@ -3089,76 +3145,67 @@ dependencies = [ [[package]] name = "hyper" -version = "1.2.0" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "186548d73ac615b32a73aafe38fb4f56c0d340e110e5a200bcadbaf2e199263a" +checksum = "d22053281f852e11534f5198498373cbb59295120a20771d90f7ed1897490a72" dependencies = [ - "bytes 1.5.0", + "atomic-waker", + "bytes 1.12.1", + "futures-channel", + "futures-core", + "h2", "http 1.1.0", "http-body 1.0.0", - "pin-project-lite 0.2.13", + "httparse", + "httpdate", + "itoa", + "pin-project-lite", "smallvec", - "tokio 1.37.0", + "tokio", "want", ] [[package]] name = "hyper-rustls" -version = "0.20.0" +version = "0.27.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac965ea399ec3a25ac7d13b8affd4b8f39325cca00858ddf5eb29b79e6b14b08" +checksum = "33ca68d021ef39cf6463ab54c1d0f5daf03377b70561305bb89a8f83aab66e0f" dependencies = [ - "bytes 0.5.6", - "ct-logs", - "futures-util", - "hyper 0.13.10", + "http 1.1.0", + "hyper 1.11.0", + "hyper-util", "log", - "rustls 0.17.0", + "rustls", "rustls-native-certs", - "tokio 0.2.25", - "tokio-rustls 0.13.1", - "webpki 0.21.4", -] - -[[package]] -name = "hyper-rustls" -version = "0.21.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37743cc83e8ee85eacfce90f2f4102030d9ff0a95244098d781e9bee4a90abb6" -dependencies = [ - "bytes 0.5.6", - "futures-util", - "hyper 0.13.10", - "log", - "rustls 0.18.1", - "tokio 0.2.25", - "tokio-rustls 0.14.1", - "webpki 0.21.4", + "tokio", + "tokio-rustls", + "tower-service", ] [[package]] name = "hyper-timeout" -version = "0.3.1" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d1f9b0b8258e3ef8f45928021d3ef14096c2b93b99e4b8cfcabf1f58ec84b0a" +checksum = "2b90d566bffbce6a75bd8b09a05aa8c2cb1fabb6cb348f8840c9e4c90a0d83b0" dependencies = [ - "bytes 0.5.6", - "hyper 0.13.10", - "tokio 0.2.25", - "tokio-io-timeout", + "hyper 1.11.0", + "hyper-util", + "pin-project-lite", + "tokio", + "tower-service", ] [[package]] name = "hyper-tls" -version = "0.4.3" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d979acc56dcb5b8dddba3917601745e877576475aa046df3226eabdecef78eed" +checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905" dependencies = [ - "bytes 0.5.6", - "hyper 0.13.10", + "bytes 1.12.1", + "hyper 0.14.32", "native-tls", - "tokio 0.2.25", - "tokio-tls", + "tokio", + "tokio-native-tls", ] [[package]] @@ -3167,34 +3214,39 @@ version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0" dependencies = [ - "bytes 1.5.0", + "bytes 1.12.1", "http-body-util", - "hyper 1.2.0", + "hyper 1.11.0", "hyper-util", "native-tls", - "tokio 1.37.0", + "tokio", "tokio-native-tls", "tower-service", ] [[package]] name = "hyper-util" -version = "0.1.3" +version = "0.1.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca38ef113da30126bbff9cd1705f9273e15d45498615d138b0c20279ac7a76aa" +checksum = "96547c2556ec9d12fb1578c4eaf448b04993e7fb79cbaad930a656880a6bdfa0" dependencies = [ - "bytes 1.5.0", + "base64 0.22.1", + "bytes 1.12.1", "futures-channel", "futures-util", "http 1.1.0", "http-body 1.0.0", - "hyper 1.2.0", - "pin-project-lite 0.2.13", - "socket2 0.5.5", - "tokio 1.37.0", - "tower", + "hyper 1.11.0", + "ipnet", + "libc", + "percent-encoding", + "pin-project-lite", + "socket2 0.6.5", + "system-configuration", + "tokio", "tower-service", "tracing", + "windows-registry", ] [[package]] @@ -3206,7 +3258,7 @@ dependencies = [ "log", "serde", "serde_derive", - "thiserror", + "thiserror 1.0.30", "toml 0.8.8", "unic-langid", ] @@ -3217,7 +3269,7 @@ version = "0.13.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "92a86226a7a16632de6723449ee5fe70bac5af718bc642ee9ca2f0f6e14fa1fa" dependencies = [ - "arc-swap 1.6.0", + "arc-swap", "fluent", "fluent-langneg", "fluent-syntax", @@ -3225,9 +3277,9 @@ dependencies = [ "intl-memoizer", "lazy_static", "log", - "parking_lot 0.12.1", + "parking_lot 0.12.5", "rust-embed", - "thiserror", + "thiserror 1.0.30", "unic-langid", "walkdir", ] @@ -3246,10 +3298,10 @@ dependencies = [ "i18n-embed", "lazy_static", "proc-macro-error", - "proc-macro2 1.0.70", - "quote 1.0.33", + "proc-macro2 1.0.107", + "quote 1.0.47", "strsim 0.10.0", - "syn 2.0.39", + "syn 2.0.119", "unic-langid", ] @@ -3261,9 +3313,9 @@ checksum = "81093c4701672f59416582fe3145676126fd23ba5db910acad0793c1108aaa58" dependencies = [ "find-crate", "i18n-config", - "proc-macro2 1.0.70", - "quote 1.0.33", - "syn 2.0.39", + "proc-macro2 1.0.107", + "quote 1.0.47", + "syn 2.0.119", ] [[package]] @@ -3273,11 +3325,11 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8326b86b6cff230b97d0d312a6c40a60726df3332e721f72a1b035f451663b20" dependencies = [ "android_system_properties", - "core-foundation-sys 0.8.6", + "core-foundation-sys", "iana-time-zone-haiku", "js-sys", "wasm-bindgen", - "windows-core", + "windows-core 0.51.1", ] [[package]] @@ -3289,6 +3341,88 @@ dependencies = [ "cc", ] +[[package]] +name = "icu_collections" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2984d1cd16c883d7935b9e07e44071dca8d917fd52ecc02c04d5fa0b5a3f191c" +dependencies = [ + "displaydoc", + "potential_utf", + "utf8_iter", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_locale_core" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92219b62b3e2b4d88ac5119f8904c10f8f61bf7e95b640d25ba3075e6cac2c29" +dependencies = [ + "displaydoc", + "litemap", + "tinystr 0.8.3", + "writeable", + "zerovec", +] + +[[package]] +name = "icu_normalizer" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c56e5ee99d6e3d33bd91c5d85458b6005a22140021cc324cea84dd0e72cff3b4" +dependencies = [ + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec", + "zerovec", +] + +[[package]] +name = "icu_normalizer_data" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da3be0ae77ea334f4da67c12f149704f19f81d1adf7c51cf482943e84a2bad38" + +[[package]] +name = "icu_properties" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bee3b67d0ea5c2cca5003417989af8996f8604e34fb9ddf96208a033901e70de" +dependencies = [ + "icu_collections", + "icu_locale_core", + "icu_properties_data", + "icu_provider", + "zerotrie", + "zerovec", +] + +[[package]] +name = "icu_properties_data" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e2bbb201e0c04f7b4b3e14382af113e17ba4f63e2c9d2ee626b720cbce54a14" + +[[package]] +name = "icu_provider" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "139c4cf31c8b5f33d7e199446eff9c1e02decfc2f0eec2c8d71f65befa45b421" +dependencies = [ + "displaydoc", + "icu_locale_core", + "writeable", + "yoke", + "zerofrom", + "zerotrie", + "zerovec", +] + [[package]] name = "ident_case" version = "1.0.1" @@ -3297,12 +3431,33 @@ checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" [[package]] name = "idna" -version = "0.5.0" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de" +dependencies = [ + "idna_adapter", + "smallvec", + "utf8_iter", +] + +[[package]] +name = "idna_adapter" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb68373c0d6620ef8105e855e7745e18b0d00d3bdb07fb532e434244cdb9a714" +dependencies = [ + "icu_normalizer", + "icu_properties", +] + +[[package]] +name = "imara-diff" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" +checksum = "2f01d462f766df78ab820dd06f5eb700233c51f0f4c2e846520eaf4ba6aa5c5c" dependencies = [ - "unicode-bidi", - "unicode-normalization", + "hashbrown 0.15.5", + "memchr", ] [[package]] @@ -3318,13 +3473,34 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.1.0" +version = "2.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d530e1a18b1cb4c484e6e34556a0d948706958449fca0cab753d649f2bce3d1f" +checksum = "d466e9454f08e4a911e14806c24e16fba1b4c121d1ea474396f396069cf949d9" dependencies = [ "equivalent", - "hashbrown 0.14.3", + "hashbrown 0.17.1", "serde", + "serde_core", +] + +[[package]] +name = "inotify" +version = "0.11.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "153be1941a183ec9ccd095ddbe17a8b8d435ef6c76e9e02451b933c3999af2c8" +dependencies = [ + "bitflags 2.13.1", + "inotify-sys", + "libc", +] + +[[package]] +name = "inotify-sys" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c033f80b2c113cdf91ab7a33faa9cbc014726dcad99880c8609af2a370edf37d" +dependencies = [ + "libc", ] [[package]] @@ -3382,13 +3558,10 @@ dependencies = [ ] [[package]] -name = "iovec" -version = "0.1.4" +name = "io_tee" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2b3ea6ff95e175473f8ffe6a7eb7c00d054240321b84c57051175fe3c1e075e" -dependencies = [ - "libc", -] +checksum = "4b3f7cef34251886990511df1c61443aa928499d598a9473929ab5a90a527304" [[package]] name = "ipnet" @@ -3409,28 +3582,22 @@ dependencies = [ [[package]] name = "itertools" -version = "0.10.5" +version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" +checksum = "25db6b064527c5d482d0423354fcd07a89a2dfe07b67892e62411946db7f07b0" dependencies = [ "either", ] [[package]] name = "itertools" -version = "0.12.0" +version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25db6b064527c5d482d0423354fcd07a89a2dfe07b67892e62411946db7f07b0" +checksum = "2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285" dependencies = [ "either", ] -[[package]] -name = "itoa" -version = "0.4.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b71991ff56294aa922b450139ee08b3bfc70982c6b2c7562771375cf73542dd4" - [[package]] name = "itoa" version = "1.0.9" @@ -3439,19 +3606,22 @@ checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38" [[package]] name = "jobserver" -version = "0.1.29" +version = "0.1.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f08474e32172238f2827bd160c67871cdb2801430f65c3979184dc362e3ca118" +checksum = "1c00acbd29eabad4a2392fa0e921c874934dbbf4194312ad20f04a0ed67a3cb3" dependencies = [ + "getrandom 0.4.3", "libc", ] [[package]] name = "js-sys" -version = "0.3.66" +version = "0.3.103" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cee9c64da59eae3b50095c18d3e74f8b73c0b86d2792824ff01bbce68ba229ca" +checksum = "53b44bfcdb3f8d5837a46dae1ca9660a837176eee74a28b229bc626816589102" dependencies = [ + "cfg-if 1.0.0", + "futures-util", "wasm-bindgen", ] @@ -3474,7 +3644,7 @@ version = "18.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "14f7f76aef2d054868398427f6c54943cf3d1caa9a7ec7d0c38d69df97a965eb" dependencies = [ - "futures 0.3.29", + "futures 0.3.33", "futures-executor", "futures-util", "log", @@ -3490,8 +3660,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5b939a78fa820cdfcb7ee7484466746a7377760970f6f9c6fe19f9edcc8a38d2" dependencies = [ "proc-macro-crate 0.1.5", - "proc-macro2 1.0.70", - "quote 1.0.33", + "proc-macro2 1.0.107", + "quote 1.0.47", "syn 1.0.109", ] @@ -3501,8 +3671,8 @@ version = "18.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e1dea6e07251d9ce6a552abfb5d7ad6bc290a4596c8dcc3d795fae2bbdc1f3ff" dependencies = [ - "futures 0.3.29", - "hyper 0.14.28", + "futures 0.3.33", + "hyper 0.14.32", "jsonrpc-core 18.0.0", "jsonrpc-server-utils", "log", @@ -3517,13 +3687,13 @@ version = "18.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fa4fdea130485b572c39a460d50888beb00afb3e35de23ccd7fad8ff19f0e0d4" dependencies = [ - "bytes 1.5.0", - "futures 0.3.29", + "bytes 1.12.1", + "futures 0.3.33", "globset", "jsonrpc-core 18.0.0", "lazy_static", "log", - "tokio 1.37.0", + "tokio", "tokio-stream", "tokio-util 0.6.10", "unicase", @@ -3545,17 +3715,27 @@ version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8f6d5ed8676d904364de097082f4e7d240b571b67989ced0240f08b7f966f940" dependencies = [ - "cpufeatures", + "cpufeatures 0.2.11", ] [[package]] -name = "kernel32-sys" -version = "0.2.2" +name = "kqueue" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "273c0752728918e0ac4976f2b275b6fefb9ecd400585dec929419f3844cd87b5" +dependencies = [ + "kqueue-sys", + "libc", +] + +[[package]] +name = "kqueue-sys" +version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d" +checksum = "07293a4e297ac234359b510362495713f75ea345d5307140414f20c69ffeb087" dependencies = [ - "winapi 0.2.8", - "winapi-build", + "bitflags 2.13.1", + "libc", ] [[package]] @@ -3573,23 +3753,25 @@ version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" dependencies = [ - "spin 0.5.2", + "spin", ] [[package]] name = "libc" -version = "0.2.153" +version = "0.2.189" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd" +checksum = "3eaf3ede3fee6db1a4c2ee091bf8a8b4dccdc6d17f656fb07896ee72867612f2" [[package]] -name = "liblmdb-sys" -version = "0.2.2" +name = "libgit2-sys" +version = "0.18.7+1.9.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "feed38a3a580f60bf61aaa067b0ff4123395966839adeaf67258a9e50c4d2e49" +checksum = "23c7391e4b9f4ffab1a624223cc1d7385ff9a678f490768add717de7ea2f4d89" dependencies = [ - "gcc", + "cc", "libc", + "libz-sys", + "pkg-config", ] [[package]] @@ -3604,18 +3786,39 @@ version = "0.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "85c833ca1e66078851dba29046874e38f08b2c883700aa29a03ddd3b23814ee8" dependencies = [ - "bitflags 2.4.1", + "bitflags 2.13.1", "libc", "redox_syscall 0.4.1", ] +[[package]] +name = "libredox" +version = "0.1.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c943259e342f1e06ff2da7a83eabdfe7f92ce10262688dbf1895ff0b3e6e4652" +dependencies = [ + "libc", +] + [[package]] name = "libsqlite3-sys" -version = "0.28.0" +version = "0.34.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91632f3b4fb6bd1d72aa3d78f41ffecfcf2b1a6648d8c241dbe7dbfaf4875e15" +dependencies = [ + "cc", + "pkg-config", + "vcpkg", +] + +[[package]] +name = "libz-sys" +version = "1.1.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c10584274047cb335c23d3e61bcef8e323adae7c5c8c760540f73610177fc3f" +checksum = "85bc9657773828b90eeb625adff10eeac83cc21bbfd8e23a03eaa8a33c9e28d9" dependencies = [ "cc", + "libc", "pkg-config", "vcpkg", ] @@ -3639,43 +3842,38 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c4cd1a83af159aa67994778be9070f0ae1bd732942279cabb14f86f986a21456" [[package]] -name = "lmdb-zero" -version = "0.4.4" +name = "litemap" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92daf443525c4cce67b150400bc2316076100ce0b3686209eb8cf3c31612e6f0" + +[[package]] +name = "lmdb-master-sys" +version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13416eee745b087c22934f35f1f24da22da41ba2a5ce197143d168ce055cc58d" +checksum = "aaeb9bd22e73bd1babffff614994b341e9b2008de7bb73bf1f7e9154f1978f8b" dependencies = [ - "bitflags 0.9.1", + "cc", + "doxygen-rs", "libc", - "liblmdb-sys", - "supercow", ] [[package]] name = "lock_api" -version = "0.3.4" +version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4da24a77a3d8a6d4862d95f72e6fdb9c09a643ecdb402d754004a557f2bec75" +checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" dependencies = [ "scopeguard", ] [[package]] -name = "lock_api" -version = "0.4.11" +name = "log" +version = "0.4.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c168f8615b12bc01f9c17e2eb0cc07dcae1940121185446edc3744920e8ef45" +checksum = "0ceec5bc11778974d1bcb055b18002eba7f4b3518b6a0081b3af5f21666da9ad" dependencies = [ - "autocfg 1.1.0", - "scopeguard", -] - -[[package]] -name = "log" -version = "0.4.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" -dependencies = [ - "serde", + "serde_core", "value-bag", ] @@ -3687,27 +3885,32 @@ checksum = "a94d21414c1f4a51209ad204c1776a3d0765002c76c6abcb602a6f09f1e881c7" [[package]] name = "log4rs" -version = "0.12.0" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4d8e6e1d5f89acca713132acc6034f30bad09b961d1338161bdb71c08f6e4fa" +checksum = "3e947bb896e702c711fccc2bf02ab2abb6072910693818d1d6b07ee2b9dfd86c" dependencies = [ - "arc-swap 0.4.8", + "anyhow", + "arc-swap", "chrono", + "derive_more", "flate2", "fnv", - "humantime 1.3.0", + "humantime", "libc", "log", "log-mdc", - "parking_lot 0.10.2", + "mock_instant", + "parking_lot 0.12.5", + "rand 0.9.5", "serde", - "serde-value 0.6.0", - "serde_derive", + "serde-value", "serde_json", "serde_yaml", + "thiserror 2.0.19", "thread-id", - "typemap", - "winapi 0.3.9", + "typemap-ors", + "unicode-segmentation", + "winapi", ] [[package]] @@ -3741,9 +3944,9 @@ dependencies = [ [[package]] name = "memchr" -version = "2.6.4" +version = "2.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f665ee40bc4a3c5590afb1e9677db74a508659dfd71e126420da8274909a0167" +checksum = "cf8baf1c55e62ffcace7a9f06f4bd9cd3f0c4beb022d3b367256b91b87513d98" [[package]] name = "memmap" @@ -3752,7 +3955,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6585fd95e7bb50d6cc31e20d4cf9afb4e2ba16c5846fc76793f11218da9c475b" dependencies = [ "libc", - "winapi 0.3.9", + "winapi", ] [[package]] @@ -3786,20 +3989,16 @@ dependencies = [ ] [[package]] -name = "mime" -version = "0.3.17" +name = "millisecond" +version = "0.15.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" +checksum = "b64459a911d6996e76aa2e708f88858891d98aaf1a1ab9ffb81415a33a768d79" [[package]] -name = "mime_guess" -version = "2.0.4" +name = "mime" +version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4192263c238a5f0d0c6bfd21f336a313a4ce1c450542449ca191bb657b4642ef" -dependencies = [ - "mime", - "unicase", -] +checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" [[package]] name = "minimal-lexical" @@ -3818,99 +4017,42 @@ dependencies = [ [[package]] name = "mio" -version = "0.6.23" +version = "1.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4afd66f5b91bf2a3bc13fad0e21caedac168ca4c707504e75585648ae80e4cc4" +checksum = "30d65c71f1ce40ab09135ce117d742b9f8a19ff91a41a8b57ed50bc2de59c427" dependencies = [ - "cfg-if 0.1.10", - "fuchsia-zircon", - "fuchsia-zircon-sys", - "iovec", - "kernel32-sys", "libc", "log", - "miow 0.2.2", - "net2", - "slab", - "winapi 0.2.8", -] - -[[package]] -name = "mio" -version = "0.8.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3dce281c5e46beae905d4de1870d8b1509a9142b62eedf18b443b011ca8343d0" -dependencies = [ - "libc", "wasi 0.11.0+wasi-snapshot-preview1", - "windows-sys 0.48.0", -] - -[[package]] -name = "mio-named-pipes" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0840c1c50fd55e521b247f949c241c9997709f23bd7f023b9762cd561e935656" -dependencies = [ - "log", - "mio 0.6.23", - "miow 0.3.7", - "winapi 0.3.9", -] - -[[package]] -name = "mio-uds" -version = "0.6.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "afcb699eb26d4332647cc848492bbc15eafb26f08d0304550d5aa1f612e066f0" -dependencies = [ - "iovec", - "libc", - "mio 0.6.23", -] - -[[package]] -name = "miow" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebd808424166322d4a38da87083bfddd3ac4c131334ed55856112eb06d46944d" -dependencies = [ - "kernel32-sys", - "net2", - "winapi 0.2.8", - "ws2_32-sys", + "windows-sys 0.61.2", ] [[package]] -name = "miow" -version = "0.3.7" +name = "mock_instant" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9f1c5b025cda876f66ef43a113f91ebc9f4ccef34843000e0adf6ebbab84e21" -dependencies = [ - "winapi 0.3.9", -] +checksum = "9bb517913cfcfb9eeda59f36020269075a152701a01606c612f547e4890be399" [[package]] name = "mwixnet" version = "0.1.0" dependencies = [ "arti-client", - "arti-hyper", "async-std", "async-trait", "blake2-rfc", "byteorder", - "bytes 1.5.0", + "bytes 1.12.1", "chacha20 0.9.1", "chrono", "clap", "ctrlc", "curve25519-dalek 4.1.2", "dirs 2.0.2", - "ed25519-dalek 2.1.1", + "ed25519-dalek", "fs-mistrust", "function_name", - "futures 0.3.29", + "futures 0.3.33", "grin_api", "grin_chain", "grin_core", @@ -3927,8 +4069,11 @@ dependencies = [ "grin_wallet_libwallet", "grin_wallet_util", "hmac 0.12.1", - "hyper 0.14.28", - "hyper-tls 0.6.0", + "http-body-util", + "hyper 0.14.32", + "hyper 1.11.0", + "hyper-tls 0.5.0", + "hyper-util", "itertools 0.12.0", "jsonrpc-core 18.0.0", "jsonrpc-derive", @@ -3945,35 +4090,33 @@ dependencies = [ "serde_derive", "serde_json", "sha2 0.10.8", - "thiserror", - "tls-api", - "tls-api-native-tls", - "tokio 1.37.0", + "thiserror 1.0.30", + "tokio", "toml 0.8.8", "tor-hscrypto", "tor-hsrproxy", "tor-hsservice", "tor-keymgr", "tor-llcrypto", + "tor-log-ratelim", "tor-rtcompat", - "x25519-dalek 0.6.0", + "x25519-dalek 2.0.1", ] [[package]] name = "native-tls" -version = "0.2.11" +version = "0.2.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07226173c32f2926027b63cce4bcd8076c3552846cbe7925f3aaffeac0a3b92e" +checksum = "465500e14ea162429d264d44189adc38b199b62b1c21eea9f69e4b73cb03bbf2" dependencies = [ - "lazy_static", "libc", "log", "openssl", "openssl-probe", "openssl-sys", "schannel", - "security-framework 2.9.2", - "security-framework-sys 2.9.1", + "security-framework", + "security-framework-sys", "tempfile", ] @@ -3985,7 +4128,7 @@ checksum = "b13b648036a2339d06de780866fbdfda0dde886de7b3af2ddeba8b14f4ee34ac" dependencies = [ "cfg-if 0.1.10", "libc", - "winapi 0.3.9", + "winapi", ] [[package]] @@ -4005,7 +4148,7 @@ version = "0.27.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2eb04e9c688eff1c89d72b407f168cf79bb9e867a9d3323ed6c01519eb9cc053" dependencies = [ - "bitflags 2.4.1", + "bitflags 2.13.1", "cfg-if 1.0.0", "libc", ] @@ -4026,6 +4169,12 @@ dependencies = [ "minimal-lexical", ] +[[package]] +name = "nonany" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6b8866ec53810a9a4b3d434a29801e78c707430a9ae11c2db4b8b62bb9675a0" + [[package]] name = "normpath" version = "1.1.1" @@ -4035,13 +4184,39 @@ dependencies = [ "windows-sys 0.48.0", ] +[[package]] +name = "notify" +version = "8.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d3d07927151ff8575b7087f245456e549fea62edf0ec4e565a5ee50c8402bc3" +dependencies = [ + "bitflags 2.13.1", + "inotify", + "kqueue", + "libc", + "log", + "mio", + "notify-types", + "walkdir", + "windows-sys 0.60.2", +] + +[[package]] +name = "notify-types" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42b8cfee0e339a0337359f3c88165702ac6e600dc01c0cc9579a92d62b08477a" +dependencies = [ + "bitflags 2.13.1", +] + [[package]] name = "ntapi" version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e8a3895c6391c39d7fe7ebc444a87eb2991b2a0bc718fdabd071eec617fc68e4" dependencies = [ - "winapi 0.3.9", + "winapi", ] [[package]] @@ -4051,7 +4226,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" dependencies = [ "overload", - "winapi 0.3.9", + "winapi", ] [[package]] @@ -4092,11 +4267,10 @@ dependencies = [ [[package]] name = "num-bigint-dig" -version = "0.8.4" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc84195820f291c7697304f3cbdadd1cb7199c0efc917ff5eafd71225c136151" +checksum = "e661dda6640fad38e827a6d4a310ff4763082116fe217f279885c97f511bb0b7" dependencies = [ - "byteorder", "lazy_static", "libm", "num-integer", @@ -4119,9 +4293,9 @@ dependencies = [ [[package]] name = "num-conv" -version = "0.1.0" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" +checksum = "521739c6d2bac4aa25192232afe6841231376b2b26d4d9fae5ecf8ca5772e441" [[package]] name = "num-integer" @@ -4175,16 +4349,6 @@ dependencies = [ "libm", ] -[[package]] -name = "num_cpus" -version = "1.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" -dependencies = [ - "hermit-abi 0.3.3", - "libc", -] - [[package]] name = "num_enum" version = "0.7.2" @@ -4201,9 +4365,28 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "681030a937600a36906c185595136d26abfebb4aa9c65701cefcaf8578bb982b" dependencies = [ "proc-macro-crate 3.1.0", - "proc-macro2 1.0.70", - "quote 1.0.33", - "syn 2.0.39", + "proc-macro2 1.0.107", + "quote 1.0.47", + "syn 2.0.119", +] + +[[package]] +name = "objc2-core-foundation" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a180dd8642fa45cdb7dd721cd4c11b1cadd4929ce112ebd8b9f5803cc79d536" +dependencies = [ + "bitflags 2.13.1", +] + +[[package]] +name = "objc2-io-kit" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33fafba39597d6dc1fb709123dfa8289d39406734be322956a69f0931c73bb15" +dependencies = [ + "libc", + "objc2-core-foundation", ] [[package]] @@ -4217,9 +4400,18 @@ dependencies = [ [[package]] name = "once_cell" -version = "1.18.0" +version = "1.21.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50" + +[[package]] +name = "oneshot-fused-workaround" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" +checksum = "60d6f8f565703c8a15f98b7782e39526490f8c291910d80c9be54a753a822f6f" +dependencies = [ + "futures 0.3.33", +] [[package]] name = "opaque-debug" @@ -4235,15 +4427,14 @@ checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" [[package]] name = "openssl" -version = "0.10.60" +version = "0.10.81" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79a4c6c3a2b158f7f8f2a2fc5a969fa3a068df6fc9dbb4a43845436e3af7c800" +checksum = "77823a27f0babb03091cb9ed9ef80af3b39dbc82f97e8fa530374b7dafd87a45" dependencies = [ - "bitflags 2.4.1", + "bitflags 2.13.1", "cfg-if 1.0.0", "foreign-types", "libc", - "once_cell", "openssl-macros", "openssl-sys", ] @@ -4254,25 +4445,35 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ - "proc-macro2 1.0.70", - "quote 1.0.33", - "syn 2.0.39", + "proc-macro2 1.0.107", + "quote 1.0.47", + "syn 2.0.119", ] [[package]] name = "openssl-probe" -version = "0.1.5" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" +checksum = "7c87def4c32ab89d880effc9e097653c8da5d6ef28e6b539d313baaacfbafcbe" + +[[package]] +name = "openssl-src" +version = "300.6.1+3.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46eb8fb9fb3b61ce1c0f8a026c4c1a0714d3a9e138e7fbde78753ce2babc3846" +dependencies = [ + "cc", +] [[package]] name = "openssl-sys" -version = "0.9.96" +version = "0.9.117" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3812c071ba60da8b5677cc12bcb1d42989a65553772897a7e0355545a819838f" +checksum = "b47e7e6bb2c38cd930d25a23b40fa52e068c10e85f3e03a7f5ba5aaca5713695" dependencies = [ "cc", "libc", + "openssl-src", "pkg-config", "vcpkg", ] @@ -4285,20 +4486,20 @@ checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" [[package]] name = "ordered-float" -version = "1.1.1" +version = "2.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3305af35278dd29f46fcdd139e0b1fbfae2153f0e5928b39b035542dd31e37b7" +checksum = "68f19d67e5a2795c94e73e0bb1cc1a7edeb2e28efd39e2e1c9b7a40c1108b11c" dependencies = [ "num-traits 0.2.17", ] [[package]] -name = "ordered-float" -version = "2.10.1" +name = "os_str_bytes" +version = "6.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68f19d67e5a2795c94e73e0bb1cc1a7edeb2e28efd39e2e1c9b7a40c1108b11c" +checksum = "e2355d85b9a3786f481747ced0e0ff2ba35213a1f9bd406ed906554d7af805a1" dependencies = [ - "num-traits 0.2.17", + "memchr", ] [[package]] @@ -4346,20 +4547,20 @@ dependencies = [ ] [[package]] -name = "parking" -version = "2.2.0" +name = "page_size" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb813b8af86854136c6922af0598d719255ecb2179515e6e7730d468f05c9cae" +checksum = "30d5b2194ed13191c1999ae0704b7839fb18384fa22e49b57eeaa97d79ce40da" +dependencies = [ + "libc", + "winapi", +] [[package]] -name = "parking_lot" -version = "0.10.2" +name = "parking" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3a704eb390aafdc107b0e392f56a82b668e3a71366993b5340f5833fd62505e" -dependencies = [ - "lock_api 0.3.4", - "parking_lot_core 0.7.3", -] +checksum = "bb813b8af86854136c6922af0598d719255ecb2179515e6e7730d468f05c9cae" [[package]] name = "parking_lot" @@ -4368,32 +4569,18 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7d17b78036a60663b797adeaee46f5c9dfebb86948d1255007a1d6be0271ff99" dependencies = [ "instant", - "lock_api 0.4.11", + "lock_api", "parking_lot_core 0.8.6", ] [[package]] name = "parking_lot" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" -dependencies = [ - "lock_api 0.4.11", - "parking_lot_core 0.9.9", -] - -[[package]] -name = "parking_lot_core" -version = "0.7.3" +version = "0.12.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b93f386bb233083c799e6e642a9d73db98c24a5deeb95ffc85bf281255dffc98" +checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a" dependencies = [ - "cfg-if 0.1.10", - "cloudabi", - "libc", - "redox_syscall 0.1.57", - "smallvec", - "winapi 0.3.9", + "lock_api", + "parking_lot_core 0.9.12", ] [[package]] @@ -4407,20 +4594,20 @@ dependencies = [ "libc", "redox_syscall 0.2.16", "smallvec", - "winapi 0.3.9", + "winapi", ] [[package]] name = "parking_lot_core" -version = "0.9.9" +version = "0.9.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c42a9226546d68acdd9c0a280d17ce19bfe27a46bf68784e4066115788d008e" +checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" dependencies = [ "cfg-if 1.0.0", "libc", - "redox_syscall 0.4.1", + "redox_syscall 0.5.18", "smallvec", - "windows-targets 0.48.5", + "windows-link", ] [[package]] @@ -4462,17 +4649,6 @@ dependencies = [ "digest 0.10.7", ] -[[package]] -name = "pem" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd56cbd21fea48d0c440b41cd69c589faacade08c992d9a54e471b79d0fd13eb" -dependencies = [ - "base64 0.13.1", - "once_cell", - "regex", -] - [[package]] name = "pem-rfc7468" version = "0.7.0" @@ -4484,9 +4660,9 @@ dependencies = [ [[package]] name = "percent-encoding" -version = "2.3.1" +version = "2.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" +checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" [[package]] name = "phf" @@ -4494,8 +4670,19 @@ version = "0.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ade2d8b8f33c7333b51bcf0428d37e217e9f32192ae4772156f65063b8ce03dc" dependencies = [ - "phf_macros", - "phf_shared", + "phf_macros 0.11.2", + "phf_shared 0.11.2", +] + +[[package]] +name = "phf" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1562dc717473dbaa4c1f85a36410e03c047b2e7df7f45ee938fbef64ae7fadf" +dependencies = [ + "phf_macros 0.13.1", + "phf_shared 0.13.1", + "serde", ] [[package]] @@ -4504,21 +4691,44 @@ version = "0.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "48e4cc64c2ad9ebe670cb8fd69dd50ae301650392e81c05f9bfcb2d5bdbc24b0" dependencies = [ - "phf_shared", + "phf_shared 0.11.2", "rand 0.8.5", ] +[[package]] +name = "phf_generator" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "135ace3a761e564ec88c03a77317a7c6b80bb7f7135ef2544dbe054243b89737" +dependencies = [ + "fastrand 2.5.0", + "phf_shared 0.13.1", +] + [[package]] name = "phf_macros" version = "0.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3444646e286606587e49f3bcf1679b8cef1dc2c5ecc29ddacaffc305180d464b" dependencies = [ - "phf_generator", - "phf_shared", - "proc-macro2 1.0.70", - "quote 1.0.33", - "syn 2.0.39", + "phf_generator 0.11.2", + "phf_shared 0.11.2", + "proc-macro2 1.0.107", + "quote 1.0.47", + "syn 2.0.119", +] + +[[package]] +name = "phf_macros" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "812f032b54b1e759ccd5f8b6677695d5268c588701effba24601f6932f8269ef" +dependencies = [ + "phf_generator 0.13.1", + "phf_shared 0.13.1", + "proc-macro2 1.0.107", + "quote 1.0.47", + "syn 2.0.119", ] [[package]] @@ -4527,7 +4737,16 @@ version = "0.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "90fcb95eef784c2ac79119d1dd819e162b5da872ce6f3c3abe1e8ca1c082f72b" dependencies = [ - "siphasher", + "siphasher 0.3.11", +] + +[[package]] +name = "phf_shared" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e57fef6bc5981e38c2ce2d63bfa546861309f875b8a75f092d1d54ae2d64f266" +dependencies = [ + "siphasher 1.0.3", ] [[package]] @@ -4545,17 +4764,11 @@ version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4359fd9c9171ec6e8c62926d6faaf553a8dc3f64e1507e76da7911b4f6a04405" dependencies = [ - "proc-macro2 1.0.70", - "quote 1.0.33", - "syn 2.0.39", + "proc-macro2 1.0.107", + "quote 1.0.47", + "syn 2.0.119", ] -[[package]] -name = "pin-project-lite" -version = "0.1.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "257b64915a082f7811703966789728173279bdebb956b143dbcd23f6f970a777" - [[package]] name = "pin-project-lite" version = "0.2.13" @@ -4575,7 +4788,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "668d31b1c4eba19242f2088b2bf3316b82ca31082a8335764db4e083db7485d4" dependencies = [ "atomic-waker", - "fastrand 2.0.1", + "fastrand 2.5.0", "futures-io", ] @@ -4624,7 +4837,7 @@ dependencies = [ "concurrent-queue", "libc", "log", - "pin-project-lite 0.2.13", + "pin-project-lite", "windows-sys 0.48.0", ] @@ -4636,7 +4849,7 @@ checksum = "cf63fa624ab313c11656b4cda960bfc46c410187ad493c41f6ba2d8c1e991c9e" dependencies = [ "cfg-if 1.0.0", "concurrent-queue", - "pin-project-lite 0.2.13", + "pin-project-lite", "rustix 0.38.25", "tracing", "windows-sys 0.52.0", @@ -4648,7 +4861,7 @@ version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "048aeb476be11a4b6ca432ca569e375810de9294ae78f4774e78ea98a9246ede" dependencies = [ - "cpufeatures", + "cpufeatures 0.2.11", "opaque-debug 0.3.0", "universal-hash", ] @@ -4661,11 +4874,20 @@ checksum = "af3fb618632874fb76937c2361a7f22afd393c982a2165595407edc75b06d3c1" dependencies = [ "atomic 0.5.3", "crossbeam-queue", - "futures 0.3.29", - "parking_lot 0.12.1", + "futures 0.3.33", + "parking_lot 0.12.5", "pin-project", "static_assertions", - "thiserror", + "thiserror 1.0.30", +] + +[[package]] +name = "potential_utf" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0103b1cef7ec0cf76490e969665504990193874ea05c85ff9bab8b911d0a0564" +dependencies = [ + "zerovec", ] [[package]] @@ -4705,12 +4927,13 @@ dependencies = [ [[package]] name = "priority-queue" -version = "1.4.0" +version = "2.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0bda9164fe05bc9225752d54aae413343c36f684380005398a6a8fde95fe785" +checksum = "93980406f12d9f8140ed5abe7155acb10bb1e69ea55c88960b9c2f117445ef96" dependencies = [ - "autocfg 1.1.0", - "indexmap 1.9.3", + "equivalent", + "indexmap 2.14.0", + "serde", ] [[package]] @@ -4722,16 +4945,6 @@ dependencies = [ "toml 0.5.11", ] -[[package]] -name = "proc-macro-crate" -version = "1.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f4c021e1093a56626774e81216a4ce732a735e5bad4868a03f3ed65ca0c3919" -dependencies = [ - "once_cell", - "toml_edit 0.19.15", -] - [[package]] name = "proc-macro-crate" version = "3.1.0" @@ -4748,8 +4961,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" dependencies = [ "proc-macro-error-attr", - "proc-macro2 1.0.70", - "quote 1.0.33", + "proc-macro2 1.0.107", + "quote 1.0.47", "syn 1.0.109", "version_check", ] @@ -4760,8 +4973,8 @@ version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" dependencies = [ - "proc-macro2 1.0.70", - "quote 1.0.33", + "proc-macro2 1.0.107", + "quote 1.0.47", "version_check", ] @@ -4771,28 +4984,28 @@ version = "0.4.30" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cf3d2011ab5c909338f7887f4fc896d35932e29146c12c8d01da6b22a80ba759" dependencies = [ - "unicode-xid", + "unicode-xid 0.1.0", ] [[package]] name = "proc-macro2" -version = "1.0.70" +version = "1.0.107" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39278fbbf5fb4f646ce651690877f89d1c5811a3d4acb27700c1cb3cdb78fd3b" +checksum = "985e7ec9bb745e6ce6535b544d84d6cd6f7ad8bd711c398938ae983b91a766d9" dependencies = [ "unicode-ident", ] [[package]] name = "pwd-grp" -version = "0.1.1" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6955c41fd7e4283bdf6ff3e7218b7e3f8ef24c4236b31d22be050f4cfd5e2a2c" +checksum = "0e2023f41b5fcb7c30eb5300a5733edfaa9e0e0d502d51b586f65633fd39e40c" dependencies = [ - "derive-adhoc", + "derive-deftly", "libc", "paste", - "thiserror", + "thiserror 2.0.19", ] [[package]] @@ -4801,12 +5014,6 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5520fbcd7da152a449261c5a533a1c7fad044e9e8aa9528cfec3f464786c7926" -[[package]] -name = "quick-error" -version = "1.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" - [[package]] name = "quote" version = "0.6.13" @@ -4818,13 +5025,25 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.33" +version = "1.0.47" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae" +checksum = "1fbf4db142a473a8d80c26bbf18454ed458bf8d26c8219c331daecfdbd079001" dependencies = [ - "proc-macro2 1.0.70", + "proc-macro2 1.0.107", ] +[[package]] +name = "r-efi" +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 = "radium" version = "0.7.0" @@ -4841,7 +5060,7 @@ dependencies = [ "fuchsia-cprng", "libc", "rand_core 0.3.1", - "winapi 0.3.9", + "winapi", ] [[package]] @@ -4856,11 +5075,11 @@ dependencies = [ "rand_core 0.4.2", "rand_hc 0.1.0", "rand_isaac", - "rand_jitter", + "rand_jitter 0.1.4", "rand_os", "rand_pcg", "rand_xorshift", - "winapi 0.3.9", + "winapi", ] [[package]] @@ -4887,6 +5106,27 @@ dependencies = [ "rand_core 0.6.4", ] +[[package]] +name = "rand" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9ef1d0d795eb7d84685bca4f72f3649f064e6641543d3a8c415898726a57b41" +dependencies = [ + "rand_chacha 0.9.0", + "rand_core 0.9.5", +] + +[[package]] +name = "rand" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7f5fa3a058cd35567ef9bfa5e75732bee0f9e4c55fa90477bef2dfcdbc4be80" +dependencies = [ + "chacha20 0.10.1", + "getrandom 0.4.3", + "rand_core 0.10.1", +] + [[package]] name = "rand_chacha" version = "0.1.1" @@ -4918,10 +5158,30 @@ dependencies = [ ] [[package]] -name = "rand_core" -version = "0.3.1" +name = "rand_chacha" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a6fdeb83b075e8266dcc8762c22776f6877a63111121f5f8c7411e5be7eed4b" +checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" +dependencies = [ + "ppv-lite86", + "rand_core 0.9.5", +] + +[[package]] +name = "rand_chacha" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e6af7f3e25ded52c41df4e0b1af2d047e45896c2f3281792ed68a1c243daedb" +dependencies = [ + "ppv-lite86", + "rand_core 0.10.1", +] + +[[package]] +name = "rand_core" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a6fdeb83b075e8266dcc8762c22776f6877a63111121f5f8c7411e5be7eed4b" dependencies = [ "rand_core 0.4.2", ] @@ -4950,6 +5210,21 @@ dependencies = [ "getrandom 0.2.11", ] +[[package]] +name = "rand_core" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +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_hc" version = "0.1.0" @@ -4985,7 +5260,18 @@ checksum = "1166d5c91dc97b88d1decc3285bb0a99ed84b05cfd0bc2341bdf2d43fc41e39b" dependencies = [ "libc", "rand_core 0.4.2", - "winapi 0.3.9", + "winapi", +] + +[[package]] +name = "rand_jitter" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fdcd80e68f0a8f9ca5ec7cfd02fd5fbb8fbe6ef4e9b90ea2f48bb929b74f88e" +dependencies = [ + "libc", + "rand_core 0.10.1", + "windows-sys 0.59.0", ] [[package]] @@ -4998,8 +5284,8 @@ dependencies = [ "fuchsia-cprng", "libc", "rand_core 0.4.2", - "rdrand", - "winapi 0.3.9", + "rdrand 0.4.0", + "winapi", ] [[package]] @@ -5057,10 +5343,13 @@ dependencies = [ ] [[package]] -name = "redox_syscall" -version = "0.1.57" +name = "rdrand" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41cc0f7e4d5d4544e8861606a285bb08d3e70712ccc7d2b84d7c0ccfaf4b05ce" +checksum = "d92195228612ac8eed47adbc2ed0f04e513a4ccb98175b6f2bd04d963b533655" +dependencies = [ + "rand_core 0.6.4", +] [[package]] name = "redox_syscall" @@ -5080,6 +5369,15 @@ dependencies = [ "bitflags 1.3.2", ] +[[package]] +name = "redox_syscall" +version = "0.5.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" +dependencies = [ + "bitflags 2.13.1", +] + [[package]] name = "redox_users" version = "0.4.4" @@ -5087,20 +5385,31 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a18479200779601e498ada4e8c1e1f50e3ee19deb0259c25825a98b5603b2cb4" dependencies = [ "getrandom 0.2.11", - "libredox", - "thiserror", + "libredox 0.0.1", + "thiserror 1.0.30", +] + +[[package]] +name = "redox_users" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4e608c6638b9c18977b00b475ac1f28d14e84b27d8d42f70e0bf1e3dec127ac" +dependencies = [ + "getrandom 0.2.11", + "libredox 0.1.18", + "thiserror 2.0.19", ] [[package]] name = "regex" -version = "1.10.2" +version = "1.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "380b951a9c5e80ddfd6136919eef32310721aa4aacd4889a8d39124b026ab343" +checksum = "f020237b6c8eed93db2e2cb53c00c60a8e1bc73da7d073199a1180401450218d" dependencies = [ "aho-corasick", "memchr", - "regex-automata 0.4.3", - "regex-syntax 0.8.2", + "regex-automata 0.4.16", + "regex-syntax 0.8.11", ] [[package]] @@ -5114,13 +5423,13 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.3" +version = "0.4.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f804c7828047e88b2d32e2d7fe5a105da8ee3264f01902f796c8e067dc2483f" +checksum = "8fcfdb36bda0c880c5931cdc7a2bcdc8ba4556847b9d912bca70bc94708711ad" dependencies = [ "aho-corasick", "memchr", - "regex-syntax 0.8.2", + "regex-syntax 0.8.11", ] [[package]] @@ -5131,9 +5440,9 @@ checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" [[package]] name = "regex-syntax" -version = "0.8.2" +version = "0.8.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" +checksum = "d6f6ff9a378485b298a5286656da665ba74413d36db0979633275d2e708145d4" [[package]] name = "remove_dir_all" @@ -5153,49 +5462,59 @@ dependencies = [ [[package]] name = "reqwest" -version = "0.10.10" +version = "0.13.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0718f81a8e14c4dbb3b34cf23dc6aaf9ab8a0dfec160c534b3dbca1aaa21f47c" +checksum = "219c5811de6525e5416c7d5d53bb656d3afdbc6c5af816e0802bcfa42dbdc1c3" dependencies = [ - "base64 0.13.1", - "bytes 0.5.6", + "base64 0.22.1", + "bytes 1.12.1", "encoding_rs", "futures-core", - "futures-util", - "http 0.2.11", - "http-body 0.3.1", - "hyper 0.13.10", - "hyper-rustls 0.21.0", - "hyper-tls 0.4.3", - "ipnet", + "h2", + "http 1.1.0", + "http-body 1.0.0", + "http-body-util", + "hyper 1.11.0", + "hyper-rustls", + "hyper-tls 0.6.0", + "hyper-util", "js-sys", - "lazy_static", "log", "mime", - "mime_guess", "native-tls", "percent-encoding", - "pin-project-lite 0.2.13", - "rustls 0.18.1", - "serde", - "serde_urlencoded", - "tokio 0.2.25", - "tokio-rustls 0.14.1", - "tokio-socks", - "tokio-tls", + "pin-project-lite", + "rustls-pki-types", + "sync_wrapper", + "tokio", + "tokio-native-tls", + "tower", + "tower-http", + "tower-service", "url", "wasm-bindgen", "wasm-bindgen-futures", "web-sys", - "webpki-roots", - "winreg", +] + +[[package]] +name = "reseeding_rng" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ecfc8e855ab517235426ec1290bfb0745e73fa478b29619eb66a2a81be9d8716" +dependencies = [ + "rand_core 0.10.1", ] [[package]] name = "retry-error" -version = "0.5.2" +version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7dea0c97723329951a3ed41ce0de8b8e389de3de4b815fb86ff57f6ab868f04" +checksum = "e7c0e06f9b501df8600ad8bd073f4990f703f36e0f48e574b431f4a15d69b449" +dependencies = [ + "humantime", + "web-time", +] [[package]] name = "rfc6979" @@ -5216,23 +5535,22 @@ dependencies = [ "cc", "libc", "once_cell", - "spin 0.5.2", + "spin", "untrusted 0.7.1", "web-sys", - "winapi 0.3.9", + "winapi", ] [[package]] name = "ring" -version = "0.17.8" +version = "0.17.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d" +checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" dependencies = [ "cc", "cfg-if 1.0.0", "getrandom 0.2.11", "libc", - "spin 0.9.8", "untrusted 0.9.0", "windows-sys 0.52.0", ] @@ -5255,7 +5573,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "99371657d3c8e4d816fb6221db98fa408242b0b53bac08f8676a41f8554fe99f" dependencies = [ "libc", - "winapi 0.3.9", + "winapi", ] [[package]] @@ -5273,7 +5591,7 @@ dependencies = [ "pkcs8", "rand_core 0.6.4", "sha2 0.10.8", - "signature 2.2.0", + "signature", "spki", "subtle", "zeroize", @@ -5281,11 +5599,11 @@ dependencies = [ [[package]] name = "rusqlite" -version = "0.31.0" +version = "0.36.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b838eba278d213a8beaf485bd313fd580ca4505a00d5871caeb1457c55322cae" +checksum = "3de23c3319433716cf134eed225fe9986bc24f63bed9be9f20c329029e672dc7" dependencies = [ - "bitflags 2.4.1", + "bitflags 2.13.1", "fallible-iterator", "fallible-streaming-iterator", "hashlink", @@ -5311,10 +5629,10 @@ version = "6.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "49b94b81e5b2c284684141a2fb9e2a31be90638caf040bf9afbc5a0416afe1ac" dependencies = [ - "proc-macro2 1.0.70", - "quote 1.0.33", + "proc-macro2 1.0.107", + "quote 1.0.47", "rust-embed-utils", - "syn 2.0.39", + "syn 2.0.119", "walkdir", ] @@ -5349,6 +5667,15 @@ dependencies = [ "semver", ] +[[package]] +name = "rusticata-macros" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "faf0c4a6ece9950b9abdb62b1cfcf2a68b3b67a10ba445b3bb85be2a293d0632" +dependencies = [ + "nom", +] + [[package]] name = "rustix" version = "0.37.27" @@ -5369,7 +5696,7 @@ version = "0.38.25" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dc99bc2d4f1fed22595588a013687477aedf3cdcfb26558c559edb67b4d9b22e" dependencies = [ - "bitflags 2.4.1", + "bitflags 2.13.1", "errno", "libc", "linux-raw-sys 0.4.12", @@ -5378,39 +5705,13 @@ dependencies = [ [[package]] name = "rustls" -version = "0.17.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0d4a31f5d68413404705d6982529b0e11a9aacd4839d1d6222ee3b8cb4015e1" -dependencies = [ - "base64 0.11.0", - "log", - "ring 0.16.20", - "sct", - "webpki 0.21.4", -] - -[[package]] -name = "rustls" -version = "0.18.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d1126dcf58e93cee7d098dbda643b5f92ed724f1f6a63007c1116eed6700c81" -dependencies = [ - "base64 0.12.3", - "log", - "ring 0.16.20", - "sct", - "webpki 0.21.4", -] - -[[package]] -name = "rustls" -version = "0.23.5" +version = "0.23.42" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "afabcee0551bd1aa3e18e5adbf2c0544722014b899adb31bd186ec638d3da97e" +checksum = "3c54fcab019b409d04215d3a17cb438fd7fbf192ee61461f20f4fe18704bc138" dependencies = [ "log", "once_cell", - "ring 0.17.8", + "ring 0.17.14", "rustls-pki-types", "rustls-webpki", "subtle", @@ -5419,29 +5720,41 @@ dependencies = [ [[package]] name = "rustls-native-certs" -version = "0.3.0" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a75ffeb84a6bd9d014713119542ce415db3a3e4748f0bfce1e1416cd224a23a5" +checksum = "dab5152771c58876a2146916e53e35057e1a4dfa2b9df0f0305b07f611fdea4d" dependencies = [ "openssl-probe", - "rustls 0.17.0", + "rustls-pki-types", "schannel", - "security-framework 0.4.4", + "security-framework", +] + +[[package]] +name = "rustls-pemfile" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" +dependencies = [ + "base64 0.21.5", ] [[package]] name = "rustls-pki-types" -version = "1.4.1" +version = "1.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ecd36cc4259e3e4514335c4a138c6b43171a8d61d8f5c9348f9fc7529416f247" +checksum = "2f4925028c7eb5d1fcdaf196971378ed9d2c1c4efc7dc5d011256f76c99c0a96" +dependencies = [ + "zeroize", +] [[package]] name = "rustls-webpki" -version = "0.102.2" +version = "0.103.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "faaa0a62740bedb9b2ef5afa303da42764c012f743917351dc9a237ea1663610" +checksum = "61c429a8649f110dddef65e2a5ad240f747e85f7758a6bccc7e5777bd33f756e" dependencies = [ - "ring 0.17.8", + "ring 0.17.14", "rustls-pki-types", "untrusted 0.9.0", ] @@ -5460,15 +5773,15 @@ checksum = "1ad4cc8da4ef723ed60bced201181d83791ad433213d8c24efffda1eec85d741" [[package]] name = "safelog" -version = "0.3.6" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ea892f8598a3682b6ed10ed9d8522b50366a792953eda37e1d9ddf01e183e3f" +checksum = "4c0812d386a9992c036500b92565c41f84c28fd2e48fe853a395c393261b730b" dependencies = [ "derive_more", "educe", "either", "fluid-let", - "thiserror", + "thiserror 2.0.19", ] [[package]] @@ -5479,11 +5792,11 @@ checksum = "ef703b7cb59335eae2eb93ceb664c0eb7ea6bf567079d843e09420219668e072" [[package]] name = "salsa20" -version = "0.9.0" +version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c0fbb5f676da676c260ba276a8f43a8dc67cf02d1438423aeb1c677a7212686" +checksum = "97a22f5af31f73a954c10289c93e8a50cc23d971e80ee446f1f6f7137a088213" dependencies = [ - "cipher 0.3.0", + "cipher 0.4.4", ] [[package]] @@ -5497,21 +5810,26 @@ dependencies = [ [[package]] name = "sanitize-filename" -version = "0.5.0" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ed72fbaf78e6f2d41744923916966c4fbe3d7c74e3037a8ee482f1115572603" +checksum = "bc984f4f9ceb736a7bb755c3e3bd17dc56370af2600c9780dcc48c66453da34d" dependencies = [ - "lazy_static", "regex", ] +[[package]] +name = "saturating-time" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "802bdbfcca9a239cb46eeaaedea507e37bb13ba1a673762d2e2ef7a9dac63144" + [[package]] name = "schannel" -version = "0.1.22" +version = "0.1.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c3733bf4cf7ea0880754e19cb5a462007c4a8c1914bff372ccc95b464f1df88" +checksum = "91c1b7e4904c873ef0710c1f407dde2e6287de2bebc1bbbf7d430bb7cbffd939" dependencies = [ - "windows-sys 0.48.0", + "windows-sys 0.61.2", ] [[package]] @@ -5522,9 +5840,9 @@ checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" [[package]] name = "scrypt" -version = "0.8.1" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e73d6d7c6311ebdbd9184ad6c4447b2f36337e327bda107d3ba9e3c374f9d325" +checksum = "ba0aaf3911fff0d942c10a49779de7754699810fc7dbe3df515613b2ecc8195a" dependencies = [ "hmac 0.12.1", "pbkdf2 0.10.1", @@ -5532,16 +5850,6 @@ dependencies = [ "sha2 0.10.8", ] -[[package]] -name = "sct" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b362b83898e0e69f38515b82ee15aa80636befe47c3b6d3d89a911e78fc228ce" -dependencies = [ - "ring 0.16.20", - "untrusted 0.7.1", -] - [[package]] name = "sec1" version = "0.7.3" @@ -5556,15 +5864,6 @@ dependencies = [ "zeroize", ] -[[package]] -name = "secrecy" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9182278ed645df3477a9c27bfee0621c621aa16f6972635f7f795dae3d81070f" -dependencies = [ - "zeroize", -] - [[package]] name = "secrecy" version = "0.8.0" @@ -5576,47 +5875,24 @@ dependencies = [ [[package]] name = "security-framework" -version = "0.4.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64808902d7d99f78eaddd2b4e2509713babc3dc3c85ad6f4c447680f3c01e535" -dependencies = [ - "bitflags 1.3.2", - "core-foundation 0.7.0", - "core-foundation-sys 0.7.0", - "libc", - "security-framework-sys 0.4.3", -] - -[[package]] -name = "security-framework" -version = "2.9.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05b64fb303737d99b81884b2c63433e9ae28abebe5eb5045dcdd175dc2ecf4de" -dependencies = [ - "bitflags 1.3.2", - "core-foundation 0.9.4", - "core-foundation-sys 0.8.6", - "libc", - "security-framework-sys 2.9.1", -] - -[[package]] -name = "security-framework-sys" -version = "0.4.3" +version = "3.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17bf11d99252f512695eb468de5516e5cf75455521e69dfe343f3b74e4748405" +checksum = "b7f4bc775c73d9a02cde8bf7b2ec4c9d12743edf609006c7facc23998404cd1d" dependencies = [ - "core-foundation-sys 0.7.0", + "bitflags 2.13.1", + "core-foundation 0.10.1", + "core-foundation-sys", "libc", + "security-framework-sys", ] [[package]] name = "security-framework-sys" -version = "2.9.1" +version = "2.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e932934257d3b408ed8f30db49d85ea163bfe74961f017f405b025af298f0c7a" +checksum = "6ce2691df843ecc5d231c0b14ece2acc3efb62c0a398c7e1d875f3983ce020e3" dependencies = [ - "core-foundation-sys 0.8.6", + "core-foundation-sys", "libc", ] @@ -5643,30 +5919,21 @@ checksum = "92d43fe69e652f3df9bdc2b85b2854a0825b86e4fb76bc44d945137d053639ca" [[package]] name = "serde" -version = "1.0.193" +version = "1.0.229" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25dd9975e68d0cb5aa1120c288333fc98731bd1dd12f561e468ea4728c042b89" +checksum = "4148590afebada386688f18773da617792bf2ef03ffc1e4cbd2b1d45b023e0ba" dependencies = [ + "serde_core", "serde_derive", ] -[[package]] -name = "serde-value" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a65a7291a8a568adcae4c10a677ebcedbc6c9cec91c054dee2ce40b0e3290eb" -dependencies = [ - "ordered-float 1.1.1", - "serde", -] - [[package]] name = "serde-value" version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f3a1a3341211875ef120e117ea7fd5228530ae7e7036a779fdc9117be6b3282c" dependencies = [ - "ordered-float 2.10.1", + "ordered-float", "serde", ] @@ -5679,15 +5946,24 @@ dependencies = [ "serde", ] +[[package]] +name = "serde_core" +version = "1.0.229" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67dca2c9c51e58a4791a4b1ed58308b39c64224d349a935ab5039aa360942a48" +dependencies = [ + "serde_derive", +] + [[package]] name = "serde_derive" -version = "1.0.193" +version = "1.0.229" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43576ca501357b9b071ac53cdc7da8ef0cbd9493d8df094cd821777ea6e894d3" +checksum = "e7a5d71263a5a7d47b41f6b3f06ba276f10cc18b0931f1799f710578e2309348" dependencies = [ - "proc-macro2 1.0.70", - "quote 1.0.33", - "syn 2.0.39", + "proc-macro2 1.0.107", + "quote 1.0.47", + "syn 3.0.3", ] [[package]] @@ -5701,13 +5977,15 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.108" +version = "1.0.151" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d1c7e3eac408d115102c4c24ad393e0821bb3a5df4d506a80f85f7a742a526b" +checksum = "c841b55ecdae098c80dcae9cf767f6f8a0c2cdb3416bbef72181df4d0fe73f14" dependencies = [ - "itoa 1.0.9", - "ryu", + "itoa", + "memchr", "serde", + "serde_core", + "zmij", ] [[package]] @@ -5720,26 +5998,12 @@ dependencies = [ ] [[package]] -name = "serde_urlencoded" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" -dependencies = [ - "form_urlencoded", - "itoa 1.0.9", - "ryu", - "serde", -] - -[[package]] -name = "serde_with" -version = "1.14.0" +name = "serde_spanned" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "678b5a069e50bf00ecd22d0cd8ddf7c236f68581b03db652061ed5eb13a312ff" +checksum = "6662b5879511e06e8999a8a235d848113e942c9124f211511b16466ee2995f26" dependencies = [ - "chrono", - "serde", - "serde_with_macros 1.5.2", + "serde_core", ] [[package]] @@ -5752,26 +6016,14 @@ dependencies = [ "chrono", "hex", "indexmap 1.9.3", - "indexmap 2.1.0", + "indexmap 2.14.0", "serde", "serde_derive", "serde_json", - "serde_with_macros 3.7.0", + "serde_with_macros", "time", ] -[[package]] -name = "serde_with_macros" -version = "1.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e182d6ec6f05393cc0e5ed1bf81ad6db3a8feedf8ee515ecdd369809bcce8082" -dependencies = [ - "darling 0.13.4", - "proc-macro2 1.0.70", - "quote 1.0.33", - "syn 1.0.109", -] - [[package]] name = "serde_with_macros" version = "3.7.0" @@ -5779,21 +6031,22 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6561dc161a9224638a31d876ccdfefbc1df91d3f3a8342eddb35f055d48c7655" dependencies = [ "darling 0.20.8", - "proc-macro2 1.0.70", - "quote 1.0.33", - "syn 2.0.39", + "proc-macro2 1.0.107", + "quote 1.0.47", + "syn 2.0.119", ] [[package]] name = "serde_yaml" -version = "0.8.26" +version = "0.9.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "578a7433b776b56a35785ed5ce9a7e777ac0598aac5a6dd1b4b18a307c7fc71b" +checksum = "b1bf28c79a99f70ee1f1d83d10c875d2e70618417fda01ad1785e027579d9d38" dependencies = [ - "indexmap 1.9.3", + "indexmap 2.14.0", + "itoa", "ryu", "serde", - "yaml-rust 0.4.5", + "unsafe-libyaml", ] [[package]] @@ -5803,7 +6056,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" dependencies = [ "cfg-if 1.0.0", - "cpufeatures", + "cpufeatures 0.2.11", "digest 0.10.7", ] @@ -5815,7 +6068,7 @@ checksum = "4d58a1e1bf39749807d89cf2d98ac2dfa0ff1cb3faa38fbb64dd88ac8013d800" dependencies = [ "block-buffer 0.9.0", "cfg-if 1.0.0", - "cpufeatures", + "cpufeatures 0.2.11", "digest 0.9.0", "opaque-debug 0.3.0", ] @@ -5827,7 +6080,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" dependencies = [ "cfg-if 1.0.0", - "cpufeatures", + "cpufeatures 0.2.11", "digest 0.10.7", ] @@ -5869,9 +6122,17 @@ version = "3.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "da03fa3b94cc19e3ebfc88c4229c49d8f08cdbd1228870a45f0ffdf84988e14b" dependencies = [ + "bstr", "dirs 5.0.1", + "os_str_bytes", ] +[[package]] +name = "shlex" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8fadd59c855ef2080decdef8ff161eb6661b86933c9d82e5ba29dc602a55aba" + [[package]] name = "signal-hook-registry" version = "1.4.1" @@ -5881,12 +6142,6 @@ dependencies = [ "libc", ] -[[package]] -name = "signature" -version = "1.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74233d3b3b2f6d4b006dc19dee745e73e2a6bfb6f93607cd3b02bd5b00797d7c" - [[package]] name = "signature" version = "2.2.0" @@ -5898,22 +6153,16 @@ dependencies = [ ] [[package]] -name = "simple_asn1" -version = "0.6.2" +name = "siphasher" +version = "0.3.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adc4e5204eb1910f40f9cfa375f6f05b68c3abac4b6fd879c8ff5e7ae8a0a085" -dependencies = [ - "num-bigint 0.4.4", - "num-traits 0.2.17", - "thiserror", - "time", -] +checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d" [[package]] name = "siphasher" -version = "0.3.11" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d" +checksum = "8ee5873ec9cce0195efcb7a4e9507a04cd49aec9c83d0389df45b1ef7ba2e649" [[package]] name = "slab" @@ -5930,25 +6179,28 @@ version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dbff4acf519f630b3a3ddcfaea6c06b42174d9a44bc70c620e9ed1649d58b82a" dependencies = [ + "serde", "version_check", ] [[package]] -name = "smallvec" -version = "1.13.2" +name = "slotmap-careful" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" +checksum = "e7cd5208f878dce99cfbefa73c692c67edf946ac53e0cc4455e2dabe43d54af7" +dependencies = [ + "paste", + "serde", + "slotmap", + "thiserror 2.0.19", + "void", +] [[package]] -name = "socket2" -version = "0.3.19" +name = "smallvec" +version = "1.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "122e570113d28d773067fab24266b66753f6ea915758651696b6e35e49f88d6e" -dependencies = [ - "cfg-if 1.0.0", - "libc", - "winapi 0.3.9", -] +checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" [[package]] name = "socket2" @@ -5957,7 +6209,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9f7916fc008ca5542385b89a3d3ce689953c143e9304a9bf8beec1de48994c0d" dependencies = [ "libc", - "winapi 0.3.9", + "winapi", ] [[package]] @@ -5971,16 +6223,20 @@ dependencies = [ ] [[package]] -name = "spin" -version = "0.5.2" +name = "socket2" +version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" +checksum = "c3d1e2c7f27f8d4cb10542a02c49005dbd6e93095799d6f3be745fae9f8fedd4" +dependencies = [ + "libc", + "windows-sys 0.61.2", +] [[package]] name = "spin" -version = "0.9.8" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" +checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" [[package]] name = "spki" @@ -5993,20 +6249,20 @@ dependencies = [ ] [[package]] -name = "ssh-cipher" +name = "ssh-cipher-fork-arti" version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "caac132742f0d33c3af65bfcde7f6aa8f62f0e991d80db99149eb9d44708784f" +checksum = "125c5795103fc93fced42d123c8044180afc55469caa1ab56487c3c5543c898d" dependencies = [ "cipher 0.4.4", - "ssh-encoding", + "ssh-encoding-fork-arti", ] [[package]] -name = "ssh-encoding" +name = "ssh-encoding-fork-arti" version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb9242b9ef4108a78e8cd1a2c98e193ef372437f8c22be363075233321dd4a15" +checksum = "e0cf03c3a7ea88451ff83a129a79451fd9891d44fc76c25e916a11848b81814c" dependencies = [ "base64ct", "pem-rfc7468", @@ -6014,11 +6270,12 @@ dependencies = [ ] [[package]] -name = "ssh-key" -version = "0.6.5" +name = "ssh-key-fork-arti" +version = "0.6.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b71299a724c8d84956caaf8fc3b3ea57c3587fe2d0b800cd0dc1f3599905d7e" +checksum = "433782176b73ea7907763dc314c4a17438a231864d4aa683ba47c07c1cf0a388" dependencies = [ + "num-bigint-dig", "p256", "p384", "p521", @@ -6026,9 +6283,9 @@ dependencies = [ "rsa", "sec1", "sha2 0.10.8", - "signature 2.2.0", - "ssh-cipher", - "ssh-encoding", + "signature", + "ssh-cipher-fork-arti", + "ssh-encoding-fork-arti", "subtle", "zeroize", ] @@ -6065,20 +6322,11 @@ checksum = "57bd81eb48f4c437cadc685403cad539345bf703d78e63707418431cecd4522b" [[package]] name = "strum" -version = "0.25.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "290d54ea6f91c969195bdbcd7442c8c2a2ba87da8bf60a7ee86a235d4bc1e125" -dependencies = [ - "strum_macros 0.25.3", -] - -[[package]] -name = "strum" -version = "0.26.2" +version = "0.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d8cec3501a5194c432b2b7976db6b7d10ec95c253208b45f83f7136aa985e29" +checksum = "9628de9b8791db39ceda2b119bbe13134770b56c138ec1d3af810d045c04f9bd" dependencies = [ - "strum_macros 0.26.2", + "strum_macros 0.28.0", ] [[package]] @@ -6088,48 +6336,28 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "87c85aa3f8ea653bfd3ddf25f7ee357ee4d204731f6aa9ad04002306f6e2774c" dependencies = [ "heck 0.3.3", - "proc-macro2 1.0.70", - "quote 1.0.33", + "proc-macro2 1.0.107", + "quote 1.0.47", "syn 1.0.109", ] [[package]] name = "strum_macros" -version = "0.25.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23dc1fa9ac9c169a78ba62f0b841814b7abae11bdd047b9c58f893439e309ea0" -dependencies = [ - "heck 0.4.1", - "proc-macro2 1.0.70", - "quote 1.0.33", - "rustversion", - "syn 2.0.39", -] - -[[package]] -name = "strum_macros" -version = "0.26.2" +version = "0.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6cf59daf282c0a494ba14fd21610a0325f9f90ec9d1231dea26bcb1d696c946" +checksum = "ab85eea0270ee17587ed4156089e10b9e6880ee688791d45a905f5b1ca36f664" dependencies = [ - "heck 0.4.1", - "proc-macro2 1.0.70", - "quote 1.0.33", - "rustversion", - "syn 2.0.39", + "heck 0.5.0", + "proc-macro2 1.0.107", + "quote 1.0.47", + "syn 2.0.119", ] [[package]] name = "subtle" -version = "2.5.0" +version = "2.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc" - -[[package]] -name = "supercow" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "171758edb47aa306a78dfa4ab9aeb5167405bd4e3dc2b64e88f6a84bbe98bd63" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" [[package]] name = "syn" @@ -6139,7 +6367,7 @@ checksum = "9ca4b3b69a77cbe1ffc9e198781b7acb0c7365a883670e8f1c1bc66fba79a5c5" dependencies = [ "proc-macro2 0.4.30", "quote 0.6.13", - "unicode-xid", + "unicode-xid 0.1.0", ] [[package]] @@ -6148,22 +6376,62 @@ version = "1.0.109" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" dependencies = [ - "proc-macro2 1.0.70", - "quote 1.0.33", + "proc-macro2 1.0.107", + "quote 1.0.47", "unicode-ident", ] [[package]] name = "syn" -version = "2.0.39" +version = "2.0.119" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23e78b90f2fcf45d3e842032ce32e3f2d1545ba6636271dcbf24fa306d87be7a" +checksum = "872831b642d1a07999a962a351ed35b955ea2cfc8f3862091e2a240a84f17297" dependencies = [ - "proc-macro2 1.0.70", - "quote 1.0.33", + "proc-macro2 1.0.107", + "quote 1.0.47", "unicode-ident", ] +[[package]] +name = "syn" +version = "3.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53e9bae58849f64dfa4f5d5ae372c8341f7305f82a3868709269343628b659a3" +dependencies = [ + "proc-macro2 1.0.107", + "quote 1.0.47", + "unicode-ident", +] + +[[package]] +name = "sync_wrapper" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" +dependencies = [ + "futures-core", +] + +[[package]] +name = "synchronoise" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3dbc01390fc626ce8d1cffe3376ded2b72a11bb70e1c75f404a210e4daa4def2" +dependencies = [ + "crossbeam-queue", +] + +[[package]] +name = "synstructure" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" +dependencies = [ + "proc-macro2 1.0.107", + "quote 1.0.47", + "syn 2.0.119", +] + [[package]] name = "sysinfo" version = "0.29.11" @@ -6171,12 +6439,47 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cd727fc423c2060f6c92d9534cef765c65a6ed3f428a03d7def74a8c4348e666" dependencies = [ "cfg-if 1.0.0", - "core-foundation-sys 0.8.6", + "core-foundation-sys", "libc", "ntapi", "once_cell", "rayon", - "winapi 0.3.9", + "winapi", +] + +[[package]] +name = "sysinfo" +version = "0.38.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92ab6a2f8bfe508deb3c6406578252e491d299cbbf3bc0529ecc3313aee4a52f" +dependencies = [ + "libc", + "memchr", + "ntapi", + "objc2-core-foundation", + "objc2-io-kit", + "windows", +] + +[[package]] +name = "system-configuration" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a13f3d0daba03132c0aa9767f98351b3488edc2c100cda2d2ec2b04f3d8d3c8b" +dependencies = [ + "bitflags 2.13.1", + "core-foundation 0.9.4", + "system-configuration-sys", +] + +[[package]] +name = "system-configuration-sys" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e1d1b10ced5ca923a1fcb8d03e96b8d3268065d724548c0211415ff6ac6bac4" +dependencies = [ + "core-foundation-sys", + "libc", ] [[package]] @@ -6192,7 +6495,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7ef1adac450ad7f4b3c28589471ade84f25f731a7a0fe30d71dfa9f60fd808e5" dependencies = [ "cfg-if 1.0.0", - "fastrand 2.0.1", + "fastrand 2.5.0", "redox_syscall 0.4.1", "rustix 0.38.25", "windows-sys 0.48.0", @@ -6205,7 +6508,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c0863a3345e70f61d613eab32ee046ccd1bcc5f9105fe402c61fcd0c13eeb8b5" dependencies = [ "dirs 2.0.2", - "winapi 0.3.9", + "winapi", ] [[package]] @@ -6216,67 +6519,66 @@ checksum = "c59df8ac95d96ff9bede18eb7300b0fda5e5d8d90960e76f8e14ae765eedbf1f" dependencies = [ "dirs-next", "rustversion", - "winapi 0.3.9", + "winapi", ] [[package]] -name = "termcolor" -version = "1.4.0" +name = "textwrap" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff1bc3d3f05aff0403e8ac0d92ced918ec05b666a43f83297ccef5bea8a3d449" +checksum = "d326610f408c7a4eb6f51c37c330e496b08506c9457c9d34287ecc38809fb060" dependencies = [ - "winapi-util", + "unicode-width", ] [[package]] -name = "test-cert-gen" -version = "0.9.0" +name = "thiserror" +version = "1.0.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "345f92b7cac59507cdaba298c5493f7c40e2063d31f6fc621105183344d5d50a" +checksum = "854babe52e4df1653706b98fcfc05843010039b406875930a70e4d9644e5c417" dependencies = [ - "once_cell", - "pem", - "tempfile", + "thiserror-impl 1.0.30", ] [[package]] -name = "textwrap" -version = "0.11.0" +name = "thiserror" +version = "2.0.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d326610f408c7a4eb6f51c37c330e496b08506c9457c9d34287ecc38809fb060" +checksum = "09a43598840e33d5b0331f38c5e30d13bb11c11210a4b58f0d9b18a5a5eefcd9" dependencies = [ - "unicode-width", + "thiserror-impl 2.0.19", ] [[package]] -name = "thiserror" +name = "thiserror-impl" version = "1.0.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "854babe52e4df1653706b98fcfc05843010039b406875930a70e4d9644e5c417" +checksum = "aa32fd3f627f367fe16f893e2597ae3c05020f8bba2666a4e6ea73d377e5714b" dependencies = [ - "thiserror-impl", + "proc-macro2 1.0.107", + "quote 1.0.47", + "syn 1.0.109", ] [[package]] name = "thiserror-impl" -version = "1.0.30" +version = "2.0.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa32fd3f627f367fe16f893e2597ae3c05020f8bba2666a4e6ea73d377e5714b" +checksum = "43cbfe0cf76104d42a574802844187e84a305e531ed54455f11fbde0f10541cd" dependencies = [ - "proc-macro2 1.0.70", - "quote 1.0.33", - "syn 1.0.109", + "proc-macro2 1.0.107", + "quote 1.0.47", + "syn 3.0.3", ] [[package]] name = "thread-id" -version = "3.3.0" +version = "5.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7fbf4c9d56b320106cd64fd024dadfa0be7cb4706725fc44a7d7ce952d820c1" +checksum = "2010d27add3f3240c1fef7959f46c814487b216baee662af53be645ba7831c07" dependencies = [ "libc", - "redox_syscall 0.1.57", - "winapi 0.3.9", + "windows-sys 0.61.2", ] [[package]] @@ -6291,30 +6593,29 @@ dependencies = [ [[package]] name = "time" -version = "0.3.35" +version = "0.3.54" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef89ece63debf11bc32d1ed8d078ac870cbeb44da02afb02a9ff135ae7ca0582" +checksum = "3e1d5e639ff6bab73cb6885cc7e7b1de96c3f32c68ec55f3952614bec1092244" dependencies = [ "deranged", - "itoa 1.0.9", "num-conv", "powerfmt", - "serde", + "serde_core", "time-core", "time-macros", ] [[package]] name = "time-core" -version = "0.1.2" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" +checksum = "9e1c906769ad99c88eaa54e728060edef082f8e358ff32030cb7c7d315e81109" [[package]] name = "time-macros" -version = "0.2.18" +version = "0.2.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f252a68540fde3a3877aeea552b832b40ab9a69e318efd078774a01ddee1ccf" +checksum = "7e689342a48d2ea927c87ea50cabf8594854bf940e9310208848d680d668ed85" dependencies = [ "num-conv", "time-core", @@ -6339,140 +6640,42 @@ dependencies = [ ] [[package]] -name = "tinyvec" -version = "1.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" -dependencies = [ - "tinyvec_macros", -] - -[[package]] -name = "tinyvec_macros" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" - -[[package]] -name = "tls-api" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "66d1b3dfb0a60da3e8a130c9f2432063d9979928a05c2b2cdcfc9fd05e4f53a3" -dependencies = [ - "anyhow", - "log", - "pem", - "tempfile", - "thiserror", - "tokio 1.37.0", - "void", - "webpki 0.22.4", -] - -[[package]] -name = "tls-api-native-tls" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b935bda2458120a5d2cea542013796fcf13937566580027f6a08f42a52206f7" -dependencies = [ - "anyhow", - "native-tls", - "thiserror", - "tls-api", - "tls-api-test", - "tokio 1.37.0", -] - -[[package]] -name = "tls-api-test" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9df107843d725428d76bb159040fbae6d1524dcf25d5b24c56daa6b37ce9dbb5" -dependencies = [ - "anyhow", - "env_logger", - "log", - "pem", - "test-cert-gen", - "tls-api", - "tokio 1.37.0", - "untrusted 0.6.2", - "webpki 0.22.4", -] - -[[package]] -name = "tokio" -version = "0.2.25" +name = "tinystr" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6703a273949a90131b290be1fe7b039d0fc884aa1935860dfcbe056f28cd8092" +checksum = "c8323304221c2a851516f22236c5722a72eaa19749016521d6dff0824447d96d" dependencies = [ - "bytes 0.5.6", - "fnv", - "futures-core", - "iovec", - "lazy_static", - "libc", - "memchr", - "mio 0.6.23", - "mio-named-pipes", - "mio-uds", - "num_cpus", - "pin-project-lite 0.1.12", - "signal-hook-registry", - "slab", - "tokio-macros 0.2.6", - "winapi 0.3.9", + "displaydoc", + "serde_core", + "zerovec", ] [[package]] name = "tokio" -version = "1.37.0" +version = "1.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1adbebffeca75fcfd058afa480fb6c0b81e165a0323f9c9d39c9697e37c46787" +checksum = "202caea871b69668250d242070849eb495be178ed697a3e98aebce5bc81a0bed" dependencies = [ - "backtrace", - "bytes 1.5.0", + "bytes 1.12.1", "libc", - "mio 0.8.9", - "num_cpus", - "parking_lot 0.12.1", - "pin-project-lite 0.2.13", + "mio", + "parking_lot 0.12.5", + "pin-project-lite", "signal-hook-registry", - "socket2 0.5.5", - "tokio-macros 2.2.0", - "windows-sys 0.48.0", -] - -[[package]] -name = "tokio-io-timeout" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9390a43272c8a6ac912ed1d1e2b6abeafd5047e05530a2fa304deee041a06215" -dependencies = [ - "bytes 0.5.6", - "tokio 0.2.25", + "socket2 0.6.5", + "tokio-macros", + "windows-sys 0.61.2", ] [[package]] name = "tokio-macros" -version = "0.2.6" +version = "2.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e44da00bfc73a25f814cd8d7e57a68a5c31b74b3152a0a1d1f590c97ed06265a" +checksum = "6328af13490e73a9b4694030fafd93f8c8c6a9dede33e821c3fc63eddf8042ba" dependencies = [ - "proc-macro2 1.0.70", - "quote 1.0.33", - "syn 1.0.109", -] - -[[package]] -name = "tokio-macros" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b" -dependencies = [ - "proc-macro2 1.0.70", - "quote 1.0.33", - "syn 2.0.39", + "proc-macro2 1.0.107", + "quote 1.0.47", + "syn 2.0.119", ] [[package]] @@ -6482,44 +6685,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2" dependencies = [ "native-tls", - "tokio 1.37.0", -] - -[[package]] -name = "tokio-rustls" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15cb62a0d2770787abc96e99c1cd98fcf17f94959f3af63ca85bdfb203f051b4" -dependencies = [ - "futures-core", - "rustls 0.17.0", - "tokio 0.2.25", - "webpki 0.21.4", + "tokio", ] [[package]] name = "tokio-rustls" -version = "0.14.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e12831b255bcfa39dc0436b01e19fea231a37db570686c06ee72c423479f889a" -dependencies = [ - "futures-core", - "rustls 0.18.1", - "tokio 0.2.25", - "webpki 0.21.4", -] - -[[package]] -name = "tokio-socks" -version = "0.3.0" +version = "0.26.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d611fd5d241872372d52a0a3d309c52d0b95a6a67671a6c8f7ab2c4a37fb2539" +checksum = "1729aa945f29d91ba541258c8df89027d5792d85a8841fb65e8bf0f4ede4ef61" dependencies = [ - "bytes 0.4.12", - "either", - "futures 0.3.29", - "thiserror", - "tokio 0.2.25", + "rustls", + "tokio", ] [[package]] @@ -6529,46 +6705,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "267ac89e0bec6e691e5813911606935d77c476ff49024f98abcea3e7b15e37af" dependencies = [ "futures-core", - "pin-project-lite 0.2.13", - "tokio 1.37.0", -] - -[[package]] -name = "tokio-tls" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a70f4fcd7b3b24fb194f837560168208f669ca8cb70d0c4b862944452396343" -dependencies = [ - "native-tls", - "tokio 0.2.25", -] - -[[package]] -name = "tokio-util" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "571da51182ec208780505a32528fc5512a8fe1443ab960b3f2f3ef093cd16930" -dependencies = [ - "bytes 0.5.6", - "futures-core", - "futures-sink", - "log", - "pin-project-lite 0.1.12", - "tokio 0.2.25", -] - -[[package]] -name = "tokio-util" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be8242891f2b6cbef26a2d7e8605133c2c554cd35b3e4948ea892d6d68436499" -dependencies = [ - "bytes 0.5.6", - "futures-core", - "futures-sink", - "log", - "pin-project-lite 0.1.12", - "tokio 0.2.25", + "pin-project-lite", + "tokio", ] [[package]] @@ -6577,12 +6715,12 @@ version = "0.6.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "36943ee01a6d67977dd3f84a5a1d2efeb4ada3a1ae771cadfaa535d9d9fc6507" dependencies = [ - "bytes 1.5.0", + "bytes 1.12.1", "futures-core", "futures-sink", "log", - "pin-project-lite 0.2.13", - "tokio 1.37.0", + "pin-project-lite", + "tokio", ] [[package]] @@ -6591,12 +6729,13 @@ version = "0.7.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5419f34732d9eb6ee4c3578b7989078579b7f039cbbb9ca2c4da015749371e15" dependencies = [ - "bytes 1.5.0", + "bytes 1.12.1", "futures-core", "futures-io", "futures-sink", - "pin-project-lite 0.2.13", - "tokio 1.37.0", + "pin-project-lite", + "tokio", + "tracing", ] [[package]] @@ -6615,11 +6754,26 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a1a195ec8c9da26928f773888e0742ca3ca1040c6cd859c919c9f59c1954ab35" dependencies = [ "serde", - "serde_spanned", - "toml_datetime", + "serde_spanned 0.6.4", + "toml_datetime 0.6.5", "toml_edit 0.21.0", ] +[[package]] +name = "toml" +version = "1.1.3+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53c96ecdfa941c8fc4fcaed14f99ada8ebed502eef533015095a07e3301d4c3c" +dependencies = [ + "indexmap 2.14.0", + "serde_core", + "serde_spanned 1.1.1", + "toml_datetime 1.1.1+spec-1.1.0", + "toml_parser", + "toml_writer", + "winnow 1.0.4", +] + [[package]] name = "toml_datetime" version = "0.6.5" @@ -6630,14 +6784,12 @@ dependencies = [ ] [[package]] -name = "toml_edit" -version = "0.19.15" +name = "toml_datetime" +version = "1.1.1+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" +checksum = "3165f65f62e28e0115a00b2ebdd37eb6f3b641855f9d636d3cd4103767159ad7" dependencies = [ - "indexmap 2.1.0", - "toml_datetime", - "winnow", + "serde_core", ] [[package]] @@ -6646,51 +6798,100 @@ version = "0.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d34d383cd00a163b4a5b85053df514d45bc330f6de7737edfe0a93311d1eaa03" dependencies = [ - "indexmap 2.1.0", + "indexmap 2.14.0", "serde", - "serde_spanned", - "toml_datetime", - "winnow", + "serde_spanned 0.6.4", + "toml_datetime 0.6.5", + "winnow 0.5.19", +] + +[[package]] +name = "toml_edit" +version = "0.22.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3328d4f68a705b2a4498da1d580585d39a6510f98318a2cec3018a7ec61ddef" +dependencies = [ + "indexmap 2.14.0", + "toml_datetime 0.6.5", + "winnow 0.6.26", ] +[[package]] +name = "toml_parser" +version = "1.1.3+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d38ac1cf9b95face32296c0a3ede1fdc270627c9d9c02a7274dd6d960dc4d56" +dependencies = [ + "winnow 1.0.4", +] + +[[package]] +name = "toml_writer" +version = "1.1.2+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d56353a2a665ad0f41a421187180aab746c8c325620617ad883a99a1cbe66d2" + [[package]] name = "tor-async-utils" -version = "0.18.0" +version = "0.44.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b48a1a2254a32b504478be8fbcac5ca9d747b6e10bd34f9559f0a92864690d6" +checksum = "58580b41636378f79500bca6a178787e0e434207e0880dd90698ae3f686f24d6" dependencies = [ - "futures 0.3.29", + "cfg-if 1.0.0", + "derive-deftly", + "educe", + "futures 0.3.33", + "oneshot-fused-workaround", "pin-project", "postage", + "sync_wrapper", + "thiserror 2.0.19", + "tokio", + "tokio-util 0.7.10", + "tor-basic-utils", + "tor-rtcompat", + "tracing", "void", + "web-time-compat", ] [[package]] name = "tor-basic-utils" -version = "0.18.0" +version = "0.44.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1b38dac0caaa5913fb93276fc564f8e9fd082121d2a23176fe2e3108d182b85" +checksum = "dd3046aa299df67da91b45c02c24d48d40ae1845f9b91e27f9c8adbde78315ba" dependencies = [ + "derive-deftly", + "derive_more", + "getrandom 0.4.3", "hex", + "itertools 0.14.0", "libc", "paste", - "rand 0.8.5", - "rand_chacha 0.3.1", + "rand 0.10.2", + "rand_chacha 0.10.0", + "serde", "slab", - "thiserror", + "smallvec", + "thiserror 2.0.19", + "tracing", + "weak-table", + "web-time-compat", ] [[package]] name = "tor-bytes" -version = "0.18.0" +version = "0.44.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f830b62e4df202e6783d5d7baa73eb5ef47cadf4aea40921512b95a6f8a1da89" +checksum = "6b4833cc8ab3fca79eabc06f3ca97db102a3b7db861d77848d39932a6f0ed598" dependencies = [ - "bytes 1.5.0", + "bytes 1.12.1", + "derive-deftly", "digest 0.10.7", "educe", - "getrandom 0.2.11", - "thiserror", + "getrandom 0.4.3", + "safelog", + "thiserror 2.0.19", "tor-error", "tor-llcrypto", "zeroize", @@ -6698,19 +6899,22 @@ dependencies = [ [[package]] name = "tor-cell" -version = "0.18.0" +version = "0.44.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85e3549cd797a8cb9c54a50287328157f652f341ccc64089088c7689ea9f759c" +checksum = "73a01cb2ac6697c12b647729d3d7db404e306d1e08a7a3aacdbee08e35170ebd" dependencies = [ - "bitflags 2.4.1", - "bytes 1.5.0", + "amplify", + "bitflags 2.13.1", + "bytes 1.12.1", "caret", + "derive-deftly", "derive_more", "educe", + "itertools 0.14.0", "paste", - "rand 0.8.5", + "rand 0.10.2", "smallvec", - "thiserror", + "thiserror 2.0.19", "tor-basic-utils", "tor-bytes", "tor-cert", @@ -6718,102 +6922,123 @@ dependencies = [ "tor-hscrypto", "tor-linkspec", "tor-llcrypto", + "tor-memquota", + "tor-protover", "tor-units", + "void", ] [[package]] name = "tor-cert" -version = "0.18.0" +version = "0.44.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d049223a0f4d5965f8e947f1b1b559b72a6cacdc904dcf296e49ce503f6821e5" +checksum = "162d44b975e445de099b3a495710689652bbd0a9a3a0e4946341acbb3138b22b" dependencies = [ "caret", "derive_builder_fork_arti", "derive_more", "digest 0.10.7", - "thiserror", + "saturating-time", + "thiserror 2.0.19", "tor-bytes", "tor-checkable", + "tor-error", "tor-llcrypto", + "web-time-compat", ] [[package]] name = "tor-chanmgr" -version = "0.18.0" +version = "0.44.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "464dbcf8ea3c2333ecdc4f6526dc0015a16052af5b256bc9449c384bb61fe962" +checksum = "bf15c4cbafa5745def4fced9e8e59148533a2bfc8d938e9fad7a0d6d16757712" dependencies = [ "async-trait", - "derive_builder_fork_arti", + "base64ct", + "caret", + "cfg-if 1.0.0", + "derive-deftly", "derive_more", "educe", - "futures 0.3.29", + "futures 0.3.33", + "httparse", + "oneshot-fused-workaround", + "percent-encoding", "postage", - "rand 0.8.5", + "rand 0.10.2", "safelog", "serde", - "thiserror", + "serde_with", + "thiserror 2.0.19", "tor-async-utils", "tor-basic-utils", "tor-cell", "tor-config", "tor-error", + "tor-keymgr", "tor-linkspec", "tor-llcrypto", + "tor-memquota", "tor-netdir", "tor-proto", "tor-rtcompat", "tor-socksproto", "tor-units", "tracing", + "url", "void", + "web-time-compat", ] [[package]] name = "tor-checkable" -version = "0.18.0" +version = "0.44.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbb8047d82b3754e8662d29c02680db453059b68956f1b0d44f965f0536f239d" +checksum = "ef81835cb0b2db460c694678eae8c4cbad5f31847e473aac42605f9b945fb31a" dependencies = [ - "humantime 2.1.0", - "signature 2.2.0", - "thiserror", + "humantime", + "signature", + "thiserror 2.0.19", "tor-llcrypto", + "web-time-compat", ] [[package]] name = "tor-circmgr" -version = "0.18.0" +version = "0.44.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "607a1d725f67db7722854b685bbbb440002b339cf610a0647a90b6540b4f25ec" +checksum = "2b63cca1f18282f82b905b6a8c20c6f247787bc010d1b317d9eb98503e4352bf" dependencies = [ "amplify", "async-trait", - "bounded-vec-deque", "cfg-if 1.0.0", + "derive-deftly", "derive_builder_fork_arti", "derive_more", "downcast-rs", "dyn-clone", "educe", - "futures 0.3.29", + "futures 0.3.33", "humantime-serde", - "itertools 0.12.0", + "itertools 0.14.0", "once_cell", + "oneshot-fused-workaround", "pin-project", - "rand 0.8.5", + "rand 0.10.2", "retry-error", "safelog", "serde", - "static_assertions", - "thiserror", + "thiserror 2.0.19", "tor-async-utils", "tor-basic-utils", + "tor-cell", "tor-chanmgr", "tor-config", + "tor-dircommon", "tor-error", "tor-guardmgr", "tor-linkspec", + "tor-memquota", "tor-netdir", "tor-netdoc", "tor-persist", @@ -6821,86 +7046,133 @@ dependencies = [ "tor-protover", "tor-relay-selection", "tor-rtcompat", + "tor-units", "tracing", "void", "weak-table", + "web-time-compat", ] [[package]] name = "tor-config" -version = "0.18.0" +version = "0.44.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eacc03d70e00cedf31de3f393255d1ee4ec1f1d393ec79223c4a4e69fffd80dd" +checksum = "a699adfb8bdb34699afcca7cbbd9d26329246940bc9dbc32f380c87578017350" dependencies = [ + "amplify", + "cfg-if 1.0.0", "derive-deftly", "derive_builder_fork_arti", - "directories", "educe", "either", "figment", "fs-mistrust", - "itertools 0.12.0", - "once_cell", + "futures 0.3.33", + "humantime-serde", + "itertools 0.14.0", + "notify", "paste", + "postage", "regex", "serde", - "serde-value 0.7.0", + "serde-value", "serde_ignored", - "shellexpand", - "strum 0.26.2", - "thiserror", - "toml 0.8.8", + "strum 0.28.0", + "thiserror 2.0.19", + "toml 1.1.3+spec-1.1.0", "tor-basic-utils", "tor-error", + "tor-rtcompat", "tracing", "void", ] +[[package]] +name = "tor-config-path" +version = "0.44.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d38001695121fc778e67ac7a1c733d3158ee8942a55cfa343981b50d90f5daa" +dependencies = [ + "directories", + "serde", + "shellexpand", + "thiserror 2.0.19", + "tor-error", + "tor-general-addr", +] + [[package]] name = "tor-consdiff" -version = "0.18.0" +version = "0.44.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b60ccfee1404d281437a659932592f3c7592305668d93addf01384adb16531e5" +checksum = "80e9e3eb11e91ea4c1affe5e1f73628726c283942715739850546acb94bbe028" dependencies = [ + "derive_more", "digest 0.10.7", "hex", - "thiserror", + "imara-diff", + "static_assertions", + "thiserror 2.0.19", + "tor-error", "tor-llcrypto", + "tor-netdoc", ] [[package]] name = "tor-dirclient" -version = "0.18.0" +version = "0.44.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f604e7450609aaae0d892572bee4d894ba00cd8061cafcbd8c8fa7c1561c2e0" +checksum = "0027cd2a58abab9ebaf61c3c1da9b0fa9e6cbc914b88fedb7b3102bd4f4dd656" dependencies = [ "async-compression", "base64ct", "derive_more", - "futures 0.3.29", + "futures 0.3.33", "hex", "http 1.1.0", "httparse", - "httpdate 1.0.3", - "itertools 0.12.0", + "httpdate", + "itertools 0.14.0", "memchr", - "thiserror", + "thiserror 2.0.19", "tor-circmgr", "tor-error", "tor-hscrypto", "tor-linkspec", "tor-llcrypto", "tor-netdoc", - "tor-proto", - "tor-rtcompat", + "tor-proto", + "tor-rtcompat", + "tracing", + "web-time-compat", +] + +[[package]] +name = "tor-dircommon" +version = "0.44.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d2047b2f1ad3453c1060e5e39203bd87ead266e6873707bd7333b1d6bdac768" +dependencies = [ + "base64ct", + "derive-deftly", + "getset", + "humantime", + "humantime-serde", + "serde", + "tor-basic-utils", + "tor-checkable", + "tor-config", + "tor-linkspec", + "tor-llcrypto", + "tor-netdoc", "tracing", ] [[package]] name = "tor-dirmgr" -version = "0.18.0" +version = "0.44.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2c676354fa69cb358b460ef698d354fb224da626b7d8dbe70a30230f30a7367" +checksum = "57ebc162ccd628ef8e96912a9e42e848cd7305eb2a5a455a6002f54ad6826422" dependencies = [ "async-trait", "base64ct", @@ -6910,24 +7182,26 @@ dependencies = [ "educe", "event-listener 5.3.0", "fs-mistrust", - "fslock", - "futures 0.3.29", + "fslock-guard", + "futures 0.3.33", "hex", - "humantime 2.1.0", + "humantime", "humantime-serde", - "itertools 0.12.0", + "itertools 0.14.0", "memmap2", - "once_cell", + "oneshot-fused-workaround", "paste", "postage", - "rand 0.8.5", + "rand 0.10.2", "rusqlite", "safelog", "scopeguard", "serde", - "signature 2.2.0", - "strum 0.26.2", - "thiserror", + "serde_json", + "signature", + "static_assertions", + "strum 0.28.0", + "thiserror 2.0.19", "time", "tor-async-utils", "tor-basic-utils", @@ -6936,6 +7210,7 @@ dependencies = [ "tor-config", "tor-consdiff", "tor-dirclient", + "tor-dircommon", "tor-error", "tor-guardmgr", "tor-llcrypto", @@ -6943,33 +7218,47 @@ dependencies = [ "tor-netdoc", "tor-persist", "tor-proto", + "tor-protover", "tor-rtcompat", "tracing", + "void", + "web-time-compat", ] [[package]] name = "tor-error" -version = "0.18.0" +version = "0.44.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "321b27a08c18364e6e30374bfb13817c8acec8a274d461db166ebe1280969eef" +checksum = "c6a7ed4aee3e0613a75d420032116dac82d7702594e28566befdfa6707a8fd0e" dependencies = [ - "backtrace", "derive_more", - "futures 0.3.29", - "once_cell", + "futures 0.3.33", "paste", "retry-error", "static_assertions", - "strum 0.26.2", - "thiserror", + "strum 0.28.0", + "thiserror 2.0.19", "tracing", + "void", + "web-time-compat", +] + +[[package]] +name = "tor-general-addr" +version = "0.44.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfee544a33dd3e67e0311cc46ef8f667cbf9c02c7c00ef4f25098a25b2b6e1cf" +dependencies = [ + "derive_more", + "thiserror 2.0.19", + "void", ] [[package]] name = "tor-guardmgr" -version = "0.18.0" +version = "0.44.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6bbbb44d3f571397a849faaf7bbb25a30f098095b94eb4234b970d8024514879" +checksum = "f1e8f52e4b1b08ba58970a9b9879b0b72c35dcba48bad389935f2778ed432d05" dependencies = [ "amplify", "base64ct", @@ -6978,21 +7267,23 @@ dependencies = [ "derive_more", "dyn-clone", "educe", - "futures 0.3.29", - "humantime 2.1.0", + "futures 0.3.33", + "humantime", "humantime-serde", - "itertools 0.12.0", + "itertools 0.14.0", "num_enum", + "oneshot-fused-workaround", "pin-project", "postage", - "rand 0.8.5", + "rand 0.10.2", "safelog", "serde", - "strum 0.26.2", - "thiserror", + "strum 0.28.0", + "thiserror 2.0.19", "tor-async-utils", "tor-basic-utils", "tor-config", + "tor-dircommon", "tor-error", "tor-linkspec", "tor-llcrypto", @@ -7000,32 +7291,35 @@ dependencies = [ "tor-netdoc", "tor-persist", "tor-proto", + "tor-protover", "tor-relay-selection", "tor-rtcompat", "tor-units", "tracing", + "web-time-compat", ] [[package]] name = "tor-hsclient" -version = "0.18.0" +version = "0.44.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "210dc08c53929e0c800198779a9595ff0cad1051c52320533a8421b4eb0f2deb" +checksum = "28dc813f71e63fd324c4b1b1647ddc2fcc4b6e77c45091e6769ae80e591726ec" dependencies = [ "async-trait", "derive-deftly", "derive_more", "educe", "either", - "futures 0.3.29", - "itertools 0.12.0", + "futures 0.3.33", + "itertools 0.14.0", + "oneshot-fused-workaround", "postage", - "rand 0.8.5", + "rand 0.10.2", "retry-error", "safelog", - "slotmap", - "strum 0.26.2", - "thiserror", + "slotmap-careful", + "strum 0.28.0", + "thiserror 2.0.19", "tor-async-utils", "tor-basic-utils", "tor-bytes", @@ -7039,53 +7333,67 @@ dependencies = [ "tor-keymgr", "tor-linkspec", "tor-llcrypto", + "tor-memquota", "tor-netdir", "tor-netdoc", "tor-persist", "tor-proto", + "tor-protover", "tor-rtcompat", "tracing", + "web-time-compat", ] [[package]] name = "tor-hscrypto" -version = "0.18.0" +version = "0.44.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c76aa63e02c854b1a845b2a35ed811a52848f37cff413d2b8357e3d47aaefbb" +checksum = "f82fd6a5a6ede5ece5e7f52708bdf0a007e8f975f9825689b376f038845f1e88" dependencies = [ "cipher 0.4.4", "data-encoding", + "derive-deftly", "derive_more", "digest 0.10.7", - "itertools 0.12.0", + "hex", + "humantime", + "itertools 0.14.0", "paste", - "rand 0.8.5", + "rand 0.10.2", "safelog", - "signature 2.2.0", + "serde", + "signature", "subtle", - "thiserror", + "thiserror 2.0.19", "tor-basic-utils", "tor-bytes", "tor-error", + "tor-key-forge", "tor-llcrypto", + "tor-memquota", "tor-units", + "void", + "web-time-compat", "zeroize", ] [[package]] name = "tor-hsrproxy" -version = "0.18.0" +version = "0.44.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1ce1ae094d32314bf4fa1142bc5ffaaf041927df0a2a5654f9860c6b79578fe" +checksum = "9b4231a55048af49ae2a8fcb2d41ea0df986b68c26bf6128f97f7f1324d47498" dependencies = [ "derive-deftly", - "derive_builder_fork_arti", - "futures 0.3.29", + "futures 0.3.33", + "futures-copy", + "itertools 0.14.0", + "oneshot-fused-workaround", "rangemap", "safelog", "serde", - "serde_with 3.7.0", - "thiserror", + "serde_with", + "strum 0.28.0", + "thiserror 2.0.19", "tor-async-utils", "tor-cell", "tor-config", @@ -7100,40 +7408,44 @@ dependencies = [ [[package]] name = "tor-hsservice" -version = "0.18.0" +version = "0.44.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d73024a7936cc0439f1b10db876070476ff8bbec0dccb31e5773e654d20dd87" +checksum = "170b66c977d3b16a5ff79ec344c06392076f0326d2d65146a58c450c50395dae" dependencies = [ + "amplify", "async-trait", "base64ct", + "cfg-if 1.0.0", "derive-deftly", "derive_builder_fork_arti", "derive_more", "digest 0.10.7", "educe", "fs-mistrust", - "futures 0.3.29", + "futures 0.3.33", "growable-bloom-filter", "hex", - "humantime 2.1.0", - "itertools 0.12.0", + "humantime", + "itertools 0.14.0", "k12", "once_cell", + "oneshot-fused-workaround", "postage", - "rand 0.8.5", - "rand_core 0.6.4", + "rand 0.10.2", + "rand_core 0.10.1", "retry-error", "safelog", "serde", - "serde_with 3.7.0", - "strum 0.26.2", - "thiserror", + "serde_with", + "strum 0.28.0", + "thiserror 2.0.19", "tor-async-utils", "tor-basic-utils", "tor-bytes", "tor-cell", "tor-circmgr", "tor-config", + "tor-config-path", "tor-dirclient", "tor-error", "tor-hscrypto", @@ -7150,16 +7462,40 @@ dependencies = [ "tor-rtcompat", "tracing", "void", + "web-time-compat", +] + +[[package]] +name = "tor-key-forge" +version = "0.44.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30f83389917e9908c43457c80d0b982ba6dcd3e6ea36a37b29167b7619d9eaa3" +dependencies = [ + "derive-deftly", + "derive_more", + "downcast-rs", + "paste", + "rand 0.10.2", + "rsa", + "signature", + "ssh-key-fork-arti", + "thiserror 2.0.19", + "tor-bytes", + "tor-cert", + "tor-checkable", + "tor-error", + "tor-llcrypto", ] [[package]] name = "tor-keymgr" -version = "0.18.0" +version = "0.44.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87c6dbc1247aaf53417ffd38958fa262fb6fb3b891987babfa0d0e51028bc9ad" +checksum = "5c7c18fb26d112c6022b7d1de558a4045b574fecfa1c504045145d8e1a9dc01a" dependencies = [ "amplify", "arrayvec 0.7.4", + "cfg-if 1.0.0", "derive-deftly", "derive_builder_fork_arti", "derive_more", @@ -7167,28 +7503,36 @@ dependencies = [ "dyn-clone", "fs-mistrust", "glob-match", - "humantime 2.1.0", + "humantime", "inventory", - "itertools 0.12.0", - "rand 0.8.5", + "itertools 0.14.0", + "rand 0.10.2", + "safelog", "serde", - "ssh-key", - "thiserror", + "signature", + "ssh-key-fork-arti", + "thiserror 2.0.19", "tor-basic-utils", + "tor-bytes", "tor-config", + "tor-config-path", "tor-error", "tor-hscrypto", + "tor-key-forge", "tor-llcrypto", "tor-persist", + "tracing", + "visibility", "walkdir", + "web-time-compat", "zeroize", ] [[package]] name = "tor-linkspec" -version = "0.18.0" +version = "0.44.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3017bfdc155832fbaf21b99d24d2ab251b1463c5a1ed4432dc02c6d7c145cac9" +checksum = "638a849a5d65d4e37adb6a2fa597a5a5c0decb749c17e76d3c44c4aefd696270" dependencies = [ "base64ct", "by_address", @@ -7197,85 +7541,141 @@ dependencies = [ "derive_builder_fork_arti", "derive_more", "hex", - "itertools 0.12.0", + "itertools 0.14.0", "safelog", "serde", - "serde_with 3.7.0", - "strum 0.26.2", - "thiserror", + "serde_with", + "strum 0.28.0", + "thiserror 2.0.19", "tor-basic-utils", "tor-bytes", "tor-config", "tor-llcrypto", + "tor-memquota", "tor-protover", ] [[package]] name = "tor-llcrypto" -version = "0.18.0" +version = "0.44.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b47163b1ad910d8365693efbe508f1fbb7215fb91b4ee579fd2e64c2adcbf853" +checksum = "4ef0e63e805e9c1da61511a93eca502dc29bcb0b8635e9668ec750b63a1e53a1" dependencies = [ "aes", "base64ct", "ctr", "curve25519-dalek 4.1.2", + "der-parser", + "derive-deftly", "derive_more", "digest 0.10.7", - "ed25519-dalek 2.1.1", + "ed25519-dalek", "educe", "getrandom 0.2.11", + "getrandom 0.3.4", + "getrandom 0.4.3", "hex", + "rand 0.10.2", + "rand_chacha 0.10.0", + "rand_core 0.10.1", "rand_core 0.6.4", + "rand_jitter 0.6.1", + "rdrand 0.8.3", + "reseeding_rng", "rsa", "safelog", "serde", "sha1", "sha2 0.10.8", "sha3 0.10.8", - "signature 2.2.0", - "simple_asn1", + "signature", "subtle", - "thiserror", + "thiserror 2.0.19", + "tor-error", + "tor-memquota-cost", + "visibility", "x25519-dalek 2.0.1", "zeroize", ] [[package]] name = "tor-log-ratelim" -version = "0.18.0" +version = "0.44.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b8e31f18898b65ebe928a4959d41b8e81b6322213070fbeb60f116eaa2d472b" +checksum = "37d0f759a875b6f9b6f3657a2626a70e2474e698a4404501033babe63ad888a6" dependencies = [ - "futures 0.3.29", - "humantime 2.1.0", - "once_cell", - "thiserror", + "futures 0.3.33", + "humantime", + "thiserror 2.0.19", "tor-error", "tor-rtcompat", "tracing", "weak-table", + "web-time-compat", +] + +[[package]] +name = "tor-memquota" +version = "0.44.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c06f2e981120a4c1da1e361573cee4af618d05fa3c7ec37c139d766f1b8d47f" +dependencies = [ + "cfg-if 1.0.0", + "derive-deftly", + "derive_more", + "dyn-clone", + "educe", + "futures 0.3.33", + "itertools 0.14.0", + "paste", + "pin-project", + "serde", + "slotmap-careful", + "static_assertions", + "sysinfo 0.38.4", + "thiserror 2.0.19", + "tor-async-utils", + "tor-basic-utils", + "tor-config", + "tor-error", + "tor-log-ratelim", + "tor-memquota-cost", + "tor-rtcompat", + "tracing", + "void", +] + +[[package]] +name = "tor-memquota-cost" +version = "0.44.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b86eb903fee638e9211daddaddc146f0c5e4f5605d79983548fce6fec596325c" +dependencies = [ + "derive-deftly", + "itertools 0.14.0", + "paste", + "void", ] [[package]] name = "tor-netdir" -version = "0.18.0" +version = "0.44.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67662012b77d73ccb08380975d676914879438dcc3a56bcebb49ffed92f72b3e" +checksum = "b8160580273eec3576158c3e833ff198870665dacebb373585892dde93cf9803" dependencies = [ - "bitflags 2.4.1", + "async-trait", + "bitflags 2.13.1", "derive_more", "digest 0.10.7", - "futures 0.3.29", + "futures 0.3.33", "hex", - "humantime 2.1.0", - "itertools 0.12.0", + "humantime", + "itertools 0.14.0", "num_enum", - "rand 0.8.5", + "rand 0.10.2", "serde", - "static_assertions", - "strum 0.26.2", - "thiserror", + "strum 0.28.0", + "thiserror 2.0.19", "time", "tor-basic-utils", "tor-error", @@ -7287,36 +7687,43 @@ dependencies = [ "tor-units", "tracing", "typed-index-collections", + "web-time-compat", ] [[package]] name = "tor-netdoc" -version = "0.18.0" +version = "0.44.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a9cc90b2d501aeb6b82106615545a15baea23337215f2daebab4faf140b2c6c" +checksum = "51598bfd24866de2c51e0de7a6e2418f86c6278cfeba2f85295ce45367fd8e06" dependencies = [ "amplify", "base64ct", - "bitflags 2.4.1", "cipher 0.4.4", + "derive-deftly", "derive_builder_fork_arti", "derive_more", "digest 0.10.7", "educe", + "enumset", "hex", - "humantime 2.1.0", - "itertools 0.12.0", - "once_cell", - "phf", - "rand 0.8.5", + "hostname-validator", + "humantime", + "ipnet", + "itertools 0.14.0", + "memchr", + "paste", + "phf 0.13.1", + "rand 0.10.2", + "saturating-time", "serde", - "serde_with 3.7.0", - "signature 2.2.0", + "serde_with", + "signature", "smallvec", + "strum 0.28.0", "subtle", - "thiserror", + "thiserror 2.0.19", "time", - "tinystr", + "tinystr 0.8.3", "tor-basic-utils", "tor-bytes", "tor-cell", @@ -7328,59 +7735,80 @@ dependencies = [ "tor-llcrypto", "tor-protover", "tor-units", - "weak-table", + "void", + "web-time-compat", "zeroize", ] [[package]] name = "tor-persist" -version = "0.18.0" +version = "0.44.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d57c0676b6eecad9242b42c72b0e501ea78a900aee2663fb0e237cdfa2f0bd31" +checksum = "c2ff75e20adb6a1a7ad07e16b55e56d5376706cc0090ab8831f008f1a89243f2" dependencies = [ "amplify", "derive-deftly", "derive_more", "filetime", "fs-mistrust", - "fslock", "fslock-guard", - "itertools 0.12.0", + "futures 0.3.33", + "itertools 0.14.0", + "oneshot-fused-workaround", "paste", "sanitize-filename", "serde", "serde_json", - "thiserror", + "thiserror 2.0.19", + "time", + "tor-async-utils", "tor-basic-utils", "tor-error", "tracing", + "void", + "web-time-compat", ] [[package]] name = "tor-proto" -version = "0.18.0" +version = "0.44.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a090687ac4b1145bae9b8f4d45d9a45fbac8e508e1e0358951e2608ff451d02" +checksum = "666b602da8ba5a4189d6ff551f5dd9db949b503780140d175435658970a1ea54" dependencies = [ + "amplify", + "async-trait", "asynchronous-codec", "bitvec", - "bytes 1.5.0", + "bytes 1.12.1", + "caret", + "cfg-if 1.0.0", "cipher 0.4.4", "coarsetime", + "derive-deftly", "derive_builder_fork_arti", "derive_more", "digest 0.10.7", "educe", - "futures 0.3.29", - "hkdf 0.12.4", + "enum_dispatch", + "futures 0.3.33", + "futures-util", + "hkdf", "hmac 0.12.1", + "itertools 0.14.0", + "nonany", + "oneshot-fused-workaround", "pin-project", - "rand 0.8.5", - "rand_core 0.6.4", + "postage", + "rand 0.10.2", + "rand_core 0.10.1", "safelog", + "slotmap-careful", + "smallvec", + "static_assertions", + "strum 0.28.0", "subtle", - "thiserror", - "tokio 1.37.0", + "thiserror 2.0.19", + "tokio", "tokio-util 0.7.10", "tor-async-utils", "tor-basic-utils", @@ -7394,6 +7822,8 @@ dependencies = [ "tor-linkspec", "tor-llcrypto", "tor-log-ratelim", + "tor-memquota", + "tor-protover", "tor-rtcompat", "tor-rtmock", "tor-units", @@ -7401,26 +7831,61 @@ dependencies = [ "typenum", "visibility", "void", + "web-time-compat", "zeroize", ] [[package]] name = "tor-protover" -version = "0.18.0" +version = "0.44.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce5af1a305ca533613b676f13d5a276d648cb1f974361c830a3113703aad3b34" +checksum = "6ef84569d020c36eb322976f9a5dec1d3fa992db9739237ad1ae923b0ddeb298" dependencies = [ "caret", - "thiserror", + "paste", + "serde_with", + "thiserror 2.0.19", + "tor-basic-utils", + "tor-bytes", +] + +[[package]] +name = "tor-ptmgr" +version = "0.44.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "66db88ee6c5ba60a077b592b7e566d465220de61ccfd473fba6567c577cad475" +dependencies = [ + "async-trait", + "cfg-if 1.0.0", + "derive-deftly", + "derive_builder_fork_arti", + "fs-mistrust", + "futures 0.3.33", + "itertools 0.14.0", + "oneshot-fused-workaround", + "serde", + "thiserror 2.0.19", + "tor-async-utils", + "tor-basic-utils", + "tor-chanmgr", + "tor-config", + "tor-config-path", + "tor-error", + "tor-linkspec", + "tor-proto", + "tor-rtcompat", + "tor-socksproto", + "tracing", + "web-time-compat", ] [[package]] name = "tor-relay-selection" -version = "0.18.0" +version = "0.44.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "003bc22bbfc01fefc9c6fdb9d72ee1b8d979b2fae3d6885522f4ba9da327ef47" +checksum = "09778e3a45fdf49ca335fa16a0032abc5d4e1cacff9f46c3ed3e2a416d088aa6" dependencies = [ - "rand 0.8.5", + "rand 0.10.2", "serde", "tor-basic-utils", "tor-linkspec", @@ -7430,153 +7895,176 @@ dependencies = [ [[package]] name = "tor-rtcompat" -version = "0.18.0" +version = "0.44.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0d97b2264cfea9e8ed9b7aa50d220d1003a5775f5065ec3ef576eb9e61a1885" +checksum = "981279291476ad7ec309c874fa99b8d31250432a48ff6eea3f7405edbbd254e1" dependencies = [ - "async-io 2.2.2", + "amplify", "async-native-tls", - "async-std", "async-trait", "async_executors", + "asynchronous-codec", + "cfg-if 1.0.0", "coarsetime", + "derive_builder_fork_arti", "derive_more", + "dyn-clone", "educe", - "futures 0.3.29", - "futures-rustls", + "futures 0.3.33", + "hex", + "libc", "native-tls", "paste", "pin-project", - "rustls-pki-types", - "thiserror", - "tokio 1.37.0", + "socket2 0.6.5", + "thiserror 2.0.19", + "tokio", "tokio-util 0.7.10", + "tor-error", + "tor-general-addr", "tracing", - "x509-signature", + "void", + "web-time-compat", + "zeroize", ] [[package]] name = "tor-rtmock" -version = "0.18.0" +version = "0.44.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c547161e0854858ca7ad1fa31c4da8d97bfd983c2acaaf91488551d7f2ce5e88" +checksum = "6a3ee9695304cc44cc0de1dc673c9a71419318e214dc04ed7883a058d050654d" dependencies = [ "amplify", + "assert_matches", "async-trait", - "backtrace", "derive-deftly", "derive_more", "educe", - "futures 0.3.29", - "humantime 2.1.0", - "itertools 0.12.0", + "futures 0.3.33", + "humantime", + "itertools 0.14.0", + "oneshot-fused-workaround", "pin-project", "priority-queue", - "slotmap", - "strum 0.26.2", - "thiserror", - "tor-async-utils", + "slotmap-careful", + "strum 0.28.0", + "thiserror 2.0.19", "tor-error", + "tor-general-addr", "tor-rtcompat", "tracing", "tracing-test", "void", + "web-time-compat", ] [[package]] name = "tor-socksproto" -version = "0.18.0" +version = "0.44.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc64bbb385974631c800d1951bb48f08775c407281d4ce9a36aaa1c6512ced33" +checksum = "bbf78ef55dbfccb5a95cd75eb433621947923653cb91c9941d5a0a5116e510ee" dependencies = [ + "amplify", "caret", + "derive-deftly", + "educe", + "safelog", "subtle", - "thiserror", + "thiserror 2.0.19", "tor-bytes", "tor-error", ] [[package]] name = "tor-units" -version = "0.18.0" +version = "0.44.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0710451c303d01d6503157a90f831ed4f62574ec265116e1aebb4b67f0657972" +checksum = "d0325a93f3b35c5a9bda74705ce89b753e1c8e183af6945826188cef16687d80" dependencies = [ + "derive-deftly", "derive_more", - "thiserror", + "serde", + "thiserror 2.0.19", + "tor-memquota", ] [[package]] name = "tower" -version = "0.4.13" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" +checksum = "ebe5ef63511595f1344e2d5cfa636d973292adc0eec1f0ad45fae9f0851ab1d4" dependencies = [ "futures-core", "futures-util", - "pin-project", - "pin-project-lite 0.2.13", - "tokio 1.37.0", + "pin-project-lite", + "sync_wrapper", + "tokio", "tower-layer", "tower-service", - "tracing", +] + +[[package]] +name = "tower-http" +version = "0.6.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cfcf7e2740e6fc6d4d688b4ef00650406bb94adf4731e43c096c3a19fe40840" +dependencies = [ + "bitflags 2.13.1", + "bytes 1.12.1", + "futures-util", + "http 1.1.0", + "http-body 1.0.0", + "pin-project-lite", + "tower", + "tower-layer", + "tower-service", + "url", ] [[package]] name = "tower-layer" -version = "0.3.2" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c20c8dbed6283a09604c3e69b4b7eeb54e298b8a600d4d5ecb5ad39de609f1d0" +checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" [[package]] name = "tower-service" -version = "0.3.2" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" +checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" [[package]] name = "tracing" -version = "0.1.40" +version = "0.1.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" +checksum = "63e71662fa4b2a2c3a26f570f037eb95bb1f85397f3cd8076caed2f026a6d100" dependencies = [ - "log", - "pin-project-lite 0.2.13", + "pin-project-lite", "tracing-attributes", "tracing-core", ] [[package]] name = "tracing-attributes" -version = "0.1.27" +version = "0.1.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" +checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da" dependencies = [ - "proc-macro2 1.0.70", - "quote 1.0.33", - "syn 2.0.39", + "proc-macro2 1.0.107", + "quote 1.0.47", + "syn 2.0.119", ] [[package]] name = "tracing-core" -version = "0.1.32" +version = "0.1.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" +checksum = "db97caf9d906fbde555dd62fa95ddba9eecfd14cb388e4f491a66d74cd5fb79a" dependencies = [ "once_cell", "valuable", ] -[[package]] -name = "tracing-futures" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97d095ae15e245a057c8e8451bab9b3ee1e1f68e9ba2b4fbc18d0ac5237835f2" -dependencies = [ - "pin-project", - "tracing", -] - [[package]] name = "tracing-log" version = "0.2.0" @@ -7625,16 +8113,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "258bc1c4f8e2e73a977812ab339d503e6feeb92700f6d07a6de4d321522d5c08" dependencies = [ "lazy_static", - "quote 1.0.33", + "quote 1.0.47", "syn 1.0.109", ] -[[package]] -name = "traitobject" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "efd1f82c56340fdf16f2a953d7bda4f8fdffba13d93b00844c25572110b26079" - [[package]] name = "try-lock" version = "0.2.4" @@ -7652,17 +8134,21 @@ dependencies = [ [[package]] name = "typed-index-collections" -version = "3.1.0" +version = "3.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "183496e014253d15abbe6235677b1392dba2d40524c88938991226baa38ac7c4" +checksum = "898160f1dfd383b4e92e17f0512a7d62f3c51c44937b23b6ffc3a1614a8eaccd" +dependencies = [ + "bincode 2.0.1", + "serde", +] [[package]] -name = "typemap" -version = "0.3.3" +name = "typemap-ors" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "653be63c80a3296da5551e1bfd2cca35227e13cdd08c6668903ae2f4f77aa1f6" +checksum = "a68c24b707f02dd18f1e4ccceb9d49f2058c2fb86384ef9972592904d7a28867" dependencies = [ - "unsafe-any", + "unsafe-any-ors", ] [[package]] @@ -7696,7 +8182,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e35bfd2f2b8796545b55d7d3fd3e89a0613f68a0d1c8bc28cb7ff96b411a35ff" dependencies = [ "serde", - "tinystr", + "tinystr 0.7.5", ] [[package]] @@ -7708,27 +8194,12 @@ dependencies = [ "version_check", ] -[[package]] -name = "unicode-bidi" -version = "0.3.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92888ba5573ff080736b3648696b70cafad7d250551175acbaa4e0385b3e1460" - [[package]] name = "unicode-ident" version = "1.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" -[[package]] -name = "unicode-normalization" -version = "0.1.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921" -dependencies = [ - "tinyvec", -] - [[package]] name = "unicode-segmentation" version = "1.10.1" @@ -7747,6 +8218,12 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fc72304796d0818e357ead4e000d19c9c174ab23dc11093ac919054d20a6a7fc" +[[package]] +name = "unicode-xid" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" + [[package]] name = "universal-hash" version = "0.4.0" @@ -7758,19 +8235,19 @@ dependencies = [ ] [[package]] -name = "unsafe-any" -version = "0.4.2" +name = "unsafe-any-ors" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f30360d7979f5e9c6e6cea48af192ea8fab4afb3cf72597154b8f08935bc9c7f" +checksum = "e0a303d30665362d9680d7d91d78b23f5f899504d4f08b3c4cf08d055d87c0ad" dependencies = [ - "traitobject", + "destructure_traitobject", ] [[package]] -name = "untrusted" -version = "0.6.2" +name = "unsafe-libyaml" +version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55cd1f4b4e96b46aeb8d4855db4a7a9bd96eeeb5c6a1ab54593328761642ce2f" +checksum = "673aac59facbab8a9007c7f6108d11f63b603f7cabff99fabf650fea5c32b861" [[package]] name = "untrusted" @@ -7782,27 +8259,42 @@ checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" name = "untrusted" version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" +checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" + +[[package]] +name = "unty" +version = "0.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d49784317cd0d1ee7ec5c716dd598ec5b4483ea832a2dced265471cc0f690ae" [[package]] name = "url" -version = "2.5.0" +version = "2.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31e6302e3bb753d46e83516cae55ae196fc0c309407cf11ab35cc51a4c2a4633" +checksum = "ff67a8a4397373c3ef660812acab3268222035010ab8680ec4215f38ba3d0eed" dependencies = [ "form_urlencoded", "idna", "percent-encoding", + "serde", ] +[[package]] +name = "utf8_iter" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" + [[package]] name = "uuid" -version = "0.8.2" +version = "1.24.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc5cf98d8186244414c848017f0e2676b3fcb46807f6668a97dfe67359a3c4b7" +checksum = "bf3923a6f5c4c6382e0b653c4117f48d631ea17f38ed86e2a828e6f7412f5239" dependencies = [ - "getrandom 0.2.11", - "serde", + "getrandom 0.4.3", + "js-sys", + "serde_core", + "wasm-bindgen", ] [[package]] @@ -7813,9 +8305,9 @@ checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" [[package]] name = "value-bag" -version = "1.4.2" +version = "1.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a72e1902dde2bd6441347de2b70b7f5d59bf157c6c62f0c44572607a1d55bbe" +checksum = "ef73bfbaf3216cb59c205d7176bee1194e0d84348979da31f4a71fefe3c2054e" [[package]] name = "vcpkg" @@ -7841,9 +8333,9 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b3fd98999db9227cf28e59d83e1f120f42bc233d4b152e8fab9bc87d5bb1e0f8" dependencies = [ - "proc-macro2 1.0.70", - "quote 1.0.33", - "syn 2.0.39", + "proc-macro2 1.0.107", + "quote 1.0.47", + "syn 2.0.119", ] [[package]] @@ -7889,6 +8381,15 @@ version = "0.11.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" +[[package]] +name = "wasip2" +version = "1.0.4+wasi-0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b67efb37e106e55ce722a510d6b5f9c17f083e5fc79afc2badeb12cc313d9487" +dependencies = [ + "wit-bindgen", +] + [[package]] name = "wasix" version = "0.12.21" @@ -7900,28 +8401,14 @@ dependencies = [ [[package]] name = "wasm-bindgen" -version = "0.2.89" +version = "0.2.126" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ed0d4f68a3015cc185aff4db9506a015f4b96f95303897bfa23f846db54064e" +checksum = "4b067c0c11094aef6b7a801c1e34a26affafdf3d051dba08456b868789aaf9a4" dependencies = [ "cfg-if 1.0.0", - "serde", - "serde_json", - "wasm-bindgen-macro", -] - -[[package]] -name = "wasm-bindgen-backend" -version = "0.2.89" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b56f625e64f3a1084ded111c4d5f477df9f8c92df113852fa5a374dbda78826" -dependencies = [ - "bumpalo", - "log", "once_cell", - "proc-macro2 1.0.70", - "quote 1.0.33", - "syn 2.0.39", + "rustversion", + "wasm-bindgen-macro", "wasm-bindgen-shared", ] @@ -7939,32 +8426,35 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.89" +version = "0.2.126" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0162dbf37223cd2afce98f3d0785506dcb8d266223983e4b5b525859e6e182b2" +checksum = "167ce5e579f6bcf889c4f7175a8a5a585de84e8ff93976ce393efa5f2837aab1" dependencies = [ - "quote 1.0.33", + "quote 1.0.47", "wasm-bindgen-macro-support", ] [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.89" +version = "0.2.126" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0eb82fcb7930ae6219a7ecfd55b217f5f0893484b7a13022ebb2b2bf20b5283" +checksum = "f3997c7839262f4ef12cf90b818d6340c18e80f263f1a94bf157d0ec4420380e" dependencies = [ - "proc-macro2 1.0.70", - "quote 1.0.33", - "syn 2.0.39", - "wasm-bindgen-backend", + "bumpalo", + "proc-macro2 1.0.107", + "quote 1.0.47", + "syn 2.0.119", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.89" +version = "0.2.126" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ab9b36309365056cd639da3134bf87fa8f3d86008abf99e612384a6eecd459f" +checksum = "dc1b4cb0cc549fcf58d7dfc081778139b3d283a081644e833e84682ad71cea24" +dependencies = [ + "unicode-ident", +] [[package]] name = "weak-table" @@ -7983,40 +8473,24 @@ dependencies = [ ] [[package]] -name = "webpki" -version = "0.21.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8e38c0608262c46d4a56202ebabdeb094cef7e560ca7a226c6bf055188aa4ea" -dependencies = [ - "ring 0.16.20", - "untrusted 0.7.1", -] - -[[package]] -name = "webpki" -version = "0.22.4" +name = "web-time" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed63aea5ce73d0ff405984102c42de94fc55a6b75765d621c65262469b3c9b53" +checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb" dependencies = [ - "ring 0.17.8", - "untrusted 0.9.0", + "js-sys", + "wasm-bindgen", ] [[package]] -name = "webpki-roots" -version = "0.20.0" +name = "web-time-compat" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f20dea7535251981a9670857150d571846545088359b28e4951d350bdaf179f" +checksum = "af46dad42aa37be3b4a116fe613365f991b8bdae6cd6ce82d84fa9f9e8f70ae4" dependencies = [ - "webpki 0.21.4", + "web-time", ] -[[package]] -name = "winapi" -version = "0.2.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a" - [[package]] name = "winapi" version = "0.3.9" @@ -8027,12 +8501,6 @@ dependencies = [ "winapi-x86_64-pc-windows-gnu", ] -[[package]] -name = "winapi-build" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc" - [[package]] name = "winapi-i686-pc-windows-gnu" version = "0.4.0" @@ -8045,7 +8513,7 @@ version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f29e6f9198ba0d26b4c9f07dbe6f9ed633e1f3d5b8b414090084349e46a52596" dependencies = [ - "winapi 0.3.9", + "winapi", ] [[package]] @@ -8054,6 +8522,27 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" +[[package]] +name = "windows" +version = "0.62.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "527fadee13e0c05939a6a05d5bd6eec6cd2e3dbd648b9f8e447c6518133d8580" +dependencies = [ + "windows-collections", + "windows-core 0.62.2", + "windows-future", + "windows-numerics", +] + +[[package]] +name = "windows-collections" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23b2d95af1a8a14a3c7367e1ed4fc9c20e0a26e79551b1454d72583c97cc6610" +dependencies = [ + "windows-core 0.62.2", +] + [[package]] name = "windows-core" version = "0.51.1" @@ -8063,6 +8552,97 @@ dependencies = [ "windows-targets 0.48.5", ] +[[package]] +name = "windows-core" +version = "0.62.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb" +dependencies = [ + "windows-implement", + "windows-interface", + "windows-link", + "windows-result", + "windows-strings", +] + +[[package]] +name = "windows-future" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1d6f90251fe18a279739e78025bd6ddc52a7e22f921070ccdc67dde84c605cb" +dependencies = [ + "windows-core 0.62.2", + "windows-link", + "windows-threading", +] + +[[package]] +name = "windows-implement" +version = "0.60.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" +dependencies = [ + "proc-macro2 1.0.107", + "quote 1.0.47", + "syn 2.0.119", +] + +[[package]] +name = "windows-interface" +version = "0.59.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" +dependencies = [ + "proc-macro2 1.0.107", + "quote 1.0.47", + "syn 2.0.119", +] + +[[package]] +name = "windows-link" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" + +[[package]] +name = "windows-numerics" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e2e40844ac143cdb44aead537bbf727de9b044e107a0f1220392177d15b0f26" +dependencies = [ + "windows-core 0.62.2", + "windows-link", +] + +[[package]] +name = "windows-registry" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02752bf7fbdcce7f2a27a742f798510f3e5ad88dbe84871e5168e2120c3d5720" +dependencies = [ + "windows-link", + "windows-result", + "windows-strings", +] + +[[package]] +name = "windows-result" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-strings" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091" +dependencies = [ + "windows-link", +] + [[package]] name = "windows-sys" version = "0.45.0" @@ -8087,7 +8667,34 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" dependencies = [ - "windows-targets 0.52.0", + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-sys" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-sys" +version = "0.60.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" +dependencies = [ + "windows-targets 0.53.5", +] + +[[package]] +name = "windows-sys" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" +dependencies = [ + "windows-link", ] [[package]] @@ -8122,17 +8729,44 @@ dependencies = [ [[package]] name = "windows-targets" -version = "0.52.0" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm 0.52.6", + "windows_aarch64_msvc 0.52.6", + "windows_i686_gnu 0.52.6", + "windows_i686_gnullvm 0.52.6", + "windows_i686_msvc 0.52.6", + "windows_x86_64_gnu 0.52.6", + "windows_x86_64_gnullvm 0.52.6", + "windows_x86_64_msvc 0.52.6", +] + +[[package]] +name = "windows-targets" +version = "0.53.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3" +dependencies = [ + "windows-link", + "windows_aarch64_gnullvm 0.53.1", + "windows_aarch64_msvc 0.53.1", + "windows_i686_gnu 0.53.1", + "windows_i686_gnullvm 0.53.1", + "windows_i686_msvc 0.53.1", + "windows_x86_64_gnu 0.53.1", + "windows_x86_64_gnullvm 0.53.1", + "windows_x86_64_msvc 0.53.1", +] + +[[package]] +name = "windows-threading" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a18201040b24831fbb9e4eb208f8892e1f50a37feb53cc7ff887feb8f50e7cd" +checksum = "3949bd5b99cafdf1c7ca86b43ca564028dfe27d66958f2470940f73d86d75b37" dependencies = [ - "windows_aarch64_gnullvm 0.52.0", - "windows_aarch64_msvc 0.52.0", - "windows_i686_gnu 0.52.0", - "windows_i686_msvc 0.52.0", - "windows_x86_64_gnu 0.52.0", - "windows_x86_64_gnullvm 0.52.0", - "windows_x86_64_msvc 0.52.0", + "windows-link", ] [[package]] @@ -8149,9 +8783,15 @@ checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" [[package]] name = "windows_aarch64_gnullvm" -version = "0.52.0" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb7764e35d4db8a7921e09562a0304bf2f93e0a51bfccee0bd0bb0b666b015ea" +checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53" [[package]] name = "windows_aarch64_msvc" @@ -8167,9 +8807,15 @@ checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" [[package]] name = "windows_aarch64_msvc" -version = "0.52.0" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbaa0368d4f1d2aaefc55b6fcfee13f41544ddf36801e793edbbfd7d7df075ef" +checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006" [[package]] name = "windows_i686_gnu" @@ -8185,9 +8831,27 @@ checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" [[package]] name = "windows_i686_gnu" -version = "0.52.0" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnu" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a506593a3" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a28637cb1fa3560a16915793afb20081aba2c92ee8af57b4d5f28e4b3e7df313" +checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c" [[package]] name = "windows_i686_msvc" @@ -8203,9 +8867,15 @@ checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" [[package]] name = "windows_i686_msvc" -version = "0.52.0" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + +[[package]] +name = "windows_i686_msvc" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffe5e8e31046ce6230cc7215707b816e339ff4d4d67c65dffa206fd0f7aa7b9a" +checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2" [[package]] name = "windows_x86_64_gnu" @@ -8221,9 +8891,15 @@ checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" [[package]] name = "windows_x86_64_gnu" -version = "0.52.0" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d6fa32db2bc4a2f5abeacf2b69f7992cd09dca97498da74a151a3132c26befd" +checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499" [[package]] name = "windows_x86_64_gnullvm" @@ -8239,9 +8915,15 @@ checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" [[package]] name = "windows_x86_64_gnullvm" -version = "0.52.0" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a657e1e9d3f514745a572a6846d3c7aa7dbe1658c056ed9c3344c4109a6949e" +checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1" [[package]] name = "windows_x86_64_msvc" @@ -8257,9 +8939,15 @@ checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" [[package]] name = "windows_x86_64_msvc" -version = "0.52.0" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dff9641d1cd4be8d1a070daf9e3773c5f67e78b4d9d42263020c057706765c04" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" [[package]] name = "winnow" @@ -8271,23 +8959,31 @@ dependencies = [ ] [[package]] -name = "winreg" -version = "0.7.0" +name = "winnow" +version = "0.6.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0120db82e8a1e0b9fb3345a539c478767c0048d842860994d96113d5b667bd69" +checksum = "1e90edd2ac1aa278a5c4599b1d89cf03074b610800f866d4026dc199d7929a28" dependencies = [ - "winapi 0.3.9", + "memchr", ] [[package]] -name = "ws2_32-sys" -version = "0.2.1" +name = "winnow" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d59cefebd0c892fa2dd6de581e937301d8552cb44489cdff035c6187cb63fa5e" -dependencies = [ - "winapi 0.2.8", - "winapi-build", -] +checksum = "23b97319f7b8343df12cc98938e5c3eb436064524c8d2b4e30a1d3a36eecdf81" + +[[package]] +name = "wit-bindgen" +version = "0.57.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ebf944e87a7c253233ad6766e082e3cd714b5d03812acc24c318f549614536e" + +[[package]] +name = "writeable" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ffae5123b2d3fc086436f8834ae3ab053a283cfac8fe0a0b8eaae044768a4c4" [[package]] name = "wyz" @@ -8298,17 +8994,6 @@ dependencies = [ "tap", ] -[[package]] -name = "x25519-dalek" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "637ff90c9540fa3073bb577e65033069e4bae7c79d49d74aa3ffdf5342a53217" -dependencies = [ - "curve25519-dalek 2.1.3", - "rand_core 0.5.1", - "zeroize", -] - [[package]] name = "x25519-dalek" version = "1.1.1" @@ -8332,16 +9017,6 @@ dependencies = [ "zeroize", ] -[[package]] -name = "x509-signature" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fb2bc2a902d992cd5f471ee3ab0ffd6603047a4207384562755b9d6de977518" -dependencies = [ - "ring 0.16.20", - "untrusted 0.7.1", -] - [[package]] name = "xxhash-rust" version = "0.8.10" @@ -8364,52 +9039,101 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e66366e18dc58b46801afbf2ca7661a9f59cc8c5962c29892b6039b4f86fa992" [[package]] -name = "yaml-rust" -version = "0.4.5" +name = "yoke" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56c1936c4cc7a1c9ab21a1ebb602eb942ba868cbd44a99cb7cdc5892335e1c85" +checksum = "709fe23a0424b6a435d82152b1bd3fdfb0833487d5fa90d05d42762a9891fef5" dependencies = [ - "linked-hash-map", + "stable_deref_trait", + "yoke-derive", + "zerofrom", +] + +[[package]] +name = "yoke-derive" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "de844c262c8848816172cef550288e7dc6c7b7814b4ee56b3e1553f275f1858e" +dependencies = [ + "proc-macro2 1.0.107", + "quote 1.0.47", + "syn 2.0.119", + "synstructure", ] [[package]] -name = "zerocopy" -version = "0.7.32" +name = "zerofrom" +version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74d4d3961e53fa4c9a25a8637fc2bfaf2595b3d3ae34875568a5cf64787716be" +checksum = "0ec05a11813ea801ff6d75110ad09cd0824ddba17dfe17128ea0d5f68e6c5272" dependencies = [ - "zerocopy-derive", + "zerofrom-derive", ] [[package]] -name = "zerocopy-derive" -version = "0.7.32" +name = "zerofrom-derive" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ce1b18ccd8e73a9321186f97e46f9f04b778851177567b1975109d26a08d2a6" +checksum = "11532158c46691caf0f2593ea8358fed6bbf68a0315e80aae9bd41fbade684a1" dependencies = [ - "proc-macro2 1.0.70", - "quote 1.0.33", - "syn 2.0.39", + "proc-macro2 1.0.107", + "quote 1.0.47", + "syn 2.0.119", + "synstructure", ] [[package]] name = "zeroize" -version = "1.7.0" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "525b4ec142c6b68a2d10f01f7bbf6755599ca3f81ea53b8431b7dd348f5fdb2d" +checksum = "e13c156562582aa81c60cb29407084cdb54c4164760106ab78e6c5b0858cf64e" dependencies = [ "zeroize_derive", ] [[package]] name = "zeroize_derive" -version = "1.4.2" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c50655cbb0fe3fc43170059e702f1ce5e19b84cec58dc87b037a09935c2f328" +dependencies = [ + "proc-macro2 1.0.107", + "quote 1.0.47", + "syn 2.0.119", +] + +[[package]] +name = "zerotrie" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f9152d31db0792fa83f70fb2f83148effb5c1f5b8c7686c3459e361d9bc20bf" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", +] + +[[package]] +name = "zerovec" +version = "0.11.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90f911cbc359ab6af17377d242225f4d75119aec87ea711a880987b18cd7b239" +dependencies = [ + "serde", + "yoke", + "zerofrom", + "zerovec-derive", +] + +[[package]] +name = "zerovec-derive" +version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" +checksum = "625dc425cab0dca6dc3c3319506e6593dcb08a9f387ea3b284dbd52a92c40555" dependencies = [ - "proc-macro2 1.0.70", - "quote 1.0.33", - "syn 2.0.39", + "proc-macro2 1.0.107", + "quote 1.0.47", + "syn 2.0.119", ] [[package]] @@ -8420,9 +9144,15 @@ checksum = "93ab48844d61251bb3835145c521d88aa4031d7139e8485990f60ca911fa0815" dependencies = [ "byteorder", "crc32fast", - "thiserror", + "thiserror 1.0.30", ] +[[package]] +name = "zmij" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29666d0abbfad1e3dc4dcf6144730dd3a3ab225bbbdac83319345b1b44ccfc1b" + [[package]] name = "zstd" version = "0.13.1" diff --git a/Cargo.toml b/Cargo.toml index 9a61375..fe5eb1f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -6,8 +6,7 @@ edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -arti-client = { version = "0.18.0", default-features = false, features = ["async-std", "rustls", "onion-service-client", "onion-service-service"] } -arti-hyper = "0.18.0" +arti-client = { version = "0.44.0", features = ["static", "pt-client", "onion-service-service", "onion-service-client"] } async-std = { version = "1", features = ["tokio1"] } async-trait = "0.1.74" blake2 = { package = "blake2-rfc", version = "0.2" } @@ -22,10 +21,13 @@ dirs = "2.0" ed25519-dalek = "2.1.1" function_name = "0.3.0" futures = "0.3" -fs-mistrust = "0.7.9" +fs-mistrust = "0.15.0" hmac = { version = "0.12.0", features = ["std"] } -hyper = "0.14.28" -hyper-tls = "0.6.0" +http-body-util = "0.1.3" +hyper = { version = "1.10.1", features = ["http1", "client"] } +hyper-util = { version = "0.1.20", features = ["tokio"] } +hyper_legacy = { package = "hyper", version = "0.14.32", features = ["client", "http1", "tcp"] } +hyper-tls = "0.5.0" itertools = { version = "0.12.0" } jsonrpc-core = "18.0.0" jsonrpc-derive = "18.0.0" @@ -36,38 +38,50 @@ rand = "0.7.3" remove_dir_all = "0.8.2" ring = "0.16" rpassword = "4.0" -rusqlite = { version = "0.31.0", features = ["bundled"] } +rusqlite = { version = "0.36.0", features = ["bundled"] } serde = { version = "1", features = ["derive"] } serde_derive = "1" serde_json = "1" sha2 = "0.10.0" thiserror = "1.0.30" -tls-api = "0.9.0" -tls-api-native-tls = "0.9.0" tokio = { version = "1.37.0", features = ["full"] } toml = "0.8.8" -tor-hscrypto = "0.18.0" -tor-hsrproxy = "0.18.0" -tor-hsservice = "0.18.0" -tor-llcrypto = "0.18.0" -tor-keymgr = "0.18.0" -tor-rtcompat = "0.18.0" -x25519-dalek = "0.6.0" +tor-hscrypto = "0.44.0" +tor-hsrproxy = "0.44.0" +tor-hsservice = "0.44.0" +tor-llcrypto = "0.44.0" +tor-keymgr = "0.44.0" +tor-log-ratelim = "0.44.0" +tor-rtcompat = { version = "0.44.0", features = ["static"] } log = "0.4.20" # Bleeding Edge Grin Deps -grin_secp256k1zkp = { version = "0.7.14", features = ["bullet-proof-sizing"] } -grin_api = { git = "https://github.com/mimblewimble/grin", branch = "master" } -grin_core = { git = "https://github.com/mimblewimble/grin", branch = "master" } -grin_chain = { git = "https://github.com/mimblewimble/grin", branch = "master" } -grin_keychain = { git = "https://github.com/mimblewimble/grin", branch = "master" } -grin_p2p = { git = "https://github.com/mimblewimble/grin", branch = "master" } -grin_servers = { git = "https://github.com/mimblewimble/grin", branch = "master" } -grin_store = { git = "https://github.com/mimblewimble/grin", branch = "master" } -grin_util = { git = "https://github.com/mimblewimble/grin", branch = "master" } -grin_wallet_api = { git = "https://github.com/mimblewimble/grin-wallet", branch = "contracts" } -grin_wallet_config = { git = "https://github.com/mimblewimble/grin-wallet", branch = "contracts" } -grin_wallet_controller = { git = "https://github.com/mimblewimble/grin-wallet", branch = "contracts" } -grin_wallet_impls = { git = "https://github.com/mimblewimble/grin-wallet", branch = "contracts" } -grin_wallet_libwallet = { git = "https://github.com/mimblewimble/grin-wallet", branch = "contracts" } -grin_wallet_util = { git = "https://github.com/mimblewimble/grin-wallet", branch = "contracts" } +grin_secp256k1zkp = { version = "0.7.15", features = ["bullet-proof-sizing"] } +grin_api = { git = "https://github.com/mimblewimble/grin", branch = "staging" } +grin_core = { git = "https://github.com/mimblewimble/grin", branch = "staging" } +grin_chain = { git = "https://github.com/mimblewimble/grin", branch = "staging" } +grin_keychain = { git = "https://github.com/mimblewimble/grin", branch = "staging" } +grin_p2p = { git = "https://github.com/mimblewimble/grin", branch = "staging" } +grin_servers = { git = "https://github.com/mimblewimble/grin", branch = "staging" } +grin_store = { git = "https://github.com/mimblewimble/grin", branch = "staging" } +grin_util = { git = "https://github.com/mimblewimble/grin", branch = "staging" } +grin_wallet_api = { git = "https://github.com/wiesche89/grin-wallet", rev = "fed6733a2209aec2ed963a5691d91c6f00b4261d" } +grin_wallet_config = { git = "https://github.com/wiesche89/grin-wallet", rev = "fed6733a2209aec2ed963a5691d91c6f00b4261d" } +grin_wallet_controller = { git = "https://github.com/wiesche89/grin-wallet", rev = "fed6733a2209aec2ed963a5691d91c6f00b4261d" } +grin_wallet_impls = { git = "https://github.com/wiesche89/grin-wallet", rev = "fed6733a2209aec2ed963a5691d91c6f00b4261d" } +grin_wallet_libwallet = { git = "https://github.com/wiesche89/grin-wallet", rev = "fed6733a2209aec2ed963a5691d91c6f00b4261d" } +grin_wallet_util = { git = "https://github.com/wiesche89/grin-wallet", rev = "fed6733a2209aec2ed963a5691d91c6f00b4261d" } + +[dev-dependencies] +grin_wallet_libwallet = { git = "https://github.com/wiesche89/grin-wallet", rev = "fed6733a2209aec2ed963a5691d91c6f00b4261d", features = ["mwixnet-test"] } +x25519-dalek = { version = "2", features = ["static_secrets"] } + +[patch."https://github.com/wiesche89/grin-wallet"] +grin_api = { git = "https://github.com/mimblewimble/grin", branch = "staging" } +grin_chain = { git = "https://github.com/mimblewimble/grin", branch = "staging" } +grin_core = { git = "https://github.com/mimblewimble/grin", branch = "staging" } +grin_keychain = { git = "https://github.com/mimblewimble/grin", branch = "staging" } +grin_p2p = { git = "https://github.com/mimblewimble/grin", branch = "staging" } +grin_pool = { git = "https://github.com/mimblewimble/grin", branch = "staging" } +grin_store = { git = "https://github.com/mimblewimble/grin", branch = "staging" } +grin_util = { git = "https://github.com/mimblewimble/grin", branch = "staging" } diff --git a/README.md b/README.md index e9efe52..75cd341 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,7 @@ We refer to the remaining servers (N2...Nn) as "Mixers." #### init-config To setup a new server, run `mwixnet init-config`. Then enter a password for the server key when prompted. -This will generate a key for the server and then create a new config file named `mwixnet-config.toml` in the current working directory. +This generates a server key and writes `mwixnet-config.toml` to the selected network directory (for example `~/.grin/test` for testnet). Use `--config_file` to choose another path. The configuration file will contain the private key of the server encrypted with the server password you provided. **Back this config file up! It's the only copy of the server's private key!** @@ -19,8 +19,21 @@ The configuration file will contain the private key of the server encrypted with #### Wallet A grin-wallet account must be created for receiving extra mwixnet fees. The wallet's owner API should be available (run `grin-wallet owner_api`). +To run without a server wallet, set `collect_fees = false` in the config or pass `--no_fee_collection`. Hop fees are then paid entirely to miners. + ### Usage -With your wallet and fully synced node both online and listening at the addresses configured, the mwixnet server can be started by running `mwixnet` and providing the server key password and wallet password when prompted. +With a fully synced node and, when collecting fees, a wallet listening at the configured addresses, start the server by running `mwixnet` and entering the requested passwords. + +`mwixnet pubkey` outputs the server's Ed25519 identity key used to configure adjacent servers. +`mwixnet onion-pubkey` outputs the server's X25519 onion encryption key that clients provide to their wallets when creating mwixnet requests. + +#### Wallet workflow + +1. Collect each server's X25519 onion key in route order. +2. Run the wallet's experimental `mwixnet` command with an eligible output commitment, the first server's onion address, `fee_per_hop`, and the ordered server keys. +3. The wallet creates and locks the request, then submits it to the first server's `/v1` endpoint. + +Owner API clients can instead call `create_mwixnet_req` and submit the returned `request` field themselves. The result also contains the associated `tx_id` when locking was requested. Routing between servers is fixed by each server's `prev_server` and `next_server` configuration. ### SWAP API The Swap Server (N1) provides the `swap` API, which is publicly available for use by GRIN wallets. @@ -51,8 +64,8 @@ The Swap Server (N1) provides the `swap` API, which is publicly avail
  1. Choose random xi for each node ni and create a Payload (Pi) for each containing xi
  2. Build a rangeproof for Cn=Cin+(Σx1...n)*G and include it in payload Pn
  3. -
  4. Choose random initial ephemeral keypair (r1, R1)
  5. -
  6. Derive remaining ephemeral keypairs such that ri+1=ri*Sha256(Ri||si) where si=ECDH(Ri, Ki)
  7. +
  8. Choose a random ephemeral keypair (ri, Ri) for each hop
  9. +
  10. For each hop, derive si=ECDH(ri, Ki) and include Ri+1 in Pi
  11. For each node ni, use ChaCha20 stream cipher with key=HmacSha256("MWIXNET"||si) and nonce "NONCE1234567" to encrypt payloads Pi...n
@@ -63,4 +76,4 @@ The Swap Server (N1) provides the `swap` API, which is publicly avail ---- -`Output derivation`, `Output validation`, `Kernel derivation`, and `Aggregation` steps remain unchanged from the [original design](https://forum.grin.mw/t/mimblewimble-coinswap-proposal/8322) \ No newline at end of file +`Output derivation`, `Output validation`, `Kernel derivation`, and `Aggregation` steps remain unchanged from the [original design](https://forum.grin.mw/t/mimblewimble-coinswap-proposal/8322) diff --git a/doc/store.md b/doc/store.md index 121354d..754f8e7 100644 --- a/doc/store.md +++ b/doc/store.md @@ -2,9 +2,9 @@ ## Overview -The `SwapStore` is an lmdb database, responsible for storing unprocessed and in-process `SwapData` entries. +The `SwapStore` is an LMDB database for swap entries and generated swap transactions. -The `SwapStore` is used to hold onto new `SwapData` entries until the next swap round, when the mixing process actually occurs. At that time, they will be marked as `InProcess` until the swap is in a confirmed transaction, at which time they will be marked `Completed` and eventually erased. +New entries remain `Unprocessed` until a round uses them. A successful round marks them `InProcess`; entries rejected by a downstream mixer become `Failed`. Reorg checks can rebroadcast or rebuild the transaction. Automatic transition to `Completed` and deletion are not currently implemented. ## Data Model @@ -22,6 +22,6 @@ The `SwapData` structure contains information needed to swap a single output. It - `onion`: The remaining onion after peeling off our layer. - `status`: The status of the swap, represented by the `SwapStatus` enum, which can be one of the following: - `Unprocessed`: The swap has been received but not yet processed. - - `InProcess { kernel_hash: Hash }`: The swap is currently being processed, and is expected to be a transaction with the kernel matching the given `kernel_hash`. - - `Completed { kernel_hash: Hash, block_hash: Hash }`: The swap has been successfully processed and included in the block matching the given `block_hash`. - - `Failed`: The swap has failed, potentially due to expiration or because the output is no longer in the UTXO set. \ No newline at end of file + - `InProcess { kernel_commit: Commitment }`: The swap was included in a generated transaction identified by its kernel commitment. + - `Completed { kernel_commit: Commitment, block_hash: Hash }`: Reserved for a swap confirmed in the given block; the current server does not set this status. + - `Failed`: The swap has failed, potentially due to expiration or because the output is no longer in the UTXO set. diff --git a/doc/swap_api.md b/doc/swap_api.md index fa84f86..0f73bf2 100644 --- a/doc/swap_api.md +++ b/doc/swap_api.md @@ -7,7 +7,7 @@ The Swap Server provides a single JSON-RPC API with the method `swap`. This API ## SWAP ### Request -The `swap` method accepts a single JSON object containing the following fields: +The `swap` method accepts one positional parameter: a `SwapReq` object containing: - `onion`: an `Onion` data structure, which is the encrypted onion packet containing the key information necessary to transform the user's output. - `comsig`: a Commitment Signature that proves the client knows the secret key and value of the output's commitment. @@ -20,20 +20,20 @@ The `Onion` data structure consists of the following fields: - `commit`: the Pedersen commitment before adjusting the excess and subtracting the fee, represented as a 33-byte `secp256k1` Pedersen commitment. - `data`: a vector of encrypted payloads, each representing a layer of the onion. When completely decrypted, these are serialized `Payload` objects. -Each entry in the `enc_payloads` vector corresponds to a server in the system, in order, with the first entry containing the payload for the swap server, and the last entry containing the payload for the final mix server. +Each entry in `data` corresponds to one server in route order, from the swap server to the final mixer. #### `Payload` data structure A `Payload` represents a single, decrypted/peeled layer of an Onion. It consists of the following fields: -- `next_ephemeral_pk`: an `xPublicKey` representing the public key for the next layer. +- `next_ephemeral_pk`: the X25519 ephemeral public key for the next layer. - `excess`: a `SecretKey` representing the excess value. - `fee`: a `FeeFields` value representing the transaction fee. - `rangeproof`: an optional `RangeProof` value. ### Response -A successful call to the 'swap' API will result in an empty JSON-RPC response with no error. +A successful call returns the JSON-RPC result `"success"`. In case of errors, the API will return a `SwapError` type with one of the following variants: @@ -46,6 +46,8 @@ In case of errors, the API will return a `SwapError` type with one of the follow - `PeelOnionFailure`: Failed to peel onion layer due to an `OnionError`. - `FeeTooLow`: The provided fee is too low. - `StoreError`: An error occurred when saving swap to the data store. +- `TxError`: An error occurred while building the swap transaction. +- `NodeError`: An error occurred while communicating with the Grin node. - `ClientError`: An error occurred during client communication. - `SwapTxNotFound`: The previous swap transaction was not found in data store. - `UnknownError`: An unknown error occurred. @@ -70,4 +72,4 @@ Here is an example of how to call the 'swap' API: }, "id": "1" } -``` \ No newline at end of file +``` diff --git a/src/bin/mwixnet.rs b/src/bin/mwixnet.rs index 2bc0ce9..eb91d69 100644 --- a/src/bin/mwixnet.rs +++ b/src/bin/mwixnet.rs @@ -10,13 +10,13 @@ use clap::App; use grin_core::global; use grin_core::global::ChainTypes; use grin_util::{StopState, ZeroingString}; -use grin_wallet_libwallet::mwixnet::onion as grin_onion; -use rand::{Rng, thread_rng}; +use rand::{thread_rng, Rng}; use rpassword; use tor_rtcompat::PreferredRuntime; use grin_onion::crypto; use grin_onion::crypto::dalek::DalekPublicKey; +use grin_wallet_libwallet::mwixnet::onion as grin_onion; use mwixnet::config::{self, ServerConfig}; use mwixnet::mix_client::{MixClient, MixClientImpl}; use mwixnet::node::GrinNode; @@ -25,24 +25,67 @@ use mwixnet::servers; use mwixnet::store::StoreError; use mwixnet::store::SwapStore; use mwixnet::tor; -use mwixnet::wallet::HttpWallet; +use mwixnet::wallet::{HttpWallet, Wallet}; const DEFAULT_INTERVAL: u32 = 12 * 60 * 60; +struct StderrLogger; + +impl log::Log for StderrLogger { + fn enabled(&self, metadata: &log::Metadata<'_>) -> bool { + metadata.level() <= log::max_level() + && (metadata.target().starts_with("mwixnet") + || metadata.target().starts_with("arti_client") + || metadata.target().starts_with("tor_")) + } + + fn log(&self, record: &log::Record<'_>) { + if self.enabled(record.metadata()) { + eprintln!("{} {} - {}", record.level(), record.target(), record.args()); + } + } + + fn flush(&self) {} +} + +static LOGGER: StderrLogger = StderrLogger; + +fn init_logging() { + if log::set_logger(&LOGGER).is_ok() { + let level = std::env::var("MWIXNET_LOG") + .ok() + .and_then(|level| level.parse().ok()) + .unwrap_or(log::LevelFilter::Info); + log::set_max_level(level); + } +} + +fn interval_elapsed(elapsed: &mut u32, interval: u32) -> bool { + *elapsed = elapsed.saturating_add(1); + if *elapsed >= interval { + *elapsed = 0; + true + } else { + false + } +} + fn main() -> Result<(), Box> { - real_main()?; - std::process::exit(0); + real_main() } fn real_main() -> Result<(), Box> { + init_logging(); + let yml = load_yaml!("mwixnet.yml"); let args = App::from_yaml(yml).get_matches(); + let server_pass_file = args.value_of("server_pass_file"); let chain_type = if args.is_present("testnet") { ChainTypes::Testnet } else { ChainTypes::Mainnet }; - global::set_local_chain_type(chain_type); + global::init_global_chain_type(chain_type); let config_path = match args.value_of("config_file") { Some(path) => PathBuf::from(path), @@ -58,9 +101,10 @@ fn real_main() -> Result<(), Box> { .map(|t| t.parse::().unwrap()); let bind_addr = args.value_of("bind_addr"); let grin_node_url = args.value_of("grin_node_url"); - let grin_node_secret_path = args.value_of("grin_node_secret_path"); + let grin_node_foreign_api_secret_path = args.value_of("grin_node_foreign_api_secret_path"); let wallet_owner_url = args.value_of("wallet_owner_url"); let wallet_owner_secret_path = args.value_of("wallet_owner_secret_path"); + let no_fee_collection = args.is_present("no_fee_collection"); let prev_server = args .value_of("prev_server") .map(|p| DalekPublicKey::from_hex(&p).unwrap()); @@ -78,16 +122,16 @@ fn real_main() -> Result<(), Box> { } let server_config = ServerConfig { - key: crypto::secp::random_secret(), + key: crypto::secp::random_secret(false), interval_s: round_time.unwrap_or(DEFAULT_INTERVAL), addr: bind_addr.unwrap_or("127.0.0.1:3000").parse()?, grin_node_url: match grin_node_url { Some(u) => u.parse()?, None => config::grin_node_url(&chain_type), }, - grin_node_secret_path: match grin_node_secret_path { + grin_node_foreign_api_secret_path: match grin_node_foreign_api_secret_path { Some(p) => Some(p.to_owned()), - None => config::node_secret_path(&chain_type) + None => config::node_foreign_api_secret_path(&chain_type) .to_str() .map(|p| p.to_owned()), }, @@ -101,11 +145,12 @@ fn real_main() -> Result<(), Box> { .to_str() .map(|p| p.to_owned()), }, + collect_fees: !no_fee_collection, prev_server, next_server, }; - let password = prompt_password_confirm(); + let password = server_password(server_pass_file, true)?; config::write_config(&config_path, &server_config, &password)?; println!( "Config file written to {:?}. Please back this file up in a safe place.", @@ -114,8 +159,11 @@ fn real_main() -> Result<(), Box> { return Ok(()); } - let password = prompt_password(); + let password = server_password(server_pass_file, false)?; let mut server_config = config::load_config(&config_path, &password)?; + if no_fee_collection { + server_config.collect_fees = false; + } // Write a new config file if init-config command is supplied if let ("pubkey", Some(_)) = args.subcommand() { @@ -127,8 +175,7 @@ fn real_main() -> Result<(), Box> { } let sub_args = args.subcommand_matches("pubkey").unwrap(); let server_pubkey = server_config.server_pubkey(); - if sub_args.is_present("output_file") - { + if sub_args.is_present("output_file") { //output server pubkey to file let output_file = sub_args.value_of("output_file").unwrap(); std::fs::write(output_file, format!("{}", server_pubkey.to_hex()))?; @@ -136,7 +183,26 @@ fn real_main() -> Result<(), Box> { } else { println!("{}", server_pubkey.to_hex()); } - return Ok(()) + return Ok(()); + } + + if let ("onion-pubkey", Some(_)) = args.subcommand() { + if !config_path.exists() { + panic!( + "No public address configured (Config file not found). {}", + config_path.to_string_lossy() + ); + } + let sub_args = args.subcommand_matches("onion-pubkey").unwrap(); + let onion_pubkey = server_config.onion_pubkey(); + if sub_args.is_present("output_file") { + let output_file = sub_args.value_of("output_file").unwrap(); + std::fs::write(output_file, onion_pubkey.to_hex())?; + println!("Onion pubkey written to file: {}", output_file); + } else { + println!("{}", onion_pubkey.to_hex()); + } + return Ok(()); } // Override grin_node_url, if supplied @@ -144,9 +210,9 @@ fn real_main() -> Result<(), Box> { server_config.grin_node_url = grin_node_url.parse()?; } - // Override grin_node_secret_path, if supplied - if let Some(grin_node_secret_path) = grin_node_secret_path { - server_config.grin_node_secret_path = Some(grin_node_secret_path.to_owned()); + // Override grin_node_foreign_api_secret_path, if supplied + if let Some(path) = grin_node_foreign_api_secret_path { + server_config.grin_node_foreign_api_secret_path = Some(path.to_owned()); } // Override wallet_owner_url, if supplied @@ -177,7 +243,7 @@ fn real_main() -> Result<(), Box> { // Create GrinNode let node = HttpGrinNode::new( &server_config.grin_node_url, - &server_config.node_api_secret(), + &server_config.node_foreign_api_secret(), ); // Node API health check @@ -192,30 +258,36 @@ fn real_main() -> Result<(), Box> { return Err(e.into()); }; - // Open wallet - let wallet_pass = prompt_wallet_password(&args.value_of("wallet_pass")); - let wallet = rt_handle.block_on(HttpWallet::async_open_wallet( - &server_config.wallet_owner_url, - &server_config.wallet_owner_api_secret(), - &wallet_pass, - )); - let wallet = match wallet { - Ok(w) => w, - Err(e) => { - eprintln!("Wallet communication failure. Is wallet listening?"); - return Err(e.into()); + // Open wallet when collecting excess hop fees. + let wallet: Option> = if server_config.collect_fees { + let wallet_pass = prompt_wallet_password(&args.value_of("wallet_pass")); + let wallet = rt_handle.block_on(HttpWallet::async_open_wallet( + &server_config.wallet_owner_url, + &server_config.wallet_owner_api_secret(), + &wallet_pass, + )); + match wallet { + Ok(w) => Some(Arc::new(w)), + Err(e) => { + eprintln!("Wallet communication failure. Is wallet listening?"); + return Err(e.into()); + } } - }; - - let tor_runtime = if let Ok(r) = PreferredRuntime::create() { - r } else { - return Err("No runtime found".into()); + println!("Fee collection disabled; hop fees will be paid to miners."); + None }; + let tor_runtime = rt_handle.block_on(async { PreferredRuntime::current() })?; + tor_log_ratelim::install_runtime(tor_runtime.clone())?; + + let tor_data_dir = config::get_grin_path(&chain_type) + .to_str() + .ok_or("Invalid Tor data directory")? + .to_owned(); let tor_instance = rt_handle.block_on(tor::async_init_tor( - tor_runtime, - &config::get_grin_path(&chain_type).to_str().unwrap(), + tor_runtime.clone(), + &tor_data_dir, &server_config, ))?; let tor_instance = Arc::new(grin_util::Mutex::new(tor_instance)); @@ -225,8 +297,12 @@ fn real_main() -> Result<(), Box> { let stop_state_clone = stop_state.clone(); rt_handle.spawn(async move { - futures::executor::block_on(build_signals_fut()); - tor_clone.lock().stop(); + build_signals_fut().await; + match tokio::task::spawn_blocking(move || tor_clone.lock().stop()).await { + Ok(Ok(())) => {} + Ok(Err(error)) => eprintln!("Could not stop Tor service cleanly: {error}"), + Err(error) => eprintln!("Tor shutdown task failed: {error}"), + } stop_state_clone.stop(); }); @@ -242,15 +318,16 @@ fn real_main() -> Result<(), Box> { if server_config.prev_server.is_some() { // Start the JSON-RPC HTTP 'mix' server println!( - "Starting MIX server with public key {:?}", - server_config.server_pubkey().to_hex() + "Starting MIX server\nEd25519 identity key: {}\nX25519 onion key: {}", + server_config.server_pubkey().to_hex(), + server_config.onion_pubkey().to_hex() ); let (_, http_server) = servers::mix_rpc::listen( &rt_handle, server_config, next_mixer, - Arc::new(wallet), + wallet, Arc::new(node), )?; @@ -268,8 +345,9 @@ fn real_main() -> Result<(), Box> { round_handle.join().unwrap(); } else { println!( - "Starting SWAP server with public key {:?}", - server_config.server_pubkey().to_hex() + "Starting SWAP server\nEd25519 identity key: {}\nX25519 onion key: {}", + server_config.server_pubkey().to_hex(), + server_config.onion_pubkey().to_hex() ); // Open SwapStore @@ -287,7 +365,7 @@ fn real_main() -> Result<(), Box> { rt.handle(), &server_config, next_mixer, - Arc::new(wallet), + wallet, Arc::new(node), store, )?; @@ -308,41 +386,38 @@ fn real_main() -> Result<(), Box> { } sleep(Duration::from_secs(1)); - secs = (secs + 1) % server_config.interval_s; - reorg_secs = (reorg_secs + 1) % reorg_window; - - if secs == 0 { - let prev_tx_clone = prev_tx.clone(); - let server_clone = server.clone(); - rt.spawn(async move { - let result = server_clone.lock().await.execute_round().await; - let mut prev_tx_lock = prev_tx_clone.lock().unwrap(); - *prev_tx_lock = match result { - Ok(Some(tx)) => Some(tx), - _ => None, - }; - }); - reorg_secs = 0; + let run_round = interval_elapsed(&mut secs, server_config.interval_s); + let check_reorg = interval_elapsed(&mut reorg_secs, reorg_window); + if check_reorg { reorg_window = rng.gen_range(900u32, 3600u32); - } else if reorg_secs == 0 { + } + + if run_round || check_reorg { let prev_tx_clone = prev_tx.clone(); let server_clone = server.clone(); rt.spawn(async move { - let tx_option = { - let prev_tx_lock = prev_tx_clone.lock().unwrap(); - prev_tx_lock.clone() - }; // Lock is dropped here - - if let Some(tx) = tx_option { - let result = server_clone.lock().await.check_reorg(&tx).await; - let mut prev_tx_lock = prev_tx_clone.lock().unwrap(); - *prev_tx_lock = match result { - Ok(Some(tx)) => Some(tx), - _ => None, - }; + if check_reorg { + let tx = prev_tx_clone.lock().unwrap().clone(); + if let Some(tx) = tx { + let result = server_clone.lock().await.check_reorg(&tx).await; + let mut prev_tx = prev_tx_clone.lock().unwrap(); + *prev_tx = match result { + Ok(Some(tx)) => Some(tx), + _ => None, + }; + } + } + + if run_round { + match server_clone.lock().await.execute_round().await { + Ok(Some(tx)) => { + *prev_tx_clone.lock().unwrap() = Some(tx); + } + Ok(None) => {} + Err(e) => eprintln!("Swap round failed: {}", e), + } } }); - reorg_window = rng.gen_range(900u32, 3600u32); } } }); @@ -402,3 +477,62 @@ fn prompt_wallet_password(wallet_pass: &Option<&str>) -> ZeroingString { } } } + +fn server_password( + password_file: Option<&str>, + confirm: bool, +) -> Result { + if let Some(path) = password_file { + let mut password = std::fs::read_to_string(path)?; + while password.ends_with('\n') || password.ends_with('\r') { + password.pop(); + } + return Ok(ZeroingString::from(password)); + } + + Ok(if confirm { + prompt_password_confirm() + } else { + prompt_password() + }) +} + +#[cfg(test)] +mod tests { + use super::{global, interval_elapsed, server_password, ChainTypes}; + + #[test] + fn independent_intervals() { + let mut round_elapsed = 0; + let mut reorg_elapsed = 0; + let mut rounds = 0; + let mut reorg_checks = 0; + + for _ in 0..10 { + rounds += interval_elapsed(&mut round_elapsed, 2) as u32; + reorg_checks += interval_elapsed(&mut reorg_elapsed, 5) as u32; + } + + assert_eq!(rounds, 5); + assert_eq!(reorg_checks, 2); + } + + #[test] + fn chain_type_is_available_to_worker_threads() { + global::init_global_chain_type(ChainTypes::Testnet); + let worker_chain_type = std::thread::spawn(global::get_chain_type).join().unwrap(); + assert_eq!(worker_chain_type, ChainTypes::Testnet); + } + + #[test] + fn reads_server_password_file() { + let path = + std::env::temp_dir().join(format!("mwixnet-server-password-{}", std::process::id())); + std::fs::write(&path, "test\r\n").unwrap(); + + let password = server_password(path.to_str(), false).unwrap(); + std::fs::remove_file(path).unwrap(); + + assert_eq!(&*password, "test"); + } +} diff --git a/src/bin/mwixnet.yml b/src/bin/mwixnet.yml index 60d6a3e..6775c45 100644 --- a/src/bin/mwixnet.yml +++ b/src/bin/mwixnet.yml @@ -12,14 +12,18 @@ args: help: Run grin against the Testnet (as opposed to mainnet) long: testnet takes_value: false + - server_pass_file: + help: Path to a file containing the server password + long: server_pass_file + takes_value: true - grin_node_url: - help: Api address of running GRIN node on which to check inputs and post transactions + help: HTTP(S) URL or address of running GRIN node on which to check inputs and post transactions short: n long: grin_node_url takes_value: true - - grin_node_secret_path: - help: Path to a file containing the secret for the GRIN node api - long: grin_node_secret_path + - grin_node_foreign_api_secret_path: + help: Path to a file containing the secret for the Grin node foreign API + long: grin_node_foreign_api_secret_path takes_value: true - wallet_owner_url: help: Api address of running wallet owner listener @@ -34,27 +38,40 @@ args: help: The wallet's password long: wallet_pass takes_value: true + - no_fee_collection: + help: Leave hop fees to miners instead of collecting them in a wallet + long: no_fee_collection + takes_value: false - bind_addr: help: Address to bind the rpc server to (e.g. 127.0.0.1:3000) long: bind_addr takes_value: true - prev_server: - help: Hex public key of the previous swap/mix server + help: Hex Ed25519 identity key of the previous swap/mix server long: prev_server takes_value: true - next_server: - help: Hex public key of the next mix server + help: Hex Ed25519 identity key of the next mix server long: next_server takes_value: true subcommands: - init-config: about: Writes a new configuration file - pubkey: - about: Outputs the public key of the server + about: Outputs the Ed25519 identity key of the server + args: + - output_file: + help: Path to output the public key to + long: output_file + short: o + takes_value: true + required: false + - onion-pubkey: + about: Outputs the X25519 onion encryption key of the server args: - output_file: help: Path to output the public key to long: output_file short: o - takes_value: true - required: false \ No newline at end of file + takes_value: true + required: false diff --git a/src/config.rs b/src/config.rs index 7ee4514..03fd83d 100644 --- a/src/config.rs +++ b/src/config.rs @@ -8,18 +8,22 @@ use std::result::Result; use grin_core::global::ChainTypes; use grin_util::{file, ToHex, ZeroingString}; use grin_wallet_util::OnionV3Address; -use rand::{Rng, thread_rng}; +use rand::{thread_rng, Rng}; use ring::{aead, pbkdf2}; use serde_derive::{Deserialize, Serialize}; use thiserror::Error; -use grin_wallet_libwallet::mwixnet::onion as grin_onion; use grin_onion::crypto::dalek::DalekPublicKey; use grin_onion::crypto::secp::SecretKey; +use grin_wallet_libwallet::mwixnet::{onion as grin_onion, MwixnetServerPublicKey}; const GRIN_HOME: &str = ".grin"; -const NODE_API_SECRET_FILE_NAME: &str = ".api_secret"; +const NODE_FOREIGN_API_SECRET_FILE_NAME: &str = ".foreign_api_secret"; const WALLET_OWNER_API_SECRET_FILE_NAME: &str = ".owner_api_secret"; +const CONFIG_HEADER: &str = "\ +# MWixnet server configuration +# Wallet clients use the ordered X25519 onion keys printed at server startup. +"; /// The decrypted server config to be passed around and used by the rest of the mwixnet code #[derive(Clone, Debug, Serialize, Deserialize, PartialEq)] @@ -32,16 +36,18 @@ pub struct ServerConfig { pub addr: SocketAddr, /// foreign api address of the grin node pub grin_node_url: String, - /// path to file containing api secret for the grin node - pub grin_node_secret_path: Option, + /// path to file containing the secret for the Grin node foreign API + pub grin_node_foreign_api_secret_path: Option, /// owner api address of the grin wallet pub wallet_owner_url: String, /// path to file containing secret for the grin wallet's owner api pub wallet_owner_secret_path: Option, - /// public key of the previous mix/swap server (e.g. N_1 if this is N_2) + /// whether to collect excess hop fees in the server wallet + pub collect_fees: bool, + /// Ed25519 identity key of the previous mix/swap server (e.g. N_1 if this is N_2) #[serde(with = "grin_onion::crypto::dalek::option_dalek_pubkey_serde", default)] pub prev_server: Option, - /// public key of the next mix server + /// Ed25519 identity key of the next mix server #[serde(with = "grin_onion::crypto::dalek::option_dalek_pubkey_serde", default)] pub next_server: Option, } @@ -55,8 +61,12 @@ impl ServerConfig { DalekPublicKey::from_secret(&self.key) } - pub fn node_api_secret(&self) -> Option { - file::get_first_line(self.grin_node_secret_path.clone()) + pub fn onion_pubkey(&self) -> MwixnetServerPublicKey { + MwixnetServerPublicKey::from_secret(&self.key) + } + + pub fn node_foreign_api_secret(&self) -> Option { + file::get_first_line(self.grin_node_foreign_api_secret_path.clone()) } pub fn wallet_owner_api_secret(&self) -> Option { @@ -182,15 +192,68 @@ struct RawConfig { interval_s: u32, addr: SocketAddr, grin_node_url: String, - grin_node_secret_path: Option, + grin_node_foreign_api_secret_path: Option, wallet_owner_url: String, wallet_owner_secret_path: Option, + collect_fees: bool, #[serde(with = "grin_onion::crypto::dalek::option_dalek_pubkey_serde", default)] prev_server: Option, #[serde(with = "grin_onion::crypto::dalek::option_dalek_pubkey_serde", default)] next_server: Option, } +fn config_comment(key: &str) -> Option<&'static str> { + match key { + "encrypted_key" => Some("Encrypted server identity and onion secret key."), + "salt" => Some("Salt used to derive the server-key encryption key."), + "nonce" => Some("Nonce used to encrypt the server key."), + "interval_s" => Some("Seconds between mixing rounds."), + "addr" => Some("Local RPC bind address, also exposed by the Tor onion service."), + "grin_node_url" => Some("Grin node HTTP(S) URL or address."), + "grin_node_foreign_api_secret_path" => Some("Path to the Grin node foreign API secret."), + "wallet_owner_url" => Some("Wallet Owner API address used for fee collection."), + "wallet_owner_secret_path" => Some("Path to the wallet Owner API secret."), + "collect_fees" => { + Some("Collect excess hop fees in the wallet; false pays all hop fees to miners.") + } + "prev_server" => { + Some("Previous server Ed25519 identity key; setting it makes this server a mixer.") + } + "next_server" => Some("Next server Ed25519 identity key; leave unset for the final hop."), + _ => None, + } +} + +fn documented_config(raw_config: &RawConfig) -> Result { + let config = toml::to_string(raw_config).map_err(ConfigError::EncodingError)?; + let mut encoded = CONFIG_HEADER.trim_end().to_string(); + + for line in config.lines() { + if let Some((key, _)) = line.split_once('=') { + if let Some(comment) = config_comment(key.trim()) { + encoded.push_str("\n\n# "); + encoded.push_str(comment); + } + } + encoded.push('\n'); + encoded.push_str(line); + } + encoded.push('\n'); + + if raw_config.prev_server.is_none() { + encoded.push_str( + "\n# Previous server Ed25519 identity key; setting it makes this server a mixer.\n", + ); + encoded.push_str("# prev_server = \"\"\n"); + } + if raw_config.next_server.is_none() { + encoded.push_str("\n# Next server Ed25519 identity key; leave unset for the final hop.\n"); + encoded.push_str("# next_server = \"\"\n"); + } + + Ok(encoded) +} + /// Writes the server config to the config_path given, encrypting the server_key first. pub fn write_config( config_path: &PathBuf, @@ -206,14 +269,14 @@ pub fn write_config( interval_s: server_config.interval_s, addr: server_config.addr, grin_node_url: server_config.grin_node_url.clone(), - grin_node_secret_path: server_config.grin_node_secret_path.clone(), + grin_node_foreign_api_secret_path: server_config.grin_node_foreign_api_secret_path.clone(), wallet_owner_url: server_config.wallet_owner_url.clone(), wallet_owner_secret_path: server_config.wallet_owner_secret_path.clone(), + collect_fees: server_config.collect_fees, prev_server: server_config.prev_server.clone(), next_server: server_config.next_server.clone(), }; - let encoded: String = - toml::to_string(&raw_config).map_err(|e| ConfigError::EncodingError(e))?; + let encoded = documented_config(&raw_config)?; let mut file = File::create(config_path).map_err(|e| ConfigError::FileWriteError(e))?; file.write_all(encoded.as_bytes()) @@ -242,9 +305,10 @@ pub fn load_config( interval_s: raw_config.interval_s, addr: raw_config.addr, grin_node_url: raw_config.grin_node_url, - grin_node_secret_path: raw_config.grin_node_secret_path, + grin_node_foreign_api_secret_path: raw_config.grin_node_foreign_api_secret_path, wallet_owner_url: raw_config.wallet_owner_url, wallet_owner_secret_path: raw_config.wallet_owner_secret_path, + collect_fees: raw_config.collect_fees, prev_server: raw_config.prev_server, next_server: raw_config.next_server, }) @@ -257,9 +321,9 @@ pub fn get_grin_path(chain_type: &ChainTypes) -> PathBuf { grin_path } -pub fn node_secret_path(chain_type: &ChainTypes) -> PathBuf { +pub fn node_foreign_api_secret_path(chain_type: &ChainTypes) -> PathBuf { let mut path = get_grin_path(chain_type); - path.push(NODE_API_SECRET_FILE_NAME); + path.push(NODE_FOREIGN_API_SECRET_FILE_NAME); path } @@ -283,6 +347,7 @@ pub fn wallet_owner_url(_chain_type: &ChainTypes) -> String { #[cfg(test)] pub mod test_util { + use super::grin_onion; use std::net::TcpListener; use grin_onion::crypto::dalek::DalekPublicKey; @@ -300,9 +365,10 @@ pub mod test_util { interval_s: 1, addr: TcpListener::bind("127.0.0.1:0")?.local_addr()?, grin_node_url: "127.0.0.1:3413".parse()?, - grin_node_secret_path: None, + grin_node_foreign_api_secret_path: None, wallet_owner_url: "127.0.0.1:3420".parse()?, wallet_owner_secret_path: None, + collect_fees: true, prev_server: prev_server.clone(), next_server: next_server.clone(), }; @@ -312,6 +378,7 @@ pub mod test_util { #[cfg(test)] mod tests { + use super::grin_onion; use grin_onion::crypto::secp; use super::*; @@ -319,7 +386,7 @@ mod tests { #[test] fn server_key_encrypt() { let password = ZeroingString::from("password"); - let server_key = secp::random_secret(); + let server_key = secp::random_secret(false); let mut enc_key = EncryptedServerKey::from_secret_key(&server_key, &password); let decrypted_key = enc_key.decrypt(&password).unwrap(); assert_eq!(server_key, decrypted_key); @@ -333,4 +400,55 @@ mod tests { let decrypted_key = enc_key.decrypt(&password); assert!(decrypted_key.is_err()); } + + #[test] + fn onion_pubkey() { + let server_key = secp::SecretKey::from_slice( + &secp::Secp256k1::new(), + &grin_util::from_hex( + "a129111d283b13bf93957c06bf6605c3417b4b89db4b5cb2e7dab2c15e36e0a4", + ) + .unwrap(), + ) + .unwrap(); + let config = test_util::local_config(&server_key, &None, &None).unwrap(); + + assert_eq!( + config.onion_pubkey().to_hex(), + "96ced236bdf1aca722ef68b818445755e6ed4bacf23e19d7b71c43efc5f0077b" + ); + } + + #[test] + fn uses_node_foreign_api_secret_path() { + let path = node_foreign_api_secret_path(&ChainTypes::Testnet); + assert_eq!(path.file_name().unwrap(), ".foreign_api_secret"); + } + + #[test] + fn writes_config_help() { + let server_key = secp::random_secret(false); + let config = test_util::local_config(&server_key, &None, &None).unwrap(); + let password = ZeroingString::from("password"); + let path = + std::env::temp_dir().join(format!("mwixnet-config-{}.toml", thread_rng().gen::())); + + write_config(&path, &config, &password).unwrap(); + let contents = std::fs::read_to_string(&path).unwrap(); + let loaded = load_config(&path, &password).unwrap(); + std::fs::remove_file(path).unwrap(); + + assert!(contents.contains("# Seconds between mixing rounds.\ninterval_s =")); + assert!(contents.contains("interval_s = 1\n\n# Local RPC bind address")); + assert!(contents.contains( + "# Collect excess hop fees in the wallet; false pays all hop fees to miners.\ncollect_fees =" + )); + assert!(contents.contains( + "# Previous server Ed25519 identity key; setting it makes this server a mixer.\n# prev_server =" + )); + assert!(contents.contains( + "# Next server Ed25519 identity key; leave unset for the final hop.\n# next_server =" + )); + assert_eq!(loaded, config); + } } diff --git a/src/http.rs b/src/http.rs index d121aba..f761cb1 100644 --- a/src/http.rs +++ b/src/http.rs @@ -3,9 +3,9 @@ use std::time::Duration; use grin_api::json_rpc; use grin_util::to_base64; use grin_wallet_api::{EncryptedRequest, EncryptedResponse, JsonId}; -use hyper::body::Body as HyperBody; -use hyper::header::{ACCEPT, AUTHORIZATION, CONTENT_TYPE, USER_AGENT}; -use hyper::Request; +use hyper_legacy::body::Body as HyperBody; +use hyper_legacy::header::{ACCEPT, AUTHORIZATION, CONTENT_TYPE, USER_AGENT}; +use hyper_legacy::Request; use serde_json::json; use thiserror::Error; @@ -17,17 +17,17 @@ pub enum HttpError { #[error("Error decrypting response")] DecryptResponseError(), #[error("Hyper HTTP error: {0:?}")] - HyperHttpError(hyper::http::Error), + HyperHttpError(hyper_legacy::http::Error), #[error("Hyper request failed with error: {0:?}")] - RequestFailed(hyper::Error), + RequestFailed(hyper_legacy::Error), #[error("Error with response body: {0:?}")] - ResponseBodyError(hyper::Error), + ResponseBodyError(hyper_legacy::Error), #[error("Error deserializing JSON response: {0:?}")] ResponseJsonError(serde_json::Error), #[error("Error decoding JSON-RPC response: {0:?}")] ResponseParseError(json_rpc::Error), #[error("Wrong response code: {0}")] - ResponseStatusError(hyper::StatusCode), + ResponseStatusError(hyper_legacy::StatusCode), } pub async fn async_send_enc_request( @@ -90,14 +90,14 @@ pub fn build_request( api_secret: &Option, req_body: String, ) -> Result, HttpError> { - let mut req_builder = hyper::Request::builder(); + let mut req_builder = hyper_legacy::Request::builder(); if let Some(api_secret) = api_secret { let basic_auth = format!("Basic {}", to_base64(&format!("grin:{}", api_secret))); req_builder = req_builder.header(AUTHORIZATION, basic_auth); } req_builder - .method(hyper::Method::POST) + .method(hyper_legacy::Method::POST) .uri(url) .header(USER_AGENT, "grin-client") .header(ACCEPT, "application/json") @@ -107,9 +107,10 @@ pub fn build_request( } async fn send_request_async(req: Request) -> Result { - let client = hyper::Client::builder() + let https = hyper_tls::HttpsConnector::new(); + let client = hyper_legacy::Client::builder() .pool_idle_timeout(Duration::from_secs(30)) - .build_http(); + .build::<_, HyperBody>(https); let resp = client .request(req) @@ -119,7 +120,7 @@ async fn send_request_async(req: Request) -> Result MixClientImpl { ) -> Result { let url = format!("{}/v1", addr.to_http_str()); let request_str = serde_json::to_string(&build_request(method, params)).unwrap(); - let hyper_request = - http::build_request(&url, &None, request_str).map_err(MixClientError::CommError)?; - - let hyper_client = self.tor.lock().new_hyper_client(); - let res = hyper_client.request(hyper_request).await.unwrap(); - - let body_bytes = hyper::body::to_bytes(res.into_body()).await.unwrap(); - let res = String::from_utf8(body_bytes.to_vec()).unwrap(); + let tor_client = self + .tor + .lock() + .client() + .ok_or_else(|| MixClientError::Custom("Tor client is not running".into()))?; + let res = tor::async_post(tor_client, &url, request_str) + .await + .map_err(MixClientError::Tor)?; let response: Response = serde_json::from_str(&res).map_err(MixClientError::DecodeResponseError)?; @@ -108,6 +108,7 @@ impl MixClient for MixClientImpl { #[cfg(test)] pub mod mock { + use super::grin_onion; use std::collections::HashMap; use async_trait::async_trait; @@ -149,6 +150,7 @@ pub mod mock { #[cfg(test)] pub mod test_util { + use super::grin_onion; use std::sync::Arc; use async_trait::async_trait; diff --git a/src/node.rs b/src/node.rs index 987aa42..0b6e9c4 100644 --- a/src/node.rs +++ b/src/node.rs @@ -1,5 +1,3 @@ -use std::net::SocketAddr; -use std::net::ToSocketAddrs; use std::sync::Arc; use async_trait::async_trait; @@ -12,8 +10,8 @@ use grin_util::ToHex; use serde_json::json; use thiserror::Error; -use grin_wallet_libwallet::mwixnet::onion as grin_onion; use grin_onion::crypto::secp::Commitment; +use grin_wallet_libwallet::mwixnet::onion as grin_onion; use crate::http; @@ -137,19 +135,22 @@ pub async fn async_is_tx_valid( /// HTTP (JSON-RPC) implementation of the 'GrinNode' trait #[derive(Clone)] pub struct HttpGrinNode { - node_url: SocketAddr, - node_api_secret: Option, + node_url: String, + node_foreign_api_secret: Option, } const ENDPOINT: &str = "/v2/foreign"; impl HttpGrinNode { - pub fn new(node_url: &str, node_api_secret: &Option) -> HttpGrinNode { - let mut addrs_iter = node_url.to_socket_addrs().unwrap(); - let node_url = addrs_iter.next().unwrap(); + pub fn new(node_url: &str, node_foreign_api_secret: &Option) -> HttpGrinNode { + let node_url = if node_url.starts_with("http://") || node_url.starts_with("https://") { + node_url.trim_end_matches('/').to_owned() + } else { + format!("http://{}", node_url.trim_end_matches('/')) + }; HttpGrinNode { node_url, - node_api_secret: node_api_secret.to_owned(), + node_foreign_api_secret: node_foreign_api_secret.to_owned(), } } @@ -158,10 +159,11 @@ impl HttpGrinNode { method: &str, params: &serde_json::Value, ) -> Result { - let url = format!("http://{}{}", self.node_url, ENDPOINT); - let parsed = http::async_send_json_request(&url, &self.node_api_secret, &method, ¶ms) - .await - .map_err(NodeError::NodeCommError)?; + let url = format!("{}{}", self.node_url, ENDPOINT); + let parsed = + http::async_send_json_request(&url, &self.node_foreign_api_secret, &method, ¶ms) + .await + .map_err(NodeError::NodeCommError)?; Ok(parsed) } } @@ -227,19 +229,14 @@ impl GrinNode for HttpGrinNode { .async_send_request::("get_kernel", ¶ms) .await?; - let contents = format!("{:?}", value); - if contents.contains("NotFound") { - return Ok(None); - } - - let located_kernel = serde_json::from_value::(value) - .map_err(NodeError::DecodeResponseError)?; - Ok(Some(located_kernel)) + serde_json::from_value::>(value) + .map_err(NodeError::DecodeResponseError) } } #[cfg(test)] pub mod mock { + use super::grin_onion; use std::collections::HashMap; use std::sync::RwLock; @@ -348,3 +345,24 @@ pub mod mock { } } } + +#[cfg(test)] +mod tests { + use super::HttpGrinNode; + + #[test] + fn node_url_supports_http_and_https() { + assert_eq!( + HttpGrinNode::new("127.0.0.1:13413", &None).node_url, + "http://127.0.0.1:13413" + ); + assert_eq!( + HttpGrinNode::new("http://node-test:13413/", &None).node_url, + "http://node-test:13413" + ); + assert_eq!( + HttpGrinNode::new("https://testnet.grinffindor.org/", &None).node_url, + "https://testnet.grinffindor.org" + ); + } +} diff --git a/src/servers/mix.rs b/src/servers/mix.rs index b9d8184..ad36d8c 100644 --- a/src/servers/mix.rs +++ b/src/servers/mix.rs @@ -1,4 +1,4 @@ -use std::collections::{HashMap, HashSet}; +use std::collections::HashSet; use std::sync::Arc; use async_trait::async_trait; @@ -10,9 +10,9 @@ use grin_core::ser::ProtocolVersion; use itertools::Itertools; use thiserror::Error; -use grin_wallet_libwallet::mwixnet::onion as grin_onion; use grin_onion::crypto::dalek::{self, DalekSignature}; use grin_onion::onion::{Onion, OnionError, PeeledOnion}; +use grin_wallet_libwallet::mwixnet::onion as grin_onion; use secp256k1zkp::key::ZERO_KEY; use secp256k1zkp::Secp256k1; @@ -23,6 +23,18 @@ use crate::servers::mix_rpc::MixResp; use crate::tx::{self, TxComponents}; use crate::wallet::Wallet; +fn filter_by_indices<'a, T>( + items: &'a [(usize, T)], + kept_indices: &HashSet, +) -> Vec<&'a (usize, T)> { + items + .iter() + .enumerate() + .filter(|(i, _)| kept_indices.contains(i)) + .map(|(_, item)| item) + .collect() +} + /// Mixer error types #[derive(Error, Debug)] pub enum MixError { @@ -69,7 +81,7 @@ pub struct MixServerImpl { secp: Secp256k1, server_config: ServerConfig, mix_client: Option>, - wallet: Arc, + wallet: Option>, node: Arc, } @@ -78,7 +90,7 @@ impl MixServerImpl { pub fn new( server_config: ServerConfig, mix_client: Option>, - wallet: Arc, + wallet: Option>, node: Arc, ) -> Self { MixServerImpl { @@ -170,7 +182,7 @@ impl MixServerImpl { .collect(); let components = tx::async_assemble_components( - &self.wallet, + self.wallet.as_ref(), &TxComponents { offset: ZERO_KEY, kernels: Vec::new(), @@ -200,12 +212,11 @@ impl MixServerImpl { onions_with_index .sort_by(|(_, a), (_, b)| a.onion.commit.partial_cmp(&b.onion.commit).unwrap()); - // Create map of prev indices to next indices - let map_indices: HashMap = - HashMap::from_iter(onions_with_index.iter().enumerate().map(|(i, j)| (j.0, i))); - // Call next server - let onions = peeled.iter().map(|(_, p)| p.onion.clone()).collect(); + let onions = onions_with_index + .iter() + .map(|(_, p)| p.onion.clone()) + .collect(); let mixed = self .mix_client .as_ref() @@ -216,13 +227,7 @@ impl MixServerImpl { // Remove filtered entries let kept_next_indices = HashSet::<_>::from_iter(mixed.indices.clone()); - let filtered_onions: Vec<&(usize, PeeledOnion)> = onions_with_index - .iter() - .filter(|(i, _)| { - map_indices.contains_key(i) - && kept_next_indices.contains(map_indices.get(i).unwrap()) - }) - .collect(); + let filtered_onions = filter_by_indices(&onions_with_index, &kept_next_indices); // Calculate excess of entries kept let excesses = filtered_onions @@ -235,10 +240,10 @@ impl MixServerImpl { .iter() .fold(0, |f, (_, p)| f + p.payload.fee.fee()); - let indices = kept_next_indices.into_iter().sorted().collect(); + let indices = filtered_onions.iter().map(|(i, _)| *i).sorted().collect(); let components = tx::async_assemble_components( - &self.wallet, + self.wallet.as_ref(), &mixed.components, &excesses, self.get_fee_base(), @@ -301,14 +306,15 @@ impl MixServer for MixServerImpl { #[cfg(test)] mod test_util { + use super::grin_onion; use std::sync::Arc; use grin_onion::crypto::dalek::DalekPublicKey; use secp256k1zkp::SecretKey; use crate::config; - use crate::mix_client::MixClient; use crate::mix_client::test_util::DirectMixClient; + use crate::mix_client::MixClient; use crate::node::mock::MockGrinNode; use crate::servers::mix::MixServerImpl; use crate::wallet::mock::MockWallet; @@ -330,7 +336,7 @@ mod test_util { let mix_server = Arc::new(MixServerImpl::new( config, next_server.as_ref().map(|(_, c)| c.clone()), - wallet.clone(), + Some(wallet.clone()), node.clone(), )); let client = Arc::new(DirectMixClient { @@ -344,15 +350,16 @@ mod test_util { #[cfg(test)] mod tests { + use super::grin_onion; use std::collections::HashSet; use std::sync::Arc; use ::function_name::named; - use grin_onion::{create_onion, Hop, new_hop}; use grin_onion::crypto::dalek::DalekPublicKey; use grin_onion::crypto::secp::{self, Commitment}; use grin_onion::test_util as onion_test_util; + use grin_onion::{create_onion, new_hop, Hop}; use secp256k1zkp::pedersen::RangeProof; use secp256k1zkp::SecretKey; @@ -380,7 +387,7 @@ mod tests { impl ServerVars { fn new(fee: u32) -> Self { let (sk, pk) = onion_test_util::rand_keypair(); - let excess = secp::random_secret(); + let excess = secp::random_secret(false); ServerVars { fee, sk, @@ -394,6 +401,16 @@ mod tests { } } + #[test] + fn filters_mixed_indices() { + let items = vec![(1, "first"), (0, "second")]; + let kept = HashSet::from([0]); + assert_eq!(super::filter_by_indices(&items, &kept), vec![&items[0]]); + + let kept = HashSet::from([1]); + assert_eq!(super::filter_by_indices(&items, &kept), vec![&items[1]]); + } + /// Tests the happy path for a 3 server setup. /// /// Servers: @@ -407,7 +424,7 @@ mod tests { // Setup Input(s) let input1_value: u64 = 200_000_000; - let input1_blind = secp::random_secret(); + let input1_blind = secp::random_secret(false); let input1_commit = secp::commit(input1_value, &input1_blind)?; let input_commits = vec![&input1_commit]; @@ -449,6 +466,7 @@ mod tests { mix1_vars.build_hop(None), mix2_vars.build_hop(Some(proof)), ], + false, )?; // Simulate the swap server peeling the onion and then calling mix1 diff --git a/src/servers/mix_rpc.rs b/src/servers/mix_rpc.rs index c2f7c09..5852fac 100644 --- a/src/servers/mix_rpc.rs +++ b/src/servers/mix_rpc.rs @@ -2,13 +2,13 @@ use std::sync::Arc; use futures::FutureExt; use jsonrpc_derive::rpc; +use jsonrpc_http_server::jsonrpc_core::{self, BoxFuture, IoHandler, Value}; use jsonrpc_http_server::{DomainsValidation, ServerBuilder}; -use jsonrpc_http_server::jsonrpc_core::{self, BoxFuture, IoHandler}; use serde::{Deserialize, Serialize}; -use grin_wallet_libwallet::mwixnet::onion as grin_onion; use grin_onion::crypto::dalek::{self, DalekSignature}; use grin_onion::onion::Onion; +use grin_wallet_libwallet::mwixnet::onion as grin_onion; use crate::config::ServerConfig; use crate::mix_client::MixClient; @@ -38,6 +38,9 @@ impl MixReq { #[rpc(server)] pub trait MixAPI { + #[rpc(name = "health")] + fn health(&self) -> jsonrpc_core::Result; + #[rpc(name = "mix")] fn mix(&self, mix: MixReq) -> BoxFuture>; } @@ -57,7 +60,7 @@ impl RPCMixServer { ServerBuilder::new(io) .event_loop_executor(runtime_handle) .cors(DomainsValidation::Disabled) - .request_middleware(|request: hyper::Request| { + .request_middleware(|request: hyper_legacy::Request| { if request.uri() == "/v1" { request.into() } else { @@ -76,6 +79,10 @@ impl From for jsonrpc_core::Error { } impl MixAPI for RPCMixServer { + fn health(&self) -> jsonrpc_core::Result { + Ok(Value::String("ok".into())) + } + fn mix(&self, mix: MixReq) -> BoxFuture> { let server = self.server.clone(); async move { @@ -95,7 +102,7 @@ pub fn listen( rt_handle: &tokio::runtime::Handle, server_config: ServerConfig, next_server: Option>, - wallet: Arc, + wallet: Option>, node: Arc, ) -> Result< ( @@ -104,12 +111,7 @@ pub fn listen( ), Box, > { - let server = MixServerImpl::new( - server_config.clone(), - next_server, - wallet.clone(), - node.clone(), - ); + let server = MixServerImpl::new(server_config.clone(), next_server, wallet, node.clone()); let server = Arc::new(tokio::sync::Mutex::new(server)); let rpc_server = RPCMixServer { diff --git a/src/servers/swap.rs b/src/servers/swap.rs index af7f211..ed132be 100644 --- a/src/servers/swap.rs +++ b/src/servers/swap.rs @@ -5,14 +5,15 @@ use std::sync::Arc; use async_trait::async_trait; use grin_core::core::{Committed, Input, Output, OutputFeatures, Transaction, TransactionBody}; use grin_core::global::DEFAULT_ACCEPT_FEE_BASE; +use grin_util::ToHex; use itertools::Itertools; use secp256k1zkp::key::ZERO_KEY; use thiserror::Error; -use grin_wallet_libwallet::mwixnet::onion as grin_onion; use grin_onion::crypto::comsig::ComSignature; use grin_onion::crypto::secp::{Commitment, Secp256k1, SecretKey}; use grin_onion::onion::{Onion, OnionError}; +use grin_wallet_libwallet::mwixnet::onion as grin_onion; use crate::config::ServerConfig; use crate::mix_client::MixClient; @@ -96,7 +97,7 @@ pub trait SwapServer: Send + Sync { pub struct SwapServerImpl { server_config: ServerConfig, next_server: Option>, - wallet: Arc, + wallet: Option>, node: Arc, store: Arc>, } @@ -106,7 +107,7 @@ impl SwapServerImpl { pub fn new( server_config: ServerConfig, next_server: Option>, - wallet: Arc, + wallet: Option>, node: Arc, store: SwapStore, ) -> Self { @@ -159,6 +160,8 @@ impl SwapServerImpl { return Ok(None); } + println!("Executing swap round with {} output(s)", swaps.len()); + let (filtered, failed, offset, outputs, kernels) = if let Some(client) = &self.next_server { // Call next mix server let onions = swaps.iter().map(|s| s.onion.clone()).collect(); @@ -211,7 +214,7 @@ impl SwapServerImpl { let output_excesses: Vec = filtered.iter().map(|s| s.excess.clone()).collect(); let tx = tx::async_assemble_tx( - &self.wallet, + self.wallet.as_ref(), &inputs, &outputs, &kernels, @@ -225,6 +228,9 @@ impl SwapServerImpl { let chain_tip = self.node.async_get_chain_tip().await?; self.node.async_post_tx(&tx).await?; + let input_count = inputs.len(); + let output_count = outputs.len(); + let failed_count = failed.len(); store.save_swap_tx(&SwapTx { tx: tx.clone(), chain_tip, @@ -243,6 +249,15 @@ impl SwapServerImpl { store.save_swap(&swap, true)?; } + println!( + "Swap transaction posted: kernel {}, {} input(s), {} output(s), {} rejected, {} nanogrin fee", + kernel_commit.to_hex(), + input_count, + output_count, + failed_count, + fees_paid + ); + Ok(Some(Arc::new(tx))) } } @@ -298,13 +313,15 @@ impl SwapServer for SwapServerImpl { return Err(SwapError::MissingRangeproof); } + let output_commit = peeled.onion.commit; + let remaining_hops = peeled.onion.enc_payloads.len(); let locked = self.store.lock().await; locked .save_swap( &SwapData { excess: peeled.payload.excess, - output_commit: peeled.onion.commit, + output_commit, rangeproof: peeled.payload.rangeproof, input, fee, @@ -319,6 +336,13 @@ impl SwapServer for SwapServerImpl { }, _ => SwapError::StoreError(e), })?; + println!( + "Swap request accepted: input {}, output {}, fee {} nanogrin, {} remaining hop(s)", + onion.commit.to_hex(), + output_commit.to_hex(), + fee, + remaining_hops + ); Ok(()) } @@ -337,7 +361,7 @@ impl SwapServer for SwapServerImpl { } } - self.async_execute_round(&locked_store, swaps).await + self.async_execute_round(&locked_store, spendable).await } async fn check_reorg( @@ -383,6 +407,7 @@ impl SwapServer for SwapServerImpl { #[cfg(test)] pub mod mock { + use super::grin_onion; use std::collections::HashMap; use std::sync::Arc; @@ -435,6 +460,7 @@ pub mod mock { #[cfg(test)] pub mod test_util { + use super::grin_onion; use std::sync::Arc; use grin_onion::crypto::dalek::DalekPublicKey; @@ -462,7 +488,7 @@ pub mod test_util { let swap_server = Arc::new(SwapServerImpl::new( config, next_server.map(|n| n.1.clone()), - wallet.clone(), + Some(wallet.clone()), node, store, )); @@ -473,6 +499,7 @@ pub mod test_util { #[cfg(test)] mod tests { + use super::grin_onion; use std::sync::Arc; use ::function_name::named; @@ -526,16 +553,16 @@ mod tests { let value: u64 = 200_000_000; let fee: u32 = 50_000_000; - let blind = secp::random_secret(); + let blind = secp::random_secret(false); let input_commit = secp::commit(value, &blind)?; - let server_key = secp::random_secret(); - let hop_excess = secp::random_secret(); + let server_key = secp::random_secret(false); + let hop_excess = secp::random_secret(false); let (output_commit, proof) = onion_test_util::proof(value, fee, &blind, &vec![&hop_excess]); let hop = new_hop(&server_key, &hop_excess, fee, Some(proof)); - let onion = create_onion(&input_commit, &vec![hop.clone()])?; - let comsig = ComSignature::sign(value, &blind, &onion.serialize()?)?; + let onion = create_onion(&input_commit, &vec![hop.clone()], false)?; + let comsig = ComSignature::sign(value, &blind, &onion.serialize()?, false)?; let node: Arc = Arc::new(MockGrinNode::new_with_utxos(&vec![&input_commit])); let (server, _) = super::test_util::new_swapper(&test_dir, &server_key, None, node.clone()); @@ -589,6 +616,43 @@ mod tests { Ok(()) } + /// Spent swaps are skipped when executing a round. + #[tokio::test] + #[named] + async fn spent_swap_skipped() -> Result<(), Box> { + let test_dir = init_test!(); + + let value: u64 = 200_000_000; + let fee: u32 = 50_000_000; + let blind = secp::random_secret(false); + let input_commit = secp::commit(value, &blind)?; + let server_key = secp::random_secret(false); + let hop_excess = secp::random_secret(false); + let (output_commit, proof) = onion_test_util::proof(value, fee, &blind, &vec![&hop_excess]); + let hop = new_hop(&server_key, &hop_excess, fee, Some(proof)); + let onion = create_onion(&input_commit, &vec![hop], false)?; + + let node: Arc = Arc::new(MockGrinNode::new()); + let (server, _) = super::test_util::new_swapper(&test_dir, &server_key, None, node.clone()); + server.store.lock().await.save_swap( + &SwapData { + excess: hop_excess, + output_commit, + rangeproof: Some(proof), + input: Input::new(OutputFeatures::Plain, input_commit), + fee: fee as u64, + onion: onion.peel_layer(&server_key)?.onion, + status: SwapStatus::Unprocessed, + }, + false, + )?; + + assert!(server.execute_round().await?.is_none()); + assert!(node.get_posted_txns().is_empty()); + + Ok(()) + } + /// Multi-server test to verify proper MixClient communication. #[tokio::test] #[named] @@ -597,20 +661,20 @@ mod tests { // Setup input let value: u64 = 200_000_000; - let blind = secp::random_secret(); + let blind = secp::random_secret(false); let input_commit = secp::commit(value, &blind)?; let node: Arc = Arc::new(MockGrinNode::new_with_utxos(&vec![&input_commit])); // Swapper data let swap_fee: u32 = 50_000_000; let (swap_sk, _swap_pk) = onion_test_util::rand_keypair(); - let swap_hop_excess = secp::random_secret(); + let swap_hop_excess = secp::random_secret(false); let swap_hop = new_hop(&swap_sk, &swap_hop_excess, swap_fee, None); // Mixer data let mixer_fee: u32 = 30_000_000; let (mixer_sk, mixer_pk) = onion_test_util::rand_keypair(); - let mixer_hop_excess = secp::random_secret(); + let mixer_hop_excess = secp::random_secret(false); let (output_commit, proof) = onion_test_util::proof( value, swap_fee + mixer_fee, @@ -620,8 +684,8 @@ mod tests { let mixer_hop = new_hop(&mixer_sk, &mixer_hop_excess, mixer_fee, Some(proof)); // Create onion - let onion = create_onion(&input_commit, &vec![swap_hop, mixer_hop])?; - let comsig = ComSignature::sign(value, &blind, &onion.serialize()?)?; + let onion = create_onion(&input_commit, &vec![swap_hop, mixer_hop], false)?; + let comsig = ComSignature::sign(value, &blind, &onion.serialize()?, false)?; // Mock mixer let mixer_onion = onion.peel_layer(&swap_sk)?.onion; @@ -676,18 +740,18 @@ mod tests { let value: u64 = 200_000_000; let fee: u32 = 50_000_000; - let blind = secp::random_secret(); + let blind = secp::random_secret(false); let input_commit = secp::commit(value, &blind)?; - let server_key = secp::random_secret(); - let hop_excess = secp::random_secret(); + let server_key = secp::random_secret(false); + let hop_excess = secp::random_secret(false); let (_output_commit, proof) = onion_test_util::proof(value, fee, &blind, &vec![&hop_excess]); let hop = new_hop(&server_key, &hop_excess, fee, Some(proof)); let hops: Vec = vec![hop.clone(), hop.clone()]; // Multiple payloads - let onion = create_onion(&input_commit, &hops)?; - let comsig = ComSignature::sign(value, &blind, &onion.serialize()?)?; + let onion = create_onion(&input_commit, &hops, false)?; + let comsig = ComSignature::sign(value, &blind, &onion.serialize()?, false)?; let node: Arc = Arc::new(MockGrinNode::new_with_utxos(&vec![&input_commit])); let (server, _) = super::test_util::new_swapper(&test_dir, &server_key, None, node.clone()); @@ -708,19 +772,19 @@ mod tests { let value: u64 = 200_000_000; let fee: u32 = 50_000_000; - let blind = secp::random_secret(); + let blind = secp::random_secret(false); let input_commit = secp::commit(value, &blind)?; - let server_key = secp::random_secret(); - let hop_excess = secp::random_secret(); + let server_key = secp::random_secret(false); + let hop_excess = secp::random_secret(false); let (_output_commit, proof) = onion_test_util::proof(value, fee, &blind, &vec![&hop_excess]); let hop = new_hop(&server_key, &hop_excess, fee, Some(proof)); - let onion = create_onion(&input_commit, &vec![hop])?; + let onion = create_onion(&input_commit, &vec![hop], false)?; - let wrong_blind = secp::random_secret(); - let comsig = ComSignature::sign(value, &wrong_blind, &onion.serialize()?)?; + let wrong_blind = secp::random_secret(false); + let comsig = ComSignature::sign(value, &wrong_blind, &onion.serialize()?, false)?; let node: Arc = Arc::new(MockGrinNode::new_with_utxos(&vec![&input_commit])); let (server, _) = super::test_util::new_swapper(&test_dir, &server_key, None, node.clone()); @@ -741,18 +805,18 @@ mod tests { let value: u64 = 200_000_000; let fee: u32 = 50_000_000; - let blind = secp::random_secret(); + let blind = secp::random_secret(false); let input_commit = secp::commit(value, &blind)?; - let server_key = secp::random_secret(); - let hop_excess = secp::random_secret(); + let server_key = secp::random_secret(false); + let hop_excess = secp::random_secret(false); let wrong_value = value + 10_000_000; let (_output_commit, proof) = onion_test_util::proof(wrong_value, fee, &blind, &vec![&hop_excess]); let hop = new_hop(&server_key, &hop_excess, fee, Some(proof)); - let onion = create_onion(&input_commit, &vec![hop])?; - let comsig = ComSignature::sign(value, &blind, &onion.serialize()?)?; + let onion = create_onion(&input_commit, &vec![hop], false)?; + let comsig = ComSignature::sign(value, &blind, &onion.serialize()?, false)?; let node: Arc = Arc::new(MockGrinNode::new_with_utxos(&vec![&input_commit])); let (server, _) = super::test_util::new_swapper(&test_dir, &server_key, None, node.clone()); @@ -773,15 +837,15 @@ mod tests { let value: u64 = 200_000_000; let fee: u32 = 50_000_000; - let blind = secp::random_secret(); + let blind = secp::random_secret(false); let input_commit = secp::commit(value, &blind)?; - let server_key = secp::random_secret(); - let hop_excess = secp::random_secret(); + let server_key = secp::random_secret(false); + let hop_excess = secp::random_secret(false); let hop = new_hop(&server_key, &hop_excess, fee, None); - let onion = create_onion(&input_commit, &vec![hop])?; - let comsig = ComSignature::sign(value, &blind, &onion.serialize()?)?; + let onion = create_onion(&input_commit, &vec![hop], false)?; + let comsig = ComSignature::sign(value, &blind, &onion.serialize()?, false)?; let node: Arc = Arc::new(MockGrinNode::new_with_utxos(&vec![&input_commit])); let (server, _) = super::test_util::new_swapper(&test_dir, &server_key, None, node.clone()); @@ -802,17 +866,17 @@ mod tests { let value: u64 = 200_000_000; let fee: u32 = 50_000_000; - let blind = secp::random_secret(); + let blind = secp::random_secret(false); let input_commit = secp::commit(value, &blind)?; - let server_key = secp::random_secret(); - let hop_excess = secp::random_secret(); + let server_key = secp::random_secret(false); + let hop_excess = secp::random_secret(false); let (_output_commit, proof) = onion_test_util::proof(value, fee, &blind, &vec![&hop_excess]); let hop = new_hop(&server_key, &hop_excess, fee, Some(proof)); - let onion = create_onion(&input_commit, &vec![hop])?; - let comsig = ComSignature::sign(value, &blind, &onion.serialize()?)?; + let onion = create_onion(&input_commit, &vec![hop], false)?; + let comsig = ComSignature::sign(value, &blind, &onion.serialize()?, false)?; let node: Arc = Arc::new(MockGrinNode::new()); let (server, _) = super::test_util::new_swapper(&test_dir, &server_key, None, node.clone()); @@ -838,17 +902,17 @@ mod tests { let value: u64 = 200_000_000; let fee: u32 = 50_000_000; - let blind = secp::random_secret(); + let blind = secp::random_secret(false); let input_commit = secp::commit(value, &blind)?; - let server_key = secp::random_secret(); - let hop_excess = secp::random_secret(); + let server_key = secp::random_secret(false); + let hop_excess = secp::random_secret(false); let (_output_commit, proof) = onion_test_util::proof(value, fee, &blind, &vec![&hop_excess]); let hop = new_hop(&server_key, &hop_excess, fee, Some(proof)); - let onion = create_onion(&input_commit, &vec![hop])?; - let comsig = ComSignature::sign(value, &blind, &onion.serialize()?)?; + let onion = create_onion(&input_commit, &vec![hop], false)?; + let comsig = ComSignature::sign(value, &blind, &onion.serialize()?, false)?; let node: Arc = Arc::new(MockGrinNode::new_with_utxos(&vec![&input_commit])); let (server, _) = super::test_util::new_swapper(&test_dir, &server_key, None, node.clone()); @@ -872,10 +936,10 @@ mod tests { async fn swap_tx_not_found() -> Result<(), Box> { let test_dir = init_test!(); - let server_key = secp::random_secret(); + let server_key = secp::random_secret(false); let node: Arc = Arc::new(MockGrinNode::new()); let (server, _) = super::test_util::new_swapper(&test_dir, &server_key, None, node.clone()); - let kern = tx::build_kernel(&secp::random_secret(), 1000u64)?; + let kern = tx::build_kernel(&secp::random_secret(false), 1000u64)?; let tx: Arc = Arc::new(Transaction::new(Inputs::default(), &[], &[kern.clone()])); let result = server.check_reorg(&tx).await; @@ -892,19 +956,19 @@ mod tests { let value: u64 = 200_000_000; let fee: u32 = 50_000_000; - let blind = secp::random_secret(); + let blind = secp::random_secret(false); let input_commit = secp::commit(value, &blind)?; - let server_key = secp::random_secret(); - let hop_excess = secp::random_secret(); + let server_key = secp::random_secret(false); + let hop_excess = secp::random_secret(false); let (_output_commit, proof) = onion_test_util::proof(value, fee, &blind, &vec![&hop_excess]); - let wrong_server_key = secp::random_secret(); + let wrong_server_key = secp::random_secret(false); let hop = new_hop(&wrong_server_key, &hop_excess, fee, Some(proof)); - let onion = create_onion(&input_commit, &vec![hop])?; - let comsig = ComSignature::sign(value, &blind, &onion.serialize()?)?; + let onion = create_onion(&input_commit, &vec![hop], false)?; + let comsig = ComSignature::sign(value, &blind, &onion.serialize()?, false)?; let node: Arc = Arc::new(MockGrinNode::new_with_utxos(&vec![&input_commit])); let (server, _) = super::test_util::new_swapper(&test_dir, &server_key, None, node.clone()); @@ -924,17 +988,17 @@ mod tests { let value: u64 = 200_000_000; let fee: u32 = 1_000_000; - let blind = secp::random_secret(); + let blind = secp::random_secret(false); let input_commit = secp::commit(value, &blind)?; - let server_key = secp::random_secret(); - let hop_excess = secp::random_secret(); + let server_key = secp::random_secret(false); + let hop_excess = secp::random_secret(false); let (_output_commit, proof) = onion_test_util::proof(value, fee, &blind, &vec![&hop_excess]); let hop = new_hop(&server_key, &hop_excess, fee, Some(proof)); - let onion = create_onion(&input_commit, &vec![hop])?; - let comsig = ComSignature::sign(value, &blind, &onion.serialize()?)?; + let onion = create_onion(&input_commit, &vec![hop], false)?; + let comsig = ComSignature::sign(value, &blind, &onion.serialize()?, false)?; let node: Arc = Arc::new(MockGrinNode::new_with_utxos(&vec![&input_commit])); let (server, _) = super::test_util::new_swapper(&test_dir, &server_key, None, node.clone()); diff --git a/src/servers/swap_rpc.rs b/src/servers/swap_rpc.rs index 2c91b7b..67e19ec 100644 --- a/src/servers/swap_rpc.rs +++ b/src/servers/swap_rpc.rs @@ -4,11 +4,8 @@ use futures::FutureExt; use jsonrpc_core::{BoxFuture, Value}; use jsonrpc_derive::rpc; use jsonrpc_http_server::{DomainsValidation, ServerBuilder}; -use serde::{Deserialize, Serialize}; -use grin_wallet_libwallet::mwixnet::onion as grin_onion; -use grin_onion::crypto::comsig::{self, ComSignature}; -use grin_onion::onion::Onion; +pub use grin_wallet_libwallet::mwixnet::SwapReq; use crate::config::ServerConfig; use crate::mix_client::MixClient; @@ -17,15 +14,11 @@ use crate::servers::swap::{SwapError, SwapServer, SwapServerImpl}; use crate::store::SwapStore; use crate::wallet::Wallet; -#[derive(Serialize, Deserialize)] -pub struct SwapReq { - onion: Onion, - #[serde(with = "comsig::comsig_serde")] - comsig: ComSignature, -} - #[rpc(server)] pub trait SwapAPI { + #[rpc(name = "health")] + fn health(&self) -> jsonrpc_core::Result; + #[rpc(name = "swap")] fn swap(&self, swap: SwapReq) -> BoxFuture>; } @@ -45,7 +38,7 @@ impl RPCSwapServer { ServerBuilder::new(io) .event_loop_executor(runtime_handle) .cors(DomainsValidation::Disabled) - .request_middleware(|request: hyper::Request| { + .request_middleware(|request: hyper_legacy::Request| { if request.uri() == "/v1" { request.into() } else { @@ -71,6 +64,10 @@ impl From for jsonrpc_core::Error { } impl SwapAPI for RPCSwapServer { + fn health(&self) -> jsonrpc_core::Result { + Ok(Value::String("ok".into())) + } + fn swap(&self, swap: SwapReq) -> BoxFuture> { let server = self.server.clone(); async move { @@ -86,7 +83,7 @@ pub fn listen( rt_handle: &tokio::runtime::Handle, server_config: &ServerConfig, next_server: Option>, - wallet: Arc, + wallet: Option>, node: Arc, store: SwapStore, ) -> std::result::Result< @@ -99,7 +96,7 @@ pub fn listen( let server = SwapServerImpl::new( server_config.clone(), next_server, - wallet.clone(), + wallet, node.clone(), store, ); @@ -120,7 +117,8 @@ mod tests { use std::net::TcpListener; use std::sync::Arc; - use hyper::{Body, Client, Request, Response}; + use grin_wallet_libwallet::mwixnet::onion as grin_onion; + use hyper_legacy::{Body, Client, Request, Response}; use tokio::sync::Mutex; use grin_onion::create_onion; @@ -128,12 +126,12 @@ mod tests { use grin_onion::crypto::secp; use crate::config::ServerConfig; - use crate::servers::swap::{SwapError, SwapServer}; use crate::servers::swap::mock::MockSwapServer; + use crate::servers::swap::{SwapError, SwapServer}; use crate::servers::swap_rpc::{RPCSwapServer, SwapReq}; async fn body_to_string(req: Response) -> String { - let body_bytes = hyper::body::to_bytes(req.into_body()).await.unwrap(); + let body_bytes = hyper_legacy::body::to_bytes(req.into_body()).await.unwrap(); String::from_utf8(body_bytes.to_vec()).unwrap() } @@ -144,13 +142,14 @@ mod tests { runtime_handle: &tokio::runtime::Handle, ) -> Result> { let server_config = ServerConfig { - key: secp::random_secret(), + key: secp::random_secret(false), interval_s: 1, addr: TcpListener::bind("127.0.0.1:0")?.local_addr()?, grin_node_url: "127.0.0.1:3413".parse()?, - grin_node_secret_path: None, + grin_node_foreign_api_secret_path: None, wallet_owner_url: "127.0.0.1:3420".parse()?, wallet_owner_secret_path: None, + collect_fees: true, prev_server: None, next_server: None, }; @@ -185,15 +184,37 @@ mod tests { // todo: Test all error types + #[test] + fn health_success() -> Result<(), Box> { + let rt = tokio::runtime::Builder::new_multi_thread() + .enable_all() + .build()?; + let server: Arc> = Arc::new(Mutex::new(MockSwapServer::new())); + let request = r#"{"jsonrpc":"2.0","method":"health","params":[],"id":1}"#; + let rt_handle = rt.handle().clone(); + let response = rt.block_on(async_make_request(server, request.into(), &rt_handle))?; + + assert_eq!( + response, + "{\"jsonrpc\":\"2.0\",\"result\":\"ok\",\"id\":1}\n" + ); + Ok(()) + } + /// Demonstrates a successful swap response #[test] fn swap_success() -> Result<(), Box> { let rt = tokio::runtime::Builder::new_multi_thread() .enable_all() .build()?; - let commitment = secp::commit(1234, &secp::random_secret())?; - let onion = create_onion(&commitment, &vec![])?; - let comsig = ComSignature::sign(1234, &secp::random_secret(), &onion.serialize()?)?; + let commitment = secp::commit(1234, &secp::random_secret(false))?; + let onion = create_onion(&commitment, &vec![], false)?; + let comsig = ComSignature::sign( + 1234, + &secp::random_secret(false), + &onion.serialize()?, + false, + )?; let swap = SwapReq { onion: onion.clone(), comsig, @@ -227,7 +248,7 @@ mod tests { ); let rt_handle = rt.handle().clone(); let response = rt.block_on(async_make_request(server, req, &rt_handle))?; - let expected = "{\"jsonrpc\":\"2.0\",\"error\":{\"code\":-32602,\"message\":\"Invalid params: missing field `onion`.\"},\"id\":\"1\"}\n"; + let expected = "{\"jsonrpc\":\"2.0\",\"error\":{\"code\":-32602,\"message\":\"Invalid params: missing field `comsig`.\"},\"id\":\"1\"}\n"; assert_eq!(response, expected); Ok(()) } @@ -239,9 +260,14 @@ mod tests { .enable_all() .build()?; - let commitment = secp::commit(1234, &secp::random_secret())?; - let onion = create_onion(&commitment, &vec![])?; - let comsig = ComSignature::sign(1234, &secp::random_secret(), &onion.serialize()?)?; + let commitment = secp::commit(1234, &secp::random_secret(false))?; + let onion = create_onion(&commitment, &vec![], false)?; + let comsig = ComSignature::sign( + 1234, + &secp::random_secret(false), + &onion.serialize()?, + false, + )?; let swap = SwapReq { onion: onion.clone(), comsig, diff --git a/src/store.rs b/src/store.rs index 2bbaf12..4bfffd2 100644 --- a/src/store.rs +++ b/src/store.rs @@ -1,5 +1,5 @@ -use grin_core::core::{Input, Transaction}; use grin_core::core::hash::Hash; +use grin_core::core::{Input, Transaction}; use grin_core::ser::{ self, DeserializationMode, ProtocolVersion, Readable, Reader, Writeable, Writer, }; @@ -7,10 +7,10 @@ use grin_store::{self as store, Store}; use grin_util::ToHex; use thiserror::Error; -use grin_wallet_libwallet::mwixnet::onion as grin_onion; use grin_onion::crypto::secp::{self, Commitment, RangeProof, SecretKey}; use grin_onion::onion::Onion; use grin_onion::util::{read_optional, write_optional}; +use grin_wallet_libwallet::mwixnet::onion as grin_onion; const DB_NAME: &str = "swap"; const STORE_SUBPATH: &str = "swaps"; @@ -213,8 +213,15 @@ impl From for StoreError { impl SwapStore { /// Create new chain store pub fn new(db_root: &str) -> Result { - let db = Store::new(db_root, Some(DB_NAME), Some(STORE_SUBPATH), None) - .map_err(StoreError::OpenError)?; + let db = Store::new( + db_root, + Some(DB_NAME), + Some(STORE_SUBPATH), + vec![SWAP_PREFIX, TX_PREFIX], + None, + None, + ) + .map_err(StoreError::OpenError)?; Ok(SwapStore { db }) } @@ -226,12 +233,11 @@ impl SwapStore { value: &Vec, overwrite: bool, ) -> Result { - let batch = self.db.batch()?; - let key = store::to_key(prefix, k); - if !overwrite && batch.exists(&key[..])? { + let mut batch = self.db.batch()?; + if !overwrite && batch.exists(Some(prefix), k.as_ref())? { Ok(false) } else { - batch.put(&key[..], &value[..])?; + batch.put(Some(prefix), k.as_ref(), &value[..])?; batch.commit()?; Ok(true) } @@ -239,7 +245,7 @@ impl SwapStore { /// Reads a single value by key fn read + Copy, V: Readable>(&self, prefix: u8, k: K) -> Result { - store::option_to_not_found(self.db.get_ser(&store::to_key(prefix, k), None), || { + store::option_to_not_found(self.db.get_ser(Some(prefix), k.as_ref(), None), || { format!("{}:{}", prefix, k.to_hex()) }) .map_err(StoreError::ReadError) @@ -260,24 +266,29 @@ impl SwapStore { /// Iterator over all swaps. pub fn swaps_iter(&self) -> Result, StoreError> { - let key = store::to_key(SWAP_PREFIX, ""); let protocol_version = self.db.protocol_version(); - self.db - .iter(&key[..], move |_, mut v| { - ser::deserialize(&mut v, protocol_version, DeserializationMode::default()) - .map_err(From::from) - }) - .map_err(|e| StoreError::ReadError(e)) + let swaps = + self.db + .iter(Some(SWAP_PREFIX), move |key, mut v| { + ser::deserialize(&mut v, protocol_version, DeserializationMode::default()) + .map_err(|e| { + error!("Failed to deserialize swap '{}': {:?}", key.to_hex(), e); + e.into() + }) + }) + .map_err(StoreError::ReadError)? + .collect::, _>>() + .map_err(StoreError::ReadError)?; + Ok(swaps.into_iter()) } /// Checks if a matching swap exists in the database #[allow(dead_code)] pub fn swap_exists(&self, input_commit: &Commitment) -> Result { - let key = store::to_key(SWAP_PREFIX, input_commit); self.db .batch() .map_err(StoreError::ReadError)? - .exists(&key[..]) + .exists(Some(SWAP_PREFIX), input_commit.as_ref()) .map_err(StoreError::ReadError) } @@ -308,16 +319,18 @@ impl SwapStore { #[cfg(test)] mod tests { + use super::grin_onion; use std::cmp::Ordering; use grin_core::core::{Input, OutputFeatures}; use grin_core::global::{self, ChainTypes}; + use grin_core::ser::{self, ProtocolVersion}; use rand::RngCore; use grin_onion::crypto::secp; use grin_onion::test_util as onion_test_util; - use crate::store::{StoreError, SwapData, SwapStatus, SwapStore}; + use crate::store::{StoreError, SwapData, SwapStatus, SwapStore, SWAP_PREFIX}; fn new_store(test_name: &str) -> SwapStore { global::set_local_chain_type(ChainTypes::AutomatedTesting); @@ -328,7 +341,7 @@ mod tests { fn rand_swap_with_status(status: SwapStatus) -> SwapData { SwapData { - excess: secp::random_secret(), + excess: secp::random_secret(false), output_commit: onion_test_util::rand_commit(), rangeproof: Some(onion_test_util::rand_proof()), input: Input::new(OutputFeatures::Plain, onion_test_util::rand_commit()), @@ -355,6 +368,38 @@ mod tests { rand_swap_with_status(status) } + #[test] + fn read_migrated_swap() -> Result<(), Box> { + let store = new_store("read_migrated_swap"); + let swap = rand_swap(); + let data = ser::ser_vec(&swap, ProtocolVersion::local())?; + + // Migration stores raw keys in the prefix database. + let mut batch = store.db.batch()?; + batch.put(Some(SWAP_PREFIX), swap.input.commit.as_ref(), &data)?; + batch.commit()?; + + assert_eq!(store.get_swap(&swap.input.commit)?, swap); + assert!(store.swap_exists(&swap.input.commit)?); + assert_eq!( + store.save_swap(&swap, false), + Err(StoreError::AlreadyExists(swap.input.commit)) + ); + Ok(()) + } + + #[test] + fn invalid_swap_iter() -> Result<(), Box> { + let store = new_store("invalid_swap_iter"); + let swap = rand_swap(); + let mut batch = store.db.batch()?; + batch.put(Some(SWAP_PREFIX), swap.input.commit.as_ref(), b"invalid")?; + batch.commit()?; + + assert!(store.swaps_iter().is_err()); + Ok(()) + } + #[test] fn swap_iter() -> Result<(), Box> { let store = new_store("swap_iter"); diff --git a/src/tor.rs b/src/tor.rs index 2fb7337..ad46d95 100644 --- a/src/tor.rs +++ b/src/tor.rs @@ -1,33 +1,39 @@ use std::sync::Arc; +use std::thread::{self, JoinHandle}; +use std::time::Duration; use arti_client::config::TorClientConfigBuilder; use arti_client::{TorClient, TorClientConfig}; -use arti_hyper::ArtiHttpConnector; +use bytes::Bytes; use curve25519_dalek::digest::Digest; use ed25519_dalek::hazmat::ExpandedSecretKey; -use futures::task::SpawnExt; +use futures::{task::SpawnExt, StreamExt}; +use http_body_util::{BodyExt, Full}; +use hyper::{Request, Uri}; +use hyper_util::rt::TokioIo; use sha2::Sha512; use thiserror::Error; -use tls_api::{TlsConnector as TlsConnectorTrait, TlsConnectorBuilder}; -use tls_api_native_tls::TlsConnector; use tor_hscrypto::pk::{HsIdKey, HsIdKeypair}; use tor_hsrproxy::config::{ Encapsulation, ProxyAction, ProxyConfigBuilder, ProxyPattern, ProxyRule, TargetAddr, }; use tor_hsrproxy::OnionServiceReverseProxy; use tor_hsservice::config::OnionServiceConfigBuilder; +use tor_hsservice::status::State as OnionServiceState; use tor_hsservice::{ - HsIdKeypairSpecifier, HsIdPublicKeySpecifier, HsNickname, RunningOnionService, + HsId, HsIdKeypairSpecifier, HsIdPublicKeySpecifier, HsNickname, RunningOnionService, }; use tor_keymgr::key_specifier_derive::internal; use tor_keymgr::{ArtiNativeKeystore, KeyMgrBuilder, KeystoreSelector}; use tor_llcrypto::pk::ed25519::ExpandedKeypair; -use tor_rtcompat::Runtime; +use tor_rtcompat::{Runtime, SleepProviderExt, ToplevelBlockOn}; use secp256k1zkp::SecretKey; use crate::config::ServerConfig; +const REQUEST_TIMEOUT: Duration = Duration::from_secs(60); + /// Tor error types #[derive(Error, Debug)] pub enum TorError { @@ -35,28 +41,41 @@ pub enum TorError { ConfigError(grin_wallet_impls::Error), #[error("Error starting process: {0:?}")] ProcessError(grin_wallet_impls::tor::process::Error), + #[error("Tor request failed: {0}")] + RequestError(String), + #[error("Tor request timed out")] + RequestTimeout, + #[error("Tor request returned HTTP status {0}")] + ResponseStatusError(hyper::StatusCode), } pub struct TorService { - tor_client: Option>, - hidden_services: Vec>, + tor_client: Option>>, + hidden_service: Option>, + proxy: Option>, + proxy_worker: Option>, } impl TorService { - /// Builds a hyper::Client with an ArtiHttpConnector over the TorClient. - /// The returned Client makes HTTP requests through the TorClient directly, eliminating the need for a socks proxy. - pub fn new_hyper_client( - &self, - ) -> hyper::Client, hyper::Body> { - let tls_connector = TlsConnector::builder().unwrap().build().unwrap(); - let tor_connector = ArtiHttpConnector::new(self.tor_client.clone().unwrap(), tls_connector); - - hyper::Client::builder().build::<_, hyper::Body>(tor_connector) + /// Returns the Tor client used for direct asynchronous connections. + /// + /// This replaces the former `new_hyper_client` API. + pub fn client(&self) -> Option>> { + self.tor_client.clone() } - pub fn stop(&mut self) { + pub fn stop(&mut self) -> Result<(), TorError> { + if let Some(proxy) = self.proxy.take() { + proxy.shutdown(); + } + self.proxy_worker + .take() + .map(|worker| worker.join()) + .transpose() + .map_err(|_| TorError::RequestError("Onion proxy thread panicked".into()))?; + self.hidden_service = None; self.tor_client = None; - self.hidden_services.clear(); + Ok(()) } } @@ -66,14 +85,15 @@ pub async fn async_init_tor( server_config: &ServerConfig, ) -> Result, TorError> where - R: Runtime, + R: Runtime + ToplevelBlockOn, { - warn!("Initializing TOR"); + info!("Initializing Tor client"); let state_dir = format!("{}/tor/state", &data_dir); let cache_dir = format!("{}/tor/cache", &data_dir); - let hs_nickname = HsNickname::new("listener".to_string()).unwrap(); - + let onion_address = server_config.onion_address().to_string(); + let hs_nickname = HsNickname::new(onion_address.clone()) + .map_err(|error| TorError::RequestError(format!("Invalid Onion nickname: {error}")))?; let mut client_config_builder = TorClientConfigBuilder::from_directories(state_dir.clone(), cache_dir.clone()); client_config_builder @@ -86,13 +106,18 @@ where .config(client_config) .create_bootstrapped() .await - .unwrap(); + .map_err(|error| { + TorError::RequestError(format!("Tor bootstrap failed: {}", error_chain(&error))) + })?; - let service = - async_launch_hidden_service(hs_nickname.clone(), &tor_client, &server_config).await?; + let (service, proxy, proxy_worker) = + async_launch_hidden_service(hs_nickname.clone(), &tor_client, server_config).await?; + spawn_status_logger(tor_client.runtime(), &service, onion_address)?; let tor_instance = TorService { tor_client: Some(tor_client), - hidden_services: vec![service], + hidden_service: Some(service), + proxy: Some(proxy), + proxy_worker: Some(proxy_worker), }; Ok(tor_instance) } @@ -101,16 +126,26 @@ async fn async_launch_hidden_service( hs_nickname: HsNickname, tor_client: &TorClient, server_config: &ServerConfig, -) -> Result, TorError> +) -> Result< + ( + Arc, + Arc, + JoinHandle<()>, + ), + TorError, +> where - R: Runtime, + R: Runtime + ToplevelBlockOn, { let svc_cfg = OnionServiceConfigBuilder::default() .nickname(hs_nickname.clone()) .build() .unwrap(); - let (service, request_stream) = tor_client.launch_onion_service(svc_cfg).unwrap(); + let (service, request_stream) = tor_client + .launch_onion_service(svc_cfg) + .map_err(|error| TorError::RequestError(error_chain(&error)))? + .ok_or_else(|| TorError::RequestError("Can not launch onion service".into()))?; let proxy_rule = ProxyRule::new( ProxyPattern::one_port(80).unwrap(), @@ -119,33 +154,106 @@ where let mut proxy_cfg_builder = ProxyConfigBuilder::default(); proxy_cfg_builder.set_proxy_ports(vec![proxy_rule]); let proxy = OnionServiceReverseProxy::new(proxy_cfg_builder.build().unwrap()); + let expected_address = format!("{}.onion", server_config.onion_address().to_ov3_str()); + let expected_address: HsId = expected_address + .parse() + .map_err(|error| TorError::RequestError(format!("Invalid Onion identity: {error}")))?; - { + let worker = { let proxy = proxy.clone(); - let runtime_clone = tor_client.runtime().clone(); - tor_client - .runtime() - .spawn(async move { - match proxy - .handle_requests(runtime_clone, hs_nickname.clone(), request_stream) - .await - { - Ok(()) => { - debug!("Onion service {} exited cleanly.", hs_nickname); - } - Err(e) => { - warn!("Onion service {} exited with an error: {}", hs_nickname, e); + let runtime = tor_client.runtime().clone(); + thread::spawn(move || { + runtime.clone().block_on(async move { + let mut request_stream = request_stream; + loop { + match proxy + .handle_requests(runtime.clone(), hs_nickname.clone(), &mut request_stream) + .await + { + Ok(()) => { + debug!("Onion service {} exited cleanly.", hs_nickname); + break; + } + Err(error) => { + warn!( + "Onion service {} proxy failed: {}; retrying in 1 second", + hs_nickname, error + ); + runtime.sleep(Duration::from_secs(1)).await; + } } } - }) - .unwrap(); + }); + }) + }; + + let launched_address = service + .onion_address() + .ok_or_else(|| TorError::RequestError("Onion service has no identity".into()))?; + if launched_address != expected_address { + proxy.shutdown(); + let _ = worker.join(); + return Err(TorError::RequestError(format!( + "Onion service identity mismatch: expected {}, launched {:?}", + server_config.onion_address().to_ov3_str(), + launched_address + ))); } - warn!( - "Server listening at http://{}.onion", + info!( + "Onion service reactor launched at http://{}.onion", server_config.onion_address().to_ov3_str() ); - Ok(service) + Ok((service, proxy, worker)) +} + +fn spawn_status_logger( + runtime: &R, + service: &RunningOnionService, + onion_address: String, +) -> Result<(), TorError> +where + R: Runtime, +{ + let mut statuses = service.status_events(); + runtime + .spawn(async move { + let mut previous = None; + while let Some(status) = statuses.next().await { + let snapshot = format!("{status:?}"); + if previous.as_ref() == Some(&snapshot) { + continue; + } + previous = Some(snapshot); + match status.state() { + OnionServiceState::Running => { + info!("Onion service is reachable at http://{onion_address}.onion") + } + OnionServiceState::DegradedReachable => warn!( + "Onion service is reachable but degraded at http://{onion_address}.onion: {status:?}" + ), + OnionServiceState::Bootstrapping => { + info!("Onion service is bootstrapping at http://{onion_address}.onion") + } + OnionServiceState::Recovering | OnionServiceState::DegradedUnreachable => { + warn!( + "Onion service is not fully reachable at http://{onion_address}.onion: {status:?}" + ) + } + OnionServiceState::Broken => error!( + "Onion service is broken at http://{onion_address}.onion: {status:?}" + ), + OnionServiceState::Shutdown => { + info!("Onion service stopped at http://{onion_address}.onion") + } + _ => warn!("Onion service status changed: {status:?}"), + } + } + }) + .map_err(|error| { + TorError::RequestError(format!("Could not monitor Onion service: {error}")) + })?; + Ok(()) } // TODO: Add proper error handling @@ -157,12 +265,12 @@ fn add_key_to_store( ) -> Result<(), TorError> { let key_store_dir = format!("{}/keystore", &state_dir); let arti_store = - ArtiNativeKeystore::from_path_and_mistrust(&key_store_dir, &tor_config.fs_mistrust()) + ArtiNativeKeystore::from_path_and_mistrust(&key_store_dir, tor_config.fs_mistrust()) .unwrap(); info!("Using keystore from {key_store_dir:?}"); let key_manager = KeyMgrBuilder::default() - .default_store(Box::new(arti_store)) + .primary_store(Box::new(arti_store)) .build() .map_err(|_| internal!("failed to build keymgr")) .unwrap(); @@ -181,9 +289,10 @@ fn add_key_to_store( key_manager .insert( - HsIdKey::from(expanded_kp.public().clone()), + HsIdKey::from(*expanded_kp.public()), &HsIdPublicKeySpecifier::new(hs_nickname.clone()), - KeystoreSelector::Default, + KeystoreSelector::Primary, + true, ) .unwrap(); @@ -191,9 +300,100 @@ fn add_key_to_store( .insert( HsIdKeypair::from(expanded_kp), &HsIdKeypairSpecifier::new(hs_nickname.clone()), - KeystoreSelector::Default, + KeystoreSelector::Primary, + true, ) .unwrap(); Ok(()) } + +pub async fn async_post( + client: Arc>, + url: &str, + body: String, +) -> Result { + async_post_with_timeout(client, url, body, REQUEST_TIMEOUT).await +} + +fn error_chain(error: &(dyn std::error::Error + 'static)) -> String { + let mut message = error.to_string(); + let mut source = error.source(); + while let Some(error) = source { + message.push_str(": "); + message.push_str(&error.to_string()); + source = error.source(); + } + message +} + +async fn async_post_with_timeout( + client: Arc>, + url: &str, + body: String, + timeout: Duration, +) -> Result { + let uri: Uri = url + .parse() + .map_err(|e| TorError::RequestError(format!("Bad URL: {e}")))?; + let host = uri + .host() + .ok_or_else(|| TorError::RequestError("URL has no host".into()))? + .to_string(); + let request_target = uri + .path_and_query() + .map(|path| path.as_str()) + .unwrap_or("/") + .to_string(); + let runtime = client.runtime().clone(); + runtime + .clone() + .timeout(timeout, async move { + let port = uri.port_u16().unwrap_or(80); + let stream = client + .connect((host.clone(), port)) + .await + .map_err(|error| TorError::RequestError(error_chain(&error)))?; + let (mut sender, connection) = + hyper::client::conn::http1::handshake(TokioIo::new(stream)) + .await + .map_err(|error| TorError::RequestError(error_chain(&error)))?; + + let connection_runtime = runtime.clone(); + connection_runtime + .spawn(async move { + if let Err(error) = connection.await { + warn!("Tor connection error: {}", error_chain(&error)); + } + }) + .map_err(|error| { + TorError::RequestError(format!("Could not start HTTP connection: {error}")) + })?; + + let response = sender + .send_request( + Request::builder() + .uri(request_target) + .method("POST") + .header("host", host) + .header("content-type", "application/json") + .body::>(Full::from(body)) + .map_err(|error| TorError::RequestError(error_chain(&error)))?, + ) + .await + .map_err(|error| TorError::RequestError(error_chain(&error)))?; + if !response.status().is_success() { + return Err(TorError::ResponseStatusError(response.status())); + } + let bytes = response + .into_body() + .collect() + .await + .map_err(|error| TorError::RequestError(error_chain(&error)))? + .to_bytes(); + String::from_utf8(bytes.to_vec()) + .map_err(|error| TorError::RequestError(error_chain(&error))) + }) + .await + .map_err(|_| TorError::RequestTimeout)? +} diff --git a/src/tx.rs b/src/tx.rs index ee53ce0..dd04bdd 100644 --- a/src/tx.rs +++ b/src/tx.rs @@ -4,8 +4,8 @@ use grin_core::core::{ FeeFields, Input, Inputs, KernelFeatures, Output, Transaction, TransactionBody, TxKernel, }; use grin_keychain::BlindingFactor; -use grin_wallet_libwallet::mwixnet::onion as grin_onion; use grin_onion::crypto::secp; +use grin_wallet_libwallet::mwixnet::onion as grin_onion; use secp256k1zkp::{ContextFlag, Secp256k1, SecretKey}; use serde::{Deserialize, Serialize}; use std::sync::Arc; @@ -45,7 +45,7 @@ pub struct TxComponents { /// Builds and verifies the finalized swap 'Transaction' using the provided components. pub async fn async_assemble_tx( - wallet: &Arc, + wallet: Option<&Arc>, inputs: &Vec, outputs: &Vec, kernels: &Vec, @@ -59,7 +59,7 @@ pub async fn async_assemble_tx( TransactionBody::weight_by_iok(inputs.len() as u64, outputs.len() as u64, 1) * fee_base; let components = async_add_kernel_and_collect_fees( - &wallet, + wallet, &outputs, &kernels, fee_base, @@ -82,7 +82,7 @@ pub async fn async_assemble_tx( /// Adds a kernel and output to a collection of transaction components to consume fees and offset excesses. pub async fn async_assemble_components( - wallet: &Arc, + wallet: Option<&Arc>, components: &TxComponents, output_excesses: &Vec, fee_base: u64, @@ -92,7 +92,7 @@ pub async fn async_assemble_components( let min_kernel_fee = TransactionBody::weight_by_iok(0, 0, 1) * fee_base; async_add_kernel_and_collect_fees( - &wallet, + wallet, &components.outputs, &components.kernels, fee_base, @@ -105,7 +105,7 @@ pub async fn async_assemble_components( } async fn async_add_kernel_and_collect_fees( - wallet: &Arc, + wallet: Option<&Arc>, outputs: &Vec, kernels: &Vec, fee_base: u64, @@ -127,23 +127,25 @@ async fn async_add_kernel_and_collect_fees( let fee_to_spend = TransactionBody::weight_by_iok(1, 0, 0) * fee_base; // collect any leftover fees - if fees_paid > min_kernel_fee + fee_to_collect + fee_to_spend { - let amount = fees_paid - (min_kernel_fee + fee_to_collect); - kernel_fee -= amount; + if let Some(wallet) = wallet { + if fees_paid > min_kernel_fee + fee_to_collect + fee_to_spend { + let amount = fees_paid - (min_kernel_fee + fee_to_collect); + kernel_fee -= amount; - let wallet_output = wallet - .async_build_output(amount) - .await - .map_err(TxError::WalletError)?; - txn_outputs.push(wallet_output.1); + let wallet_output = wallet + .async_build_output(amount) + .await + .map_err(TxError::WalletError)?; + txn_outputs.push(wallet_output.1); - let output_excess = SecretKey::from_slice(&secp, &wallet_output.0.as_ref()) - .map_err(TxError::OutputBlindError)?; - txn_excesses.push(output_excess); + let output_excess = SecretKey::from_slice(&secp, &wallet_output.0.as_ref()) + .map_err(TxError::OutputBlindError)?; + txn_excesses.push(output_excess); + } } // generate random transaction offset - let our_offset = secp::random_secret(); + let our_offset = secp::random_secret(false); let txn_offset = secp .blind_sum(vec![prev_offset.clone(), our_offset.clone()], Vec::new()) .map_err(TxError::OffsetError)?; @@ -207,13 +209,16 @@ async fn async_add_kernel_and_collect_fees( /// # Example /// /// ```rust +/// use mwixnet::tx::build_kernel; +/// use secp256k1zkp::{ContextFlag, Secp256k1}; /// use secp256k1zkp::key::SecretKey; /// use secp256k1zkp::rand::thread_rng; -/// use grin_onion::crypto::secp; /// -/// let secret_key = secp::random_secret(); -/// let fee = 10; // 10 nanogrin -/// let kernel = mwixnet::tx::build_kernel(&secret_key, fee); +/// let secp = Secp256k1::with_caps(ContextFlag::None); +/// let secret_key = SecretKey::new(&secp, &mut thread_rng()); +/// let kernel = build_kernel(&secret_key, 10); +/// +/// assert!(kernel.is_ok()); /// ``` pub fn build_kernel(excess: &SecretKey, fee: u64) -> Result { let mut kernel = TxKernel::with_features(KernelFeatures::Plain { @@ -228,3 +233,29 @@ pub fn build_kernel(excess: &SecretKey, fee: u64) -> Result { Ok(kernel) } + +#[cfg(test)] +mod tests { + use super::*; + + #[tokio::test] + async fn no_wallet_keeps_kernel_fee() { + let components = TxComponents { + offset: secp::random_secret(false), + kernels: Vec::new(), + outputs: Vec::new(), + }; + let fees_paid = 1_000; + + let result = async_assemble_components(None, &components, &Vec::new(), 1, fees_paid) + .await + .unwrap(); + + assert!(result.outputs.is_empty()); + assert_eq!(result.kernels.len(), 1); + match result.kernels[0].features { + KernelFeatures::Plain { fee } => assert_eq!(fee.fee(), fees_paid), + _ => panic!("expected plain kernel"), + } + } +} diff --git a/src/wallet.rs b/src/wallet.rs index 68868bc..30cb874 100644 --- a/src/wallet.rs +++ b/src/wallet.rs @@ -11,8 +11,8 @@ use serde::{Deserialize, Serialize}; use serde_json::json; use thiserror::Error; -use grin_wallet_libwallet::mwixnet::onion as grin_onion; use grin_onion::crypto::secp; +use grin_wallet_libwallet::mwixnet::onion as grin_onion; use secp256k1zkp::{PublicKey, Secp256k1, SecretKey}; use crate::http; @@ -94,7 +94,7 @@ impl HttpWallet { wallet_owner_secret: &Option, ) -> Result { let secp = Secp256k1::new(); - let ephemeral_sk = secp::random_secret(); + let ephemeral_sk = secp::random_secret(false); let ephemeral_pk = PublicKey::from_secret_key(&secp, &ephemeral_sk).unwrap(); let ephemeral_pk_bytes = ephemeral_pk.serialize_vec(&secp, true); let init_params = json!({ @@ -183,6 +183,7 @@ impl Wallet for HttpWallet { #[cfg(test)] pub mod mock { + use super::grin_onion; use std::borrow::BorrowMut; use std::sync::{Arc, Mutex}; @@ -224,13 +225,13 @@ pub mod mock { amount: u64, ) -> Result<(BlindingFactor, Output), WalletError> { let secp = Secp256k1::new(); - let blind = secp::random_secret(); + let blind = secp::random_secret(false); let commit = secp::commit(amount, &blind).unwrap(); let proof = secp.bullet_proof( amount, blind.clone(), - secp::random_secret(), - secp::random_secret(), + secp::random_secret(false), + secp::random_secret(false), None, None, ); diff --git a/tests/common/miner.rs b/tests/common/miner.rs index 11985c0..5e9a7e1 100644 --- a/tests/common/miner.rs +++ b/tests/common/miner.rs @@ -20,7 +20,7 @@ use crate::common::types::BlockFees; use crate::common::wallet::IntegrationGrinWallet; use chrono::prelude::Utc; -use chrono::{DateTime, NaiveDateTime}; +use chrono::DateTime; use grin_chain::Chain; use grin_core::core::hash::{Hash, Hashed}; use grin_core::core::{Block, BlockHeader, Transaction}; @@ -214,10 +214,7 @@ impl Miner { b.header.pow.nonce = thread_rng().gen(); b.header.pow.secondary_scaling = difficulty.secondary_scaling; - b.header.timestamp = DateTime::::from_naive_utc_and_offset( - NaiveDateTime::from_timestamp_opt(now_sec, 0).unwrap(), - Utc, - ); + b.header.timestamp = DateTime::::from_timestamp(now_sec, 0).unwrap(); debug!( "Built new block with {} inputs and {} outputs, block difficulty: {}, cumulative difficulty {}", diff --git a/tests/common/node.rs b/tests/common/node.rs index 596dc85..efd7d37 100644 --- a/tests/common/node.rs +++ b/tests/common/node.rs @@ -4,14 +4,11 @@ extern crate grin_wallet_controller as wallet_controller; extern crate grin_wallet_impls as wallet; extern crate grin_wallet_libwallet as libwallet; -use futures::channel::oneshot; - use grin_core as core; use grin_p2p as p2p; use grin_servers as servers; -use grin_util::logger::LogEntry; use grin_util::{Mutex, StopState}; use std::default::Default; use std::net::SocketAddr; @@ -37,21 +34,15 @@ impl IntegrationGrinNode { // Start the node in a new thread thread::spawn(move || { - let api_chan: &'static mut (oneshot::Sender<()>, oneshot::Receiver<()>) = - Box::leak(Box::new(oneshot::channel::<()>())); - - servers::Server::start( + let api_chan = tokio::sync::mpsc::channel::<()>(1); + let server = servers::Server::start( server_config_thread.clone(), - None, - move |serv: servers::Server, _: Option>| { - // Signal that the callback has been called - tx.send(serv).unwrap(); - // Do other necessary stuff here - }, Some(stop_state_thread.clone()), + None, api_chan, ) .unwrap(); + tx.send(server).unwrap(); }); // Wait for the signal from the node-running thread @@ -96,7 +87,7 @@ impl GrinNodeManager { api_secret_path: None, db_root: format!("{}/nodes/{}", self.working_dir, self.nodes.len()), p2p_config: p2p::P2PConfig { - port: 13414, + port: 13414 + self.nodes.len() as u16, seeding_type: p2p::Seeding::None, ..p2p::P2PConfig::default() }, diff --git a/tests/common/server.rs b/tests/common/server.rs index 54c90a5..46bbbd3 100644 --- a/tests/common/server.rs +++ b/tests/common/server.rs @@ -2,13 +2,14 @@ use std::iter; use std::net::TcpListener; use std::sync::Arc; +use grin_api::{client, json_rpc}; use grin_core::core::Transaction; +use grin_wallet_libwallet::mwixnet::{MwixnetServerPublicKey, SwapReq}; +use serde_json::json; use tor_rtcompat::PreferredRuntime; -use x25519_dalek::{PublicKey as xPublicKey, StaticSecret}; -use grin_onion::crypto::comsig::ComSignature; use grin_onion::crypto::dalek::DalekPublicKey; -use grin_onion::onion::Onion; +use grin_wallet_libwallet::mwixnet::onion as grin_onion; use mwixnet::mix_client::MixClientImpl; use mwixnet::tor::TorService; use mwixnet::{tor, SwapError, SwapServer, SwapStore}; @@ -18,7 +19,7 @@ use crate::common::node::IntegrationGrinNode; use crate::common::wallet::{GrinWalletManager, IntegrationGrinWallet}; pub struct IntegrationSwapServer { - server_key: SecretKey, + onion_pubkey: MwixnetServerPublicKey, tor_instance: Arc>>, swap_server: Arc>, rpc_server: jsonrpc_http_server::Server, @@ -26,17 +27,44 @@ pub struct IntegrationSwapServer { } impl IntegrationSwapServer { - pub async fn async_swap(&self, onion: &Onion, comsig: &ComSignature) -> Result<(), SwapError> { - self.swap_server.lock().await.swap(&onion, &comsig).await + pub async fn async_swap(&self, request: &SwapReq) -> Result<(), SwapError> { + let url = format!("http://{}/v1", self.rpc_server.address()); + let params = json!([request]); + let request = json_rpc::build_request("swap", ¶ms); + let response: json_rpc::Response = client::post_async(&url, &request, None) + .await + .map_err(|e| SwapError::ClientError(e.to_string()))?; + if let Some(error) = response.error { + return Err(SwapError::ClientError(error.message)); + } + let response: String = + serde_json::from_value(response.result.unwrap_or(serde_json::Value::Null)) + .map_err(|e| SwapError::ClientError(e.to_string()))?; + if response == "success" { + Ok(()) + } else { + Err(SwapError::ClientError(format!( + "Unexpected swap API response: {}", + response + ))) + } } pub async fn async_execute_round(&self) -> Result>, SwapError> { self.swap_server.lock().await.execute_round().await } + + pub async fn async_check_reorg( + &self, + tx: &Arc, + ) -> Result>, SwapError> { + self.swap_server.lock().await.check_reorg(tx).await + } } pub struct IntegrationMixServer { server_key: SecretKey, + onion_pubkey: MwixnetServerPublicKey, tor_instance: Arc>>, rpc_server: jsonrpc_http_server::Server, _wallet: Arc>, @@ -52,7 +80,7 @@ async fn async_new_swap_server( next_server: Option<&IntegrationMixServer>, ) -> IntegrationSwapServer where - R: tor_rtcompat::Runtime, + R: tor_rtcompat::Runtime + tor_rtcompat::ToplevelBlockOn, { let wallet = wallets.async_new_wallet(&node.lock().api_address()).await; @@ -64,9 +92,10 @@ where .local_addr() .unwrap(), grin_node_url: node.lock().api_address().to_string(), - grin_node_secret_path: None, + grin_node_foreign_api_secret_path: None, wallet_owner_url: wallet.lock().owner_address().to_string(), wallet_owner_secret_path: None, + collect_fees: true, prev_server: None, next_server: match next_server { Some(s) => Some(DalekPublicKey::from_secret(&s.server_key)), @@ -92,14 +121,14 @@ where ))), None => None, }, - wallet.lock().get_client(), + Some(wallet.lock().get_client()), node.lock().to_client(), store, ) .unwrap(); IntegrationSwapServer { - server_key: server_key.clone(), + onion_pubkey: server_config.onion_pubkey(), tor_instance, swap_server, rpc_server, @@ -118,7 +147,7 @@ async fn async_new_mix_server( next_server: Option<&IntegrationMixServer>, ) -> IntegrationMixServer where - R: tor_rtcompat::Runtime, + R: tor_rtcompat::Runtime + tor_rtcompat::ToplevelBlockOn, { let wallet = wallets.async_new_wallet(&node.lock().api_address()).await; let server_config = mwixnet::ServerConfig { @@ -129,9 +158,10 @@ where .local_addr() .unwrap(), grin_node_url: node.lock().api_address().to_string(), - grin_node_secret_path: None, + grin_node_foreign_api_secret_path: None, wallet_owner_url: wallet.lock().owner_address().to_string(), wallet_owner_secret_path: None, + collect_fees: true, prev_server: Some(prev_server), next_server: match next_server { Some(s) => Some(DalekPublicKey::from_secret(&s.server_key)), @@ -155,13 +185,14 @@ where ))), None => None, }, - wallet.lock().get_client(), + Some(wallet.lock().get_client()), node.lock().to_client(), ) .unwrap(); IntegrationMixServer { server_key: server_key.clone(), + onion_pubkey: server_config.onion_pubkey(), tor_instance, rpc_server, _wallet: wallet, @@ -184,7 +215,7 @@ impl Servers { ) -> Servers { // Pre-generate all server keys let server_keys: Vec = - iter::repeat_with(|| grin_onion::crypto::secp::random_secret()) + iter::repeat_with(|| grin_onion::crypto::secp::random_secret(false)) .take(num_mixers + 1) .collect(); @@ -206,7 +237,7 @@ impl Servers { ) .await; println!( - "Mixer {}: server_key={}, prev_server={}, next_server={}", + "Mixer {}: identity_key={}, prev_server={}, next_server={}", i, DalekPublicKey::from_secret(&server_keys[i + 1]).to_hex(), DalekPublicKey::from_secret(&server_keys[i]).to_hex(), @@ -230,32 +261,36 @@ impl Servers { ) .await; println!( - "Swapper: server_key={}", + "Swapper: identity_key={}", DalekPublicKey::from_secret(&server_keys[0]).to_hex() ); Servers { swapper, mixers } } - pub fn get_pub_keys(&self) -> Vec { - let mut pub_keys = vec![xPublicKey::from(&StaticSecret::from( - self.swapper.server_key.0.clone(), - ))]; + pub fn get_server_keys(&self) -> Vec { + let mut server_keys = vec![self.swapper.onion_pubkey]; for mixer in &self.mixers { - pub_keys.push(xPublicKey::from(&StaticSecret::from( - mixer.server_key.0.clone(), - ))) + server_keys.push(mixer.onion_pubkey); } - pub_keys + server_keys } pub fn stop_all(&mut self) { self.swapper.rpc_server.close_handle().close(); - self.swapper.tor_instance.lock().stop(); + self.swapper + .tor_instance + .lock() + .stop() + .expect("stop swap Tor service"); self.mixers.iter_mut().for_each(|mixer| { mixer.rpc_server.close_handle().close(); - mixer.tor_instance.lock().stop(); + mixer + .tor_instance + .lock() + .stop() + .expect("stop mixer Tor service"); }); } } diff --git a/tests/common/wallet.rs b/tests/common/wallet.rs index cf717a8..0f8fded 100644 --- a/tests/common/wallet.rs +++ b/tests/common/wallet.rs @@ -1,29 +1,26 @@ use std::net::{IpAddr, Ipv4Addr, SocketAddr}; +use std::path::PathBuf; use std::sync::Arc; use std::thread; +use std::time::Duration; -use grin_core::core::{FeeFields, Output, OutputFeatures, Transaction, TxKernel}; +use grin_core::core::{Output, Transaction, TxKernel}; use grin_core::global::ChainTypes; -use grin_core::libtx::tx_fee; -use grin_keychain::{BlindingFactor, ExtKeychain, Identifier, Keychain, SwitchCommitmentType}; -use grin_util::{Mutex, ZeroingString}; +use grin_keychain::{ExtKeychain, Identifier}; +use grin_util::{Mutex, ToHex, ZeroingString}; use grin_wallet_api::Owner; use grin_wallet_config::WalletConfig; use grin_wallet_controller::controller; use grin_wallet_impls::{DefaultLCProvider, DefaultWalletImpl, HTTPNodeClient}; +use grin_wallet_libwallet::mwixnet::{MwixnetReqCreationResult, MwixnetServerPublicKey}; use grin_wallet_libwallet::{InitTxArgs, Slate, VersionedSlate, WalletInfo, WalletInst}; use log::error; -use serde_derive::{Deserialize, Serialize}; -use serde_json::json; -use x25519_dalek::PublicKey as xPublicKey; - -use grin_onion::crypto::comsig::ComSignature; -use grin_onion::onion::Onion; -use grin_onion::Hop; use mwixnet::http; use mwixnet::wallet::HttpWallet; use secp256k1zkp::pedersen::Commitment; -use secp256k1zkp::{Secp256k1, SecretKey}; +use secp256k1zkp::SecretKey; +use serde_derive::{Deserialize, Serialize}; +use serde_json::json; use crate::common::types::BlockFees; @@ -39,22 +36,9 @@ pub struct CbData { } pub struct IntegrationGrinWallet { - wallet: Arc< - Mutex< - Box< - dyn WalletInst< - 'static, - DefaultLCProvider<'static, HTTPNodeClient, ExtKeychain>, - HTTPNodeClient, - ExtKeychain, - >, - >, - >, - >, api_listen_port: u16, - owner_api: Arc< - Owner, HTTPNodeClient, ExtKeychain>, - >, + owner_api: + Arc, HTTPNodeClient, ExtKeychain>>, http_client: Arc, } @@ -64,18 +48,18 @@ impl IntegrationGrinWallet { api_listen_port: u16, node_api: String, ) -> IntegrationGrinWallet { - let node_client = HTTPNodeClient::new(&node_api, None).unwrap(); - let mut wallet = Box::new( - DefaultWalletImpl::<'static, HTTPNodeClient>::new(node_client.clone()).unwrap(), - ) - as Box< - dyn WalletInst< - 'static, - DefaultLCProvider, - HTTPNodeClient, - ExtKeychain, - >, - >; + std::fs::create_dir_all(&wallet_dir).unwrap(); + let node_client = HTTPNodeClient::new(&node_api, None, Duration::from_secs(30)).unwrap(); + let mut wallet = + Box::new(DefaultWalletImpl::::new(node_client.clone()).unwrap()) + as Box< + dyn WalletInst< + 'static, + DefaultLCProvider, + HTTPNodeClient, + ExtKeychain, + >, + >; // Wallet LifeCycle Provider provides all functions init wallet and work with seeds, etc... let lc = wallet.lc_provider().unwrap(); @@ -105,20 +89,20 @@ impl IntegrationGrinWallet { // Start owner API let km = Arc::new(Mutex::new(None)); let wallet = Arc::new(Mutex::new(wallet)); - let owner_api = Arc::new(Owner::new(wallet.clone(), None)); + let config_path = PathBuf::from(&wallet_dir).join("grin-wallet.toml"); + let owner_api = Arc::new(Owner::new(wallet.clone(), None, config_path.clone())); let address_str = format!("127.0.0.1:{}", api_listen_port); let address_str_2 = format!("127.0.0.1:{}", api_listen_port); - let thr_wallet = wallet.clone(); + let mut listener_api = Owner::new(wallet.clone(), None, config_path); let _thread_handle = thread::spawn(move || { controller::owner_listener( - thr_wallet, + &mut listener_api, km, address_str.as_str(), None, None, Some(true), - None, false, ) .unwrap() @@ -131,7 +115,6 @@ impl IntegrationGrinWallet { ); IntegrationGrinWallet { - wallet, api_listen_port, owner_api, http_client, @@ -152,6 +135,18 @@ impl IntegrationGrinWallet { Ok(wallet_info) } + pub async fn async_scan(&self) -> Result<(), mwixnet::WalletError> { + let params = json!({ + "token": self.http_client.get_token(), + "start_height": null, + "delete_unconfirmed": false, + }); + self.http_client + .clone() + .async_perform_request("scan", ¶ms) + .await + } + pub async fn async_send( &self, receiving_wallet: &IntegrationGrinWallet, @@ -194,7 +189,7 @@ impl IntegrationGrinWallet { }); self.http_client .clone() - .async_perform_request("tx_lock_outputs", ¶ms) + .async_perform_request::<()>("tx_lock_outputs", ¶ms) .await?; Ok(slate) @@ -271,90 +266,31 @@ impl IntegrationGrinWallet { Ok(response) } - pub fn build_onion( + pub async fn async_create_mwixnet_req( &self, commitment: &Commitment, - server_pubkeys: &Vec, - ) -> Result<(Onion, ComSignature), grin_wallet_libwallet::Error> { - let keychain = self - .wallet - .lock() - .lc_provider()? - .wallet_inst()? - .keychain(self.keychain_mask().as_ref())?; - let (_, outputs) = - self.owner_api - .retrieve_outputs(self.keychain_mask().as_ref(), false, false, None)?; - - let mut output = None; - for o in &outputs { - if o.commit == *commitment { - output = Some(o.output.clone()); - break; - } - } - - if output.is_none() { - return Err(grin_wallet_libwallet::Error::GenericError(String::from( - "output not found", - ))); - } - - let amount = output.clone().unwrap().value; - let input_blind = keychain.derive_key( - amount, - &output.clone().unwrap().key_id, - SwitchCommitmentType::Regular, - )?; - - let fee = tx_fee(1, 1, 1); - let new_amount = amount - (fee * server_pubkeys.len() as u64); - let new_output = self.owner_api.build_output( - self.keychain_mask().as_ref(), - OutputFeatures::Plain, - new_amount, - )?; - - let secp = Secp256k1::new(); - let mut blind_sum = new_output - .blind - .split(&BlindingFactor::from_secret_key(input_blind.clone()), &secp)?; - - let hops = server_pubkeys + server_keys: &[MwixnetServerPublicKey], + ) -> Result { + let server_keys = server_keys .iter() - .enumerate() - .map(|(i, &p)| { - if (i + 1) == server_pubkeys.len() { - Hop { - server_pubkey: p.clone(), - excess: blind_sum.secret_key(&secp).unwrap(), - fee: FeeFields::from(fee as u32), - rangeproof: Some(new_output.output.proof.clone()), - } - } else { - let hop_excess = BlindingFactor::rand(&secp); - blind_sum = blind_sum.split(&hop_excess, &secp).unwrap(); - Hop { - server_pubkey: p.clone(), - excess: hop_excess.secret_key(&secp).unwrap(), - fee: FeeFields::from(fee as u32), - rangeproof: None, - } - } - }) - .collect(); - - let onion = grin_onion::create_onion(&commitment, &hops).unwrap(); - let comsig = ComSignature::sign(amount, &input_blind, &onion.serialize().unwrap()).unwrap(); - - Ok((onion, comsig)) + .map(|key| key.to_hex()) + .collect::>(); + let params = json!({ + "token": self.http_client.get_token(), + "commitment": commitment.to_hex(), + "fee_per_hop": "50000000", + "lock_output": true, + "server_keys": server_keys, + }); + self.http_client + .clone() + .async_perform_request("create_mwixnet_req", ¶ms) + .await } pub fn owner_api( &self, - ) -> Arc< - Owner, HTTPNodeClient, ExtKeychain>, - > { + ) -> Arc, HTTPNodeClient, ExtKeychain>> { self.owner_api.clone() } diff --git a/tests/e2e.rs b/tests/e2e.rs index ef7ec4d..e996008 100644 --- a/tests/e2e.rs +++ b/tests/e2e.rs @@ -4,6 +4,8 @@ extern crate log; use std::ops::Deref; use function_name::named; +use grin_chain::{Chain, Options}; +use grin_core::core::hash::Hashed; use grin_core::global; use grin_util::logger::LoggingConfig; use log::Level; @@ -40,6 +42,14 @@ fn setup_test(test_name: &str) -> (GrinNodeManager, GrinWalletManager, String) { (nodes, wallets, test_dir) } +fn copy_blocks(source: &Chain, target: &Chain, start_height: u64, end_height: u64) { + for height in start_height..=end_height { + let hash = source.get_header_by_height(height).unwrap().hash(); + let block = source.get_block(&hash).unwrap(); + target.process_block(block, Options::MINE).unwrap(); + } +} + #[test] #[named] fn integration_test() -> Result<(), Box> { @@ -91,21 +101,24 @@ fn integration_test() -> Result<(), Box> { miner .async_mine_next_block(&mining_wallet, &vec![tx1, tx2]) .await; + let fork_height = node1_server.chain.head_header().unwrap().height; let user1_km = user1_wallet.lock().keychain_mask(); let (_, outputs) = user1_wallet .lock() .owner_api() - .retrieve_outputs(user1_km.as_ref(), false, false, None) + .retrieve_outputs(user1_km.as_ref(), false, true, None) .unwrap(); - assert_eq!(outputs.len(), 1); - for output in &outputs { - let (onion, comsig) = user1_wallet - .lock() - .build_onion(&output.commit, &servers.get_pub_keys()) - .unwrap(); - servers.swapper.async_swap(&onion, &comsig).await.unwrap(); - } + assert_eq!(outputs.len(), 1); + for output in &outputs { + let creation = user1_wallet + .lock() + .async_create_mwixnet_req(&output.commit, &servers.get_server_keys()) + .await + .unwrap(); + assert!(creation.tx_id.is_some()); + servers.swapper.async_swap(&creation.request).await.unwrap(); + } let mining_wallet_info = mining_wallet .lock() @@ -126,7 +139,60 @@ fn integration_test() -> Result<(), Box> { .unwrap(); println!("User2 wallet: {:?}", user2_wallet_info); - let _tx = servers.swapper.async_execute_round().await.unwrap(); + let tx = servers + .swapper + .async_execute_round() + .await + .unwrap() + .unwrap(); + miner + .async_mine_next_block(&mining_wallet, &vec![tx.as_ref().clone()]) + .await; + let user1_wallet_info = user1_wallet + .lock() + .async_retrieve_summary_info() + .await + .unwrap(); + assert_eq!(user1_wallet_info.amount_currently_spendable, 9_850_000_000); + assert_eq!(user1_wallet_info.amount_locked, 0); + + let node2 = nodes.new_node(); + let node2_server = node2.lock().start(); + copy_blocks(&node1_server.chain, &node2_server.chain, 1, fork_height); + let fork_miner = Miner::new(node2_server.chain.clone()); + fork_miner.async_mine_empty_blocks(&mining_wallet, 2).await; + copy_blocks( + &node2_server.chain, + &node1_server.chain, + fork_height + 1, + fork_height + 2, + ); + user1_wallet.lock().async_scan().await.unwrap(); + let user1_wallet_info = user1_wallet + .lock() + .async_retrieve_summary_info() + .await + .unwrap(); + assert_eq!(user1_wallet_info.amount_currently_spendable, 10_000_000_000); + assert_eq!(user1_wallet_info.amount_locked, 0); + + let tx = servers + .swapper + .async_check_reorg(&tx) + .await + .unwrap() + .unwrap(); + miner + .async_mine_next_block(&mining_wallet, &vec![tx.as_ref().clone()]) + .await; + user1_wallet.lock().async_scan().await.unwrap(); + let user1_wallet_info = user1_wallet + .lock() + .async_retrieve_summary_info() + .await + .unwrap(); + assert_eq!(user1_wallet_info.amount_currently_spendable, 9_850_000_000); + assert_eq!(user1_wallet_info.amount_locked, 0); }); servers.stop_all(); From 8b2316b4dffd912956e04f196bb1b523fb12e831 Mon Sep 17 00:00:00 2001 From: wiesche Date: Sat, 8 Aug 2026 08:48:48 +0200 Subject: [PATCH 2/5] stabilize tor --- src/tor.rs | 49 ++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 38 insertions(+), 11 deletions(-) diff --git a/src/tor.rs b/src/tor.rs index ad46d95..e13d20a 100644 --- a/src/tor.rs +++ b/src/tor.rs @@ -33,6 +33,13 @@ use secp256k1zkp::SecretKey; use crate::config::ServerConfig; const REQUEST_TIMEOUT: Duration = Duration::from_secs(60); +const MIN_CIRCUIT_TIMEOUT_MS: i32 = 2_000; + +fn set_timeout_floor(config: &mut TorClientConfigBuilder) { + config + .override_net_params() + .insert("cbtmintimeout".into(), MIN_CIRCUIT_TIMEOUT_MS); +} /// Tor error types #[derive(Error, Debug)] @@ -96,6 +103,7 @@ where .map_err(|error| TorError::RequestError(format!("Invalid Onion nickname: {error}")))?; let mut client_config_builder = TorClientConfigBuilder::from_directories(state_dir.clone(), cache_dir.clone()); + set_timeout_floor(&mut client_config_builder); client_config_builder .address_filter() .allow_onion_addrs(true); @@ -220,33 +228,36 @@ where .spawn(async move { let mut previous = None; while let Some(status) = statuses.next().await { - let snapshot = format!("{status:?}"); - if previous.as_ref() == Some(&snapshot) { + let state = status.state(); + debug!("Onion service status at http://{onion_address}.onion: {status:?}"); + if previous == Some(state) { continue; } - previous = Some(snapshot); - match status.state() { + previous = Some(state); + match state { OnionServiceState::Running => { info!("Onion service is reachable at http://{onion_address}.onion") } OnionServiceState::DegradedReachable => warn!( - "Onion service is reachable but degraded at http://{onion_address}.onion: {status:?}" + "Onion service is reachable but degraded at http://{onion_address}.onion" ), OnionServiceState::Bootstrapping => { info!("Onion service is bootstrapping at http://{onion_address}.onion") } OnionServiceState::Recovering | OnionServiceState::DegradedUnreachable => { warn!( - "Onion service is not fully reachable at http://{onion_address}.onion: {status:?}" - ) + "Onion service is not fully reachable ({state:?}) at http://{onion_address}.onion" + ) + } + OnionServiceState::Broken => { + error!("Onion service is broken at http://{onion_address}.onion") } - OnionServiceState::Broken => error!( - "Onion service is broken at http://{onion_address}.onion: {status:?}" - ), OnionServiceState::Shutdown => { info!("Onion service stopped at http://{onion_address}.onion") } - _ => warn!("Onion service status changed: {status:?}"), + _ => warn!( + "Onion service status changed to {state:?} at http://{onion_address}.onion" + ), } } }) @@ -397,3 +408,19 @@ async fn async_post_with_timeout( .await .map_err(|_| TorError::RequestTimeout)? } + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn timeout_floor() { + let mut config = TorClientConfigBuilder::default(); + set_timeout_floor(&mut config); + + assert_eq!( + config.override_net_params().get("cbtmintimeout"), + Some(&MIN_CIRCUIT_TIMEOUT_MS) + ); + } +} From eb2aa27e48dd915f16cbf2f11b6055d21bfb91ee Mon Sep 17 00:00:00 2001 From: wiesche Date: Sun, 9 Aug 2026 14:48:12 +0200 Subject: [PATCH 3/5] clarify onion service status logging --- src/tor.rs | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/tor.rs b/src/tor.rs index e13d20a..4108845 100644 --- a/src/tor.rs +++ b/src/tor.rs @@ -227,6 +227,7 @@ where runtime .spawn(async move { let mut previous = None; + let mut has_reached_running = false; while let Some(status) = statuses.next().await { let state = status.state(); debug!("Onion service status at http://{onion_address}.onion: {status:?}"); @@ -236,14 +237,20 @@ where previous = Some(state); match state { OnionServiceState::Running => { + has_reached_running = true; info!("Onion service is reachable at http://{onion_address}.onion") } OnionServiceState::DegradedReachable => warn!( "Onion service is reachable but degraded at http://{onion_address}.onion" ), - OnionServiceState::Bootstrapping => { + OnionServiceState::Bootstrapping if !has_reached_running => { info!("Onion service is bootstrapping at http://{onion_address}.onion") } + // Arti also uses Bootstrapping while refreshing a running service's + // descriptor, so avoid implying that the process restarted. + OnionServiceState::Bootstrapping => info!( + "Onion service status changed to Bootstrapping at http://{onion_address}.onion" + ), OnionServiceState::Recovering | OnionServiceState::DegradedUnreachable => { warn!( "Onion service is not fully reachable ({state:?}) at http://{onion_address}.onion" From d13e09eef8972b72005ba3800104d49edba15778 Mon Sep 17 00:00:00 2001 From: wiesche Date: Sun, 9 Aug 2026 14:59:07 +0200 Subject: [PATCH 4/5] Improve onion service problem logging --- src/tor.rs | 54 ++++++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 42 insertions(+), 12 deletions(-) diff --git a/src/tor.rs b/src/tor.rs index 4108845..f0f1e8d 100644 --- a/src/tor.rs +++ b/src/tor.rs @@ -19,7 +19,7 @@ use tor_hsrproxy::config::{ }; use tor_hsrproxy::OnionServiceReverseProxy; use tor_hsservice::config::OnionServiceConfigBuilder; -use tor_hsservice::status::State as OnionServiceState; +use tor_hsservice::status::{Problem as OnionServiceProblem, State as OnionServiceState}; use tor_hsservice::{ HsId, HsIdKeypairSpecifier, HsIdPublicKeySpecifier, HsNickname, RunningOnionService, }; @@ -230,31 +230,47 @@ where let mut has_reached_running = false; while let Some(status) = statuses.next().await { let state = status.state(); + let problem = status.current_problem().and_then(onion_service_problem); debug!("Onion service status at http://{onion_address}.onion: {status:?}"); - if previous == Some(state) { + if previous == Some((state, problem)) { continue; } - previous = Some(state); + previous = Some((state, problem)); match state { OnionServiceState::Running => { has_reached_running = true; info!("Onion service is reachable at http://{onion_address}.onion") } - OnionServiceState::DegradedReachable => warn!( - "Onion service is reachable but degraded at http://{onion_address}.onion" - ), + OnionServiceState::DegradedReachable => match problem { + Some(problem) => warn!( + "Onion service is reachable but degraded ({problem}) at http://{onion_address}.onion" + ), + None => warn!( + "Onion service is reachable but degraded at http://{onion_address}.onion" + ), + }, OnionServiceState::Bootstrapping if !has_reached_running => { info!("Onion service is bootstrapping at http://{onion_address}.onion") } // Arti also uses Bootstrapping while refreshing a running service's // descriptor, so avoid implying that the process restarted. - OnionServiceState::Bootstrapping => info!( - "Onion service status changed to Bootstrapping at http://{onion_address}.onion" - ), + OnionServiceState::Bootstrapping => match problem { + Some(problem) => warn!( + "Onion service status changed to Bootstrapping ({problem}) at http://{onion_address}.onion" + ), + None => info!( + "Onion service status changed to Bootstrapping (no problem reported) at http://{onion_address}.onion" + ), + }, OnionServiceState::Recovering | OnionServiceState::DegradedUnreachable => { - warn!( - "Onion service is not fully reachable ({state:?}) at http://{onion_address}.onion" - ) + match problem { + Some(problem) => warn!( + "Onion service is not fully reachable ({state:?}, {problem}) at http://{onion_address}.onion" + ), + None => warn!( + "Onion service is not fully reachable ({state:?}) at http://{onion_address}.onion" + ), + } } OnionServiceState::Broken => { error!("Onion service is broken at http://{onion_address}.onion") @@ -274,6 +290,20 @@ where Ok(()) } +fn onion_service_problem(problem: &OnionServiceProblem) -> Option<&'static str> { + match problem { + OnionServiceProblem::Runtime(_) => Some("runtime problem"), + OnionServiceProblem::DescriptorUpload(errors) if !errors.is_empty() => { + Some("descriptor upload problem") + } + OnionServiceProblem::Ipt(errors) if !errors.is_empty() => { + Some("introduction point problem") + } + OnionServiceProblem::DescriptorUpload(_) | OnionServiceProblem::Ipt(_) => None, + _ => Some("unknown problem"), + } +} + // TODO: Add proper error handling fn add_key_to_store( tor_config: &TorClientConfig, From d36d843a681c27b0529506f70de677f0dffe0b77 Mon Sep 17 00:00:00 2001 From: wiesche Date: Sun, 9 Aug 2026 19:27:22 +0200 Subject: [PATCH 5/5] make circuit timeout configurable --- src/bin/mwixnet.rs | 1 + src/config.rs | 30 +++++++++++++++++++++++++++++- src/servers/swap_rpc.rs | 1 + src/tor.rs | 14 ++++++++------ tests/common/server.rs | 2 ++ 5 files changed, 41 insertions(+), 7 deletions(-) diff --git a/src/bin/mwixnet.rs b/src/bin/mwixnet.rs index eb91d69..f754b3e 100644 --- a/src/bin/mwixnet.rs +++ b/src/bin/mwixnet.rs @@ -146,6 +146,7 @@ fn real_main() -> Result<(), Box> { .map(|p| p.to_owned()), }, collect_fees: !no_fee_collection, + min_circuit_timeout_ms: config::DEFAULT_MIN_CIRCUIT_TIMEOUT_MS, prev_server, next_server, }; diff --git a/src/config.rs b/src/config.rs index 03fd83d..9a7ee6c 100644 --- a/src/config.rs +++ b/src/config.rs @@ -20,11 +20,17 @@ use grin_wallet_libwallet::mwixnet::{onion as grin_onion, MwixnetServerPublicKey const GRIN_HOME: &str = ".grin"; const NODE_FOREIGN_API_SECRET_FILE_NAME: &str = ".foreign_api_secret"; const WALLET_OWNER_API_SECRET_FILE_NAME: &str = ".owner_api_secret"; +/// Default minimum Tor circuit build timeout in milliseconds. +pub const DEFAULT_MIN_CIRCUIT_TIMEOUT_MS: i32 = 2_000; const CONFIG_HEADER: &str = "\ # MWixnet server configuration # Wallet clients use the ordered X25519 onion keys printed at server startup. "; +fn default_min_circuit_timeout_ms() -> i32 { + DEFAULT_MIN_CIRCUIT_TIMEOUT_MS +} + /// The decrypted server config to be passed around and used by the rest of the mwixnet code #[derive(Clone, Debug, Serialize, Deserialize, PartialEq)] pub struct ServerConfig { @@ -44,6 +50,9 @@ pub struct ServerConfig { pub wallet_owner_secret_path: Option, /// whether to collect excess hop fees in the server wallet pub collect_fees: bool, + /// minimum Tor circuit build timeout in milliseconds + #[serde(default = "default_min_circuit_timeout_ms")] + pub min_circuit_timeout_ms: i32, /// Ed25519 identity key of the previous mix/swap server (e.g. N_1 if this is N_2) #[serde(with = "grin_onion::crypto::dalek::option_dalek_pubkey_serde", default)] pub prev_server: Option, @@ -196,6 +205,8 @@ struct RawConfig { wallet_owner_url: String, wallet_owner_secret_path: Option, collect_fees: bool, + #[serde(default = "default_min_circuit_timeout_ms")] + min_circuit_timeout_ms: i32, #[serde(with = "grin_onion::crypto::dalek::option_dalek_pubkey_serde", default)] prev_server: Option, #[serde(with = "grin_onion::crypto::dalek::option_dalek_pubkey_serde", default)] @@ -216,6 +227,7 @@ fn config_comment(key: &str) -> Option<&'static str> { "collect_fees" => { Some("Collect excess hop fees in the wallet; false pays all hop fees to miners.") } + "min_circuit_timeout_ms" => Some("Minimum Tor circuit build timeout in milliseconds."), "prev_server" => { Some("Previous server Ed25519 identity key; setting it makes this server a mixer.") } @@ -273,6 +285,7 @@ pub fn write_config( wallet_owner_url: server_config.wallet_owner_url.clone(), wallet_owner_secret_path: server_config.wallet_owner_secret_path.clone(), collect_fees: server_config.collect_fees, + min_circuit_timeout_ms: server_config.min_circuit_timeout_ms, prev_server: server_config.prev_server.clone(), next_server: server_config.next_server.clone(), }; @@ -309,6 +322,7 @@ pub fn load_config( wallet_owner_url: raw_config.wallet_owner_url, wallet_owner_secret_path: raw_config.wallet_owner_secret_path, collect_fees: raw_config.collect_fees, + min_circuit_timeout_ms: raw_config.min_circuit_timeout_ms, prev_server: raw_config.prev_server, next_server: raw_config.next_server, }) @@ -353,7 +367,7 @@ pub mod test_util { use grin_onion::crypto::dalek::DalekPublicKey; use secp256k1zkp::SecretKey; - use crate::config::ServerConfig; + use crate::config::{ServerConfig, DEFAULT_MIN_CIRCUIT_TIMEOUT_MS}; pub fn local_config( server_key: &SecretKey, @@ -369,6 +383,7 @@ pub mod test_util { wallet_owner_url: "127.0.0.1:3420".parse()?, wallet_owner_secret_path: None, collect_fees: true, + min_circuit_timeout_ms: DEFAULT_MIN_CIRCUIT_TIMEOUT_MS, prev_server: prev_server.clone(), next_server: next_server.clone(), }; @@ -436,6 +451,12 @@ mod tests { write_config(&path, &config, &password).unwrap(); let contents = std::fs::read_to_string(&path).unwrap(); let loaded = load_config(&path, &password).unwrap(); + std::fs::write( + &path, + contents.replace("min_circuit_timeout_ms = 2000\n", ""), + ) + .unwrap(); + let legacy_loaded = load_config(&path, &password).unwrap(); std::fs::remove_file(path).unwrap(); assert!(contents.contains("# Seconds between mixing rounds.\ninterval_s =")); @@ -443,6 +464,9 @@ mod tests { assert!(contents.contains( "# Collect excess hop fees in the wallet; false pays all hop fees to miners.\ncollect_fees =" )); + assert!(contents.contains( + "# Minimum Tor circuit build timeout in milliseconds.\nmin_circuit_timeout_ms = 2000" + )); assert!(contents.contains( "# Previous server Ed25519 identity key; setting it makes this server a mixer.\n# prev_server =" )); @@ -450,5 +474,9 @@ mod tests { "# Next server Ed25519 identity key; leave unset for the final hop.\n# next_server =" )); assert_eq!(loaded, config); + assert_eq!( + legacy_loaded.min_circuit_timeout_ms, + DEFAULT_MIN_CIRCUIT_TIMEOUT_MS + ); } } diff --git a/src/servers/swap_rpc.rs b/src/servers/swap_rpc.rs index 67e19ec..45fcb50 100644 --- a/src/servers/swap_rpc.rs +++ b/src/servers/swap_rpc.rs @@ -150,6 +150,7 @@ mod tests { wallet_owner_url: "127.0.0.1:3420".parse()?, wallet_owner_secret_path: None, collect_fees: true, + min_circuit_timeout_ms: crate::config::DEFAULT_MIN_CIRCUIT_TIMEOUT_MS, prev_server: None, next_server: None, }; diff --git a/src/tor.rs b/src/tor.rs index f0f1e8d..b69a499 100644 --- a/src/tor.rs +++ b/src/tor.rs @@ -33,12 +33,11 @@ use secp256k1zkp::SecretKey; use crate::config::ServerConfig; const REQUEST_TIMEOUT: Duration = Duration::from_secs(60); -const MIN_CIRCUIT_TIMEOUT_MS: i32 = 2_000; -fn set_timeout_floor(config: &mut TorClientConfigBuilder) { +fn set_timeout_floor(config: &mut TorClientConfigBuilder, timeout_ms: i32) { config .override_net_params() - .insert("cbtmintimeout".into(), MIN_CIRCUIT_TIMEOUT_MS); + .insert("cbtmintimeout".into(), timeout_ms); } /// Tor error types @@ -103,7 +102,10 @@ where .map_err(|error| TorError::RequestError(format!("Invalid Onion nickname: {error}")))?; let mut client_config_builder = TorClientConfigBuilder::from_directories(state_dir.clone(), cache_dir.clone()); - set_timeout_floor(&mut client_config_builder); + set_timeout_floor( + &mut client_config_builder, + server_config.min_circuit_timeout_ms, + ); client_config_builder .address_filter() .allow_onion_addrs(true); @@ -453,11 +455,11 @@ mod tests { #[test] fn timeout_floor() { let mut config = TorClientConfigBuilder::default(); - set_timeout_floor(&mut config); + set_timeout_floor(&mut config, 1_234); assert_eq!( config.override_net_params().get("cbtmintimeout"), - Some(&MIN_CIRCUIT_TIMEOUT_MS) + Some(&1_234) ); } } diff --git a/tests/common/server.rs b/tests/common/server.rs index 46bbbd3..d336277 100644 --- a/tests/common/server.rs +++ b/tests/common/server.rs @@ -96,6 +96,7 @@ where wallet_owner_url: wallet.lock().owner_address().to_string(), wallet_owner_secret_path: None, collect_fees: true, + min_circuit_timeout_ms: mwixnet::config::DEFAULT_MIN_CIRCUIT_TIMEOUT_MS, prev_server: None, next_server: match next_server { Some(s) => Some(DalekPublicKey::from_secret(&s.server_key)), @@ -162,6 +163,7 @@ where wallet_owner_url: wallet.lock().owner_address().to_string(), wallet_owner_secret_path: None, collect_fees: true, + min_circuit_timeout_ms: mwixnet::config::DEFAULT_MIN_CIRCUIT_TIMEOUT_MS, prev_server: Some(prev_server), next_server: match next_server { Some(s) => Some(DalekPublicKey::from_secret(&s.server_key)),