From 4ea2c3beb30f064bd6b86c384e826092f37f465d Mon Sep 17 00:00:00 2001 From: mfahampshire Date: Fri, 4 Jul 2025 13:44:18 +0200 Subject: [PATCH] temp commit: got gateway dir dependency working, moving on to vpn-api-client --- Cargo.lock | 13042 ---------------- Cargo.toml | 1 + nym-gateway-directory/Cargo.toml | 31 + nym-gateway-directory/src/caching_client.rs | 329 + .../src/entries/auth_addresses.rs | 57 + nym-gateway-directory/src/entries/country.rs | 31 + .../src/entries/entry_point.rs | 78 + .../src/entries/exit_point.rs | 92 + nym-gateway-directory/src/entries/gateway.rs | 535 + .../src/entries/ipr_addresses.rs | 56 + nym-gateway-directory/src/entries/mod.rs | 7 + nym-gateway-directory/src/entries/score.rs | 34 + nym-gateway-directory/src/error.rs | 93 + nym-gateway-directory/src/gateway_client.rs | 508 + nym-gateway-directory/src/helpers.rs | 64 + nym-gateway-directory/src/lib.rs | 29 + nym-ip-packet-client/Cargo.toml | 3 + nym-ip-packet-client/src/error.rs | 7 + nym-ip-packet-client/src/listener.rs | 2 +- nym-vpn-api-client/Cargo.toml | 40 + nym-vpn-api-client/src/bootstrap.rs | 65 + nym-vpn-api-client/src/client.rs | 1164 ++ nym-vpn-api-client/src/error.rs | 143 + nym-vpn-api-client/src/jwt.rs | 247 + nym-vpn-api-client/src/lib.rs | 19 + .../src/network_compatibility.rs | 35 + nym-vpn-api-client/src/request.rs | 99 + nym-vpn-api-client/src/response.rs | 658 + nym-vpn-api-client/src/routes.rs | 33 + nym-vpn-api-client/src/types/account.rs | 248 + nym-vpn-api-client/src/types/device.rs | 222 + nym-vpn-api-client/src/types/gateway.rs | 63 + nym-vpn-api-client/src/types/mod.rs | 17 + nym-vpn-api-client/src/types/platform.rs | 16 + nym-vpn-api-client/src/types/test_fixtures.rs | 11 + sdk/rust/nym-sdk/Cargo.toml | 2 +- 36 files changed, 5037 insertions(+), 13044 deletions(-) delete mode 100644 Cargo.lock create mode 100644 nym-gateway-directory/Cargo.toml create mode 100644 nym-gateway-directory/src/caching_client.rs create mode 100644 nym-gateway-directory/src/entries/auth_addresses.rs create mode 100644 nym-gateway-directory/src/entries/country.rs create mode 100644 nym-gateway-directory/src/entries/entry_point.rs create mode 100644 nym-gateway-directory/src/entries/exit_point.rs create mode 100644 nym-gateway-directory/src/entries/gateway.rs create mode 100644 nym-gateway-directory/src/entries/ipr_addresses.rs create mode 100644 nym-gateway-directory/src/entries/mod.rs create mode 100644 nym-gateway-directory/src/entries/score.rs create mode 100644 nym-gateway-directory/src/error.rs create mode 100644 nym-gateway-directory/src/gateway_client.rs create mode 100644 nym-gateway-directory/src/helpers.rs create mode 100644 nym-gateway-directory/src/lib.rs create mode 100644 nym-vpn-api-client/Cargo.toml create mode 100644 nym-vpn-api-client/src/bootstrap.rs create mode 100644 nym-vpn-api-client/src/client.rs create mode 100644 nym-vpn-api-client/src/error.rs create mode 100644 nym-vpn-api-client/src/jwt.rs create mode 100644 nym-vpn-api-client/src/lib.rs create mode 100644 nym-vpn-api-client/src/network_compatibility.rs create mode 100644 nym-vpn-api-client/src/request.rs create mode 100644 nym-vpn-api-client/src/response.rs create mode 100644 nym-vpn-api-client/src/routes.rs create mode 100644 nym-vpn-api-client/src/types/account.rs create mode 100644 nym-vpn-api-client/src/types/device.rs create mode 100644 nym-vpn-api-client/src/types/gateway.rs create mode 100644 nym-vpn-api-client/src/types/mod.rs create mode 100644 nym-vpn-api-client/src/types/platform.rs create mode 100644 nym-vpn-api-client/src/types/test_fixtures.rs diff --git a/Cargo.lock b/Cargo.lock deleted file mode 100644 index f0f2c68eaa..0000000000 --- a/Cargo.lock +++ /dev/null @@ -1,13042 +0,0 @@ -# This file is automatically @generated by Cargo. -# It is not intended for manual editing. -version = 4 - -[[package]] -name = "accessory" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28e416a3ab45838bac2ab2d81b1088d738d7b2d2c5272a54d39366565a29bd80" -dependencies = [ - "macroific", - "proc-macro2", - "quote", - "syn 2.0.107", -] - -[[package]] -name = "addr" -version = "0.15.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a93b8a41dbe230ad5087cc721f8d41611de654542180586b315d9f4cf6b72bef" -dependencies = [ - "psl", - "psl-types", -] - -[[package]] -name = "adler2" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" - -[[package]] -name = "aead" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d122413f284cf2d62fb1b7db97e02edb8cda96d769b16e443a4f6195e35662b0" -dependencies = [ - "crypto-common", - "generic-array 0.14.9", -] - -[[package]] -name = "aes" -version = "0.8.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b169f7a6d4742236a0a00c541b845991d0ac43e546831af1249753ab4c3aa3a0" -dependencies = [ - "cfg-if", - "cipher", - "cpufeatures", -] - -[[package]] -name = "aes-gcm" -version = "0.10.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "831010a0f742e1209b3bcea8fab6a8e149051ba6099432c8cb2cc117dec3ead1" -dependencies = [ - "aead", - "aes", - "cipher", - "ctr", - "ghash", - "subtle 2.6.1", -] - -[[package]] -name = "aes-gcm-siv" -version = "0.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae0784134ba9375416d469ec31e7c5f9fa94405049cf08c5ce5b4698be673e0d" -dependencies = [ - "aead", - "aes", - "cipher", - "ctr", - "polyval", - "subtle 2.6.1", - "zeroize", -] - -[[package]] -name = "ahash" -version = "0.8.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75" -dependencies = [ - "cfg-if", - "once_cell", - "version_check", - "zerocopy", -] - -[[package]] -name = "aho-corasick" -version = "1.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" -dependencies = [ - "memchr", -] - -[[package]] -name = "alloc-no-stdlib" -version = "2.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc7bb162ec39d46ab1ca8c77bf72e890535becd1751bb45f64c597edb4c8c6b3" - -[[package]] -name = "alloc-stdlib" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94fb8275041c72129eb51b7d0322c29b8387a0386127718b096429201a5d6ece" -dependencies = [ - "alloc-no-stdlib", -] - -[[package]] -name = "allocator-api2" -version = "0.2.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" - -[[package]] -name = "ammonia" -version = "4.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17e913097e1a2124b46746c980134e8c954bc17a6a59bb3fde96f088d126dde6" -dependencies = [ - "cssparser", - "html5ever", - "maplit", - "tendril", - "url", -] - -[[package]] -name = "android_system_properties" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" -dependencies = [ - "libc", -] - -[[package]] -name = "anes" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b46cbb362ab8752921c97e041f5e366ee6297bd428a31275b9fcf1e380f7299" - -[[package]] -name = "anstream" -version = "0.6.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43d5b281e737544384e969a5ccad3f1cdd24b48086a0fc1b2a5262a26b8f4f4a" -dependencies = [ - "anstyle", - "anstyle-parse", - "anstyle-query", - "anstyle-wincon", - "colorchoice", - "is_terminal_polyfill", - "utf8parse", -] - -[[package]] -name = "anstyle" -version = "1.0.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5192cca8006f1fd4f7237516f40fa183bb07f8fbdfedaa0036de5ea9b0b45e78" - -[[package]] -name = "anstyle-parse" -version = "0.2.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e7644824f0aa2c7b9384579234ef10eb7efb6a0deb83f9630a49594dd9c15c2" -dependencies = [ - "utf8parse", -] - -[[package]] -name = "anstyle-query" -version = "1.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e231f6134f61b71076a3eab506c379d4f36122f2af15a9ff04415ea4c3339e2" -dependencies = [ - "windows-sys 0.60.2", -] - -[[package]] -name = "anstyle-wincon" -version = "3.0.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e0633414522a32ffaac8ac6cc8f748e090c5717661fddeea04219e2344f5f2a" -dependencies = [ - "anstyle", - "once_cell_polyfill", - "windows-sys 0.60.2", -] - -[[package]] -name = "anyhow" -version = "1.0.100" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a23eb6b1614318a8071c9b2521f36b424b2c83db5eb3a0fead4a6c0809af6e61" - -[[package]] -name = "arbitrary" -version = "1.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3d036a3c4ab069c7b410a2ce876bd74808d2d0888a82667669f8e783a898bf1" -dependencies = [ - "derive_arbitrary", -] - -[[package]] -name = "arc-swap" -version = "1.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69f7f8c3906b62b754cd5326047894316021dcfe5a194c8ea52bdd94934a3457" - -[[package]] -name = "argon2" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c3610892ee6e0cbce8ae2700349fcf8f98adb0dbfbee85aec3c9179d29cc072" -dependencies = [ - "base64ct", - "blake2 0.10.6", - "cpufeatures", - "password-hash", -] - -[[package]] -name = "ark-bls12-381" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c775f0d12169cba7aae4caeb547bb6a50781c7449a8aa53793827c9ec4abf488" -dependencies = [ - "ark-ec", - "ark-ff", - "ark-serialize", - "ark-std", -] - -[[package]] -name = "ark-ec" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "defd9a439d56ac24968cca0571f598a61bc8c55f71d50a89cda591cb750670ba" -dependencies = [ - "ark-ff", - "ark-poly", - "ark-serialize", - "ark-std", - "derivative", - "hashbrown 0.13.2", - "itertools 0.10.5", - "num-traits", - "rayon", - "zeroize", -] - -[[package]] -name = "ark-ff" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec847af850f44ad29048935519032c33da8aa03340876d351dfab5660d2966ba" -dependencies = [ - "ark-ff-asm", - "ark-ff-macros", - "ark-serialize", - "ark-std", - "derivative", - "digest 0.10.7", - "itertools 0.10.5", - "num-bigint", - "num-traits", - "paste", - "rayon", - "rustc_version 0.4.1", - "zeroize", -] - -[[package]] -name = "ark-ff-asm" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ed4aa4fe255d0bc6d79373f7e31d2ea147bcf486cba1be5ba7ea85abdb92348" -dependencies = [ - "quote", - "syn 1.0.109", -] - -[[package]] -name = "ark-ff-macros" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7abe79b0e4288889c4574159ab790824d0033b9fdcb2a112a3182fac2e514565" -dependencies = [ - "num-bigint", - "num-traits", - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "ark-poly" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d320bfc44ee185d899ccbadfa8bc31aab923ce1558716e1997a1e74057fe86bf" -dependencies = [ - "ark-ff", - "ark-serialize", - "ark-std", - "derivative", - "hashbrown 0.13.2", -] - -[[package]] -name = "ark-serialize" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adb7b85a02b83d2f22f89bd5cac66c9c89474240cb6207cb1efc16d098e822a5" -dependencies = [ - "ark-serialize-derive", - "ark-std", - "digest 0.10.7", - "num-bigint", -] - -[[package]] -name = "ark-serialize-derive" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae3281bc6d0fd7e549af32b52511e1302185bd688fd3359fa36423346ff682ea" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "ark-std" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94893f1e0c6eeab764ade8dc4c0db24caf4fe7cbbaafc0eba0a9030f447b5185" -dependencies = [ - "num-traits", - "rand 0.8.5", - "rayon", -] - -[[package]] -name = "arrayref" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76a2e8124351fda1ef8aaaa3bbd7ebbcb486bbcd4225aca0aa0d84bb2db8fecb" - -[[package]] -name = "arrayvec" -version = "0.7.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" - -[[package]] -name = "askama" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d4744ed2eef2645831b441d8f5459689ade2ab27c854488fbab1fbe94fce1a7" -dependencies = [ - "askama_derive", - "itoa", - "percent-encoding", - "serde", - "serde_json", -] - -[[package]] -name = "askama_derive" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d661e0f57be36a5c14c48f78d09011e67e0cb618f269cca9f2fd8d15b68c46ac" -dependencies = [ - "askama_parser", - "basic-toml", - "memchr", - "proc-macro2", - "quote", - "rustc-hash", - "serde", - "serde_derive", - "syn 2.0.107", -] - -[[package]] -name = "askama_parser" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf315ce6524c857bb129ff794935cf6d42c82a6cff60526fe2a63593de4d0d4f" -dependencies = [ - "memchr", - "serde", - "serde_derive", - "winnow", -] - -[[package]] -name = "assert-json-diff" -version = "2.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47e4f2b81832e72834d7518d8487a0396a28cc408186a2e8854c0f98011faf12" -dependencies = [ - "serde", - "serde_json", -] - -[[package]] -name = "async-channel" -version = "1.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81953c529336010edd6d8e358f886d9581267795c61b19475b71314bffa46d35" -dependencies = [ - "concurrent-queue", - "event-listener 2.5.3", - "futures-core", -] - -[[package]] -name = "async-compression" -version = "0.4.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a89bce6054c720275ac2432fbba080a66a2106a44a1b804553930ca6909f4e0" -dependencies = [ - "compression-codecs", - "compression-core", - "futures-core", - "pin-project-lite", - "tokio", -] - -[[package]] -name = "async-lock" -version = "3.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5fd03604047cee9b6ce9de9f70c6cd540a0520c813cbd49bae61f33ab80ed1dc" -dependencies = [ - "event-listener 5.4.1", - "event-listener-strategy", - "pin-project-lite", -] - -[[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", - "quote", - "syn 2.0.107", -] - -[[package]] -name = "async-trait" -version = "0.1.89" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.107", -] - -[[package]] -name = "async-tungstenite" -version = "0.24.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3609af4bbf701ddaf1f6bb4e6257dff4ff8932327d0e685d3f653724c258b1ac" -dependencies = [ - "futures-io", - "futures-util", - "log", - "pin-project-lite", - "rustls-native-certs 0.7.3", - "rustls-pki-types", - "tokio", - "tokio-rustls 0.25.0", - "tungstenite 0.21.0", -] - -[[package]] -name = "atoi" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f28d99ec8bfea296261ca1af174f24225171fea9664ba9003cbebee704810528" -dependencies = [ - "num-traits", -] - -[[package]] -name = "atomic-waker" -version = "1.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" - -[[package]] -name = "auto-future" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c1e7e457ea78e524f48639f551fd79703ac3f2237f5ecccdf4708f8a75ad373" - -[[package]] -name = "autocfg" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" - -[[package]] -name = "autodoc" -version = "0.1.0" -dependencies = [ - "env_logger", - "log", -] - -[[package]] -name = "axum" -version = "0.7.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edca88bc138befd0323b20752846e6587272d3b03b0343c8ea28a6f819e6e71f" -dependencies = [ - "async-trait", - "axum-core", - "axum-macros", - "bytes", - "futures-util", - "http 1.3.1", - "http-body 1.0.1", - "http-body-util", - "hyper 1.7.0", - "hyper-util", - "itoa", - "matchit", - "memchr", - "mime", - "percent-encoding", - "pin-project-lite", - "rustversion", - "serde", - "serde_json", - "serde_path_to_error", - "serde_urlencoded", - "sync_wrapper 1.0.2", - "tokio", - "tower 0.5.2", - "tower-layer", - "tower-service", - "tracing", -] - -[[package]] -name = "axum-client-ip" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9eefda7e2b27e1bda4d6fa8a06b50803b8793769045918bc37ad062d48a6efac" -dependencies = [ - "axum", - "forwarded-header-value", - "serde", -] - -[[package]] -name = "axum-core" -version = "0.4.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09f2bd6146b97ae3359fa0cc6d6b376d9539582c7b4220f041a33ec24c226199" -dependencies = [ - "async-trait", - "bytes", - "futures-util", - "http 1.3.1", - "http-body 1.0.1", - "http-body-util", - "mime", - "pin-project-lite", - "rustversion", - "sync_wrapper 1.0.2", - "tower-layer", - "tower-service", - "tracing", -] - -[[package]] -name = "axum-extra" -version = "0.9.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c794b30c904f0a1c2fb7740f7df7f7972dfaa14ef6f57cb6178dc63e5dca2f04" -dependencies = [ - "axum", - "axum-core", - "bytes", - "fastrand 2.3.0", - "futures-util", - "headers", - "http 1.3.1", - "http-body 1.0.1", - "http-body-util", - "mime", - "multer", - "pin-project-lite", - "serde", - "tower 0.5.2", - "tower-layer", - "tower-service", -] - -[[package]] -name = "axum-macros" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57d123550fa8d071b7255cb0cc04dc302baa6c8c4a79f55701552684d8399bce" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.107", -] - -[[package]] -name = "axum-test" -version = "16.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "63e3a443d2608936a02a222da7b746eb412fede7225b3030b64fe9be99eab8dc" -dependencies = [ - "anyhow", - "assert-json-diff", - "auto-future", - "axum", - "bytes", - "bytesize", - "cookie", - "http 1.3.1", - "http-body-util", - "hyper 1.7.0", - "hyper-util", - "mime", - "pretty_assertions", - "reserve-port", - "rust-multipart-rfc7578_2", - "serde", - "serde_json", - "serde_urlencoded", - "smallvec", - "tokio", - "tower 0.5.2", - "url", -] - -[[package]] -name = "base16ct" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" - -[[package]] -name = "base64" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" - -[[package]] -name = "base64" -version = "0.21.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" - -[[package]] -name = "base64" -version = "0.22.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" - -[[package]] -name = "base64ct" -version = "1.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55248b47b0caf0546f7988906588779981c43bb1bc9d0c44087278f80cdb44ba" - -[[package]] -name = "base85rs" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87678d33a2af71f019ed11f52db246ca6c5557edee2cccbe689676d1ad9c6b5a" - -[[package]] -name = "basic-toml" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba62675e8242a4c4e806d12f11d136e626e6c8361d6b829310732241652a178a" -dependencies = [ - "serde", -] - -[[package]] -name = "bech32" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d965446196e3b7decd44aa7ee49e31d630118f90ef12f97900f262eb915c951d" - -[[package]] -name = "bincode" -version = "1.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad" -dependencies = [ - "serde", -] - -[[package]] -name = "binstring" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0669d5a35b64fdb5ab7fb19cae13148b6b5cbdf4b8247faf54ece47f699c8cef" - -[[package]] -name = "bip32" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db40d3dfbeab4e031d78c844642fa0caa0b0db11ce1607ac9d2986dff1405c69" -dependencies = [ - "bs58", - "hmac", - "k256", - "rand_core 0.6.4", - "ripemd", - "secp256k1", - "sha2 0.10.9", - "subtle 2.6.1", - "zeroize", -] - -[[package]] -name = "bip39" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43d193de1f7487df1914d3a568b772458861d33f9c54249612cc2893d6915054" -dependencies = [ - "bitcoin_hashes", - "rand 0.8.5", - "rand_core 0.6.4", - "serde", - "unicode-normalization", - "zeroize", -] - -[[package]] -name = "bitcoin-internals" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9425c3bf7089c983facbae04de54513cce73b41c7f9ff8c845b54e7bc64ebbfb" - -[[package]] -name = "bitcoin_hashes" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1930a4dabfebb8d7d9992db18ebe3ae2876f0a305fab206fd168df931ede293b" -dependencies = [ - "bitcoin-internals", - "hex-conservative", -] - -[[package]] -name = "bitflags" -version = "1.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" - -[[package]] -name = "bitflags" -version = "2.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "812e12b5285cc515a9c72a5c1d3b6d46a19dac5acfef5265968c166106e31dd3" -dependencies = [ - "serde_core", -] - -[[package]] -name = "bitvec" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" -dependencies = [ - "funty", - "radium", - "tap", - "wyz", -] - -[[package]] -name = "blake2" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94cb07b0da6a73955f8fb85d24c466778e70cda767a568229b104f0264089330" -dependencies = [ - "byte-tools", - "crypto-mac", - "digest 0.8.1", - "opaque-debug 0.2.3", -] - -[[package]] -name = "blake2" -version = "0.10.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46502ad458c9a52b69d4d4d32775c788b7a1b85e8bc9d482d92250fc0e3f8efe" -dependencies = [ - "digest 0.10.7", -] - -[[package]] -name = "blake2b_simd" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06e903a20b159e944f91ec8499fe1e55651480c541ea0a584f5d967c49ad9d99" -dependencies = [ - "arrayref", - "arrayvec", - "constant_time_eq", -] - -[[package]] -name = "blake3" -version = "1.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3888aaa89e4b2a40fca9848e400f6a658a5a3978de7be858e209cafa8be9a4a0" -dependencies = [ - "arrayref", - "arrayvec", - "cc", - "cfg-if", - "constant_time_eq", - "digest 0.10.7", -] - -[[package]] -name = "block-buffer" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" -dependencies = [ - "generic-array 0.14.9", -] - -[[package]] -name = "block-buffer" -version = "0.10.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" -dependencies = [ - "generic-array 0.14.9", -] - -[[package]] -name = "block-padding" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8894febbff9f758034a5b8e12d87918f56dfc64a8e1fe757d65e29041538d93" -dependencies = [ - "generic-array 0.14.9", -] - -[[package]] -name = "bloomfilter" -version = "3.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f6d7f06817e48ea4e17532fa61bc4e8b9a101437f0623f69d2ea54284f3a817" -dependencies = [ - "getrandom 0.2.16", - "siphasher 1.0.1", -] - -[[package]] -name = "bls12_381" -version = "0.8.0" -source = "git+https://github.com/jstuczyn/bls12_381?branch=temp%2Fexperimental-serdect-updated#9bf520059cb28323fc51469cae86868ef4fa6fbd" -dependencies = [ - "digest 0.10.7", - "ff", - "group", - "pairing", - "rand_core 0.6.4", - "serde", - "serdect 0.3.0", - "subtle 2.6.1", - "zeroize", -] - -[[package]] -name = "bnum" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e31ea183f6ee62ac8b8a8cf7feddd766317adfb13ff469de57ce033efd6a790" - -[[package]] -name = "brotli" -version = "8.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4bd8b9603c7aa97359dbd97ecf258968c95f3adddd6db2f7e7a5bef101c84560" -dependencies = [ - "alloc-no-stdlib", - "alloc-stdlib", - "brotli-decompressor", -] - -[[package]] -name = "brotli-decompressor" -version = "5.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "874bb8112abecc98cbd6d81ea4fa7e94fb9449648c93cc89aa40c81c24d7de03" -dependencies = [ - "alloc-no-stdlib", - "alloc-stdlib", -] - -[[package]] -name = "bs58" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf88ba1141d185c399bee5288d850d63b8369520c1eafc32a0430b5b6c287bf4" -dependencies = [ - "sha2 0.10.9", - "tinyvec", -] - -[[package]] -name = "bumpalo" -version = "3.19.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43" - -[[package]] -name = "byte-tools" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3b5ca7a04898ad4bcd41c90c5285445ff5b791899bb1b0abdd2a2aa791211d7" - -[[package]] -name = "bytecodec" -version = "0.4.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adf4c9d0bbf32eea58d7c0f812058138ee8edaf0f2802b6d03561b504729a325" -dependencies = [ - "byteorder", - "trackable 0.2.24", -] - -[[package]] -name = "byteorder" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" - -[[package]] -name = "bytes" -version = "1.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" -dependencies = [ - "serde", -] - -[[package]] -name = "bytesize" -version = "1.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e93abca9e28e0a1b9877922aacb20576e05d4679ffa78c3d6dc22a26a216659" - -[[package]] -name = "camino" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "276a59bf2b2c967788139340c9f0c5b12d7fd6630315c15c217e559de85d2609" -dependencies = [ - "serde_core", -] - -[[package]] -name = "cargo-platform" -version = "0.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e35af189006b9c0f00a064685c727031e3ed2d8020f7ba284d78cc2671bd36ea" -dependencies = [ - "serde", -] - -[[package]] -name = "cargo_metadata" -version = "0.18.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d886547e41f740c616ae73108f6eb70afe6d940c7bc697cb30f13daec073037" -dependencies = [ - "camino", - "cargo-platform", - "semver 1.0.27", - "serde", - "serde_json", - "thiserror 1.0.69", -] - -[[package]] -name = "cargo_metadata" -version = "0.19.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd5eb614ed4c27c5d706420e4320fbe3216ab31fa1c33cd8246ac36dae4479ba" -dependencies = [ - "camino", - "cargo-platform", - "semver 1.0.27", - "serde", - "serde_json", - "thiserror 2.0.17", -] - -[[package]] -name = "cast" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5" - -[[package]] -name = "castaway" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2698f953def977c68f935bb0dfa959375ad4638570e969e2f1e9f433cbf1af6" - -[[package]] -name = "cc" -version = "1.2.41" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac9fe6cdbb24b6ade63616c0a0688e45bb56732262c158df3c0c4bea4ca47cb7" -dependencies = [ - "find-msvc-tools", - "jobserver", - "libc", - "shlex", -] - -[[package]] -name = "celes" -version = "2.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc3ba3c5408fae183329e0d1ac8f8eed3cb7b647590fd93e6d6288f6b09db0be" -dependencies = [ - "phf 0.11.3", - "serde", -] - -[[package]] -name = "cfg-if" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" - -[[package]] -name = "cfg_aliases" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" - -[[package]] -name = "chacha" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ddf3c081b5fba1e5615640aae998e0fbd10c24cbd897ee39ed754a77601a4862" -dependencies = [ - "byteorder", - "keystream", -] - -[[package]] -name = "chacha20" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3613f74bd2eac03dad61bd53dbe620703d4371614fe0bc3b9f04dd36fe4e818" -dependencies = [ - "cfg-if", - "cipher", - "cpufeatures", -] - -[[package]] -name = "chacha20poly1305" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10cd79432192d1c0f4e1a0fef9527696cc039165d729fb41b3f4f4f354c2dc35" -dependencies = [ - "aead", - "chacha20", - "cipher", - "poly1305", - "zeroize", -] - -[[package]] -name = "chrono" -version = "0.4.42" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "145052bdd345b87320e369255277e3fb5152762ad123a901ef5c262dd38fe8d2" -dependencies = [ - "iana-time-zone", - "js-sys", - "num-traits", - "serde", - "wasm-bindgen", - "windows-link 0.2.1", -] - -[[package]] -name = "ciborium" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42e69ffd6f0917f5c029256a24d0161db17cea3997d185db0d35926308770f0e" -dependencies = [ - "ciborium-io", - "ciborium-ll", - "serde", -] - -[[package]] -name = "ciborium-io" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05afea1e0a06c9be33d539b876f1ce3692f4afea2cb41f740e7743225ed1c757" - -[[package]] -name = "ciborium-ll" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57663b653d948a338bfb3eeba9bb2fd5fcfaecb9e199e87e1eda4d9e8b240fd9" -dependencies = [ - "ciborium-io", - "half", -] - -[[package]] -name = "cipher" -version = "0.4.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad" -dependencies = [ - "crypto-common", - "inout", - "zeroize", -] - -[[package]] -name = "clap" -version = "4.5.50" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c2cfd7bf8a6017ddaa4e32ffe7403d547790db06bd171c1c53926faab501623" -dependencies = [ - "clap_builder", - "clap_derive", -] - -[[package]] -name = "clap_builder" -version = "4.5.50" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a4c05b9e80c5ccd3a7ef080ad7b6ba7d6fc00a985b8b157197075677c82c7a0" -dependencies = [ - "anstream", - "anstyle", - "clap_lex", - "strsim", -] - -[[package]] -name = "clap_complete" -version = "4.5.59" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2348487adcd4631696ced64ccdb40d38ac4d31cae7f2eec8817fcea1b9d1c43c" -dependencies = [ - "clap", -] - -[[package]] -name = "clap_complete_fig" -version = "4.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d494102c8ff3951810c72baf96910b980fb065ca5d3101243e6a8dc19747c86b" -dependencies = [ - "clap", - "clap_complete", -] - -[[package]] -name = "clap_derive" -version = "4.5.49" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a0b5487afeab2deb2ff4e03a807ad1a03ac532ff5a2cee5d86884440c7f7671" -dependencies = [ - "heck 0.5.0", - "proc-macro2", - "quote", - "syn 2.0.107", -] - -[[package]] -name = "clap_lex" -version = "0.7.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1d728cc89cf3aee9ff92b05e62b19ee65a02b5702cff7d5a377e32c6ae29d8d" - -[[package]] -name = "coarsetime" -version = "0.1.36" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91849686042de1b41cd81490edc83afbcb0abe5a9b6f2c4114f23ce8cca1bcf4" -dependencies = [ - "libc", - "wasix", - "wasm-bindgen", -] - -[[package]] -name = "colorchoice" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b05b61dc5112cbb17e4b6cd61790d9845d13888356391624cbe7e41efeac1e75" - -[[package]] -name = "colored" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "117725a109d387c937a1533ce01b450cbde6b88abceea8473c4d7a85853cda3c" -dependencies = [ - "lazy_static", - "windows-sys 0.59.0", -] - -[[package]] -name = "comfy-table" -version = "7.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b03b7db8e0b4b2fdad6c551e634134e99ec000e5c8c3b6856c65e8bbaded7a3b" -dependencies = [ - "crossterm 0.29.0", - "unicode-segmentation", - "unicode-width 0.2.2", -] - -[[package]] -name = "compression-codecs" -version = "0.4.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef8a506ec4b81c460798f572caead636d57d3d7e940f998160f52bd254bf2d23" -dependencies = [ - "brotli", - "compression-core", - "flate2", - "memchr", - "zstd", - "zstd-safe", -] - -[[package]] -name = "compression-core" -version = "0.4.29" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e47641d3deaf41fb1538ac1f54735925e275eaf3bf4d55c81b137fba797e5cbb" - -[[package]] -name = "concurrent-queue" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" -dependencies = [ - "crossbeam-utils", -] - -[[package]] -name = "console" -version = "0.16.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b430743a6eb14e9764d4260d4c0d8123087d504eeb9c48f2b2a5e810dd369df4" -dependencies = [ - "encode_unicode", - "libc", - "once_cell", - "unicode-width 0.2.2", - "windows-sys 0.61.2", -] - -[[package]] -name = "console-api" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8030735ecb0d128428b64cd379809817e620a40e5001c54465b99ec5feec2857" -dependencies = [ - "futures-core", - "prost", - "prost-types", - "tonic", - "tracing-core", -] - -[[package]] -name = "console-subscriber" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6539aa9c6a4cd31f4b1c040f860a1eac9aa80e7df6b05d506a6e7179936d6a01" -dependencies = [ - "console-api", - "crossbeam-channel", - "crossbeam-utils", - "futures-task", - "hdrhistogram", - "humantime", - "hyper-util", - "prost", - "prost-types", - "serde", - "serde_json", - "thread_local", - "tokio", - "tokio-stream", - "tonic", - "tracing", - "tracing-core", - "tracing-subscriber", -] - -[[package]] -name = "console_error_panic_hook" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a06aeb73f470f66dcdbf7223caeebb85984942f22f1adb2a088cf9668146bbbc" -dependencies = [ - "cfg-if", - "wasm-bindgen", -] - -[[package]] -name = "const-oid" -version = "0.9.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" - -[[package]] -name = "const-str" -version = "0.5.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3618cccc083bb987a415d85c02ca6c9994ea5b44731ec28b9ecf09658655fba9" - -[[package]] -name = "const_format" -version = "0.2.35" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7faa7469a93a566e9ccc1c73fe783b4a65c274c5ace346038dca9c39fe0030ad" -dependencies = [ - "const_format_proc_macros", -] - -[[package]] -name = "const_format_proc_macros" -version = "0.2.34" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d57c2eccfb16dbac1f4e61e206105db5820c9d26c3c472bc17c774259ef7744" -dependencies = [ - "proc-macro2", - "quote", - "unicode-xid", -] - -[[package]] -name = "constant_time_eq" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c74b8349d32d297c9134b8c88677813a227df8f779daa29bfc29c183fe3dca6" - -[[package]] -name = "cookie" -version = "0.18.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ddef33a339a91ea89fb53151bd0a4689cfce27055c291dfa69945475d22c747" -dependencies = [ - "time", - "version_check", -] - -[[package]] -name = "core-foundation" -version = "0.9.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" -dependencies = [ - "core-foundation-sys", - "libc", -] - -[[package]] -name = "core-foundation-sys" -version = "0.8.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" - -[[package]] -name = "cosmos-sdk-proto" -version = "0.26.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "462e1f6a8e005acc8835d32d60cbd7973ed65ea2a8d8473830e675f050956427" -dependencies = [ - "prost", - "tendermint-proto", -] - -[[package]] -name = "cosmrs" -version = "0.21.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1394c263335da09e8ba8c4b2c675d804e3e0deb44cce0866a5f838d3ddd43d02" -dependencies = [ - "bip32", - "cosmos-sdk-proto", - "ecdsa", - "eyre", - "k256", - "rand_core 0.6.4", - "serde", - "serde_json", - "signature", - "subtle-encoding", - "tendermint", - "tendermint-rpc", - "thiserror 1.0.69", -] - -[[package]] -name = "cosmwasm-core" -version = "2.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35b6dc17e7fd89d0a0a58f12ef33f0bbdf09a6a14c3dfb383eae665e5889250e" - -[[package]] -name = "cosmwasm-crypto" -version = "2.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa2f53285517db3e33d825b3e46301efe845135778527e1295154413b2f0469e" -dependencies = [ - "ark-bls12-381", - "ark-ec", - "ark-ff", - "ark-serialize", - "cosmwasm-core", - "curve25519-dalek", - "digest 0.10.7", - "ecdsa", - "ed25519-zebra", - "k256", - "num-traits", - "p256", - "rand_core 0.6.4", - "rayon", - "sha2 0.10.9", - "thiserror 1.0.69", -] - -[[package]] -name = "cosmwasm-derive" -version = "2.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a782b93fae93e57ca8ad3e9e994e784583f5933aeaaa5c80a545c4b437be2047" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.107", -] - -[[package]] -name = "cosmwasm-schema" -version = "2.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6984ab21b47a096e17ae4c73cea2123a704d4b6686c39421247ad67020d76f95" -dependencies = [ - "cosmwasm-schema-derive", - "schemars 0.8.22", - "serde", - "serde_json", - "thiserror 1.0.69", -] - -[[package]] -name = "cosmwasm-schema-derive" -version = "2.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e01c9214319017f6ebd8e299036e1f717fa9bb6724e758f7d6fb2477599d1a29" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.107", -] - -[[package]] -name = "cosmwasm-std" -version = "2.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf82335c14bd94eeb4d3c461b7aa419ecd7ea13c2efe24b97cd972bdb8044e7d" -dependencies = [ - "base64 0.22.1", - "bech32", - "bnum", - "cosmwasm-core", - "cosmwasm-crypto", - "cosmwasm-derive", - "derive_more 1.0.0", - "hex", - "rand_core 0.6.4", - "rmp-serde", - "schemars 0.8.22", - "serde", - "serde-json-wasm", - "sha2 0.10.9", - "static_assertions", - "thiserror 1.0.69", -] - -[[package]] -name = "cpufeatures" -version = "0.2.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" -dependencies = [ - "libc", -] - -[[package]] -name = "crc" -version = "3.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9710d3b3739c2e349eb44fe848ad0b7c8cb1e42bd87ee49371df2f7acaf3e675" -dependencies = [ - "crc-catalog", -] - -[[package]] -name = "crc-catalog" -version = "2.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19d374276b40fb8bbdee95aef7c7fa6b5316ec764510eb64b8dd0e2ed0d7e7f5" - -[[package]] -name = "crc32fast" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "criterion" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2b12d017a929603d80db1831cd3a24082f8137ce19c69e6447f54f5fc8d692f" -dependencies = [ - "anes", - "cast", - "ciborium", - "clap", - "criterion-plot", - "futures", - "is-terminal", - "itertools 0.10.5", - "num-traits", - "once_cell", - "oorandom", - "plotters", - "rayon", - "regex", - "serde", - "serde_derive", - "serde_json", - "tinytemplate", - "tokio", - "walkdir", -] - -[[package]] -name = "criterion-plot" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b50826342786a51a89e2da3a28f1c32b06e387201bc2d19791f622c673706b1" -dependencies = [ - "cast", - "itertools 0.10.5", -] - -[[package]] -name = "critical-section" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "790eea4361631c5e7d22598ecd5723ff611904e3344ce8720784c93e3d83d40b" - -[[package]] -name = "crossbeam-channel" -version = "0.5.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82b8f8f868b36967f9606790d1903570de9ceaf870a7bf9fbbd3016d636a2cb2" -dependencies = [ - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-deque" -version = "0.8.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51" -dependencies = [ - "crossbeam-epoch", - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-epoch" -version = "0.9.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" -dependencies = [ - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-queue" -version = "0.3.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f58bbc28f91df819d0aa2a2c00cd19754769c2fad90579b3592b1c9ba7a3115" -dependencies = [ - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-utils" -version = "0.8.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" - -[[package]] -name = "crossterm" -version = "0.25.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e64e6c0fbe2c17357405f7c758c1ef960fce08bdfb2c03d88d2a18d7e09c4b67" -dependencies = [ - "bitflags 1.3.2", - "crossterm_winapi", - "libc", - "mio 0.8.11", - "parking_lot", - "signal-hook", - "signal-hook-mio", - "winapi", -] - -[[package]] -name = "crossterm" -version = "0.29.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8b9f2e4c67f833b660cdb0a3523065869fb35570177239812ed4c905aeff87b" -dependencies = [ - "bitflags 2.10.0", - "crossterm_winapi", - "document-features", - "parking_lot", - "rustix", - "winapi", -] - -[[package]] -name = "crossterm_winapi" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "acdd7c62a3665c7f6830a51635d9ac9b23ed385797f70a83bb8bafe9c572ab2b" -dependencies = [ - "winapi", -] - -[[package]] -name = "crunchy" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5" - -[[package]] -name = "crypto-bigint" -version = "0.5.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76" -dependencies = [ - "generic-array 0.14.9", - "rand_core 0.6.4", - "subtle 2.6.1", - "zeroize", -] - -[[package]] -name = "crypto-common" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" -dependencies = [ - "generic-array 0.14.9", - "rand_core 0.6.4", - "typenum", -] - -[[package]] -name = "crypto-mac" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4434400df11d95d556bac068ddfedd482915eb18fe8bea89bc80b6e4b1c179e5" -dependencies = [ - "generic-array 0.12.4", - "subtle 1.0.0", -] - -[[package]] -name = "cssparser" -version = "0.35.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e901edd733a1472f944a45116df3f846f54d37e67e68640ac8bb69689aca2aa" -dependencies = [ - "cssparser-macros", - "dtoa-short", - "itoa", - "phf 0.11.3", - "smallvec", -] - -[[package]] -name = "cssparser-macros" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13b588ba4ac1a99f7f2964d24b3d896ddc6bf847ee3855dbd4366f058cfcd331" -dependencies = [ - "quote", - "syn 2.0.107", -] - -[[package]] -name = "csv" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52cd9d68cf7efc6ddfaaee42e7288d3a99d613d4b50f76ce9827ae0c6e14f938" -dependencies = [ - "csv-core", - "itoa", - "ryu", - "serde_core", -] - -[[package]] -name = "csv-core" -version = "0.1.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "704a3c26996a80471189265814dbc2c257598b96b8a7feae2d31ace646bb9782" -dependencies = [ - "memchr", -] - -[[package]] -name = "ct-codecs" -version = "1.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b10589d1a5e400d61f9f38f12f884cfd080ff345de8f17efda36fe0e4a02aa8" - -[[package]] -name = "ctr" -version = "0.9.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0369ee1ad671834580515889b80f2ea915f23b8be8d0daa4bbaf2ac5c7590835" -dependencies = [ - "cipher", -] - -[[package]] -name = "cupid" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8bad352a84b567cc38a5854e3aa8ee903cb8519a25d0b799b739bafffd1f91a1" -dependencies = [ - "gcc", - "rustc_version 0.2.3", -] - -[[package]] -name = "curl" -version = "0.4.49" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79fc3b6dd0b87ba36e565715bf9a2ced221311db47bd18011676f24a6066edbc" -dependencies = [ - "curl-sys", - "libc", - "openssl-probe", - "openssl-sys", - "schannel", - "socket2 0.6.1", - "windows-sys 0.59.0", -] - -[[package]] -name = "curl-sys" -version = "0.4.83+curl-8.15.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5830daf304027db10c82632a464879d46a3f7c4ba17a31592657ad16c719b483" -dependencies = [ - "cc", - "libc", - "libz-sys", - "openssl-sys", - "pkg-config", - "vcpkg", - "windows-sys 0.59.0", -] - -[[package]] -name = "curve25519-dalek" -version = "4.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97fb8b7c4503de7d6ae7b42ab72a5a59857b4c937ec27a3d4539dba95b5ab2be" -dependencies = [ - "cfg-if", - "cpufeatures", - "curve25519-dalek-derive", - "digest 0.10.7", - "fiat-crypto", - "rustc_version 0.4.1", - "serde", - "subtle 2.6.1", - "zeroize", -] - -[[package]] -name = "curve25519-dalek-derive" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.107", -] - -[[package]] -name = "curve25519-dalek-ng" -version = "4.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c359b7249347e46fb28804470d071c921156ad62b3eef5d34e2ba867533dec8" -dependencies = [ - "byteorder", - "digest 0.9.0", - "rand_core 0.6.4", - "subtle-ng", - "zeroize", -] - -[[package]] -name = "cw-controllers" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50c1804013d21060b994dea28a080f9eab78a3bcb6b617f05e7634b0600bf7b1" -dependencies = [ - "cosmwasm-schema", - "cosmwasm-std", - "cw-storage-plus", - "cw-utils", - "schemars 0.8.22", - "serde", - "thiserror 1.0.69", -] - -[[package]] -name = "cw-multi-test" -version = "2.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "533b31c94b9e10e77e2468a2b1559aa506505d18c4e52eb64cbfc624ca876ad2" -dependencies = [ - "anyhow", - "bech32", - "cosmwasm-schema", - "cosmwasm-std", - "cw-storage-plus", - "cw-utils", - "itertools 0.14.0", - "prost", - "schemars 0.8.22", - "serde", - "sha2 0.10.9", - "thiserror 2.0.17", -] - -[[package]] -name = "cw-storage-plus" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f13360e9007f51998d42b1bc6b7fa0141f74feae61ed5fd1e5b0a89eec7b5de1" -dependencies = [ - "cosmwasm-std", - "schemars 0.8.22", - "serde", -] - -[[package]] -name = "cw-utils" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07dfee7f12f802431a856984a32bce1cb7da1e6c006b5409e3981035ce562dec" -dependencies = [ - "cosmwasm-schema", - "cosmwasm-std", - "schemars 0.8.22", - "serde", - "thiserror 1.0.69", -] - -[[package]] -name = "cw2" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b04852cd38f044c0751259d5f78255d07590d136b8a86d4e09efdd7666bd6d27" -dependencies = [ - "cosmwasm-schema", - "cosmwasm-std", - "cw-storage-plus", - "schemars 0.8.22", - "semver 1.0.27", - "serde", - "thiserror 1.0.69", -] - -[[package]] -name = "cw20" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a42212b6bf29bbdda693743697c621894723f35d3db0d5df930be22903d0e27c" -dependencies = [ - "cosmwasm-schema", - "cosmwasm-std", - "cw-utils", - "schemars 0.8.22", - "serde", -] - -[[package]] -name = "cw3" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5e53c2057526c65d9c88be8b2a564729ebad7a3d87ee97b97665a71446f913a" -dependencies = [ - "cosmwasm-schema", - "cosmwasm-std", - "cw-utils", - "cw20", - "schemars 0.8.22", - "serde", - "thiserror 1.0.69", -] - -[[package]] -name = "cw4" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d33f5c8a6b6cd1bd24e212d7f44967697bfa3c4f9cc3f9a8e1c58f5fe5db032d" -dependencies = [ - "cosmwasm-schema", - "cosmwasm-std", - "cw-storage-plus", - "schemars 0.8.22", - "serde", -] - -[[package]] -name = "darling" -version = "0.20.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc7f46116c46ff9ab3eb1597a45688b6715c6e628b5c133e288e709a29bcb4ee" -dependencies = [ - "darling_core 0.20.11", - "darling_macro 0.20.11", -] - -[[package]] -name = "darling" -version = "0.21.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9cdf337090841a411e2a7f3deb9187445851f91b309c0c0a29e05f74a00a48c0" -dependencies = [ - "darling_core 0.21.3", - "darling_macro 0.21.3", -] - -[[package]] -name = "darling_core" -version = "0.20.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d00b9596d185e565c2207a0b01f8bd1a135483d02d9b7b0a54b11da8d53412e" -dependencies = [ - "fnv", - "ident_case", - "proc-macro2", - "quote", - "strsim", - "syn 2.0.107", -] - -[[package]] -name = "darling_core" -version = "0.21.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1247195ecd7e3c85f83c8d2a366e4210d588e802133e1e355180a9870b517ea4" -dependencies = [ - "fnv", - "ident_case", - "proc-macro2", - "quote", - "strsim", - "syn 2.0.107", -] - -[[package]] -name = "darling_macro" -version = "0.20.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead" -dependencies = [ - "darling_core 0.20.11", - "quote", - "syn 2.0.107", -] - -[[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", - "syn 2.0.107", -] - -[[package]] -name = "dashmap" -version = "5.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "978747c1d849a7d2ee5e8adc0159961c48fb7e5db2f06af6723b80123bb53856" -dependencies = [ - "cfg-if", - "hashbrown 0.14.5", - "lock_api", - "once_cell", - "parking_lot_core", - "serde", -] - -[[package]] -name = "data-encoding" -version = "2.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a2330da5de22e8a3cb63252ce2abb30116bf5265e89c0e01bc17015ce30a476" - -[[package]] -name = "defguard_wireguard_rs" -version = "0.4.7" -source = "git+https://github.com/DefGuard/wireguard-rs.git?rev=v0.4.7#ef1cf3714629bf5016fb38cbb7320451dc69fb09" -dependencies = [ - "base64 0.22.1", - "libc", - "log", - "netlink-packet-core 0.7.0", - "netlink-packet-generic 0.3.3", - "netlink-packet-route", - "netlink-packet-utils", - "netlink-packet-wireguard", - "netlink-sys", - "nix 0.29.0", - "serde", - "thiserror 1.0.69", -] - -[[package]] -name = "delegate-display" -version = "3.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9926686c832494164c33a36bf65118f4bd6e704000b58c94681bf62e9ad67a74" -dependencies = [ - "impartial-ord", - "itoa", - "macroific", - "proc-macro2", - "quote", - "syn 2.0.107", -] - -[[package]] -name = "der" -version = "0.7.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7c1832837b905bbfb5101e07cc24c8deddf52f93225eee6ead5f4d63d53ddcb" -dependencies = [ - "const-oid", - "pem-rfc7468", - "zeroize", -] - -[[package]] -name = "deranged" -version = "0.5.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a41953f86f8a05768a6cda24def994fd2f424b04ec5c719cf89989779f199071" -dependencies = [ - "powerfmt", - "serde_core", -] - -[[package]] -name = "derivative" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "derive_arbitrary" -version = "1.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e567bd82dcff979e4b03460c307b3cdc9e96fde3d73bed1496d2bc75d9dd62a" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.107", -] - -[[package]] -name = "derive_builder" -version = "0.20.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "507dfb09ea8b7fa618fcf76e953f4f5e192547945816d5358edffe39f6f94947" -dependencies = [ - "derive_builder_macro", -] - -[[package]] -name = "derive_builder_core" -version = "0.20.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d5bcf7b024d6835cfb3d473887cd966994907effbe9227e8c8219824d06c4e8" -dependencies = [ - "darling 0.20.11", - "proc-macro2", - "quote", - "syn 2.0.107", -] - -[[package]] -name = "derive_builder_macro" -version = "0.20.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab63b0e2bf4d5928aff72e83a7dace85d7bba5fe12dcc3c5a572d78caffd3f3c" -dependencies = [ - "derive_builder_core", - "syn 2.0.107", -] - -[[package]] -name = "derive_more" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a9b99b9cbbe49445b21764dc0625032a89b145a2642e67603e1c936f5458d05" -dependencies = [ - "derive_more-impl 1.0.0", -] - -[[package]] -name = "derive_more" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "093242cf7570c207c83073cf82f79706fe7b8317e98620a47d5be7c3d8497678" -dependencies = [ - "derive_more-impl 2.0.1", -] - -[[package]] -name = "derive_more-impl" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb7330aeadfbe296029522e6c40f315320aba36fc43a5b3632f3795348f3bd22" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.107", - "unicode-xid", -] - -[[package]] -name = "derive_more-impl" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bda628edc44c4bb645fbe0f758797143e4e07926f7ebf4e9bdfbd3d2ce621df3" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.107", - "unicode-xid", -] - -[[package]] -name = "diff" -version = "0.1.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56254986775e3233ffa9c4d7d3faaf6d36a2c09d30b20687e9f88bc8bafc16c8" - -[[package]] -name = "digest" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3d0c8c8752312f9713efd397ff63acb9f85585afbf179282e720e7704954dd5" -dependencies = [ - "generic-array 0.12.4", -] - -[[package]] -name = "digest" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" -dependencies = [ - "generic-array 0.14.9", -] - -[[package]] -name = "digest" -version = "0.10.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" -dependencies = [ - "block-buffer 0.10.4", - "const-oid", - "crypto-common", - "subtle 2.6.1", -] - -[[package]] -name = "dirs" -version = "6.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3e8aa94d75141228480295a7d0e7feb620b1a5ad9f12bc40be62411e38cce4e" -dependencies = [ - "dirs-sys", -] - -[[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", - "windows-sys 0.61.2", -] - -[[package]] -name = "displaydoc" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.107", -] - -[[package]] -name = "dkg-bypass-contract" -version = "0.1.0" -dependencies = [ - "cosmwasm-schema", - "cosmwasm-std", - "cw-storage-plus", - "nym-coconut-dkg-common", - "nym-contracts-common", -] - -[[package]] -name = "doc-comment" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fea41bba32d969b513997752735605054bc0dfa92b4c56bf1189f2e174be7a10" - -[[package]] -name = "document-features" -version = "0.2.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95249b50c6c185bee49034bcb378a49dc2b5dff0be90ff6616d31d64febab05d" -dependencies = [ - "litrs", -] - -[[package]] -name = "dotenvy" -version = "0.15.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1aaf95b3e5c8f23aa320147307562d361db0ae0d51242340f558153b4eb2439b" - -[[package]] -name = "dtoa" -version = "1.0.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6add3b8cff394282be81f3fc1a0605db594ed69890078ca6e2cab1c408bcf04" - -[[package]] -name = "dtoa-short" -version = "0.3.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd1511a7b6a56299bd043a9c167a6d2bfb37bf84a6dfceaba651168adfb43c87" -dependencies = [ - "dtoa", -] - -[[package]] -name = "dyn-clone" -version = "1.0.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0881ea181b1df73ff77ffaaf9c7544ecc11e82fba9b5f27b262a3c73a332555" - -[[package]] -name = "easy-addr" -version = "0.1.0" -dependencies = [ - "cosmwasm-std", - "quote", - "syn 2.0.107", -] - -[[package]] -name = "ecdsa" -version = "0.16.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee27f32b5c5292967d2d4a9d7f1e0b0aed2c15daded5a60300e4abb9d8020bca" -dependencies = [ - "der", - "digest 0.10.7", - "elliptic-curve", - "rfc6979", - "serdect 0.2.0", - "signature", - "spki", -] - -[[package]] -name = "echo-server" -version = "0.1.0" -dependencies = [ - "anyhow", - "bincode", - "bytecodec", - "bytes", - "clap", - "dashmap", - "dirs", - "futures", - "nym-bin-common", - "nym-crypto", - "nym-sdk", - "serde", - "tempfile", - "tokio", - "tokio-stream", - "tokio-util", - "tracing", - "tracing-subscriber", - "uuid", -] - -[[package]] -name = "ed25519" -version = "2.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "115531babc129696a58c64a4fef0a8bf9e9698629fb97e9e40767d235cfbcd53" -dependencies = [ - "pkcs8", - "serde", - "signature", -] - -[[package]] -name = "ed25519-compact" -version = "2.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e9b3460f44bea8cd47f45a0c70892f1eff856d97cd55358b2f73f663789f6190" -dependencies = [ - "ct-codecs", - "getrandom 0.2.16", -] - -[[package]] -name = "ed25519-consensus" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c8465edc8ee7436ffea81d21a019b16676ee3db267aa8d5a8d729581ecf998b" -dependencies = [ - "curve25519-dalek-ng", - "hex", - "rand_core 0.6.4", - "sha2 0.9.9", - "zeroize", -] - -[[package]] -name = "ed25519-dalek" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70e796c081cee67dc755e1a36a0a172b897fab85fc3f6bc48307991f64e4eca9" -dependencies = [ - "curve25519-dalek", - "ed25519", - "rand_core 0.6.4", - "serde", - "sha2 0.10.9", - "subtle 2.6.1", - "zeroize", -] - -[[package]] -name = "ed25519-zebra" -version = "4.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0017d969298eec91e3db7a2985a8cab4df6341d86e6f3a6f5878b13fb7846bc9" -dependencies = [ - "curve25519-dalek", - "ed25519", - "rand_core 0.6.4", - "sha2 0.10.9", - "subtle 2.6.1", - "zeroize", -] - -[[package]] -name = "either" -version = "1.15.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" -dependencies = [ - "serde", -] - -[[package]] -name = "elliptic-curve" -version = "0.13.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" -dependencies = [ - "base16ct", - "crypto-bigint", - "digest 0.10.7", - "ff", - "generic-array 0.14.9", - "group", - "hkdf", - "pem-rfc7468", - "pkcs8", - "rand_core 0.6.4", - "sec1", - "serdect 0.2.0", - "subtle 2.6.1", - "zeroize", -] - -[[package]] -name = "encode_unicode" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34aa73646ffb006b8f5147f3dc182bd4bcb190227ce861fc4a4844bf8e3cb2c0" - -[[package]] -name = "encoding_rs" -version = "0.8.35" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "enum-as-inner" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1e6a265c649f3f5979b601d26f1d05ada116434c87741c9493cb56218f76cbc" -dependencies = [ - "heck 0.5.0", - "proc-macro2", - "quote", - "syn 2.0.107", -] - -[[package]] -name = "env_filter" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bf3c259d255ca70051b30e2e95b5446cdb8949ac4cd22c0d7fd634d89f568e2" -dependencies = [ - "log", - "regex", -] - -[[package]] -name = "env_logger" -version = "0.11.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13c863f0904021b108aa8b2f55046443e6b1ebde8fd4a15c399893aae4fa069f" -dependencies = [ - "anstream", - "anstyle", - "env_filter", - "jiff", - "log", -] - -[[package]] -name = "equivalent" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" - -[[package]] -name = "errno" -version = "0.3.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" -dependencies = [ - "libc", - "windows-sys 0.61.2", -] - -[[package]] -name = "etcetera" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "136d1b5283a1ab77bd9257427ffd09d8667ced0570b6f938942bc7568ed5b943" -dependencies = [ - "cfg-if", - "home", - "windows-sys 0.48.0", -] - -[[package]] -name = "etherparse" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "827292ea592108849932ad8e30218f8b1f21c0dfd0696698a18b5d0aed62d990" -dependencies = [ - "arrayvec", -] - -[[package]] -name = "event-listener" -version = "2.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" - -[[package]] -name = "event-listener" -version = "5.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e13b66accf52311f30a0db42147dadea9850cb48cd070028831ae5f5d4b856ab" -dependencies = [ - "concurrent-queue", - "parking", - "pin-project-lite", -] - -[[package]] -name = "event-listener-strategy" -version = "0.5.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8be9f3dfaaffdae2972880079a491a1a8bb7cbed0b8dd7a347f668b4150a3b93" -dependencies = [ - "event-listener 5.4.1", - "pin-project-lite", -] - -[[package]] -name = "extension-storage" -version = "1.4.0-rc.0" -dependencies = [ - "bip39", - "console_error_panic_hook", - "js-sys", - "serde-wasm-bindgen 0.6.5", - "thiserror 2.0.17", - "wasm-bindgen", - "wasm-bindgen-futures", - "wasm-storage", - "wasm-utils", - "zeroize", -] - -[[package]] -name = "eyre" -version = "0.6.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7cd915d99f24784cdc19fd37ef22b97e3ff0ae756c7e492e9fbfe897d61e2aec" -dependencies = [ - "indenter", - "once_cell", -] - -[[package]] -name = "fallible-iterator" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4443176a9f2c162692bd3d352d745ef9413eec5782a80d8fd6f8a1ac692a07f7" - -[[package]] -name = "fancy_constructor" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28a27643a5d05f3a22f5afd6e0d0e6e354f92d37907006f97b84b9cb79082198" -dependencies = [ - "macroific", - "proc-macro2", - "quote", - "syn 2.0.107", -] - -[[package]] -name = "fastrand" -version = "1.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e51093e27b0797c359783294ca4f0a911c270184cb10f85783b118614a1501be" -dependencies = [ - "instant", -] - -[[package]] -name = "fastrand" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" - -[[package]] -name = "ff" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0b50bfb653653f9ca9095b427bed08ab8d75a137839d9ad64eb11810d5b6393" -dependencies = [ - "rand_core 0.6.4", - "subtle 2.6.1", -] - -[[package]] -name = "fiat-crypto" -version = "0.2.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28dea519a9695b9977216879a3ebfddf92f1c08c05d984f8996aecd6ecdc811d" - -[[package]] -name = "filetime" -version = "0.2.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc0505cd1b6fa6580283f6bdf70a73fcf4aba1184038c90902b92b3dd0df63ed" -dependencies = [ - "cfg-if", - "libc", - "libredox", - "windows-sys 0.60.2", -] - -[[package]] -name = "find-msvc-tools" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52051878f80a721bb68ebfbc930e07b65ba72f2da88968ea5c06fd6ca3d3a127" - -[[package]] -name = "fixedbitset" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" - -[[package]] -name = "flate2" -version = "1.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc5a4e564e38c699f2880d3fda590bedc2e69f3f84cd48b457bd892ce61d0aa9" -dependencies = [ - "crc32fast", - "miniz_oxide", -] - -[[package]] -name = "flex-error" -version = "0.4.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c606d892c9de11507fa0dcffc116434f94e105d0bbdc4e405b61519464c49d7b" -dependencies = [ - "eyre", - "paste", -] - -[[package]] -name = "flume" -version = "0.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da0e4dd2a88388a1f4ccc7c9ce104604dab68d9f408dc34cd45823d5a9069095" -dependencies = [ - "futures-core", - "futures-sink", - "spin", -] - -[[package]] -name = "fnv" -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 = "form_urlencoded" -version = "1.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" -dependencies = [ - "percent-encoding", -] - -[[package]] -name = "forwarded-header-value" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8835f84f38484cc86f110a805655697908257fb9a7af005234060891557198e9" -dependencies = [ - "nonempty", - "thiserror 1.0.69", -] - -[[package]] -name = "fs-err" -version = "2.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88a41f105fe1d5b6b34b2055e3dc59bb79b46b48b2040b9e6c7b4b5de097aa41" -dependencies = [ - "autocfg", -] - -[[package]] -name = "fsevent-sys" -version = "4.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76ee7a02da4d231650c7cea31349b889be2f45ddb3ef3032d2ec8185f6313fd2" -dependencies = [ - "libc", -] - -[[package]] -name = "funty" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" - -[[package]] -name = "futf" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df420e2e84819663797d1ec6544b13c5be84629e7bb00dc960d6917db2987843" -dependencies = [ - "mac", - "new_debug_unreachable", -] - -[[package]] -name = "futures" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" -dependencies = [ - "futures-channel", - "futures-core", - "futures-executor", - "futures-io", - "futures-sink", - "futures-task", - "futures-util", -] - -[[package]] -name = "futures-channel" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" -dependencies = [ - "futures-core", - "futures-sink", -] - -[[package]] -name = "futures-core" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" - -[[package]] -name = "futures-executor" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" -dependencies = [ - "futures-core", - "futures-task", - "futures-util", -] - -[[package]] -name = "futures-intrusive" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d930c203dd0b6ff06e0201a4a2fe9149b43c684fd4420555b26d21b1a02956f" -dependencies = [ - "futures-core", - "lock_api", - "parking_lot", -] - -[[package]] -name = "futures-io" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" - -[[package]] -name = "futures-lite" -version = "1.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49a9d51ce47660b1e808d3c990b4709f2f415d928835a17dfd16991515c46bce" -dependencies = [ - "fastrand 1.9.0", - "futures-core", - "futures-io", - "memchr", - "parking", - "pin-project-lite", - "waker-fn", -] - -[[package]] -name = "futures-macro" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.107", -] - -[[package]] -name = "futures-sink" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" - -[[package]] -name = "futures-task" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" - -[[package]] -name = "futures-util" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" -dependencies = [ - "futures-channel", - "futures-core", - "futures-io", - "futures-macro", - "futures-sink", - "futures-task", - "memchr", - "pin-project-lite", - "pin-utils", - "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" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffdf9f34f1447443d37393cc6c2b8313aebddcd96906caf34e54c68d8e57d7bd" -dependencies = [ - "typenum", -] - -[[package]] -name = "generic-array" -version = "0.14.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4bb6743198531e02858aeaea5398fcc883e71851fcbcb5a2f773e2fb6cb1edf2" -dependencies = [ - "serde", - "typenum", - "version_check", - "zeroize", -] - -[[package]] -name = "getrandom" -version = "0.2.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" -dependencies = [ - "cfg-if", - "js-sys", - "libc", - "wasi", - "wasm-bindgen", -] - -[[package]] -name = "getrandom" -version = "0.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" -dependencies = [ - "cfg-if", - "js-sys", - "libc", - "r-efi", - "wasip2", - "wasm-bindgen", -] - -[[package]] -name = "ghash" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0d8a4362ccb29cb0b265253fb0a2728f592895ee6854fd9bc13f2ffda266ff1" -dependencies = [ - "opaque-debug 0.3.1", - "polyval", -] - -[[package]] -name = "glob" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0cc23270f6e1808e30a928bdc84dea0b9b4136a8bc82338574f23baf47bbd280" - -[[package]] -name = "gloo-net" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c06f627b1a58ca3d42b45d6104bf1e1a03799df472df00988b6ba21accc10580" -dependencies = [ - "futures-channel", - "futures-core", - "futures-sink", - "gloo-utils 0.2.0", - "http 1.3.1", - "js-sys", - "pin-project", - "serde", - "serde_json", - "thiserror 1.0.69", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", -] - -[[package]] -name = "gloo-timers" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbb143cf96099802033e0d4f4963b19fd2e0b728bcf076cd9cf7f6634f092994" -dependencies = [ - "futures-channel", - "futures-core", - "js-sys", - "wasm-bindgen", -] - -[[package]] -name = "gloo-utils" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "037fcb07216cb3a30f7292bd0176b050b7b9a052ba830ef7d5d65f6dc64ba58e" -dependencies = [ - "js-sys", - "serde", - "serde_json", - "wasm-bindgen", - "web-sys", -] - -[[package]] -name = "gloo-utils" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b5555354113b18c547c1d3a98fbf7fb32a9ff4f6fa112ce823a21641a0ba3aa" -dependencies = [ - "js-sys", - "serde", - "serde_json", - "wasm-bindgen", - "web-sys", -] - -[[package]] -name = "goblin" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b363a30c165f666402fe6a3024d3bec7ebc898f96a4a23bd1c99f8dbf3f4f47" -dependencies = [ - "log", - "plain", - "scroll", -] - -[[package]] -name = "group" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" -dependencies = [ - "ff", - "rand_core 0.6.4", - "subtle 2.6.1", -] - -[[package]] -name = "h2" -version = "0.3.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0beca50380b1fc32983fc1cb4587bfa4bb9e78fc259aad4a0032d2080309222d" -dependencies = [ - "bytes", - "fnv", - "futures-core", - "futures-sink", - "futures-util", - "http 0.2.12", - "indexmap 2.12.0", - "slab", - "tokio", - "tokio-util", - "tracing", -] - -[[package]] -name = "h2" -version = "0.4.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3c0b69cfcb4e1b9f1bf2f53f95f766e4661169728ec61cd3fe5a0166f2d1386" -dependencies = [ - "atomic-waker", - "bytes", - "fnv", - "futures-core", - "futures-sink", - "http 1.3.1", - "indexmap 2.12.0", - "slab", - "tokio", - "tokio-util", - "tracing", -] - -[[package]] -name = "half" -version = "2.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ea2d84b969582b4b1864a92dc5d27cd2b77b622a8d79306834f1be5ba20d84b" -dependencies = [ - "cfg-if", - "crunchy", - "zerocopy", -] - -[[package]] -name = "handlebars" -version = "3.5.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4498fc115fa7d34de968184e473529abb40eeb6be8bc5f7faba3d08c316cb3e3" -dependencies = [ - "log", - "pest", - "pest_derive", - "quick-error", - "serde", - "serde_json", -] - -[[package]] -name = "hashbrown" -version = "0.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" - -[[package]] -name = "hashbrown" -version = "0.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e" -dependencies = [ - "ahash", -] - -[[package]] -name = "hashbrown" -version = "0.14.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" - -[[package]] -name = "hashbrown" -version = "0.15.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" -dependencies = [ - "allocator-api2", - "equivalent", - "foldhash", -] - -[[package]] -name = "hashbrown" -version = "0.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5419bdc4f6a9207fbeba6d11b604d481addf78ecd10c11ad51e76c2f6482748d" - -[[package]] -name = "hashlink" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7382cf6263419f2d8df38c55d7da83da5c18aef87fc7a7fc1fb1e344edfe14c1" -dependencies = [ - "hashbrown 0.15.5", -] - -[[package]] -name = "hdrhistogram" -version = "7.5.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "765c9198f173dd59ce26ff9f95ef0aafd0a0fe01fb9d72841bc5066a4c06511d" -dependencies = [ - "base64 0.21.7", - "byteorder", - "flate2", - "nom", - "num-traits", -] - -[[package]] -name = "headers" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3314d5adb5d94bcdf56771f2e50dbbc80bb4bdf88967526706205ac9eff24eb" -dependencies = [ - "base64 0.22.1", - "bytes", - "headers-core", - "http 1.3.1", - "httpdate", - "mime", - "sha1", -] - -[[package]] -name = "headers-core" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54b4a22553d4242c49fddb9ba998a99962b5cc6f22cb5a3482bec22522403ce4" -dependencies = [ - "http 1.3.1", -] - -[[package]] -name = "heck" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" - -[[package]] -name = "heck" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" - -[[package]] -name = "hermit-abi" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c" - -[[package]] -name = "hex" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" - -[[package]] -name = "hex-conservative" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "212ab92002354b4819390025006c897e8140934349e8635c9b077f47b4dcbd20" - -[[package]] -name = "hex-literal" -version = "0.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ebdb29d2ea9ed0083cd8cece49bbd968021bd99b0849edb4a9a7ee0fdf6a4e0" - -[[package]] -name = "hickory-proto" -version = "0.25.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8a6fe56c0038198998a6f217ca4e7ef3a5e51f46163bd6dd60b5c71ca6c6502" -dependencies = [ - "async-trait", - "bytes", - "cfg-if", - "data-encoding", - "enum-as-inner", - "futures-channel", - "futures-io", - "futures-util", - "h2 0.4.12", - "http 1.3.1", - "idna", - "ipnet", - "once_cell", - "rand 0.9.2", - "ring", - "rustls 0.23.33", - "thiserror 2.0.17", - "tinyvec", - "tokio", - "tokio-rustls 0.26.4", - "tracing", - "url", - "webpki-roots 0.26.11", -] - -[[package]] -name = "hickory-resolver" -version = "0.25.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc62a9a99b0bfb44d2ab95a7208ac952d31060efc16241c87eaf36406fecf87a" -dependencies = [ - "cfg-if", - "futures-util", - "hickory-proto", - "ipconfig", - "moka", - "once_cell", - "parking_lot", - "rand 0.9.2", - "resolv-conf", - "rustls 0.23.33", - "smallvec", - "thiserror 2.0.17", - "tokio", - "tokio-rustls 0.26.4", - "tracing", - "webpki-roots 0.26.11", -] - -[[package]] -name = "hidapi" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "798154e4b6570af74899d71155fb0072d5b17e6aa12f39c8ef22c60fb8ec99e7" -dependencies = [ - "cc", - "libc", - "pkg-config", - "winapi", -] - -[[package]] -name = "hkdf" -version = "0.12.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b5f8eb2ad728638ea2c7d47a21db23b7b58a72ed6a38256b8a1849f15fbbdf7" -dependencies = [ - "hmac", -] - -[[package]] -name = "hmac" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" -dependencies = [ - "digest 0.10.7", -] - -[[package]] -name = "hmac-sha1-compact" -version = "1.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18492c9f6f9a560e0d346369b665ad2bdbc89fa9bceca75796584e79042694c3" - -[[package]] -name = "hmac-sha256" -version = "1.1.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad6880c8d4a9ebf39c6e8b77007ce223f646a4d21ce29d99f70cb16420545425" -dependencies = [ - "digest 0.10.7", -] - -[[package]] -name = "hmac-sha512" -version = "1.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e89e8d20b3799fa526152a5301a771eaaad80857f83e01b23216ceaafb2d9280" -dependencies = [ - "digest 0.10.7", -] - -[[package]] -name = "home" -version = "0.5.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "589533453244b0995c858700322199b2becb13b627df2851f64a2775d024abcf" -dependencies = [ - "windows-sys 0.59.0", -] - -[[package]] -name = "html5ever" -version = "0.35.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55d958c2f74b664487a2035fe1dadb032c48718a03b63f3ab0b8537db8549ed4" -dependencies = [ - "log", - "markup5ever", - "match_token", -] - -[[package]] -name = "http" -version = "0.2.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1" -dependencies = [ - "bytes", - "fnv", - "itoa", -] - -[[package]] -name = "http" -version = "1.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4a85d31aea989eead29a3aaf9e1115a180df8282431156e533de47660892565" -dependencies = [ - "bytes", - "fnv", - "itoa", -] - -[[package]] -name = "http-body" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" -dependencies = [ - "bytes", - "http 0.2.12", - "pin-project-lite", -] - -[[package]] -name = "http-body" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" -dependencies = [ - "bytes", - "http 1.3.1", -] - -[[package]] -name = "http-body-util" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" -dependencies = [ - "bytes", - "futures-core", - "http 1.3.1", - "http-body 1.0.1", - "pin-project-lite", -] - -[[package]] -name = "http-range-header" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9171a2ea8a68358193d15dd5d70c1c10a2afc3e7e4c5bc92bc9f025cebd7359c" - -[[package]] -name = "httparse" -version = "1.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" - -[[package]] -name = "httpcodec" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f49d64351430cabd543943b79d48aaf0bc95a41d9ccf5b8774c2cfd23422775" -dependencies = [ - "bytecodec", - "trackable 0.2.24", -] - -[[package]] -name = "httpdate" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" - -[[package]] -name = "human-repr" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f58b778a5761513caf593693f8951c97a5b610841e754788400f32102eefdff1" - -[[package]] -name = "humantime" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "135b12329e5e3ce057a9f972339ea52bc954fe1e9358ef27f95e89716fbc5424" - -[[package]] -name = "humantime-serde" -version = "1.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57a3db5ea5923d99402c94e9feb261dc5ee9b4efa158b0315f788cf549cc200c" -dependencies = [ - "humantime", - "serde", -] - -[[package]] -name = "hyper" -version = "0.14.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41dfc780fdec9373c01bae43289ea34c972e40ee3c9f6b3c8801a35f35586ce7" -dependencies = [ - "bytes", - "futures-channel", - "futures-core", - "futures-util", - "h2 0.3.27", - "http 0.2.12", - "http-body 0.4.6", - "httparse", - "httpdate", - "itoa", - "pin-project-lite", - "socket2 0.5.10", - "tokio", - "tower-service", - "tracing", - "want", -] - -[[package]] -name = "hyper" -version = "1.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb3aa54a13a0dfe7fbe3a59e0c76093041720fdc77b110cc0fc260fafb4dc51e" -dependencies = [ - "atomic-waker", - "bytes", - "futures-channel", - "futures-core", - "h2 0.4.12", - "http 1.3.1", - "http-body 1.0.1", - "httparse", - "httpdate", - "itoa", - "pin-project-lite", - "pin-utils", - "smallvec", - "tokio", - "want", -] - -[[package]] -name = "hyper-rustls" -version = "0.24.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec3efd23720e2049821a693cbc7e65ea87c72f1c58ff2f9522ff332b1491e590" -dependencies = [ - "futures-util", - "http 0.2.12", - "hyper 0.14.32", - "rustls 0.21.12", - "tokio", - "tokio-rustls 0.24.1", -] - -[[package]] -name = "hyper-rustls" -version = "0.27.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3c93eb611681b207e1fe55d5a71ecf91572ec8a6705cdb6857f7d8d5242cf58" -dependencies = [ - "http 1.3.1", - "hyper 1.7.0", - "hyper-util", - "rustls 0.23.33", - "rustls-pki-types", - "tokio", - "tokio-rustls 0.26.4", - "tower-service", - "webpki-roots 1.0.3", -] - -[[package]] -name = "hyper-timeout" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b90d566bffbce6a75bd8b09a05aa8c2cb1fabb6cb348f8840c9e4c90a0d83b0" -dependencies = [ - "hyper 1.7.0", - "hyper-util", - "pin-project-lite", - "tokio", - "tower-service", -] - -[[package]] -name = "hyper-util" -version = "0.1.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c6995591a8f1380fcb4ba966a252a4b29188d51d2b89e3a252f5305be65aea8" -dependencies = [ - "base64 0.22.1", - "bytes", - "futures-channel", - "futures-core", - "futures-util", - "http 1.3.1", - "http-body 1.0.1", - "hyper 1.7.0", - "ipnet", - "libc", - "percent-encoding", - "pin-project-lite", - "socket2 0.6.1", - "tokio", - "tower-service", - "tracing", -] - -[[package]] -name = "iana-time-zone" -version = "0.1.64" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33e57f83510bb73707521ebaffa789ec8caf86f9657cad665b092b581d40e9fb" -dependencies = [ - "android_system_properties", - "core-foundation-sys", - "iana-time-zone-haiku", - "js-sys", - "log", - "wasm-bindgen", - "windows-core 0.62.2", -] - -[[package]] -name = "iana-time-zone-haiku" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" -dependencies = [ - "cc", -] - -[[package]] -name = "icu_collections" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "200072f5d0e3614556f94a9930d5dc3e0662a652823904c3a75dc3b0af7fee47" -dependencies = [ - "displaydoc", - "potential_utf", - "yoke", - "zerofrom", - "zerovec", -] - -[[package]] -name = "icu_locale_core" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0cde2700ccaed3872079a65fb1a78f6c0a36c91570f28755dda67bc8f7d9f00a" -dependencies = [ - "displaydoc", - "litemap", - "tinystr", - "writeable", - "zerovec", -] - -[[package]] -name = "icu_normalizer" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "436880e8e18df4d7bbc06d58432329d6458cc84531f7ac5f024e93deadb37979" -dependencies = [ - "displaydoc", - "icu_collections", - "icu_normalizer_data", - "icu_properties", - "icu_provider", - "smallvec", - "zerovec", -] - -[[package]] -name = "icu_normalizer_data" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00210d6893afc98edb752b664b8890f0ef174c8adbb8d0be9710fa66fbbf72d3" - -[[package]] -name = "icu_properties" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "016c619c1eeb94efb86809b015c58f479963de65bdb6253345c1a1276f22e32b" -dependencies = [ - "displaydoc", - "icu_collections", - "icu_locale_core", - "icu_properties_data", - "icu_provider", - "potential_utf", - "zerotrie", - "zerovec", -] - -[[package]] -name = "icu_properties_data" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "298459143998310acd25ffe6810ed544932242d3f07083eee1084d83a71bd632" - -[[package]] -name = "icu_provider" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03c80da27b5f4187909049ee2d72f276f0d9f99a42c306bd0131ecfe04d8e5af" -dependencies = [ - "displaydoc", - "icu_locale_core", - "stable_deref_trait", - "tinystr", - "writeable", - "yoke", - "zerofrom", - "zerotrie", - "zerovec", -] - -[[package]] -name = "ident_case" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" - -[[package]] -name = "idna" -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.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" -dependencies = [ - "icu_normalizer", - "icu_properties", -] - -[[package]] -name = "impartial-ord" -version = "1.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ab604ee7085efba6efc65e4ebca0e9533e3aff6cb501d7d77b211e3a781c6d5" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.107", -] - -[[package]] -name = "importer-cli" -version = "0.1.0" -dependencies = [ - "anyhow", - "bip39", - "clap", - "dirs", - "importer-contract", - "nym-bin-common", - "nym-mixnet-contract-common", - "nym-network-defaults", - "nym-validator-client", - "nym-vesting-contract-common", - "serde", - "serde_json", - "tokio", - "tracing", -] - -[[package]] -name = "importer-contract" -version = "0.1.0" -dependencies = [ - "base85rs", - "cosmwasm-schema", - "cosmwasm-std", -] - -[[package]] -name = "indenter" -version = "0.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "964de6e86d545b246d84badc0fef527924ace5134f30641c203ef52ba83f58d5" - -[[package]] -name = "indexed_db_futures" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69ff41758cbd104e91033bb53bc449bec7eea65652960c81eddf3fc146ecea19" -dependencies = [ - "accessory", - "cfg-if", - "delegate-display", - "derive_more 2.0.1", - "fancy_constructor", - "indexed_db_futures_macros_internal", - "js-sys", - "sealed", - "smallvec", - "thiserror 2.0.17", - "tokio", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", -] - -[[package]] -name = "indexed_db_futures_macros_internal" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "caeba94923b68f254abef921cea7e7698bf4675fdd89d7c58bf1ed885b49a27d" -dependencies = [ - "macroific", - "proc-macro2", - "quote", - "syn 2.0.107", -] - -[[package]] -name = "indexmap" -version = "1.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" -dependencies = [ - "autocfg", - "hashbrown 0.12.3", - "serde", -] - -[[package]] -name = "indexmap" -version = "2.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6717a8d2a5a929a1a2eb43a12812498ed141a0bcfb7e8f7844fbdbe4303bba9f" -dependencies = [ - "equivalent", - "hashbrown 0.16.0", - "serde", - "serde_core", -] - -[[package]] -name = "indicatif" -version = "0.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70a646d946d06bedbbc4cac4c218acf4bbf2d87757a784857025f4d447e4e1cd" -dependencies = [ - "console", - "portable-atomic", - "unicode-width 0.2.2", - "unit-prefix", - "vt100", - "web-time", -] - -[[package]] -name = "inotify" -version = "0.9.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8069d3ec154eb856955c1c0fbffefbf5f3c40a104ec912d4797314c1801abff" -dependencies = [ - "bitflags 1.3.2", - "inotify-sys", - "libc", -] - -[[package]] -name = "inotify-sys" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e05c02b5e89bff3b946cedeca278abc628fe811e604f027c45a8aa3cf793d0eb" -dependencies = [ - "libc", -] - -[[package]] -name = "inout" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "879f10e63c20629ecabbb64a8010319738c66a5cd0c29b02d63d272b03751d01" -dependencies = [ - "block-padding", - "generic-array 0.14.9", -] - -[[package]] -name = "inquire" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c33e7c1ddeb15c9abcbfef6029d8e29f69b52b6d6c891031b88ed91b5065803b" -dependencies = [ - "bitflags 1.3.2", - "crossterm 0.25.0", - "dyn-clone", - "lazy_static", - "newline-converter", - "thiserror 1.0.69", - "unicode-segmentation", - "unicode-width 0.1.14", -] - -[[package]] -name = "instant" -version = "0.1.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0242819d153cba4b4b05a5a8f2a7e9bbf97b6055b2a002b395c96b5ff3c0222" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "integer-encoding" -version = "3.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8bb03732005da905c88227371639bf1ad885cc712789c011c31c5fb3ab3ccf02" - -[[package]] -name = "inventory" -version = "0.3.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc61209c082fbeb19919bee74b176221b27223e27b65d781eb91af24eb1fb46e" -dependencies = [ - "rustversion", -] - -[[package]] -name = "ip_network" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa2f047c0a98b2f299aa5d6d7088443570faae494e9ae1305e48be000c9e0eb1" - -[[package]] -name = "ipconfig" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b58db92f96b720de98181bbbe63c831e87005ab460c1bf306eb2622b4707997f" -dependencies = [ - "socket2 0.5.10", - "widestring", - "windows-sys 0.48.0", - "winreg", -] - -[[package]] -name = "ipnet" -version = "2.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" - -[[package]] -name = "ipnetwork" -version = "0.20.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf466541e9d546596ee94f9f69590f89473455f88372423e0008fc1a7daf100e" -dependencies = [ - "serde", -] - -[[package]] -name = "iri-string" -version = "0.7.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dbc5ebe9c3a1a7a5127f920a418f7585e9e758e911d0466ed004f393b0e380b2" -dependencies = [ - "memchr", - "serde", -] - -[[package]] -name = "is-terminal" -version = "0.4.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e04d7f318608d35d4b61ddd75cbdaee86b023ebe2bd5a66ee0915f0bf93095a9" -dependencies = [ - "hermit-abi", - "libc", - "windows-sys 0.59.0", -] - -[[package]] -name = "is_terminal_polyfill" -version = "1.70.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" - -[[package]] -name = "isahc" -version = "1.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "334e04b4d781f436dc315cb1e7515bd96826426345d498149e4bde36b67f8ee9" -dependencies = [ - "async-channel", - "castaway", - "crossbeam-utils", - "curl", - "curl-sys", - "event-listener 2.5.3", - "futures-lite", - "http 0.2.12", - "log", - "once_cell", - "polling", - "slab", - "sluice", - "tracing", - "tracing-futures", - "url", - "waker-fn", -] - -[[package]] -name = "itertools" -version = "0.10.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" -dependencies = [ - "either", -] - -[[package]] -name = "itertools" -version = "0.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285" -dependencies = [ - "either", -] - -[[package]] -name = "itoa" -version = "1.0.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" - -[[package]] -name = "jiff" -version = "0.2.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be1f93b8b1eb69c77f24bbb0afdf66f54b632ee39af40ca21c4365a1d7347e49" -dependencies = [ - "jiff-static", - "log", - "portable-atomic", - "portable-atomic-util", - "serde", -] - -[[package]] -name = "jiff-static" -version = "0.2.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03343451ff899767262ec32146f6d559dd759fdadf42ff0e227c7c48f72594b4" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.107", -] - -[[package]] -name = "jobserver" -version = "0.1.34" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9afb3de4395d6b3e67a780b6de64b51c978ecf11cb9a462c66be7d4ca9039d33" -dependencies = [ - "getrandom 0.3.4", - "libc", -] - -[[package]] -name = "js-sys" -version = "0.3.81" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec48937a97411dcb524a265206ccd4c90bb711fca92b2792c407f268825b9305" -dependencies = [ - "once_cell", - "wasm-bindgen", -] - -[[package]] -name = "jwt-simple" -version = "0.12.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "731011e9647a71ff4f8474176ff6ce6e0d2de87a0173f15613af3a84c3e3401a" -dependencies = [ - "anyhow", - "binstring", - "blake2b_simd", - "coarsetime", - "ct-codecs", - "ed25519-compact", - "hmac-sha1-compact", - "hmac-sha256", - "hmac-sha512", - "k256", - "p256", - "p384", - "rand 0.8.5", - "serde", - "serde_json", - "superboring", - "thiserror 2.0.17", - "zeroize", -] - -[[package]] -name = "k256" -version = "0.13.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6e3919bbaa2945715f0bb6d3934a173d1e9a59ac23767fbaaef277265a7411b" -dependencies = [ - "cfg-if", - "ecdsa", - "elliptic-curve", - "once_cell", - "sha2 0.10.9", - "signature", -] - -[[package]] -name = "keystream" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c33070833c9ee02266356de0c43f723152bd38bd96ddf52c82b3af10c9138b28" - -[[package]] -name = "kqueue" -version = "1.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eac30106d7dce88daf4a3fcb4879ea939476d5074a9b7ddd0fb97fa4bed5596a" -dependencies = [ - "kqueue-sys", - "libc", -] - -[[package]] -name = "kqueue-sys" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed9625ffda8729b85e45cf04090035ac368927b8cebc34898e7c120f52e4838b" -dependencies = [ - "bitflags 1.3.2", - "libc", -] - -[[package]] -name = "lazy_static" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" -dependencies = [ - "spin", -] - -[[package]] -name = "ledger-apdu" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe435806c197dfeaa5efcded5e623c4b8230fd28fdf1e91e7a86e40ef2acbf90" -dependencies = [ - "arrayref", - "no-std-compat", - "snafu", -] - -[[package]] -name = "ledger-transport" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1117f2143d92c157197785bf57711d7b02f2cfa101e162f8ca7900fb7f976321" -dependencies = [ - "async-trait", - "ledger-apdu", -] - -[[package]] -name = "ledger-transport-hid" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45ba81a1f5f24396b37211478aff7fbcd605dd4544df8dbed07b9da3c2057aee" -dependencies = [ - "byteorder", - "cfg-if", - "hex", - "hidapi", - "ledger-transport", - "libc", - "log", - "thiserror 1.0.69", -] - -[[package]] -name = "libc" -version = "0.2.177" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2874a2af47a2325c2001a6e6fad9b16a53b802102b528163885171cf92b15976" - -[[package]] -name = "libm" -version = "0.2.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9fbbcab51052fe104eb5e5d351cf728d30a5be1fe14d9be8a3b097481fb97de" - -[[package]] -name = "libredox" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "416f7e718bdb06000964960ffa43b4335ad4012ae8b99060261aa4a8088d5ccb" -dependencies = [ - "bitflags 2.10.0", - "libc", - "redox_syscall", -] - -[[package]] -name = "libsqlite3-sys" -version = "0.30.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e99fb7a497b1e3339bc746195567ed8d3e24945ecd636e3619d20b9de9e9149" -dependencies = [ - "cc", - "pkg-config", - "vcpkg", -] - -[[package]] -name = "libz-sys" -version = "1.1.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b70e7a7df205e92a1a4cd9aaae7898dac0aa555503cc0a649494d0d60e7651d" -dependencies = [ - "cc", - "libc", - "pkg-config", - "vcpkg", -] - -[[package]] -name = "linux-raw-sys" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df1d3c3b53da64cf5760482273a98e575c651a67eec7f77df96b5b642de8f039" - -[[package]] -name = "lioness" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ae926706ba42c425c9457121178330d75e273df2e82e28b758faf3de3a9acb9" -dependencies = [ - "arrayref", - "blake2 0.8.1", - "chacha", - "keystream", -] - -[[package]] -name = "litemap" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "241eaef5fd12c88705a01fc1066c48c4b36e0dd4377dcdc7ec3942cea7a69956" - -[[package]] -name = "litrs" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f5e54036fe321fd421e10d732f155734c4e4afd610dd556d9a82833ab3ee0bed" - -[[package]] -name = "lock_api" -version = "0.4.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" -dependencies = [ - "scopeguard", -] - -[[package]] -name = "log" -version = "0.4.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34080505efa8e45a4b816c349525ebe327ceaa8559756f0356cba97ef3bf7432" - -[[package]] -name = "lru-slab" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "112b39cec0b298b6c1999fee3e31427f74f676e4cb9879ed1a121b43661a4154" - -[[package]] -name = "mac" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c41e0c4fef86961ac6d6f8a82609f55f31b05e4fce149ac5710e439df7619ba4" - -[[package]] -name = "macroific" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89f276537b4b8f981bf1c13d79470980f71134b7bdcc5e6e911e910e556b0285" -dependencies = [ - "macroific_attr_parse", - "macroific_core", - "macroific_macro", -] - -[[package]] -name = "macroific_attr_parse" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad4023761b45fcd36abed8fb7ae6a80456b0a38102d55e89a57d9a594a236be9" -dependencies = [ - "proc-macro2", - "quote", - "sealed", - "syn 2.0.107", -] - -[[package]] -name = "macroific_core" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0a7594d3c14916fa55bef7e9d18c5daa9ed410dd37504251e4b75bbdeec33e3" -dependencies = [ - "proc-macro2", - "quote", - "sealed", - "syn 2.0.107", -] - -[[package]] -name = "macroific_macro" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4da6f2ed796261b0a74e2b52b42c693bb6dee1effba3a482c49592659f824b3b" -dependencies = [ - "macroific_attr_parse", - "macroific_core", - "proc-macro2", - "quote", - "syn 2.0.107", -] - -[[package]] -name = "maplit" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e2e65a1a2e43cfcb47a895c4c8b10d1f4a61097f9f254f183aee60cad9c651d" - -[[package]] -name = "markup5ever" -version = "0.35.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "311fe69c934650f8f19652b3946075f0fc41ad8757dbb68f1ca14e7900ecc1c3" -dependencies = [ - "log", - "tendril", - "web_atoms", -] - -[[package]] -name = "match_token" -version = "0.35.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac84fd3f360fcc43dc5f5d186f02a94192761a080e8bc58621ad4d12296a58cf" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.107", -] - -[[package]] -name = "matchers" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1525a2a28c7f4fa0fc98bb91ae755d1e2d1505079e05539e35bc876b5d65ae9" -dependencies = [ - "regex-automata", -] - -[[package]] -name = "matchit" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e7465ac9959cc2b1404e8e2367b43684a6d13790fe23056cc8c6c5a6b7bcb94" - -[[package]] -name = "md-5" -version = "0.10.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d89e7ee0cfbedfc4da3340218492196241d89eefb6dab27de5df917a6d2e78cf" -dependencies = [ - "cfg-if", - "digest 0.10.7", -] - -[[package]] -name = "memchr" -version = "2.7.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f52b00d39961fc5b2736ea853c9cc86238e165017a493d1d5c8eac6bdc4cc273" - -[[package]] -name = "memoffset" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a" -dependencies = [ - "autocfg", -] - -[[package]] -name = "mime" -version = "0.3.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" - -[[package]] -name = "mime_guess" -version = "2.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7c44f8e672c00fe5308fa235f821cb4198414e1c77935c1ab6948d3fd78550e" -dependencies = [ - "mime", - "unicase", -] - -[[package]] -name = "minicov" -version = "0.3.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f27fe9f1cc3c22e1687f9446c2083c4c5fc7f0bcf1c7a86bdbded14985895b4b" -dependencies = [ - "cc", - "walkdir", -] - -[[package]] -name = "minimal-lexical" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" - -[[package]] -name = "miniz_oxide" -version = "0.8.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" -dependencies = [ - "adler2", - "simd-adler32", -] - -[[package]] -name = "mio" -version = "0.8.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4a650543ca06a924e8b371db273b2756685faae30f8487da1b56505a8f78b0c" -dependencies = [ - "libc", - "log", - "wasi", - "windows-sys 0.48.0", -] - -[[package]] -name = "mio" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69d83b0086dc8ecf3ce9ae2874b2d1290252e2a30720bea58a5c6639b0092873" -dependencies = [ - "libc", - "wasi", - "windows-sys 0.61.2", -] - -[[package]] -name = "mix-fetch-wasm" -version = "1.4.0-rc.0" -dependencies = [ - "async-trait", - "futures", - "js-sys", - "nym-bin-common", - "nym-http-api-client", - "nym-ordered-buffer", - "nym-service-providers-common", - "nym-socks5-requests", - "rand 0.8.5", - "serde", - "serde-wasm-bindgen 0.6.5", - "thiserror 2.0.17", - "tokio", - "tsify", - "url", - "wasm-bindgen", - "wasm-bindgen-futures", - "wasm-client-core", - "wasm-utils", -] - -[[package]] -name = "mixnet-connectivity-check" -version = "0.1.0" -dependencies = [ - "anyhow", - "clap", - "futures", - "nym-bin-common", - "nym-crypto", - "nym-network-defaults", - "nym-sdk", - "tokio", - "tracing", -] - -[[package]] -name = "mock_instant" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dce6dd36094cac388f119d2e9dc82dc730ef91c32a6222170d630e5414b956e6" - -[[package]] -name = "moka" -version = "0.12.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8261cd88c312e0004c1d51baad2980c66528dfdb2bee62003e643a4d8f86b077" -dependencies = [ - "async-lock", - "crossbeam-channel", - "crossbeam-epoch", - "crossbeam-utils", - "equivalent", - "event-listener 5.4.1", - "futures-util", - "parking_lot", - "portable-atomic", - "rustc_version 0.4.1", - "smallvec", - "tagptr", - "uuid", -] - -[[package]] -name = "multer" -version = "3.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83e87776546dc87511aa5ee218730c92b666d7264ab6ed41f9d215af9cd5224b" -dependencies = [ - "bytes", - "encoding_rs", - "futures-util", - "http 1.3.1", - "httparse", - "memchr", - "mime", - "spin", - "version_check", -] - -[[package]] -name = "netlink-packet-core" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72724faf704479d67b388da142b186f916188505e7e0b26719019c525882eda4" -dependencies = [ - "anyhow", - "byteorder", - "netlink-packet-utils", -] - -[[package]] -name = "netlink-packet-core" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3463cbb78394cb0141e2c926b93fc2197e473394b761986eca3b9da2c63ae0f4" -dependencies = [ - "paste", -] - -[[package]] -name = "netlink-packet-generic" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1cd7eb8ad331c84c6b8cb7f685b448133e5ad82e1ffd5acafac374af4a5a308b" -dependencies = [ - "anyhow", - "byteorder", - "netlink-packet-core 0.7.0", - "netlink-packet-utils", -] - -[[package]] -name = "netlink-packet-generic" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f891b2e0054cac5a684a06628f59568f841c93da4e551239da6e518f539e775" -dependencies = [ - "netlink-packet-core 0.8.1", -] - -[[package]] -name = "netlink-packet-route" -version = "0.20.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55e5bda7ca0f9ac5e75b5debac3b75e29a8ac8e2171106a2c3bb466389a8dd83" -dependencies = [ - "anyhow", - "bitflags 2.10.0", - "byteorder", - "libc", - "log", - "netlink-packet-core 0.7.0", - "netlink-packet-utils", -] - -[[package]] -name = "netlink-packet-utils" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ede8a08c71ad5a95cdd0e4e52facd37190977039a4704eb82a283f713747d34" -dependencies = [ - "anyhow", - "byteorder", - "paste", - "thiserror 1.0.69", -] - -[[package]] -name = "netlink-packet-wireguard" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "598962d9067d3153a00106da10e7b8276cea68f396f4a22f5b4a079270d92e29" -dependencies = [ - "libc", - "log", - "netlink-packet-core 0.8.1", - "netlink-packet-generic 0.4.0", -] - -[[package]] -name = "netlink-sys" -version = "0.8.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16c903aa70590cb93691bf97a767c8d1d6122d2cc9070433deb3bbf36ce8bd23" -dependencies = [ - "bytes", - "libc", - "log", -] - -[[package]] -name = "new_debug_unreachable" -version = "1.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086" - -[[package]] -name = "newline-converter" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f71d09d5c87634207f894c6b31b6a2b2c64ea3bdcf71bd5599fdbbe1600c00f" -dependencies = [ - "unicode-segmentation", -] - -[[package]] -name = "nix" -version = "0.27.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2eb04e9c688eff1c89d72b407f168cf79bb9e867a9d3323ed6c01519eb9cc053" -dependencies = [ - "bitflags 2.10.0", - "cfg-if", - "libc", -] - -[[package]] -name = "nix" -version = "0.29.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "71e2746dc3a24dd78b3cfcb7be93368c6de9963d30f43a6a73998a9cf4b17b46" -dependencies = [ - "bitflags 2.10.0", - "cfg-if", - "cfg_aliases", - "libc", - "memoffset", -] - -[[package]] -name = "no-std-compat" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b93853da6d84c2e3c7d730d6473e8817692dd89be387eb01b94d7f108ecb5b8c" - -[[package]] -name = "no-std-net" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43794a0ace135be66a25d3ae77d41b91615fb68ae937f904090203e81f755b65" - -[[package]] -name = "nom" -version = "7.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" -dependencies = [ - "memchr", - "minimal-lexical", -] - -[[package]] -name = "nonempty" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e9e591e719385e6ebaeb5ce5d3887f7d5676fceca6411d1925ccc95745f3d6f7" - -[[package]] -name = "notify" -version = "5.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "729f63e1ca555a43fe3efa4f3efdf4801c479da85b432242a7b726f353c88486" -dependencies = [ - "bitflags 1.3.2", - "crossbeam-channel", - "filetime", - "fsevent-sys", - "inotify", - "kqueue", - "libc", - "mio 0.8.11", - "walkdir", - "windows-sys 0.45.0", -] - -[[package]] -name = "ntapi" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8a3895c6391c39d7fe7ebc444a87eb2991b2a0bc718fdabd071eec617fc68e4" -dependencies = [ - "winapi", -] - -[[package]] -name = "nu-ansi-term" -version = "0.46.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" -dependencies = [ - "overload", - "winapi", -] - -[[package]] -name = "nu-ansi-term" -version = "0.50.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7957b9740744892f114936ab4a57b3f487491bbeafaf8083688b16841a4240e5" -dependencies = [ - "windows-sys 0.61.2", -] - -[[package]] -name = "num-bigint" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" -dependencies = [ - "num-integer", - "num-traits", -] - -[[package]] -name = "num-bigint-dig" -version = "0.8.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc84195820f291c7697304f3cbdadd1cb7199c0efc917ff5eafd71225c136151" -dependencies = [ - "byteorder", - "lazy_static", - "libm", - "num-integer", - "num-iter", - "num-traits", - "rand 0.8.5", - "smallvec", - "zeroize", -] - -[[package]] -name = "num-conv" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" - -[[package]] -name = "num-integer" -version = "0.1.46" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" -dependencies = [ - "num-traits", -] - -[[package]] -name = "num-iter" -version = "0.1.45" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf" -dependencies = [ - "autocfg", - "num-integer", - "num-traits", -] - -[[package]] -name = "num-traits" -version = "0.2.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" -dependencies = [ - "autocfg", - "libm", -] - -[[package]] -name = "num_cpus" -version = "1.17.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91df4bbde75afed763b708b7eee1e8e7651e02d97f6d5dd763e89367e957b23b" -dependencies = [ - "hermit-abi", - "libc", -] - -[[package]] -name = "num_threads" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c7398b9c8b70908f6371f47ed36737907c87c52af34c268fed0bf0ceb92ead9" -dependencies = [ - "libc", -] - -[[package]] -name = "nym-api" -version = "1.1.68" -dependencies = [ - "anyhow", - "async-trait", - "axum", - "axum-test", - "bincode", - "bip39", - "bs58", - "cfg-if", - "clap", - "console-subscriber", - "cosmwasm-std", - "cw-utils", - "cw2", - "cw3", - "cw4", - "dashmap", - "dotenvy", - "futures", - "humantime-serde", - "moka", - "nym-api-requests", - "nym-bandwidth-controller", - "nym-bin-common", - "nym-cache", - "nym-coconut-dkg-common", - "nym-compact-ecash", - "nym-config", - "nym-contracts-common", - "nym-credential-storage", - "nym-credentials", - "nym-credentials-interface", - "nym-crypto", - "nym-dkg", - "nym-ecash-contract-common", - "nym-ecash-signer-check", - "nym-ecash-time", - "nym-gateway-client", - "nym-http-api-client", - "nym-http-api-common", - "nym-mixnet-contract-common", - "nym-node-requests", - "nym-node-tester-utils", - "nym-pemstore", - "nym-serde-helpers", - "nym-sphinx", - "nym-statistics-common", - "nym-task", - "nym-ticketbooks-merkle", - "nym-topology", - "nym-types", - "nym-validator-client", - "pin-project", - "rand 0.8.5", - "rand_chacha 0.3.1", - "reqwest 0.12.24", - "schemars 0.8.22", - "semver 1.0.27", - "serde", - "serde_json", - "sha2 0.10.9", - "sqlx", - "tempfile", - "tendermint", - "test-with", - "thiserror 2.0.17", - "time", - "tokio", - "tokio-stream", - "tokio-util", - "tower-http 0.5.2", - "tracing", - "ts-rs", - "url", - "utoipa", - "utoipa-swagger-ui", - "utoipauto", - "zeroize", -] - -[[package]] -name = "nym-api-requests" -version = "0.1.0" -dependencies = [ - "bs58", - "cosmrs", - "cosmwasm-std", - "ecdsa", - "hex", - "humantime-serde", - "nym-coconut-dkg-common", - "nym-compact-ecash", - "nym-config", - "nym-contracts-common", - "nym-credentials-interface", - "nym-crypto", - "nym-ecash-signer-check-types", - "nym-ecash-time", - "nym-mixnet-contract-common", - "nym-network-defaults", - "nym-node-requests", - "nym-noise-keys", - "nym-serde-helpers", - "nym-ticketbooks-merkle", - "rand_chacha 0.3.1", - "schemars 0.8.22", - "serde", - "serde_json", - "sha2 0.10.9", - "tendermint", - "tendermint-rpc", - "thiserror 2.0.17", - "time", - "tracing", - "ts-rs", - "utoipa", -] - -[[package]] -name = "nym-async-file-watcher" -version = "0.1.0" -dependencies = [ - "futures", - "log", - "notify", - "tokio", -] - -[[package]] -name = "nym-authenticator-client" -version = "0.1.0" -dependencies = [ - "bincode", - "futures", - "nym-authenticator-requests", - "nym-bandwidth-controller", - "nym-credentials-interface", - "nym-crypto", - "nym-registration-common", - "nym-sdk", - "nym-service-provider-requests-common", - "nym-validator-client", - "nym-wireguard-types", - "semver 1.0.27", - "thiserror 2.0.17", - "tokio", - "tokio-util", - "tracing", -] - -[[package]] -name = "nym-authenticator-requests" -version = "0.1.0" -dependencies = [ - "base64 0.22.1", - "bincode", - "hmac", - "nym-credentials-interface", - "nym-crypto", - "nym-network-defaults", - "nym-service-provider-requests-common", - "nym-sphinx", - "nym-wireguard-types", - "rand 0.8.5", - "semver 1.0.27", - "serde", - "sha2 0.10.9", - "strum_macros", - "thiserror 2.0.17", - "x25519-dalek", -] - -[[package]] -name = "nym-bandwidth-controller" -version = "0.1.0" -dependencies = [ - "async-trait", - "bip39", - "log", - "nym-credential-storage", - "nym-credentials", - "nym-credentials-interface", - "nym-crypto", - "nym-ecash-contract-common", - "nym-ecash-time", - "nym-network-defaults", - "nym-task", - "nym-validator-client", - "rand 0.8.5", - "thiserror 2.0.17", - "url", - "zeroize", -] - -[[package]] -name = "nym-bin-common" -version = "0.6.0" -dependencies = [ - "clap", - "clap_complete", - "clap_complete_fig", - "const-str", - "log", - "opentelemetry", - "opentelemetry-jaeger", - "schemars 0.8.22", - "serde", - "serde_json", - "tracing", - "tracing-opentelemetry", - "tracing-subscriber", - "tracing-tree", - "utoipa", - "vergen 8.3.1", -] - -[[package]] -name = "nym-cache" -version = "0.1.0" -dependencies = [ - "tokio", -] - -[[package]] -name = "nym-cli" -version = "1.1.65" -dependencies = [ - "anyhow", - "base64 0.22.1", - "bip39", - "bs58", - "clap", - "clap_complete", - "clap_complete_fig", - "dotenvy", - "inquire", - "log", - "nym-bin-common", - "nym-cli-commands", - "nym-network-defaults", - "nym-validator-client", - "serde", - "serde_json", - "tap", - "tokio", -] - -[[package]] -name = "nym-cli-commands" -version = "1.0.0" -dependencies = [ - "anyhow", - "base64 0.22.1", - "bip39", - "bs58", - "cfg-if", - "clap", - "colored", - "comfy-table", - "cosmrs", - "cosmwasm-std", - "csv", - "cw-utils", - "futures", - "handlebars", - "humantime-serde", - "inquire", - "k256", - "log", - "nym-bandwidth-controller", - "nym-bin-common", - "nym-client-core", - "nym-coconut-dkg-common", - "nym-config", - "nym-contracts-common", - "nym-credential-proxy-requests", - "nym-credential-storage", - "nym-credential-utils", - "nym-credentials", - "nym-credentials-interface", - "nym-crypto", - "nym-ecash-contract-common", - "nym-ecash-time", - "nym-http-api-client", - "nym-id", - "nym-mixnet-contract-common", - "nym-multisig-contract-common", - "nym-network-defaults", - "nym-pemstore", - "nym-sphinx", - "nym-types", - "nym-validator-client", - "nym-vesting-contract-common", - "rand 0.8.5", - "serde", - "serde_json", - "tap", - "tempfile", - "thiserror 2.0.17", - "time", - "tokio", - "toml 0.8.23", - "url", - "zeroize", -] - -[[package]] -name = "nym-client" -version = "1.1.65" -dependencies = [ - "bs58", - "clap", - "dirs", - "futures", - "log", - "nym-bandwidth-controller", - "nym-bin-common", - "nym-client-core", - "nym-client-websocket-requests", - "nym-config", - "nym-credential-storage", - "nym-credentials", - "nym-crypto", - "nym-gateway-requests", - "nym-id", - "nym-network-defaults", - "nym-pemstore", - "nym-sphinx", - "nym-task", - "nym-topology", - "nym-validator-client", - "rand 0.8.5", - "serde", - "serde_json", - "tap", - "thiserror 2.0.17", - "time", - "tokio", - "tokio-tungstenite", - "url", - "zeroize", -] - -[[package]] -name = "nym-client-core" -version = "1.1.15" -dependencies = [ - "async-trait", - "base64 0.21.7", - "bincode", - "bs58", - "cfg-if", - "clap", - "comfy-table", - "futures", - "gloo-timers", - "http-body-util", - "humantime", - "hyper 1.7.0", - "hyper-util", - "nym-bandwidth-controller", - "nym-client-core-config-types", - "nym-client-core-gateways-storage", - "nym-client-core-surb-storage", - "nym-credential-storage", - "nym-credentials-interface", - "nym-crypto", - "nym-ecash-time", - "nym-gateway-client", - "nym-gateway-requests", - "nym-http-api-client", - "nym-id", - "nym-mixnet-client", - "nym-mixnet-contract-common", - "nym-network-defaults", - "nym-nonexhaustive-delayqueue", - "nym-pemstore", - "nym-sphinx", - "nym-statistics-common", - "nym-task", - "nym-topology", - "nym-validator-client", - "rand 0.8.5", - "rand_chacha 0.3.1", - "serde", - "serde_json", - "sha2 0.10.9", - "si-scale", - "tempfile", - "thiserror 2.0.17", - "time", - "tokio", - "tokio-stream", - "tokio-tungstenite", - "tokio-util", - "tokio_with_wasm", - "tracing", - "tungstenite 0.20.1", - "url", - "wasm-bindgen", - "wasm-bindgen-futures", - "wasm-utils", - "wasmtimer", - "zeroize", -] - -[[package]] -name = "nym-client-core-config-types" -version = "0.1.0" -dependencies = [ - "humantime-serde", - "nym-config", - "nym-pemstore", - "nym-sphinx-addressing", - "nym-sphinx-params", - "nym-statistics-common", - "serde", - "thiserror 2.0.17", - "url", -] - -[[package]] -name = "nym-client-core-gateways-storage" -version = "0.1.0" -dependencies = [ - "anyhow", - "async-trait", - "cosmrs", - "nym-crypto", - "nym-gateway-requests", - "serde", - "sqlx", - "thiserror 2.0.17", - "time", - "tokio", - "tracing", - "url", - "zeroize", -] - -[[package]] -name = "nym-client-core-surb-storage" -version = "0.1.0" -dependencies = [ - "anyhow", - "async-trait", - "dashmap", - "nym-crypto", - "nym-sphinx", - "nym-task", - "sqlx", - "sqlx-pool-guard", - "thiserror 2.0.17", - "time", - "tokio", - "tracing", -] - -[[package]] -name = "nym-client-wasm" -version = "1.4.0-rc.0" -dependencies = [ - "anyhow", - "futures", - "gloo-timers", - "js-sys", - "nym-bin-common", - "nym-gateway-requests", - "nym-node-tester-utils", - "nym-node-tester-wasm", - "once_cell", - "rand 0.8.5", - "serde", - "serde-wasm-bindgen 0.6.5", - "serde_json", - "thiserror 2.0.17", - "tokio", - "tokio_with_wasm", - "tsify", - "wasm-bindgen", - "wasm-bindgen-futures", - "wasm-bindgen-test", - "wasm-client-core", - "wasm-utils", - "web-sys", -] - -[[package]] -name = "nym-client-websocket-requests" -version = "0.1.0" -dependencies = [ - "nym-sphinx", - "serde", - "serde_json", -] - -[[package]] -name = "nym-coconut-dkg-common" -version = "0.1.0" -dependencies = [ - "cosmwasm-schema", - "cosmwasm-std", - "cw-utils", - "cw2", - "cw4", - "nym-contracts-common", - "nym-multisig-contract-common", -] - -[[package]] -name = "nym-common" -version = "1.18.0" -dependencies = [ - "tracing", - "tracing-test", -] - -[[package]] -name = "nym-compact-ecash" -version = "0.1.0" -dependencies = [ - "bincode", - "bls12_381", - "bs58", - "cfg-if", - "criterion", - "digest 0.10.7", - "ff", - "group", - "itertools 0.14.0", - "nym-network-defaults", - "nym-pemstore", - "rand 0.8.5", - "rayon", - "serde", - "sha2 0.10.9", - "subtle 2.6.1", - "thiserror 2.0.17", - "zeroize", -] - -[[package]] -name = "nym-config" -version = "0.1.0" -dependencies = [ - "dirs", - "handlebars", - "log", - "nym-network-defaults", - "serde", - "thiserror 2.0.17", - "toml 0.8.23", - "url", -] - -[[package]] -name = "nym-connection-monitor" -version = "1.18.0" -dependencies = [ - "bincode", - "bytes", - "futures", - "nym-common", - "nym-config", - "nym-ip-packet-requests", - "nym-sdk", - "pnet_packet", - "thiserror 2.0.17", - "tokio", - "tokio-util", - "tracing", -] - -[[package]] -name = "nym-contracts-common" -version = "0.5.0" -dependencies = [ - "anyhow", - "bs58", - "cosmwasm-schema", - "cosmwasm-std", - "cw-storage-plus", - "schemars 0.8.22", - "serde", - "serde_json", - "thiserror 2.0.17", - "utoipa", - "vergen 8.3.1", -] - -[[package]] -name = "nym-contracts-common-testing" -version = "0.1.0" -dependencies = [ - "anyhow", - "cosmwasm-std", - "cw-multi-test", - "cw-storage-plus", - "nym-contracts-common", - "rand 0.8.5", - "rand_chacha 0.3.1", - "serde", -] - -[[package]] -name = "nym-cpp-ffi" -version = "0.1.2" -dependencies = [ - "anyhow", - "bs58", - "lazy_static", - "nym-bin-common", - "nym-ffi-shared", - "nym-sdk", - "nym-sphinx-anonymous-replies", - "tokio", -] - -[[package]] -name = "nym-credential-proxy" -version = "0.3.0" -dependencies = [ - "anyhow", - "axum", - "bip39", - "bs58", - "cfg-if", - "clap", - "futures", - "humantime", - "nym-bin-common", - "nym-compact-ecash", - "nym-config", - "nym-credential-proxy-lib", - "nym-credential-proxy-requests", - "nym-credentials", - "nym-credentials-interface", - "nym-crypto", - "nym-ecash-contract-common", - "nym-ecash-signer-check", - "nym-http-api-client", - "nym-http-api-common", - "nym-network-defaults", - "nym-pemstore", - "nym-upgrade-mode-check", - "nym-validator-client", - "rand 0.8.5", - "reqwest 0.12.24", - "serde", - "serde_json", - "sqlx", - "strum", - "strum_macros", - "tempfile", - "thiserror 2.0.17", - "time", - "tokio", - "tokio-util", - "tower-http 0.5.2", - "tracing", - "url", - "utoipa", - "utoipa-swagger-ui", - "uuid", - "zeroize", -] - -[[package]] -name = "nym-credential-proxy-lib" -version = "0.1.0" -dependencies = [ - "anyhow", - "axum", - "bip39", - "bs58", - "futures", - "humantime", - "nym-cache", - "nym-compact-ecash", - "nym-credential-proxy-requests", - "nym-credentials", - "nym-credentials-interface", - "nym-crypto", - "nym-ecash-contract-common", - "nym-ecash-signer-check", - "nym-network-defaults", - "nym-validator-client", - "rand 0.8.5", - "reqwest 0.12.24", - "serde", - "serde_json", - "sqlx", - "strum", - "strum_macros", - "tempfile", - "thiserror 2.0.17", - "time", - "tokio", - "tokio-util", - "tracing", - "url", - "uuid", - "zeroize", -] - -[[package]] -name = "nym-credential-proxy-requests" -version = "0.1.0" -dependencies = [ - "async-trait", - "nym-credentials", - "nym-credentials-interface", - "nym-http-api-client", - "nym-http-api-common", - "nym-serde-helpers", - "nym-upgrade-mode-check", - "reqwest 0.12.24", - "schemars 0.8.22", - "serde", - "serde_json", - "serde_with", - "time", - "tsify", - "utoipa", - "uuid", - "wasm-bindgen", - "wasmtimer", -] - -[[package]] -name = "nym-credential-storage" -version = "0.1.0" -dependencies = [ - "anyhow", - "async-trait", - "bincode", - "log", - "nym-compact-ecash", - "nym-credentials", - "nym-credentials-interface", - "nym-crypto", - "nym-ecash-time", - "nym-test-utils", - "serde", - "sqlx", - "sqlx-pool-guard", - "thiserror 2.0.17", - "tokio", - "zeroize", -] - -[[package]] -name = "nym-credential-utils" -version = "0.1.0" -dependencies = [ - "log", - "nym-bandwidth-controller", - "nym-client-core", - "nym-config", - "nym-credential-storage", - "nym-credentials", - "nym-credentials-interface", - "nym-ecash-time", - "nym-validator-client", - "thiserror 2.0.17", - "time", - "tokio", -] - -[[package]] -name = "nym-credential-verification" -version = "0.1.0" -dependencies = [ - "async-trait", - "bs58", - "cosmwasm-std", - "cw-utils", - "dyn-clone", - "futures", - "nym-api-requests", - "nym-credentials", - "nym-credentials-interface", - "nym-ecash-contract-common", - "nym-gateway-requests", - "nym-gateway-storage", - "nym-task", - "nym-validator-client", - "rand 0.8.5", - "si-scale", - "thiserror 2.0.17", - "time", - "tokio", - "tracing", -] - -[[package]] -name = "nym-credentials" -version = "0.1.0" -dependencies = [ - "bincode", - "bls12_381", - "cosmrs", - "log", - "nym-api-requests", - "nym-credentials-interface", - "nym-crypto", - "nym-ecash-contract-common", - "nym-ecash-time", - "nym-http-api-client", - "nym-network-defaults", - "nym-serde-helpers", - "nym-validator-client", - "rand 0.8.5", - "serde", - "thiserror 2.0.17", - "time", - "zeroize", -] - -[[package]] -name = "nym-credentials-interface" -version = "0.1.0" -dependencies = [ - "bls12_381", - "nym-compact-ecash", - "nym-ecash-time", - "nym-network-defaults", - "rand 0.8.5", - "serde", - "strum", - "strum_macros", - "thiserror 2.0.17", - "time", - "utoipa", -] - -[[package]] -name = "nym-crypto" -version = "0.4.0" -dependencies = [ - "aead", - "aes", - "aes-gcm-siv", - "anyhow", - "base64 0.22.1", - "blake3", - "bs58", - "cipher", - "ctr", - "digest 0.10.7", - "ed25519-dalek", - "generic-array 0.14.9", - "hkdf", - "hmac", - "jwt-simple", - "nym-pemstore", - "nym-sphinx-types", - "nym-test-utils", - "rand 0.8.5", - "rand_chacha 0.3.1", - "serde", - "serde_bytes", - "serde_json", - "sha2 0.10.9", - "subtle-encoding", - "thiserror 2.0.17", - "x25519-dalek", - "zeroize", -] - -[[package]] -name = "nym-dkg" -version = "0.1.0" -dependencies = [ - "bitvec", - "bls12_381", - "bs58", - "criterion", - "ff", - "group", - "nym-contracts-common", - "nym-pemstore", - "rand 0.8.5", - "rand_chacha 0.3.1", - "rand_core 0.6.4", - "serde", - "serde_derive", - "sha2 0.10.9", - "thiserror 2.0.17", - "zeroize", -] - -[[package]] -name = "nym-ecash-contract-common" -version = "0.1.0" -dependencies = [ - "bs58", - "cosmwasm-schema", - "cosmwasm-std", - "cw-controllers", - "cw-utils", - "cw2", - "nym-multisig-contract-common", - "thiserror 2.0.17", -] - -[[package]] -name = "nym-ecash-signer-check" -version = "0.1.0" -dependencies = [ - "futures", - "nym-ecash-signer-check-types", - "nym-http-api-client", - "nym-network-defaults", - "nym-validator-client", - "semver 1.0.27", - "thiserror 2.0.17", - "tokio", - "tracing", - "url", -] - -[[package]] -name = "nym-ecash-signer-check-types" -version = "0.1.0" -dependencies = [ - "nym-coconut-dkg-common", - "nym-crypto", - "semver 1.0.27", - "serde", - "thiserror 2.0.17", - "time", - "tracing", - "url", - "utoipa", -] - -[[package]] -name = "nym-ecash-time" -version = "0.1.0" -dependencies = [ - "nym-compact-ecash", - "time", -] - -[[package]] -name = "nym-exit-policy" -version = "0.1.0" -dependencies = [ - "reqwest 0.12.24", - "serde", - "serde_json", - "thiserror 2.0.17", - "tracing", - "utoipa", -] - -[[package]] -name = "nym-ffi-shared" -version = "0.2.1" -dependencies = [ - "anyhow", - "bs58", - "lazy_static", - "nym-bin-common", - "nym-crypto", - "nym-sdk", - "nym-sphinx-anonymous-replies", - "tokio", - "uniffi", - "uniffi_build", -] - -[[package]] -name = "nym-gateway" -version = "1.1.36" -dependencies = [ - "anyhow", - "async-trait", - "bincode", - "bip39", - "bs58", - "dashmap", - "defguard_wireguard_rs", - "fastrand 2.3.0", - "futures", - "ipnetwork", - "mock_instant", - "nym-api-requests", - "nym-authenticator-requests", - "nym-client-core", - "nym-credential-verification", - "nym-credentials", - "nym-credentials-interface", - "nym-crypto", - "nym-gateway-requests", - "nym-gateway-stats-storage", - "nym-gateway-storage", - "nym-id", - "nym-ip-packet-router", - "nym-mixnet-client", - "nym-mixnode-common", - "nym-network-defaults", - "nym-network-requester", - "nym-node-metrics", - "nym-sdk", - "nym-service-provider-requests-common", - "nym-sphinx", - "nym-statistics-common", - "nym-task", - "nym-topology", - "nym-types", - "nym-validator-client", - "nym-wireguard", - "nym-wireguard-private-metadata-server", - "nym-wireguard-types", - "rand 0.8.5", - "serde", - "sha2 0.10.9", - "thiserror 2.0.17", - "time", - "tokio", - "tokio-stream", - "tokio-tungstenite", - "tokio-util", - "tracing", - "url", - "zeroize", -] - -[[package]] -name = "nym-gateway-client" -version = "0.1.0" -dependencies = [ - "futures", - "getrandom 0.2.16", - "gloo-utils 0.2.0", - "nym-bandwidth-controller", - "nym-credential-storage", - "nym-credentials", - "nym-credentials-interface", - "nym-crypto", - "nym-gateway-requests", - "nym-http-api-client", - "nym-network-defaults", - "nym-pemstore", - "nym-sphinx", - "nym-statistics-common", - "nym-task", - "nym-validator-client", - "rand 0.8.5", - "serde", - "si-scale", - "thiserror 2.0.17", - "time", - "tokio", - "tokio-stream", - "tokio-tungstenite", - "tracing", - "tungstenite 0.20.1", - "url", - "wasm-bindgen", - "wasm-bindgen-futures", - "wasm-utils", - "wasmtimer", - "zeroize", -] - -[[package]] -name = "nym-gateway-probe" -version = "1.18.0" -dependencies = [ - "anyhow", - "base64 0.22.1", - "bincode", - "bs58", - "bytes", - "clap", - "futures", - "hex", - "nym-authenticator-client", - "nym-authenticator-requests", - "nym-bandwidth-controller", - "nym-bin-common", - "nym-client-core", - "nym-config", - "nym-connection-monitor", - "nym-credential-utils", - "nym-credentials", - "nym-credentials-interface", - "nym-crypto", - "nym-http-api-client", - "nym-http-api-client-macro", - "nym-ip-packet-client", - "nym-ip-packet-requests", - "nym-node-status-client", - "nym-sdk", - "nym-topology", - "nym-validator-client", - "pnet_packet", - "rand 0.8.5", - "serde", - "serde_json", - "thiserror 2.0.17", - "tokio", - "tokio-util", - "tracing", - "tracing-subscriber", - "url", - "vergen-gitcl", - "x25519-dalek", -] - -[[package]] -name = "nym-gateway-requests" -version = "0.1.0" -dependencies = [ - "anyhow", - "bs58", - "futures", - "generic-array 0.14.9", - "nym-compact-ecash", - "nym-credentials", - "nym-credentials-interface", - "nym-crypto", - "nym-pemstore", - "nym-serde-helpers", - "nym-sphinx", - "nym-statistics-common", - "nym-task", - "nym-test-utils", - "rand 0.8.5", - "serde", - "serde_json", - "strum", - "subtle 2.6.1", - "thiserror 2.0.17", - "time", - "tokio", - "tracing", - "tungstenite 0.20.1", - "wasmtimer", - "zeroize", -] - -[[package]] -name = "nym-gateway-stats-storage" -version = "0.1.0" -dependencies = [ - "anyhow", - "nym-node-metrics", - "nym-sphinx", - "nym-statistics-common", - "sqlx", - "strum", - "thiserror 2.0.17", - "time", - "tokio", - "tracing", -] - -[[package]] -name = "nym-gateway-storage" -version = "0.1.0" -dependencies = [ - "anyhow", - "async-trait", - "bincode", - "defguard_wireguard_rs", - "dyn-clone", - "nym-credentials-interface", - "nym-gateway-requests", - "nym-sphinx", - "sqlx", - "thiserror 2.0.17", - "time", - "tokio", - "tracing", -] - -[[package]] -name = "nym-go-ffi" -version = "0.2.2" -dependencies = [ - "anyhow", - "lazy_static", - "nym-bin-common", - "nym-crypto", - "nym-ffi-shared", - "nym-sdk", - "nym-sphinx-anonymous-replies", - "thiserror 2.0.17", - "tokio", - "uniffi", - "uniffi_build", -] - -[[package]] -name = "nym-group-contract-common" -version = "0.1.0" -dependencies = [ - "cosmwasm-schema", - "cw-controllers", - "cw4", - "schemars 0.8.22", - "serde", -] - -[[package]] -name = "nym-http-api-client" -version = "0.1.0" -dependencies = [ - "async-trait", - "bincode", - "bytes", - "cfg-if", - "encoding_rs", - "hickory-resolver", - "http 1.3.1", - "inventory", - "itertools 0.14.0", - "mime", - "nym-bin-common", - "nym-http-api-client-macro", - "nym-http-api-common", - "nym-network-defaults", - "once_cell", - "reqwest 0.12.24", - "serde", - "serde_json", - "serde_plain", - "serde_yaml", - "thiserror 2.0.17", - "tokio", - "tracing", - "url", - "wasmtimer", -] - -[[package]] -name = "nym-http-api-client-macro" -version = "0.1.0" -dependencies = [ - "nym-http-api-client", - "proc-macro-crate", - "proc-macro2", - "quote", - "reqwest 0.12.24", - "syn 2.0.107", - "uuid", -] - -[[package]] -name = "nym-http-api-common" -version = "0.1.0" -dependencies = [ - "axum", - "axum-client-ip", - "bincode", - "bytes", - "colored", - "futures", - "mime", - "serde", - "serde_json", - "serde_yaml", - "subtle 2.6.1", - "time", - "tower 0.5.2", - "tracing", - "utoipa", - "zeroize", -] - -[[package]] -name = "nym-id" -version = "0.1.0" -dependencies = [ - "nym-credential-storage", - "nym-credentials", - "thiserror 2.0.17", - "time", - "tracing", - "zeroize", -] - -[[package]] -name = "nym-id-cli" -version = "0.1.0" -dependencies = [ - "anyhow", - "bs58", - "clap", - "nym-bin-common", - "nym-credential-storage", - "nym-id", - "tokio", - "tracing", -] - -[[package]] -name = "nym-inclusion-probability" -version = "0.1.0" -dependencies = [ - "log", - "rand 0.8.5", - "thiserror 2.0.17", -] - -[[package]] -name = "nym-ip-packet-client" -version = "0.1.0" -dependencies = [ - "bincode", - "bytes", - "futures", - "nym-ip-packet-requests", - "nym-sdk", - "thiserror 2.0.17", - "tokio", - "tokio-util", - "tracing", -] - -[[package]] -name = "nym-ip-packet-requests" -version = "0.1.0" -dependencies = [ - "bincode", - "bytes", - "nym-bin-common", - "nym-crypto", - "nym-service-provider-requests-common", - "nym-sphinx", - "rand 0.8.5", - "serde", - "thiserror 2.0.17", - "time", - "tokio", - "tokio-util", -] - -[[package]] -name = "nym-ip-packet-router" -version = "0.1.0" -dependencies = [ - "anyhow", - "async-trait", - "bincode", - "bs58", - "bytes", - "clap", - "etherparse", - "futures", - "log", - "nym-bin-common", - "nym-client-core", - "nym-config", - "nym-crypto", - "nym-exit-policy", - "nym-id", - "nym-ip-packet-requests", - "nym-network-defaults", - "nym-network-requester", - "nym-sdk", - "nym-service-provider-requests-common", - "nym-service-providers-common", - "nym-sphinx", - "nym-task", - "nym-tun", - "nym-types", - "nym-wireguard", - "nym-wireguard-types", - "rand 0.8.5", - "reqwest 0.12.24", - "serde", - "serde_json", - "thiserror 2.0.17", - "time", - "tokio", - "tokio-tun", - "tokio-util", - "url", -] - -[[package]] -name = "nym-ledger" -version = "0.1.0" -dependencies = [ - "bip32", - "k256", - "ledger-transport", - "ledger-transport-hid", - "thiserror 2.0.17", -] - -[[package]] -name = "nym-metrics" -version = "0.1.0" -dependencies = [ - "dashmap", - "lazy_static", - "prometheus", - "tracing", -] - -[[package]] -name = "nym-mixnet-client" -version = "0.1.0" -dependencies = [ - "dashmap", - "futures", - "nym-crypto", - "nym-noise", - "nym-sphinx", - "nym-task", - "rand 0.8.5", - "tokio", - "tokio-stream", - "tokio-util", - "tracing", -] - -[[package]] -name = "nym-mixnet-contract-common" -version = "0.6.0" -dependencies = [ - "bs58", - "cosmwasm-schema", - "cosmwasm-std", - "cw-controllers", - "cw-storage-plus", - "cw2", - "humantime-serde", - "nym-contracts-common", - "rand_chacha 0.3.1", - "schemars 0.8.22", - "semver 1.0.27", - "serde", - "serde_repr", - "thiserror 2.0.17", - "time", - "ts-rs", - "utoipa", -] - -[[package]] -name = "nym-mixnode-common" -version = "0.1.0" -dependencies = [ - "bytes", - "futures", - "humantime-serde", - "log", - "nym-crypto", - "nym-metrics", - "nym-network-defaults", - "nym-sphinx-acknowledgements", - "nym-sphinx-addressing", - "nym-sphinx-forwarding", - "nym-sphinx-framing", - "nym-sphinx-params", - "nym-sphinx-types", - "nym-task", - "rand 0.8.5", - "serde", - "thiserror 2.0.17", - "time", - "tokio", - "tokio-util", - "url", -] - -[[package]] -name = "nym-multisig-contract-common" -version = "0.1.0" -dependencies = [ - "cosmwasm-schema", - "cosmwasm-std", - "cw-storage-plus", - "cw-utils", - "cw3", - "cw4", - "schemars 0.8.22", - "serde", - "thiserror 2.0.17", -] - -[[package]] -name = "nym-network-defaults" -version = "0.1.0" -dependencies = [ - "cargo_metadata 0.19.2", - "dotenvy", - "log", - "regex", - "schemars 0.8.22", - "serde", - "url", - "utoipa", -] - -[[package]] -name = "nym-network-monitor" -version = "1.0.2" -dependencies = [ - "anyhow", - "axum", - "clap", - "dashmap", - "futures", - "log", - "nym-bin-common", - "nym-client-core", - "nym-crypto", - "nym-gateway-requests", - "nym-http-api-client", - "nym-mixnet-contract-common", - "nym-network-defaults", - "nym-sdk", - "nym-sphinx", - "nym-topology", - "nym-types", - "nym-validator-client", - "petgraph", - "rand 0.8.5", - "rand_chacha 0.3.1", - "reqwest 0.12.24", - "serde", - "serde_json", - "tokio", - "tokio-postgres", - "tokio-util", - "utoipa", - "utoipa-swagger-ui", -] - -[[package]] -name = "nym-network-requester" -version = "1.1.66" -dependencies = [ - "addr", - "anyhow", - "async-trait", - "bs58", - "clap", - "dirs", - "futures", - "humantime-serde", - "ipnetwork", - "log", - "nym-async-file-watcher", - "nym-bin-common", - "nym-client-core", - "nym-client-websocket-requests", - "nym-config", - "nym-credential-storage", - "nym-credentials", - "nym-crypto", - "nym-exit-policy", - "nym-id", - "nym-network-defaults", - "nym-ordered-buffer", - "nym-sdk", - "nym-service-providers-common", - "nym-socks5-proxy-helpers", - "nym-socks5-requests", - "nym-sphinx", - "nym-task", - "nym-types", - "publicsuffix", - "rand 0.8.5", - "regex", - "reqwest 0.12.24", - "serde", - "serde_json", - "sqlx", - "tap", - "tempfile", - "thiserror 2.0.17", - "time", - "tokio", - "tokio-tungstenite", - "tokio-util", - "url", - "zeroize", -] - -[[package]] -name = "nym-node" -version = "1.20.0" -dependencies = [ - "anyhow", - "arc-swap", - "arrayref", - "async-trait", - "axum", - "bip39", - "blake2 0.8.1", - "bloomfilter", - "bs58", - "cargo_metadata 0.19.2", - "celes", - "cfg-if", - "chacha", - "clap", - "colored", - "console-subscriber", - "criterion", - "csv", - "cupid", - "futures", - "hkdf", - "human-repr", - "humantime-serde", - "indicatif", - "ipnetwork", - "lioness", - "nym-bin-common", - "nym-client-core-config-types", - "nym-config", - "nym-crypto", - "nym-gateway", - "nym-gateway-stats-storage", - "nym-http-api-client", - "nym-http-api-common", - "nym-ip-packet-router", - "nym-metrics", - "nym-mixnet-client", - "nym-network-requester", - "nym-node-metrics", - "nym-node-requests", - "nym-noise", - "nym-noise-keys", - "nym-nonexhaustive-delayqueue", - "nym-pemstore", - "nym-sphinx-acknowledgements", - "nym-sphinx-addressing", - "nym-sphinx-forwarding", - "nym-sphinx-framing", - "nym-sphinx-params", - "nym-sphinx-routing", - "nym-sphinx-types", - "nym-statistics-common", - "nym-task", - "nym-topology", - "nym-types", - "nym-validator-client", - "nym-verloc", - "nym-wireguard", - "nym-wireguard-types", - "rand 0.8.5", - "rand_chacha 0.3.1", - "serde", - "serde_json", - "sha2 0.10.9", - "sysinfo", - "thiserror 2.0.17", - "time", - "tokio", - "tokio-stream", - "tokio-util", - "toml 0.8.23", - "tower-http 0.5.2", - "tracing", - "tracing-indicatif", - "tracing-subscriber", - "url", - "utoipa", - "utoipa-swagger-ui", - "zeroize", -] - -[[package]] -name = "nym-node-metrics" -version = "0.1.0" -dependencies = [ - "dashmap", - "futures", - "nym-metrics", - "nym-statistics-common", - "strum", - "time", - "tokio", - "tracing", -] - -[[package]] -name = "nym-node-requests" -version = "0.1.0" -dependencies = [ - "async-trait", - "celes", - "humantime", - "humantime-serde", - "nym-bin-common", - "nym-crypto", - "nym-exit-policy", - "nym-http-api-client", - "nym-noise-keys", - "nym-wireguard-types", - "rand_chacha 0.3.1", - "schemars 0.8.22", - "serde", - "serde_json", - "strum", - "strum_macros", - "thiserror 2.0.17", - "time", - "tokio", - "utoipa", -] - -[[package]] -name = "nym-node-status-agent" -version = "1.0.7" -dependencies = [ - "anyhow", - "clap", - "futures", - "nym-bin-common", - "nym-crypto", - "nym-node-status-client", - "rand 0.8.5", - "tempfile", - "tokio", - "tracing", - "tracing-subscriber", -] - -[[package]] -name = "nym-node-status-api" -version = "4.0.11-rc1" -dependencies = [ - "ammonia", - "anyhow", - "axum", - "axum-test", - "bip39", - "bs58", - "celes", - "clap", - "cosmwasm-std", - "futures-util", - "humantime", - "itertools 0.14.0", - "moka", - "nym-bin-common", - "nym-contracts-common", - "nym-credential-proxy-lib", - "nym-credentials", - "nym-crypto", - "nym-ecash-time", - "nym-http-api-client", - "nym-http-api-common", - "nym-mixnet-contract-common", - "nym-network-defaults", - "nym-node-metrics", - "nym-node-requests", - "nym-node-status-client", - "nym-serde-helpers", - "nym-statistics-common", - "nym-task", - "nym-validator-client", - "rand 0.8.5", - "rand_chacha 0.3.1", - "regex", - "reqwest 0.12.24", - "semver 1.0.27", - "serde", - "serde_json", - "serde_json_path", - "sqlx", - "strum", - "strum_macros", - "thiserror 2.0.17", - "time", - "tokio", - "tokio-stream", - "tokio-util", - "tower-http 0.5.2", - "tracing", - "tracing-log 0.2.0", - "tracing-subscriber", - "utoipa", - "utoipa-swagger-ui", - "utoipauto", - "zeroize", -] - -[[package]] -name = "nym-node-status-client" -version = "0.2.0" -dependencies = [ - "anyhow", - "bincode", - "bs58", - "nym-credentials", - "nym-crypto", - "reqwest 0.12.24", - "serde", - "serde_json", - "time", - "tracing", -] - -[[package]] -name = "nym-node-tester-utils" -version = "0.1.0" -dependencies = [ - "futures", - "log", - "nym-crypto", - "nym-sphinx", - "nym-sphinx-params", - "nym-task", - "nym-topology", - "rand 0.8.5", - "rand_chacha 0.3.1", - "serde", - "serde_json", - "thiserror 2.0.17", - "tokio", - "wasm-utils", -] - -[[package]] -name = "nym-node-tester-wasm" -version = "1.3.0-rc.0" -dependencies = [ - "futures", - "js-sys", - "nym-node-tester-utils", - "rand 0.8.5", - "serde", - "serde-wasm-bindgen 0.6.5", - "thiserror 2.0.17", - "tokio", - "tsify", - "wasm-bindgen", - "wasm-bindgen-futures", - "wasm-client-core", - "wasm-utils", - "wasmtimer", -] - -[[package]] -name = "nym-noise" -version = "0.1.0" -dependencies = [ - "anyhow", - "arc-swap", - "bytes", - "futures", - "nym-crypto", - "nym-noise-keys", - "nym-test-utils", - "pin-project", - "rand_chacha 0.3.1", - "sha2 0.10.9", - "snow", - "strum", - "strum_macros", - "thiserror 2.0.17", - "tokio", - "tokio-util", - "tracing", -] - -[[package]] -name = "nym-noise-keys" -version = "0.1.0" -dependencies = [ - "nym-crypto", - "schemars 0.8.22", - "serde", - "utoipa", -] - -[[package]] -name = "nym-nonexhaustive-delayqueue" -version = "0.1.0" -dependencies = [ - "tokio", - "tokio-stream", - "tokio-util", - "wasmtimer", -] - -[[package]] -name = "nym-nr-query" -version = "0.1.0" -dependencies = [ - "anyhow", - "clap", - "log", - "nym-bin-common", - "nym-network-defaults", - "nym-sdk", - "nym-service-providers-common", - "nym-socks5-requests", - "serde", - "tokio", -] - -[[package]] -name = "nym-ordered-buffer" -version = "0.1.0" -dependencies = [ - "log", - "thiserror 2.0.17", -] - -[[package]] -name = "nym-outfox" -version = "0.1.0" -dependencies = [ - "blake3", - "chacha20", - "chacha20poly1305", - "criterion", - "fastrand 2.3.0", - "getrandom 0.2.16", - "log", - "rand 0.8.5", - "rayon", - "sphinx-packet", - "thiserror 2.0.17", - "x25519-dalek", - "zeroize", -] - -[[package]] -name = "nym-pemstore" -version = "0.3.0" -dependencies = [ - "pem", - "tracing", - "zeroize", -] - -[[package]] -name = "nym-performance-contract-common" -version = "0.1.0" -dependencies = [ - "cosmwasm-schema", - "cosmwasm-std", - "cw-controllers", - "nym-contracts-common", - "schemars 0.8.22", - "serde", - "thiserror 2.0.17", -] - -[[package]] -name = "nym-pool-contract-common" -version = "0.1.0" -dependencies = [ - "cosmwasm-schema", - "cosmwasm-std", - "cw-controllers", - "schemars 0.8.22", - "serde", - "thiserror 2.0.17", - "time", -] - -[[package]] -name = "nym-registration-client" -version = "0.1.0" -dependencies = [ - "futures", - "nym-authenticator-client", - "nym-bandwidth-controller", - "nym-credential-storage", - "nym-credentials-interface", - "nym-ip-packet-client", - "nym-registration-common", - "nym-sdk", - "nym-validator-client", - "thiserror 2.0.17", - "tokio", - "tokio-util", - "tracing", - "typed-builder", - "url", -] - -[[package]] -name = "nym-registration-common" -version = "0.1.0" -dependencies = [ - "nym-authenticator-requests", - "nym-crypto", - "nym-ip-packet-requests", - "nym-sphinx", - "tokio-util", -] - -[[package]] -name = "nym-sdk" -version = "0.1.0" -dependencies = [ - "anyhow", - "async-trait", - "bincode", - "bip39", - "bytecodec", - "bytes", - "clap", - "dashmap", - "dirs", - "dotenvy", - "futures", - "hex", - "http 1.3.1", - "httpcodec", - "log", - "nym-bandwidth-controller", - "nym-bin-common", - "nym-client-core", - "nym-credential-storage", - "nym-credential-utils", - "nym-credentials", - "nym-credentials-interface", - "nym-crypto", - "nym-gateway-requests", - "nym-http-api-client", - "nym-network-defaults", - "nym-ordered-buffer", - "nym-service-providers-common", - "nym-socks5-client-core", - "nym-socks5-requests", - "nym-sphinx", - "nym-sphinx-addressing", - "nym-statistics-common", - "nym-task", - "nym-topology", - "nym-validator-client", - "parking_lot", - "rand 0.8.5", - "reqwest 0.12.24", - "serde", - "tap", - "tempfile", - "thiserror 2.0.17", - "time", - "tokio", - "tokio-stream", - "tokio-util", - "toml 0.8.23", - "tracing", - "tracing-subscriber", - "url", - "uuid", - "zeroize", -] - -[[package]] -name = "nym-serde-helpers" -version = "0.1.0" -dependencies = [ - "base64 0.22.1", - "bs58", - "hex", - "serde", - "time", -] - -[[package]] -name = "nym-service-provider-requests-common" -version = "0.1.0" -dependencies = [ - "bincode", - "serde", - "thiserror 2.0.17", -] - -[[package]] -name = "nym-service-providers-common" -version = "0.1.0" -dependencies = [ - "anyhow", - "async-trait", - "log", - "nym-bin-common", - "nym-sdk", - "nym-socks5-requests", - "nym-sphinx-anonymous-replies", - "serde", - "serde_json", - "thiserror 2.0.17", - "tokio", -] - -[[package]] -name = "nym-signers-monitor" -version = "0.1.0" -dependencies = [ - "anyhow", - "clap", - "humantime", - "itertools 0.14.0", - "nym-bin-common", - "nym-ecash-signer-check", - "nym-network-defaults", - "nym-task", - "nym-validator-client", - "time", - "tokio", - "tracing", - "url", - "zulip-client", -] - -[[package]] -name = "nym-socks5-client" -version = "1.1.65" -dependencies = [ - "bs58", - "clap", - "log", - "nym-bin-common", - "nym-client-core", - "nym-config", - "nym-credential-storage", - "nym-credentials", - "nym-crypto", - "nym-gateway-requests", - "nym-id", - "nym-network-defaults", - "nym-ordered-buffer", - "nym-pemstore", - "nym-socks5-client-core", - "nym-sphinx", - "nym-topology", - "nym-validator-client", - "rand 0.8.5", - "serde", - "serde_json", - "tap", - "thiserror 2.0.17", - "time", - "tokio", - "url", - "zeroize", -] - -[[package]] -name = "nym-socks5-client-core" -version = "0.1.0" -dependencies = [ - "anyhow", - "dirs", - "futures", - "log", - "nym-bandwidth-controller", - "nym-client-core", - "nym-config", - "nym-contracts-common", - "nym-credential-storage", - "nym-mixnet-contract-common", - "nym-network-defaults", - "nym-service-providers-common", - "nym-socks5-proxy-helpers", - "nym-socks5-requests", - "nym-sphinx", - "nym-task", - "nym-validator-client", - "pin-project", - "rand 0.8.5", - "reqwest 0.12.24", - "schemars 0.8.22", - "serde", - "tap", - "thiserror 2.0.17", - "tokio", - "tokio-util", - "url", -] - -[[package]] -name = "nym-socks5-proxy-helpers" -version = "0.1.0" -dependencies = [ - "bytes", - "futures", - "log", - "nym-ordered-buffer", - "nym-socks5-requests", - "nym-task", - "tokio", - "tokio-test", - "tokio-util", -] - -[[package]] -name = "nym-socks5-requests" -version = "0.1.0" -dependencies = [ - "bincode", - "log", - "nym-exit-policy", - "nym-service-providers-common", - "nym-sphinx-addressing", - "serde", - "serde_json", - "tap", - "thiserror 2.0.17", -] - -[[package]] -name = "nym-sphinx" -version = "0.1.0" -dependencies = [ - "bincode", - "log", - "nym-crypto", - "nym-metrics", - "nym-mixnet-contract-common", - "nym-sphinx-acknowledgements", - "nym-sphinx-addressing", - "nym-sphinx-anonymous-replies", - "nym-sphinx-chunking", - "nym-sphinx-cover", - "nym-sphinx-forwarding", - "nym-sphinx-framing", - "nym-sphinx-params", - "nym-sphinx-routing", - "nym-sphinx-types", - "nym-topology", - "rand 0.8.5", - "rand_chacha 0.3.1", - "rand_distr", - "serde", - "thiserror 2.0.17", - "tokio", - "tokio-util", - "tracing", -] - -[[package]] -name = "nym-sphinx-acknowledgements" -version = "0.1.0" -dependencies = [ - "generic-array 0.14.9", - "nym-crypto", - "nym-pemstore", - "nym-sphinx-addressing", - "nym-sphinx-params", - "nym-sphinx-routing", - "nym-sphinx-types", - "nym-topology", - "rand 0.8.5", - "serde", - "thiserror 2.0.17", - "zeroize", -] - -[[package]] -name = "nym-sphinx-addressing" -version = "0.1.0" -dependencies = [ - "bincode", - "nym-crypto", - "nym-sphinx-types", - "rand 0.8.5", - "serde", - "serde_json", - "thiserror 2.0.17", -] - -[[package]] -name = "nym-sphinx-anonymous-replies" -version = "0.1.0" -dependencies = [ - "bs58", - "nym-crypto", - "nym-sphinx-addressing", - "nym-sphinx-params", - "nym-sphinx-routing", - "nym-sphinx-types", - "nym-topology", - "rand 0.8.5", - "rand_chacha 0.3.1", - "serde", - "thiserror 2.0.17", - "tracing", - "wasm-bindgen", -] - -[[package]] -name = "nym-sphinx-chunking" -version = "0.1.0" -dependencies = [ - "dashmap", - "log", - "nym-crypto", - "nym-metrics", - "nym-sphinx-addressing", - "nym-sphinx-params", - "nym-sphinx-types", - "rand 0.8.5", - "serde", - "thiserror 2.0.17", - "utoipa", - "wasmtimer", -] - -[[package]] -name = "nym-sphinx-cover" -version = "0.1.0" -dependencies = [ - "nym-crypto", - "nym-sphinx-acknowledgements", - "nym-sphinx-addressing", - "nym-sphinx-chunking", - "nym-sphinx-forwarding", - "nym-sphinx-params", - "nym-sphinx-routing", - "nym-sphinx-types", - "nym-topology", - "rand 0.8.5", - "thiserror 2.0.17", -] - -[[package]] -name = "nym-sphinx-forwarding" -version = "0.1.0" -dependencies = [ - "nym-sphinx-addressing", - "nym-sphinx-anonymous-replies", - "nym-sphinx-params", - "nym-sphinx-types", - "serde", - "thiserror 2.0.17", -] - -[[package]] -name = "nym-sphinx-framing" -version = "0.1.0" -dependencies = [ - "bytes", - "nym-sphinx-acknowledgements", - "nym-sphinx-addressing", - "nym-sphinx-forwarding", - "nym-sphinx-params", - "nym-sphinx-types", - "thiserror 2.0.17", - "tokio", - "tokio-util", - "tracing", -] - -[[package]] -name = "nym-sphinx-params" -version = "0.1.0" -dependencies = [ - "nym-crypto", - "nym-sphinx-types", - "serde", - "thiserror 2.0.17", -] - -[[package]] -name = "nym-sphinx-routing" -version = "0.1.0" -dependencies = [ - "nym-sphinx-addressing", - "nym-sphinx-types", - "thiserror 2.0.17", -] - -[[package]] -name = "nym-sphinx-types" -version = "0.2.0" -dependencies = [ - "nym-outfox", - "sphinx-packet", - "thiserror 2.0.17", -] - -[[package]] -name = "nym-statistics-api" -version = "0.2.1" -dependencies = [ - "anyhow", - "axum", - "axum-client-ip", - "axum-extra", - "celes", - "clap", - "nym-bin-common", - "nym-http-api-client", - "nym-http-api-common", - "nym-statistics-common", - "nym-task", - "nym-validator-client", - "serde", - "serde_json", - "sqlx", - "time", - "tokio", - "tokio-util", - "tower-http 0.5.2", - "tracing", - "tracing-subscriber", - "url", - "utoipa", - "utoipa-swagger-ui", - "utoipauto", -] - -[[package]] -name = "nym-statistics-common" -version = "0.1.0" -dependencies = [ - "futures", - "log", - "nym-credentials-interface", - "nym-crypto", - "nym-metrics", - "nym-sphinx", - "nym-task", - "serde", - "serde_json", - "sha2 0.10.9", - "si-scale", - "strum", - "strum_macros", - "sysinfo", - "thiserror 2.0.17", - "time", - "tokio", - "utoipa", - "wasmtimer", -] - -[[package]] -name = "nym-store-cipher" -version = "0.1.0" -dependencies = [ - "aes-gcm", - "argon2", - "generic-array 0.14.9", - "getrandom 0.2.16", - "rand 0.8.5", - "serde", - "serde_json", - "thiserror 2.0.17", - "zeroize", -] - -[[package]] -name = "nym-task" -version = "0.1.0" -dependencies = [ - "anyhow", - "cfg-if", - "futures", - "log", - "nym-test-utils", - "serde", - "thiserror 2.0.17", - "tokio", - "tokio-util", - "tracing", - "wasm-bindgen", - "wasm-bindgen-futures", - "wasmtimer", -] - -[[package]] -name = "nym-test-utils" -version = "0.1.0" -dependencies = [ - "anyhow", - "futures", - "rand_chacha 0.3.1", - "tokio", -] - -[[package]] -name = "nym-ticketbooks-merkle" -version = "0.1.0" -dependencies = [ - "nym-credentials-interface", - "nym-serde-helpers", - "rand 0.8.5", - "rand_chacha 0.3.1", - "rs_merkle", - "schemars 0.8.22", - "serde", - "serde_json", - "sha2 0.10.9", - "time", - "utoipa", -] - -[[package]] -name = "nym-topology" -version = "0.1.0" -dependencies = [ - "async-trait", - "nym-api-requests", - "nym-crypto", - "nym-mixnet-contract-common", - "nym-sphinx-addressing", - "nym-sphinx-types", - "rand 0.8.5", - "reqwest 0.12.24", - "serde", - "serde_json", - "thiserror 2.0.17", - "time", - "tracing", - "tsify", - "wasm-bindgen", - "wasm-utils", -] - -[[package]] -name = "nym-tun" -version = "0.1.0" -dependencies = [ - "etherparse", - "log", - "nym-wireguard-types", - "thiserror 2.0.17", - "tokio", - "tokio-tun", -] - -[[package]] -name = "nym-types" -version = "1.0.0" -dependencies = [ - "base64 0.22.1", - "cosmrs", - "cosmwasm-std", - "eyre", - "hmac", - "itertools 0.14.0", - "log", - "nym-config", - "nym-crypto", - "nym-mixnet-contract-common", - "nym-validator-client", - "nym-vesting-contract-common", - "reqwest 0.12.24", - "schemars 0.8.22", - "serde", - "serde_json", - "sha2 0.10.9", - "strum", - "strum_macros", - "tempfile", - "thiserror 2.0.17", - "ts-rs", - "url", - "utoipa", - "x25519-dalek", -] - -[[package]] -name = "nym-upgrade-mode-check" -version = "0.1.0" -dependencies = [ - "anyhow", - "jwt-simple", - "nym-crypto", - "nym-http-api-client", - "nym-test-utils", - "reqwest 0.12.24", - "serde", - "serde_json", - "thiserror 2.0.17", - "time", - "tracing", - "utoipa", -] - -[[package]] -name = "nym-validator-client" -version = "0.1.0" -dependencies = [ - "async-trait", - "base64 0.22.1", - "bip32", - "bip39", - "colored", - "cosmrs", - "cosmwasm-std", - "cw-controllers", - "cw-utils", - "cw2", - "cw3", - "cw4", - "eyre", - "flate2", - "futures", - "itertools 0.14.0", - "nym-api-requests", - "nym-coconut-dkg-common", - "nym-compact-ecash", - "nym-config", - "nym-contracts-common", - "nym-ecash-contract-common", - "nym-group-contract-common", - "nym-http-api-client", - "nym-mixnet-contract-common", - "nym-multisig-contract-common", - "nym-network-defaults", - "nym-performance-contract-common", - "nym-serde-helpers", - "nym-vesting-contract-common", - "prost", - "reqwest 0.12.24", - "serde", - "serde_json", - "sha2 0.10.9", - "tendermint-rpc", - "thiserror 2.0.17", - "time", - "tokio", - "tracing", - "ts-rs", - "url", - "wasmtimer", - "zeroize", -] - -[[package]] -name = "nym-validator-rewarder" -version = "0.3.0" -dependencies = [ - "anyhow", - "bip39", - "clap", - "cosmwasm-std", - "futures", - "humantime", - "humantime-serde", - "nym-bin-common", - "nym-coconut-dkg-common", - "nym-compact-ecash", - "nym-config", - "nym-contracts-common", - "nym-credentials", - "nym-credentials-interface", - "nym-crypto", - "nym-ecash-time", - "nym-http-api-client", - "nym-network-defaults", - "nym-pemstore", - "nym-serde-helpers", - "nym-task", - "nym-ticketbooks-merkle", - "nym-validator-client", - "nyxd-scraper", - "rand 0.8.5", - "rand_chacha 0.3.1", - "serde", - "serde_json", - "serde_with", - "sha2 0.10.9", - "sqlx", - "thiserror 2.0.17", - "time", - "tokio", - "tracing", - "url", - "zeroize", -] - -[[package]] -name = "nym-verloc" -version = "0.1.0" -dependencies = [ - "bytes", - "futures", - "humantime", - "nym-api-requests", - "nym-crypto", - "nym-http-api-client", - "nym-task", - "nym-validator-client", - "rand 0.8.5", - "thiserror 2.0.17", - "time", - "tokio", - "tokio-util", - "tracing", - "url", -] - -[[package]] -name = "nym-vesting-contract-common" -version = "0.7.0" -dependencies = [ - "cosmwasm-schema", - "cosmwasm-std", - "cw2", - "nym-contracts-common", - "nym-mixnet-contract-common", - "serde", - "thiserror 2.0.17", - "ts-rs", -] - -[[package]] -name = "nym-vpn-api-lib-wasm" -version = "0.1.0" -dependencies = [ - "bs58", - "getrandom 0.2.16", - "js-sys", - "nym-bin-common", - "nym-compact-ecash", - "nym-credential-proxy-requests", - "nym-credentials", - "nym-credentials-interface", - "nym-crypto", - "nym-ecash-time", - "serde", - "serde-wasm-bindgen 0.6.5", - "serde_json", - "thiserror 2.0.17", - "time", - "tsify", - "wasm-bindgen", - "wasm-utils", - "zeroize", -] - -[[package]] -name = "nym-wallet-types" -version = "1.0.0" -dependencies = [ - "cosmrs", - "cosmwasm-std", - "hex-literal", - "nym-config", - "nym-mixnet-contract-common", - "nym-network-defaults", - "nym-types", - "nym-validator-client", - "nym-vesting-contract-common", - "serde", - "serde_json", - "strum", - "strum_macros", - "ts-rs", -] - -[[package]] -name = "nym-wireguard" -version = "0.1.0" -dependencies = [ - "async-trait", - "base64 0.22.1", - "bincode", - "chrono", - "dashmap", - "defguard_wireguard_rs", - "dyn-clone", - "futures", - "ip_network", - "log", - "nym-authenticator-requests", - "nym-credential-verification", - "nym-credentials-interface", - "nym-crypto", - "nym-gateway-requests", - "nym-gateway-storage", - "nym-network-defaults", - "nym-node-metrics", - "nym-task", - "nym-wireguard-types", - "thiserror 2.0.17", - "time", - "tokio", - "tokio-stream", - "tracing", - "x25519-dalek", -] - -[[package]] -name = "nym-wireguard-private-metadata-client" -version = "1.0.0" -dependencies = [ - "async-trait", - "nym-http-api-client", - "nym-wireguard-private-metadata-shared", - "tracing", -] - -[[package]] -name = "nym-wireguard-private-metadata-server" -version = "1.0.0" -dependencies = [ - "anyhow", - "async-trait", - "axum", - "futures", - "nym-credential-verification", - "nym-credentials-interface", - "nym-http-api-common", - "nym-wireguard", - "nym-wireguard-private-metadata-shared", - "tokio", - "tokio-util", - "tower-http 0.5.2", - "utoipa", - "utoipa-swagger-ui", -] - -[[package]] -name = "nym-wireguard-private-metadata-shared" -version = "1.0.0" -dependencies = [ - "axum", - "bincode", - "nym-credentials-interface", - "schemars 0.8.22", - "serde", - "thiserror 2.0.17", - "utoipa", -] - -[[package]] -name = "nym-wireguard-private-metadata-tests" -version = "1.0.0" -dependencies = [ - "async-trait", - "axum", - "nym-credential-verification", - "nym-credentials-interface", - "nym-http-api-client", - "nym-http-api-common", - "nym-wireguard", - "nym-wireguard-private-metadata-client", - "nym-wireguard-private-metadata-server", - "nym-wireguard-private-metadata-shared", - "tokio", - "tower-http 0.5.2", - "utoipa", -] - -[[package]] -name = "nym-wireguard-types" -version = "0.1.0" -dependencies = [ - "base64 0.22.1", - "log", - "nym-config", - "nym-crypto", - "nym-network-defaults", - "rand 0.8.5", - "serde", - "thiserror 2.0.17", - "x25519-dalek", -] - -[[package]] -name = "nymvisor" -version = "0.1.30" -dependencies = [ - "anyhow", - "bytes", - "clap", - "dotenvy", - "flate2", - "futures", - "hex", - "humantime", - "humantime-serde", - "nix 0.27.1", - "nym-async-file-watcher", - "nym-bin-common", - "nym-config", - "nym-task", - "reqwest 0.12.24", - "serde", - "serde_json", - "sha2 0.10.9", - "tar", - "thiserror 2.0.17", - "time", - "tokio", - "tracing", - "url", -] - -[[package]] -name = "nyx-chain-watcher" -version = "0.1.14" -dependencies = [ - "anyhow", - "async-trait", - "axum", - "chrono", - "clap", - "nym-bin-common", - "nym-config", - "nym-network-defaults", - "nym-task", - "nym-validator-client", - "nyxd-scraper", - "reqwest 0.12.24", - "schemars 0.8.22", - "serde", - "sqlx", - "thiserror 2.0.17", - "time", - "tokio", - "tokio-util", - "tower-http 0.5.2", - "tracing", - "tracing-subscriber", - "utoipa", - "utoipa-swagger-ui", - "utoipauto", -] - -[[package]] -name = "nyxd-scraper" -version = "0.1.0" -dependencies = [ - "anyhow", - "async-trait", - "const_format", - "cosmrs", - "eyre", - "futures", - "humantime", - "serde", - "sha2 0.10.9", - "sqlx", - "tendermint", - "tendermint-rpc", - "thiserror 2.0.17", - "time", - "tokio", - "tokio-stream", - "tokio-util", - "tracing", - "url", -] - -[[package]] -name = "objc2-core-foundation" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a180dd8642fa45cdb7dd721cd4c11b1cadd4929ce112ebd8b9f5803cc79d536" -dependencies = [ - "bitflags 2.10.0", -] - -[[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]] -name = "once_cell" -version = "1.21.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" -dependencies = [ - "critical-section", - "portable-atomic", -] - -[[package]] -name = "once_cell_polyfill" -version = "1.70.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4895175b425cb1f87721b59f0f286c2092bd4af812243672510e1ac53e2e0ad" - -[[package]] -name = "oorandom" -version = "11.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6790f58c7ff633d8771f42965289203411a5e5c68388703c06e14f24770b41e" - -[[package]] -name = "opaque-debug" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2839e79665f131bdb5782e51f2c6c9599c133c6098982a54c794358bf432529c" - -[[package]] -name = "opaque-debug" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" - -[[package]] -name = "openssl-probe" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" - -[[package]] -name = "openssl-sys" -version = "0.9.110" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a9f0075ba3c21b09f8e8b2026584b1d18d49388648f2fbbf3c97ea8deced8e2" -dependencies = [ - "cc", - "libc", - "pkg-config", - "vcpkg", -] - -[[package]] -name = "opentelemetry" -version = "0.19.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f4b8347cc26099d3aeee044065ecc3ae11469796b4d65d065a23a584ed92a6f" -dependencies = [ - "opentelemetry_api", - "opentelemetry_sdk", -] - -[[package]] -name = "opentelemetry-http" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a819b71d6530c4297b49b3cae2939ab3a8cc1b9f382826a1bc29dd0ca3864906" -dependencies = [ - "async-trait", - "bytes", - "http 0.2.12", - "isahc", - "opentelemetry_api", -] - -[[package]] -name = "opentelemetry-jaeger" -version = "0.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08e028dc9f4f304e9320ce38c80e7cf74067415b1ad5a8750a38bae54a4d450d" -dependencies = [ - "async-trait", - "futures", - "futures-executor", - "http 0.2.12", - "isahc", - "once_cell", - "opentelemetry", - "opentelemetry-http", - "opentelemetry-semantic-conventions", - "thiserror 1.0.69", - "thrift", - "tokio", -] - -[[package]] -name = "opentelemetry-semantic-conventions" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24e33428e6bf08c6f7fcea4ddb8e358fab0fe48ab877a87c70c6ebe20f673ce5" -dependencies = [ - "opentelemetry", -] - -[[package]] -name = "opentelemetry_api" -version = "0.19.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed41783a5bf567688eb38372f2b7a8530f5a607a4b49d38dd7573236c23ca7e2" -dependencies = [ - "fnv", - "futures-channel", - "futures-util", - "indexmap 1.9.3", - "once_cell", - "pin-project-lite", - "thiserror 1.0.69", - "urlencoding", -] - -[[package]] -name = "opentelemetry_sdk" -version = "0.19.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b3a2a91fdbfdd4d212c0dcc2ab540de2c2bcbbd90be17de7a7daf8822d010c1" -dependencies = [ - "async-trait", - "crossbeam-channel", - "dashmap", - "fnv", - "futures-channel", - "futures-executor", - "futures-util", - "once_cell", - "opentelemetry_api", - "percent-encoding", - "rand 0.8.5", - "thiserror 1.0.69", - "tokio", - "tokio-stream", -] - -[[package]] -name = "option-ext" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" - -[[package]] -name = "ordered-float" -version = "2.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68f19d67e5a2795c94e73e0bb1cc1a7edeb2e28efd39e2e1c9b7a40c1108b11c" -dependencies = [ - "num-traits", -] - -[[package]] -name = "overload" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" - -[[package]] -name = "p256" -version = "0.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9863ad85fa8f4460f9c48cb909d38a0d689dba1f6f6988a5e3e0d31071bcd4b" -dependencies = [ - "ecdsa", - "elliptic-curve", - "primeorder", - "sha2 0.10.9", -] - -[[package]] -name = "p384" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe42f1670a52a47d448f14b6a5c61dd78fce51856e68edaa38f7ae3a46b8d6b6" -dependencies = [ - "ecdsa", - "elliptic-curve", - "primeorder", - "sha2 0.10.9", -] - -[[package]] -name = "pairing" -version = "0.23.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81fec4625e73cf41ef4bb6846cafa6d44736525f442ba45e407c4a000a13996f" -dependencies = [ - "group", -] - -[[package]] -name = "parking" -version = "2.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" - -[[package]] -name = "parking_lot" -version = "0.12.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a" -dependencies = [ - "lock_api", - "parking_lot_core", -] - -[[package]] -name = "parking_lot_core" -version = "0.9.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" -dependencies = [ - "cfg-if", - "libc", - "redox_syscall", - "smallvec", - "windows-link 0.2.1", -] - -[[package]] -name = "password-hash" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "346f04948ba92c43e8469c1ee6736c7563d71012b17d40745260fe106aac2166" -dependencies = [ - "base64ct", - "rand_core 0.6.4", - "subtle 2.6.1", -] - -[[package]] -name = "paste" -version = "1.0.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" - -[[package]] -name = "peg" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9928cfca101b36ec5163e70049ee5368a8a1c3c6efc9ca9c5f9cc2f816152477" -dependencies = [ - "peg-macros", - "peg-runtime", -] - -[[package]] -name = "peg-macros" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6298ab04c202fa5b5d52ba03269fb7b74550b150323038878fe6c372d8280f71" -dependencies = [ - "peg-runtime", - "proc-macro2", - "quote", -] - -[[package]] -name = "peg-runtime" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "132dca9b868d927b35b5dd728167b2dee150eb1ad686008fc71ccb298b776fca" - -[[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" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88b39c9bfcfc231068454382784bb460aae594343fb030d46e9f50a645418412" -dependencies = [ - "base64ct", -] - -[[package]] -name = "percent-encoding" -version = "2.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" - -[[package]] -name = "pest" -version = "2.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "989e7521a040efde50c3ab6bbadafbe15ab6dc042686926be59ac35d74607df4" -dependencies = [ - "memchr", - "ucd-trie", -] - -[[package]] -name = "pest_derive" -version = "2.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "187da9a3030dbafabbbfb20cb323b976dc7b7ce91fcd84f2f74d6e31d378e2de" -dependencies = [ - "pest", - "pest_generator", -] - -[[package]] -name = "pest_generator" -version = "2.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49b401d98f5757ebe97a26085998d6c0eecec4995cad6ab7fc30ffdf4b052843" -dependencies = [ - "pest", - "pest_meta", - "proc-macro2", - "quote", - "syn 2.0.107", -] - -[[package]] -name = "pest_meta" -version = "2.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72f27a2cfee9f9039c4d86faa5af122a0ac3851441a34865b8a043b46be0065a" -dependencies = [ - "pest", - "sha2 0.10.9", -] - -[[package]] -name = "petgraph" -version = "0.6.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4c5cc86750666a3ed20bdaf5ca2a0344f9c67674cae0515bec2da16fbaa47db" -dependencies = [ - "fixedbitset", - "indexmap 2.12.0", -] - -[[package]] -name = "phf" -version = "0.11.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fd6780a80ae0c52cc120a26a1a42c1ae51b247a253e4e06113d23d2c2edd078" -dependencies = [ - "phf_macros", - "phf_shared 0.11.3", -] - -[[package]] -name = "phf" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1562dc717473dbaa4c1f85a36410e03c047b2e7df7f45ee938fbef64ae7fadf" -dependencies = [ - "phf_shared 0.13.1", - "serde", -] - -[[package]] -name = "phf_codegen" -version = "0.11.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aef8048c789fa5e851558d709946d6d79a8ff88c0440c587967f8e94bfb1216a" -dependencies = [ - "phf_generator", - "phf_shared 0.11.3", -] - -[[package]] -name = "phf_generator" -version = "0.11.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c80231409c20246a13fddb31776fb942c38553c51e871f8cbd687a4cfb5843d" -dependencies = [ - "phf_shared 0.11.3", - "rand 0.8.5", -] - -[[package]] -name = "phf_macros" -version = "0.11.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f84ac04429c13a7ff43785d75ad27569f2951ce0ffd30a3321230db2fc727216" -dependencies = [ - "phf_generator", - "phf_shared 0.11.3", - "proc-macro2", - "quote", - "syn 2.0.107", -] - -[[package]] -name = "phf_shared" -version = "0.11.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67eabc2ef2a60eb7faa00097bd1ffdb5bd28e62bf39990626a582201b7a754e5" -dependencies = [ - "siphasher 1.0.1", -] - -[[package]] -name = "phf_shared" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e57fef6bc5981e38c2ce2d63bfa546861309f875b8a75f092d1d54ae2d64f266" -dependencies = [ - "siphasher 1.0.1", -] - -[[package]] -name = "pin-project" -version = "1.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "677f1add503faace112b9f1373e43e9e054bfdd22ff1a63c1bc485eaec6a6a8a" -dependencies = [ - "pin-project-internal", -] - -[[package]] -name = "pin-project-internal" -version = "1.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207a8fbf861" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.107", -] - -[[package]] -name = "pin-project-lite" -version = "0.2.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" - -[[package]] -name = "pin-utils" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" - -[[package]] -name = "pkcs1" -version = "0.7.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8ffb9f10fa047879315e6625af03c164b16962a5368d724ed16323b68ace47f" -dependencies = [ - "der", - "pkcs8", - "spki", -] - -[[package]] -name = "pkcs8" -version = "0.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" -dependencies = [ - "der", - "spki", -] - -[[package]] -name = "pkg-config" -version = "0.3.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" - -[[package]] -name = "plain" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4596b6d070b27117e987119b4dac604f3c58cfb0b191112e24771b2faeac1a6" - -[[package]] -name = "plotters" -version = "0.3.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5aeb6f403d7a4911efb1e33402027fc44f29b5bf6def3effcc22d7bb75f2b747" -dependencies = [ - "num-traits", - "plotters-backend", - "plotters-svg", - "wasm-bindgen", - "web-sys", -] - -[[package]] -name = "plotters-backend" -version = "0.3.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df42e13c12958a16b3f7f4386b9ab1f3e7933914ecea48da7139435263a4172a" - -[[package]] -name = "plotters-svg" -version = "0.3.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51bae2ac328883f7acdfea3d66a7c35751187f870bc81f94563733a154d7a670" -dependencies = [ - "plotters-backend", -] - -[[package]] -name = "pnet_base" -version = "0.35.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffc190d4067df16af3aba49b3b74c469e611cad6314676eaf1157f31aa0fb2f7" -dependencies = [ - "no-std-net", -] - -[[package]] -name = "pnet_macros" -version = "0.35.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13325ac86ee1a80a480b0bc8e3d30c25d133616112bb16e86f712dcf8a71c863" -dependencies = [ - "proc-macro2", - "quote", - "regex", - "syn 2.0.107", -] - -[[package]] -name = "pnet_macros_support" -version = "0.35.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eed67a952585d509dd0003049b1fc56b982ac665c8299b124b90ea2bdb3134ab" -dependencies = [ - "pnet_base", -] - -[[package]] -name = "pnet_packet" -version = "0.35.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c96ebadfab635fcc23036ba30a7d33a80c39e8461b8bd7dc7bb186acb96560f" -dependencies = [ - "glob", - "pnet_base", - "pnet_macros", - "pnet_macros_support", -] - -[[package]] -name = "polling" -version = "2.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b2d323e8ca7996b3e23126511a523f7e62924d93ecd5ae73b333815b0eb3dce" -dependencies = [ - "autocfg", - "bitflags 1.3.2", - "cfg-if", - "concurrent-queue", - "libc", - "log", - "pin-project-lite", - "windows-sys 0.48.0", -] - -[[package]] -name = "poly1305" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8159bd90725d2df49889a078b54f4f79e87f1f8a8444194cdca81d38f5393abf" -dependencies = [ - "cpufeatures", - "opaque-debug 0.3.1", - "universal-hash", -] - -[[package]] -name = "polyval" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d1fe60d06143b2430aa532c94cfe9e29783047f06c0d7fd359a9a51b729fa25" -dependencies = [ - "cfg-if", - "cpufeatures", - "opaque-debug 0.3.1", - "universal-hash", -] - -[[package]] -name = "portable-atomic" -version = "1.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f84267b20a16ea918e43c6a88433c2d54fa145c92a811b5b047ccbe153674483" - -[[package]] -name = "portable-atomic-util" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8a2f0d8d040d7848a709caf78912debcc3f33ee4b3cac47d73d1e1069e83507" -dependencies = [ - "portable-atomic", -] - -[[package]] -name = "postgres-protocol" -version = "0.6.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbef655056b916eb868048276cfd5d6a7dea4f81560dfd047f97c8c6fe3fcfd4" -dependencies = [ - "base64 0.22.1", - "byteorder", - "bytes", - "fallible-iterator", - "hmac", - "md-5", - "memchr", - "rand 0.9.2", - "sha2 0.10.9", - "stringprep", -] - -[[package]] -name = "postgres-types" -version = "0.2.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef4605b7c057056dd35baeb6ac0c0338e4975b1f2bef0f65da953285eb007095" -dependencies = [ - "bytes", - "fallible-iterator", - "postgres-protocol", -] - -[[package]] -name = "potential_utf" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84df19adbe5b5a0782edcab45899906947ab039ccf4573713735ee7de1e6b08a" -dependencies = [ - "zerovec", -] - -[[package]] -name = "powerfmt" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" - -[[package]] -name = "ppv-lite86" -version = "0.2.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" -dependencies = [ - "zerocopy", -] - -[[package]] -name = "precomputed-hash" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c" - -[[package]] -name = "pretty_assertions" -version = "1.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ae130e2f271fbc2ac3a40fb1d07180839cdbbe443c7a27e1e3c13c5cac0116d" -dependencies = [ - "diff", - "yansi", -] - -[[package]] -name = "primeorder" -version = "0.13.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "353e1ca18966c16d9deb1c69278edbc5f194139612772bd9537af60ac231e1e6" -dependencies = [ - "elliptic-curve", -] - -[[package]] -name = "proc-macro-crate" -version = "3.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "219cb19e96be00ab2e37d6e299658a0cfa83e52429179969b0f0121b4ac46983" -dependencies = [ - "toml_edit 0.23.7", -] - -[[package]] -name = "proc-macro-error-attr2" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96de42df36bb9bba5542fe9f1a054b8cc87e172759a1868aa05c1f3acc89dfc5" -dependencies = [ - "proc-macro2", - "quote", -] - -[[package]] -name = "proc-macro-error2" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11ec05c52be0a07b08061f7dd003e7d7092e0472bc731b4af7bb1ef876109802" -dependencies = [ - "proc-macro-error-attr2", - "proc-macro2", - "quote", - "syn 2.0.107", -] - -[[package]] -name = "proc-macro2" -version = "1.0.101" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89ae43fd86e4158d6db51ad8e2b80f313af9cc74f5c0e03ccb87de09998732de" -dependencies = [ - "unicode-ident", -] - -[[package]] -name = "proc_pidinfo" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29492a7b48a00ab80202528e235d2f80a04ccff3747540b4ec6881f2f2bc42d1" -dependencies = [ - "libc", -] - -[[package]] -name = "prometheus" -version = "0.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ca5326d8d0b950a9acd87e6a3f94745394f62e4dae1b1ee22b2bc0c394af43a" -dependencies = [ - "cfg-if", - "fnv", - "lazy_static", - "memchr", - "parking_lot", - "protobuf", - "thiserror 2.0.17", -] - -[[package]] -name = "prost" -version = "0.13.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2796faa41db3ec313a31f7624d9286acf277b52de526150b7e69f3debf891ee5" -dependencies = [ - "bytes", - "prost-derive", -] - -[[package]] -name = "prost-derive" -version = "0.13.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a56d757972c98b346a9b766e3f02746cde6dd1cd1d1d563472929fdd74bec4d" -dependencies = [ - "anyhow", - "itertools 0.14.0", - "proc-macro2", - "quote", - "syn 2.0.107", -] - -[[package]] -name = "prost-types" -version = "0.13.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52c2c1bf36ddb1a1c396b3601a3cec27c2462e45f07c386894ec3ccf5332bd16" -dependencies = [ - "prost", -] - -[[package]] -name = "protobuf" -version = "3.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d65a1d4ddae7d8b5de68153b48f6aa3bba8cb002b243dbdbc55a5afbc98f99f4" -dependencies = [ - "once_cell", - "protobuf-support", - "thiserror 1.0.69", -] - -[[package]] -name = "protobuf-support" -version = "3.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e36c2f31e0a47f9280fb347ef5e461ffcd2c52dd520d8e216b52f93b0b0d7d6" -dependencies = [ - "thiserror 1.0.69", -] - -[[package]] -name = "psl" -version = "2.1.151" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6fd2e88c2c28854abe53489ce679f9dad712e2ac01a342dbeccae851cf0654d9" -dependencies = [ - "psl-types", -] - -[[package]] -name = "psl-types" -version = "2.0.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33cb294fe86a74cbcf50d4445b37da762029549ebeea341421c7c70370f86cac" - -[[package]] -name = "publicsuffix" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f42ea446cab60335f76979ec15e12619a2165b5ae2c12166bef27d283a9fadf" -dependencies = [ - "idna", - "psl-types", -] - -[[package]] -name = "quick-error" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a993555f31e5a609f617c12db6250dedcac1b0a85076912c436e6fc9b2c8e6a3" - -[[package]] -name = "quinn" -version = "0.11.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9e20a958963c291dc322d98411f541009df2ced7b5a4f2bd52337638cfccf20" -dependencies = [ - "bytes", - "cfg_aliases", - "pin-project-lite", - "quinn-proto", - "quinn-udp", - "rustc-hash", - "rustls 0.23.33", - "socket2 0.6.1", - "thiserror 2.0.17", - "tokio", - "tracing", - "web-time", -] - -[[package]] -name = "quinn-proto" -version = "0.11.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1906b49b0c3bc04b5fe5d86a77925ae6524a19b816ae38ce1e426255f1d8a31" -dependencies = [ - "bytes", - "getrandom 0.3.4", - "lru-slab", - "rand 0.9.2", - "ring", - "rustc-hash", - "rustls 0.23.33", - "rustls-pki-types", - "slab", - "thiserror 2.0.17", - "tinyvec", - "tracing", - "web-time", -] - -[[package]] -name = "quinn-udp" -version = "0.5.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "addec6a0dcad8a8d96a771f815f0eaf55f9d1805756410b39f5fa81332574cbd" -dependencies = [ - "cfg_aliases", - "libc", - "once_cell", - "socket2 0.6.1", - "tracing", - "windows-sys 0.60.2", -] - -[[package]] -name = "quote" -version = "1.0.41" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce25767e7b499d1b604768e7cde645d14cc8584231ea6b295e9c9eb22c02e1d1" -dependencies = [ - "proc-macro2", -] - -[[package]] -name = "r-efi" -version = "5.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" - -[[package]] -name = "radium" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" - -[[package]] -name = "rand" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" -dependencies = [ - "libc", - "rand_chacha 0.3.1", - "rand_core 0.6.4", -] - -[[package]] -name = "rand" -version = "0.9.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1" -dependencies = [ - "rand_chacha 0.9.0", - "rand_core 0.9.3", -] - -[[package]] -name = "rand_chacha" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" -dependencies = [ - "ppv-lite86", - "rand_core 0.6.4", -] - -[[package]] -name = "rand_chacha" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" -dependencies = [ - "ppv-lite86", - "rand_core 0.9.3", -] - -[[package]] -name = "rand_core" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" -dependencies = [ - "getrandom 0.2.16", -] - -[[package]] -name = "rand_core" -version = "0.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" -dependencies = [ - "getrandom 0.3.4", -] - -[[package]] -name = "rand_distr" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32cb0b9bc82b0a0876c2dd994a7e7a2683d3e7390ca40e6886785ef0c7e3ee31" -dependencies = [ - "num-traits", - "rand 0.8.5", -] - -[[package]] -name = "rayon" -version = "1.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "368f01d005bf8fd9b1206fb6fa653e6c4a81ceb1466406b81792d87c5677a58f" -dependencies = [ - "either", - "rayon-core", -] - -[[package]] -name = "rayon-core" -version = "1.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22e18b0f0062d30d4230b2e85ff77fdfe4326feb054b9783a3460d8435c8ab91" -dependencies = [ - "crossbeam-deque", - "crossbeam-utils", -] - -[[package]] -name = "redox_syscall" -version = "0.5.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" -dependencies = [ - "bitflags 2.10.0", -] - -[[package]] -name = "redox_users" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4e608c6638b9c18977b00b475ac1f28d14e84b27d8d42f70e0bf1e3dec127ac" -dependencies = [ - "getrandom 0.2.16", - "libredox", - "thiserror 2.0.17", -] - -[[package]] -name = "ref-cast" -version = "1.0.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f354300ae66f76f1c85c5f84693f0ce81d747e2c3f21a45fef496d89c960bf7d" -dependencies = [ - "ref-cast-impl", -] - -[[package]] -name = "ref-cast-impl" -version = "1.0.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7186006dcb21920990093f30e3dea63b7d6e977bf1256be20c3563a5db070da" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.107", -] - -[[package]] -name = "regex" -version = "1.12.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "843bc0191f75f3e22651ae5f1e72939ab2f72a4bc30fa80a066bd66edefc24d4" -dependencies = [ - "aho-corasick", - "memchr", - "regex-automata", - "regex-syntax", -] - -[[package]] -name = "regex-automata" -version = "0.4.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5276caf25ac86c8d810222b3dbb938e512c55c6831a10f3e6ed1c93b84041f1c" -dependencies = [ - "aho-corasick", - "memchr", - "regex-syntax", -] - -[[package]] -name = "regex-syntax" -version = "0.8.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a2d987857b319362043e95f5353c0535c1f58eec5336fdfcf626430af7def58" - -[[package]] -name = "reqwest" -version = "0.11.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd67538700a17451e7cba03ac727fb961abb7607553461627b97de0b89cf4a62" -dependencies = [ - "base64 0.21.7", - "bytes", - "encoding_rs", - "futures-core", - "futures-util", - "h2 0.3.27", - "http 0.2.12", - "http-body 0.4.6", - "hyper 0.14.32", - "hyper-rustls 0.24.2", - "ipnet", - "js-sys", - "log", - "mime", - "once_cell", - "percent-encoding", - "pin-project-lite", - "rustls 0.21.12", - "rustls-native-certs 0.6.3", - "rustls-pemfile 1.0.4", - "serde", - "serde_json", - "serde_urlencoded", - "sync_wrapper 0.1.2", - "system-configuration", - "tokio", - "tokio-rustls 0.24.1", - "tower-service", - "url", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", - "winreg", -] - -[[package]] -name = "reqwest" -version = "0.12.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d0946410b9f7b082a427e4ef5c8ff541a88b357bc6c637c40db3a68ac70a36f" -dependencies = [ - "async-compression", - "base64 0.22.1", - "bytes", - "futures-core", - "futures-util", - "http 1.3.1", - "http-body 1.0.1", - "http-body-util", - "hyper 1.7.0", - "hyper-rustls 0.27.7", - "hyper-util", - "js-sys", - "log", - "percent-encoding", - "pin-project-lite", - "quinn", - "rustls 0.23.33", - "rustls-pki-types", - "serde", - "serde_json", - "serde_urlencoded", - "sync_wrapper 1.0.2", - "tokio", - "tokio-rustls 0.26.4", - "tokio-util", - "tower 0.5.2", - "tower-http 0.6.6", - "tower-service", - "url", - "wasm-bindgen", - "wasm-bindgen-futures", - "wasm-streams", - "web-sys", - "webpki-roots 1.0.3", -] - -[[package]] -name = "reserve-port" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21918d6644020c6f6ef1993242989bf6d4952d2e025617744f184c02df51c356" -dependencies = [ - "thiserror 2.0.17", -] - -[[package]] -name = "resolv-conf" -version = "0.7.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b3789b30bd25ba102de4beabd95d21ac45b69b1be7d14522bab988c526d6799" - -[[package]] -name = "rfc6979" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8dd2a808d456c4a54e300a23e9f5a67e122c3024119acbfd73e3bf664491cb2" -dependencies = [ - "hmac", - "subtle 2.6.1", -] - -[[package]] -name = "ring" -version = "0.17.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" -dependencies = [ - "cc", - "cfg-if", - "getrandom 0.2.16", - "libc", - "untrusted", - "windows-sys 0.52.0", -] - -[[package]] -name = "ripemd" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd124222d17ad93a644ed9d011a40f4fb64aa54275c08cc216524a9ea82fb09f" -dependencies = [ - "digest 0.10.7", -] - -[[package]] -name = "rmp" -version = "0.8.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "228ed7c16fa39782c3b3468e974aec2795e9089153cd08ee2e9aefb3613334c4" -dependencies = [ - "byteorder", - "num-traits", - "paste", -] - -[[package]] -name = "rmp-serde" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52e599a477cf9840e92f2cde9a7189e67b42c57532749bf90aea6ec10facd4db" -dependencies = [ - "byteorder", - "rmp", - "serde", -] - -[[package]] -name = "rs_merkle" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb09b49230ba22e8c676e7b75dfe2887dea8121f18b530ae0ba519ce442d2b21" -dependencies = [ - "sha2 0.10.9", -] - -[[package]] -name = "rsa" -version = "0.9.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78928ac1ed176a5ca1d17e578a1825f3d81ca54cf41053a592584b020cfd691b" -dependencies = [ - "const-oid", - "digest 0.10.7", - "num-bigint-dig", - "num-integer", - "num-traits", - "pkcs1", - "pkcs8", - "rand_core 0.6.4", - "sha2 0.10.9", - "signature", - "spki", - "subtle 2.6.1", - "zeroize", -] - -[[package]] -name = "rust-embed" -version = "8.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb44e1917075637ee8c7bcb865cf8830e3a92b5b1189e44e3a0ab5a0d5be314b" -dependencies = [ - "rust-embed-impl", - "rust-embed-utils", - "walkdir", -] - -[[package]] -name = "rust-embed-impl" -version = "8.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "382499b49db77a7c19abd2a574f85ada7e9dbe125d5d1160fa5cad7c4cf71fc9" -dependencies = [ - "proc-macro2", - "quote", - "rust-embed-utils", - "syn 2.0.107", - "walkdir", -] - -[[package]] -name = "rust-embed-utils" -version = "8.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21fcbee55c2458836bcdbfffb6ec9ba74bbc23ca7aa6816015a3dd2c4d8fc185" -dependencies = [ - "sha2 0.10.9", - "walkdir", -] - -[[package]] -name = "rust-multipart-rfc7578_2" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03b748410c0afdef2ebbe3685a6a862e2ee937127cdaae623336a459451c8d57" -dependencies = [ - "bytes", - "futures-core", - "futures-util", - "http 0.2.12", - "mime", - "mime_guess", - "rand 0.8.5", - "thiserror 1.0.69", -] - -[[package]] -name = "rustc-hash" -version = "2.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "357703d41365b4b27c590e3ed91eabb1b663f07c4c084095e60cbed4362dff0d" - -[[package]] -name = "rustc_version" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a" -dependencies = [ - "semver 0.9.0", -] - -[[package]] -name = "rustc_version" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" -dependencies = [ - "semver 1.0.27", -] - -[[package]] -name = "rustix" -version = "1.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd15f8a2c5551a84d56efdc1cd049089e409ac19a3072d5037a17fd70719ff3e" -dependencies = [ - "bitflags 2.10.0", - "errno", - "libc", - "linux-raw-sys", - "windows-sys 0.61.2", -] - -[[package]] -name = "rustls" -version = "0.21.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f56a14d1f48b391359b22f731fd4bd7e43c97f3c50eee276f3aa09c94784d3e" -dependencies = [ - "log", - "ring", - "rustls-webpki 0.101.7", - "sct", -] - -[[package]] -name = "rustls" -version = "0.22.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf4ef73721ac7bcd79b2b315da7779d8fc09718c6b3d2d1b2d94850eb8c18432" -dependencies = [ - "log", - "ring", - "rustls-pki-types", - "rustls-webpki 0.102.8", - "subtle 2.6.1", - "zeroize", -] - -[[package]] -name = "rustls" -version = "0.23.33" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "751e04a496ca00bb97a5e043158d23d66b5aabf2e1d5aa2a0aaebb1aafe6f82c" -dependencies = [ - "log", - "once_cell", - "ring", - "rustls-pki-types", - "rustls-webpki 0.103.7", - "subtle 2.6.1", - "zeroize", -] - -[[package]] -name = "rustls-native-certs" -version = "0.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9aace74cb666635c918e9c12bc0d348266037aa8eb599b5cba565709a8dff00" -dependencies = [ - "openssl-probe", - "rustls-pemfile 1.0.4", - "schannel", - "security-framework", -] - -[[package]] -name = "rustls-native-certs" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5bfb394eeed242e909609f56089eecfe5fda225042e8b171791b9c95f5931e5" -dependencies = [ - "openssl-probe", - "rustls-pemfile 2.2.0", - "rustls-pki-types", - "schannel", - "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.7", -] - -[[package]] -name = "rustls-pemfile" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dce314e5fee3f39953d46bb63bb8a46d40c2f8fb7cc5a3b6cab2bde9721d6e50" -dependencies = [ - "rustls-pki-types", -] - -[[package]] -name = "rustls-pki-types" -version = "1.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "229a4a4c221013e7e1f1a043678c5cc39fe5171437c88fb47151a21e6f5b5c79" -dependencies = [ - "web-time", - "zeroize", -] - -[[package]] -name = "rustls-webpki" -version = "0.101.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b6275d1ee7a1cd780b64aca7726599a1dbc893b1e64144529e55c3c2f745765" -dependencies = [ - "ring", - "untrusted", -] - -[[package]] -name = "rustls-webpki" -version = "0.102.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64ca1bc8749bd4cf37b5ce386cc146580777b4e8572c7b97baf22c83f444bee9" -dependencies = [ - "ring", - "rustls-pki-types", - "untrusted", -] - -[[package]] -name = "rustls-webpki" -version = "0.103.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e10b3f4191e8a80e6b43eebabfac91e5dcecebb27a71f04e820c47ec41d314bf" -dependencies = [ - "ring", - "rustls-pki-types", - "untrusted", -] - -[[package]] -name = "rustversion" -version = "1.0.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" - -[[package]] -name = "ryu" -version = "1.0.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" - -[[package]] -name = "same-file" -version = "1.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" -dependencies = [ - "winapi-util", -] - -[[package]] -name = "schannel" -version = "0.1.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "891d81b926048e76efe18581bf793546b4c0eaf8448d72be8de2bbee5fd166e1" -dependencies = [ - "windows-sys 0.61.2", -] - -[[package]] -name = "schemars" -version = "0.8.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fbf2ae1b8bc8e02df939598064d22402220cd5bbcca1c76f7d6a310974d5615" -dependencies = [ - "dyn-clone", - "indexmap 1.9.3", - "schemars_derive", - "serde", - "serde_json", - "uuid", -] - -[[package]] -name = "schemars" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4cd191f9397d57d581cddd31014772520aa448f65ef991055d7f61582c65165f" -dependencies = [ - "dyn-clone", - "ref-cast", - "serde", - "serde_json", -] - -[[package]] -name = "schemars" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82d20c4491bc164fa2f6c5d44565947a52ad80b9505d8e36f8d54c27c739fcd0" -dependencies = [ - "dyn-clone", - "ref-cast", - "serde", - "serde_json", -] - -[[package]] -name = "schemars_derive" -version = "0.8.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32e265784ad618884abaea0600a9adf15393368d840e0222d101a072f3f7534d" -dependencies = [ - "proc-macro2", - "quote", - "serde_derive_internals 0.29.1", - "syn 2.0.107", -] - -[[package]] -name = "scopeguard" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" - -[[package]] -name = "scroll" -version = "0.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ab8598aa408498679922eff7fa985c25d58a90771bd6be794434c5277eab1a6" -dependencies = [ - "scroll_derive", -] - -[[package]] -name = "scroll_derive" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1783eabc414609e28a5ba76aee5ddd52199f7107a0b24c2e9746a1ecc34a683d" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.107", -] - -[[package]] -name = "sct" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da046153aa2352493d6cb7da4b6e5c0c057d8a1d0a9aa8560baffdd945acd414" -dependencies = [ - "ring", - "untrusted", -] - -[[package]] -name = "sealed" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22f968c5ea23d555e670b449c1c5e7b2fc399fdaec1d304a17cd48e288abc107" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.107", -] - -[[package]] -name = "sec1" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc" -dependencies = [ - "base16ct", - "der", - "generic-array 0.14.9", - "pkcs8", - "serdect 0.2.0", - "subtle 2.6.1", - "zeroize", -] - -[[package]] -name = "secp256k1" -version = "0.27.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25996b82292a7a57ed3508f052cfff8640d38d32018784acd714758b43da9c8f" -dependencies = [ - "secp256k1-sys", -] - -[[package]] -name = "secp256k1-sys" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4473013577ec77b4ee3668179ef1186df3146e2cf2d927bd200974c6fe60fd99" -dependencies = [ - "cc", -] - -[[package]] -name = "security-framework" -version = "2.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" -dependencies = [ - "bitflags 2.10.0", - "core-foundation", - "core-foundation-sys", - "libc", - "security-framework-sys", -] - -[[package]] -name = "security-framework-sys" -version = "2.15.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc1f0cbffaac4852523ce30d8bd3c5cdc873501d96ff467ca09b6767bb8cd5c0" -dependencies = [ - "core-foundation-sys", - "libc", -] - -[[package]] -name = "semver" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403" -dependencies = [ - "semver-parser", -] - -[[package]] -name = "semver" -version = "1.0.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2" -dependencies = [ - "serde", - "serde_core", -] - -[[package]] -name = "semver-parser" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" - -[[package]] -name = "serde" -version = "1.0.228" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" -dependencies = [ - "serde_core", - "serde_derive", -] - -[[package]] -name = "serde-json-wasm" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f05da0d153dd4595bdffd5099dc0e9ce425b205ee648eb93437ff7302af8c9a5" -dependencies = [ - "serde", -] - -[[package]] -name = "serde-wasm-bindgen" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3b143e2833c57ab9ad3ea280d21fd34e285a42837aeb0ee301f4f41890fa00e" -dependencies = [ - "js-sys", - "serde", - "wasm-bindgen", -] - -[[package]] -name = "serde-wasm-bindgen" -version = "0.6.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8302e169f0eddcc139c70f139d19d6467353af16f9fce27e8c30158036a1e16b" -dependencies = [ - "js-sys", - "serde", - "wasm-bindgen", -] - -[[package]] -name = "serde_bytes" -version = "0.11.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5d440709e79d88e51ac01c4b72fc6cb7314017bb7da9eeff678aa94c10e3ea8" -dependencies = [ - "serde", - "serde_core", -] - -[[package]] -name = "serde_core" -version = "1.0.228" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" -dependencies = [ - "serde_derive", -] - -[[package]] -name = "serde_derive" -version = "1.0.228" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.107", -] - -[[package]] -name = "serde_derive_internals" -version = "0.28.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e578a843d40b4189a4d66bba51d7684f57da5bd7c304c64e14bd63efbef49509" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.107", -] - -[[package]] -name = "serde_derive_internals" -version = "0.29.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18d26a20a969b9e3fdf2fc2d9f21eda6c40e2de84c9408bb5d3b05d499aae711" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.107", -] - -[[package]] -name = "serde_json" -version = "1.0.145" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "402a6f66d8c709116cf22f558eab210f5a50187f702eb4d7e5ef38d9a7f1c79c" -dependencies = [ - "itoa", - "memchr", - "ryu", - "serde", - "serde_core", -] - -[[package]] -name = "serde_json_path" -version = "0.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b992cea3194eea663ba99a042d61cea4bd1872da37021af56f6a37e0359b9d33" -dependencies = [ - "inventory", - "nom", - "regex", - "serde", - "serde_json", - "serde_json_path_core", - "serde_json_path_macros", - "thiserror 2.0.17", -] - -[[package]] -name = "serde_json_path_core" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dde67d8dfe7d4967b5a95e247d4148368ddd1e753e500adb34b3ffe40c6bc1bc" -dependencies = [ - "inventory", - "serde", - "serde_json", - "thiserror 2.0.17", -] - -[[package]] -name = "serde_json_path_macros" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "517acfa7f77ddaf5c43d5f119c44a683774e130b4247b7d3210f8924506cfac8" -dependencies = [ - "inventory", - "serde_json_path_core", - "serde_json_path_macros_internal", -] - -[[package]] -name = "serde_json_path_macros_internal" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aafbefbe175fa9bf03ca83ef89beecff7d2a95aaacd5732325b90ac8c3bd7b90" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.107", -] - -[[package]] -name = "serde_path_to_error" -version = "0.1.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10a9ff822e371bb5403e391ecd83e182e0e77ba7f6fe0160b795797109d1b457" -dependencies = [ - "itoa", - "serde", - "serde_core", -] - -[[package]] -name = "serde_plain" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ce1fc6db65a611022b23a0dec6975d63fb80a302cb3388835ff02c097258d50" -dependencies = [ - "serde", -] - -[[package]] -name = "serde_repr" -version = "0.1.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "175ee3e80ae9982737ca543e96133087cbd9a485eecc3bc4de9c1a37b47ea59c" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.107", -] - -[[package]] -name = "serde_spanned" -version = "0.6.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf41e0cfaf7226dca15e8197172c295a782857fcb97fad1808a166870dee75a3" -dependencies = [ - "serde", -] - -[[package]] -name = "serde_urlencoded" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" -dependencies = [ - "form_urlencoded", - "itoa", - "ryu", - "serde", -] - -[[package]] -name = "serde_with" -version = "3.15.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6093cd8c01b25262b84927e0f7151692158fab02d961e04c979d3903eba7ecc5" -dependencies = [ - "base64 0.22.1", - "chrono", - "hex", - "indexmap 1.9.3", - "indexmap 2.12.0", - "schemars 0.9.0", - "schemars 1.0.4", - "serde_core", - "serde_json", - "serde_with_macros", - "time", -] - -[[package]] -name = "serde_with_macros" -version = "3.15.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7e6c180db0816026a61afa1cff5344fb7ebded7e4d3062772179f2501481c27" -dependencies = [ - "darling 0.21.3", - "proc-macro2", - "quote", - "syn 2.0.107", -] - -[[package]] -name = "serde_yaml" -version = "0.9.34+deprecated" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a8b1a1a2ebf674015cc02edccce75287f1a0130d394307b36743c2f5d504b47" -dependencies = [ - "indexmap 2.12.0", - "itoa", - "ryu", - "serde", - "unsafe-libyaml", -] - -[[package]] -name = "serdect" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a84f14a19e9a014bb9f4512488d9829a68e04ecabffb0f9904cd1ace94598177" -dependencies = [ - "base16ct", - "serde", -] - -[[package]] -name = "serdect" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f42f67da2385b51a5f9652db9c93d78aeaf7610bf5ec366080b6de810604af53" -dependencies = [ - "base16ct", - "serde", -] - -[[package]] -name = "sha1" -version = "0.10.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" -dependencies = [ - "cfg-if", - "cpufeatures", - "digest 0.10.7", -] - -[[package]] -name = "sha2" -version = "0.9.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d58a1e1bf39749807d89cf2d98ac2dfa0ff1cb3faa38fbb64dd88ac8013d800" -dependencies = [ - "block-buffer 0.9.0", - "cfg-if", - "cpufeatures", - "digest 0.9.0", - "opaque-debug 0.3.1", -] - -[[package]] -name = "sha2" -version = "0.10.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" -dependencies = [ - "cfg-if", - "cpufeatures", - "digest 0.10.7", -] - -[[package]] -name = "sharded-slab" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" -dependencies = [ - "lazy_static", -] - -[[package]] -name = "shlex" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" - -[[package]] -name = "si-scale" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b72e7cd0744e007e382ba320435f1ed1ecd709409b4ebd5cfbc843d77b25a8aa" - -[[package]] -name = "signal-hook" -version = "0.3.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d881a16cf4426aa584979d30bd82cb33429027e42122b169753d6ef1085ed6e2" -dependencies = [ - "libc", - "signal-hook-registry", -] - -[[package]] -name = "signal-hook-mio" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34db1a06d485c9142248b7a054f034b349b212551f3dfd19c94d45a754a217cd" -dependencies = [ - "libc", - "mio 0.8.11", - "signal-hook", -] - -[[package]] -name = "signal-hook-registry" -version = "1.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2a4719bff48cee6b39d12c020eeb490953ad2443b7055bd0b21fca26bd8c28b" -dependencies = [ - "libc", -] - -[[package]] -name = "signature" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" -dependencies = [ - "digest 0.10.7", - "rand_core 0.6.4", -] - -[[package]] -name = "simd-adler32" -version = "0.3.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe" - -[[package]] -name = "siphasher" -version = "0.3.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d" - -[[package]] -name = "siphasher" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56199f7ddabf13fe5074ce809e7d3f42b42ae711800501b5b16ea82ad029c39d" - -[[package]] -name = "slab" -version = "0.4.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a2ae44ef20feb57a68b23d846850f861394c2e02dc425a50098ae8c90267589" - -[[package]] -name = "sluice" -version = "0.5.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d7400c0eff44aa2fcb5e31a5f24ba9716ed90138769e4977a2ba6014ae63eb5" -dependencies = [ - "async-channel", - "futures-core", - "futures-io", -] - -[[package]] -name = "smallvec" -version = "1.15.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" -dependencies = [ - "serde", -] - -[[package]] -name = "smawk" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7c388c1b5e93756d0c740965c41e8822f866621d41acbdf6336a6a168f8840c" - -[[package]] -name = "snafu" -version = "0.7.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4de37ad025c587a29e8f3f5605c00f70b98715ef90b9061a815b9e59e9042d6" -dependencies = [ - "doc-comment", - "snafu-derive", -] - -[[package]] -name = "snafu-derive" -version = "0.7.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "990079665f075b699031e9c08fd3ab99be5029b96f3b78dc0709e8f77e4efebf" -dependencies = [ - "heck 0.4.1", - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "snow" -version = "0.9.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "850948bee068e713b8ab860fe1adc4d109676ab4c3b621fd8147f06b261f2f85" -dependencies = [ - "aes-gcm", - "blake2 0.10.6", - "chacha20poly1305", - "curve25519-dalek", - "rand_core 0.6.4", - "rustc_version 0.4.1", - "sha2 0.10.9", - "subtle 2.6.1", -] - -[[package]] -name = "socket2" -version = "0.5.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e22376abed350d73dd1cd119b57ffccad95b4e585a7cda43e286245ce23c0678" -dependencies = [ - "libc", - "windows-sys 0.52.0", -] - -[[package]] -name = "socket2" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17129e116933cf371d018bb80ae557e889637989d8638274fb25622827b03881" -dependencies = [ - "libc", - "windows-sys 0.60.2", -] - -[[package]] -name = "sphinx-packet" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c26f0c20d909fdda1c5d0ece3973127ca421984d55b000215df365e93722fc6e" -dependencies = [ - "aes", - "arrayref", - "blake2 0.8.1", - "bs58", - "byteorder", - "chacha", - "ctr", - "curve25519-dalek", - "digest 0.10.7", - "hkdf", - "hmac", - "lioness", - "rand 0.8.5", - "rand_distr", - "sha2 0.10.9", - "subtle 2.6.1", - "x25519-dalek", - "zeroize", -] - -[[package]] -name = "spin" -version = "0.9.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" -dependencies = [ - "lock_api", -] - -[[package]] -name = "spki" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" -dependencies = [ - "base64ct", - "der", -] - -[[package]] -name = "sqlx" -version = "0.8.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fefb893899429669dcdd979aff487bd78f4064e5e7907e4269081e0ef7d97dc" -dependencies = [ - "sqlx-core", - "sqlx-macros", - "sqlx-mysql", - "sqlx-postgres", - "sqlx-sqlite", -] - -[[package]] -name = "sqlx-core" -version = "0.8.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee6798b1838b6a0f69c007c133b8df5866302197e404e8b6ee8ed3e3a5e68dc6" -dependencies = [ - "base64 0.22.1", - "bytes", - "chrono", - "crc", - "crossbeam-queue", - "either", - "event-listener 5.4.1", - "futures-core", - "futures-intrusive", - "futures-io", - "futures-util", - "hashbrown 0.15.5", - "hashlink", - "indexmap 2.12.0", - "log", - "memchr", - "once_cell", - "percent-encoding", - "rustls 0.23.33", - "serde", - "serde_json", - "sha2 0.10.9", - "smallvec", - "thiserror 2.0.17", - "time", - "tokio", - "tokio-stream", - "tracing", - "url", - "webpki-roots 0.26.11", -] - -[[package]] -name = "sqlx-macros" -version = "0.8.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2d452988ccaacfbf5e0bdbc348fb91d7c8af5bee192173ac3636b5fb6e6715d" -dependencies = [ - "proc-macro2", - "quote", - "sqlx-core", - "sqlx-macros-core", - "syn 2.0.107", -] - -[[package]] -name = "sqlx-macros-core" -version = "0.8.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19a9c1841124ac5a61741f96e1d9e2ec77424bf323962dd894bdb93f37d5219b" -dependencies = [ - "dotenvy", - "either", - "heck 0.5.0", - "hex", - "once_cell", - "proc-macro2", - "quote", - "serde", - "serde_json", - "sha2 0.10.9", - "sqlx-core", - "sqlx-mysql", - "sqlx-postgres", - "sqlx-sqlite", - "syn 2.0.107", - "tokio", - "url", -] - -[[package]] -name = "sqlx-mysql" -version = "0.8.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa003f0038df784eb8fecbbac13affe3da23b45194bd57dba231c8f48199c526" -dependencies = [ - "atoi", - "base64 0.22.1", - "bitflags 2.10.0", - "byteorder", - "bytes", - "chrono", - "crc", - "digest 0.10.7", - "dotenvy", - "either", - "futures-channel", - "futures-core", - "futures-io", - "futures-util", - "generic-array 0.14.9", - "hex", - "hkdf", - "hmac", - "itoa", - "log", - "md-5", - "memchr", - "once_cell", - "percent-encoding", - "rand 0.8.5", - "rsa", - "serde", - "sha1", - "sha2 0.10.9", - "smallvec", - "sqlx-core", - "stringprep", - "thiserror 2.0.17", - "time", - "tracing", - "whoami", -] - -[[package]] -name = "sqlx-pool-guard" -version = "0.1.0" -dependencies = [ - "proc_pidinfo", - "sqlx", - "tempfile", - "tokio", - "tracing", - "tracing-subscriber", - "windows", -] - -[[package]] -name = "sqlx-postgres" -version = "0.8.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db58fcd5a53cf07c184b154801ff91347e4c30d17a3562a635ff028ad5deda46" -dependencies = [ - "atoi", - "base64 0.22.1", - "bitflags 2.10.0", - "byteorder", - "chrono", - "crc", - "dotenvy", - "etcetera", - "futures-channel", - "futures-core", - "futures-util", - "hex", - "hkdf", - "hmac", - "home", - "itoa", - "log", - "md-5", - "memchr", - "once_cell", - "rand 0.8.5", - "serde", - "serde_json", - "sha2 0.10.9", - "smallvec", - "sqlx-core", - "stringprep", - "thiserror 2.0.17", - "time", - "tracing", - "whoami", -] - -[[package]] -name = "sqlx-sqlite" -version = "0.8.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2d12fe70b2c1b4401038055f90f151b78208de1f9f89a7dbfd41587a10c3eea" -dependencies = [ - "atoi", - "chrono", - "flume", - "futures-channel", - "futures-core", - "futures-executor", - "futures-intrusive", - "futures-util", - "libsqlite3-sys", - "log", - "percent-encoding", - "serde", - "serde_urlencoded", - "sqlx-core", - "thiserror 2.0.17", - "time", - "tracing", - "url", -] - -[[package]] -name = "ssl-inject" -version = "0.1.0" -dependencies = [ - "anyhow", - "clap", - "hex", - "tokio", -] - -[[package]] -name = "stable_deref_trait" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" - -[[package]] -name = "static_assertions" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" - -[[package]] -name = "string_cache" -version = "0.8.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf776ba3fa74f83bf4b63c3dcbbf82173db2632ed8452cb2d891d33f459de70f" -dependencies = [ - "new_debug_unreachable", - "parking_lot", - "phf_shared 0.11.3", - "precomputed-hash", - "serde", -] - -[[package]] -name = "string_cache_codegen" -version = "0.5.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c711928715f1fe0fe509c53b43e993a9a557babc2d0a3567d0a3006f1ac931a0" -dependencies = [ - "phf_generator", - "phf_shared 0.11.3", - "proc-macro2", - "quote", -] - -[[package]] -name = "stringprep" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b4df3d392d81bd458a8a621b8bffbd2302a12ffe288a9d931670948749463b1" -dependencies = [ - "unicode-bidi", - "unicode-normalization", - "unicode-properties", -] - -[[package]] -name = "strsim" -version = "0.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" - -[[package]] -name = "strum" -version = "0.27.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af23d6f6c1a224baef9d3f61e287d2761385a5b88fdab4eb4c6f11aeb54c4bcf" -dependencies = [ - "strum_macros", -] - -[[package]] -name = "strum_macros" -version = "0.27.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7695ce3845ea4b33927c055a39dc438a45b059f7c1b3d91d38d10355fb8cbca7" -dependencies = [ - "heck 0.5.0", - "proc-macro2", - "quote", - "syn 2.0.107", -] - -[[package]] -name = "subtle" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d67a5a62ba6e01cb2192ff309324cb4875d0c451d55fe2319433abe7a05a8ee" - -[[package]] -name = "subtle" -version = "2.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" - -[[package]] -name = "subtle-encoding" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7dcb1ed7b8330c5eed5441052651dd7a12c75e2ed88f2ec024ae1fa3a5e59945" -dependencies = [ - "zeroize", -] - -[[package]] -name = "subtle-ng" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "734676eb262c623cec13c3155096e08d1f8f29adce39ba17948b18dad1e54142" - -[[package]] -name = "superboring" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "515cce34a781d7250b8a65706e0f2a5b99236ea605cb235d4baed6685820478f" -dependencies = [ - "getrandom 0.2.16", - "hmac-sha256", - "hmac-sha512", - "rand 0.8.5", - "rsa", -] - -[[package]] -name = "syn" -version = "1.0.109" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "syn" -version = "2.0.107" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a26dbd934e5451d21ef060c018dae56fc073894c5a7896f882928a76e6d081b" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "sync_wrapper" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" - -[[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 = "synstructure" -version = "0.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.107", -] - -[[package]] -name = "sysinfo" -version = "0.37.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16607d5caffd1c07ce073528f9ed972d88db15dd44023fa57142963be3feb11f" -dependencies = [ - "libc", - "memchr", - "ntapi", - "objc2-core-foundation", - "objc2-io-kit", - "windows", -] - -[[package]] -name = "system-configuration" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7" -dependencies = [ - "bitflags 1.3.2", - "core-foundation", - "system-configuration-sys", -] - -[[package]] -name = "system-configuration-sys" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a75fb188eb626b924683e3b95e3a48e63551fcfb51949de2f06a9d91dbee93c9" -dependencies = [ - "core-foundation-sys", - "libc", -] - -[[package]] -name = "tagptr" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b2093cf4c8eb1e67749a6762251bc9cd836b6fc171623bd0a9d324d37af2417" - -[[package]] -name = "tap" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" - -[[package]] -name = "tar" -version = "0.4.44" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d863878d212c87a19c1a610eb53bb01fe12951c0501cf5a0d65f724914a667a" -dependencies = [ - "filetime", - "libc", - "xattr", -] - -[[package]] -name = "tempfile" -version = "3.23.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d31c77bdf42a745371d260a26ca7163f1e0924b64afa0b688e61b5a9fa02f16" -dependencies = [ - "fastrand 2.3.0", - "getrandom 0.3.4", - "once_cell", - "rustix", - "windows-sys 0.61.2", -] - -[[package]] -name = "tendermint" -version = "0.40.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc997743ecfd4864bbca8170d68d9b2bee24653b034210752c2d883ef4b838b1" -dependencies = [ - "bytes", - "digest 0.10.7", - "ed25519", - "ed25519-consensus", - "flex-error", - "futures", - "k256", - "num-traits", - "once_cell", - "prost", - "ripemd", - "serde", - "serde_bytes", - "serde_json", - "serde_repr", - "sha2 0.10.9", - "signature", - "subtle 2.6.1", - "subtle-encoding", - "tendermint-proto", - "time", - "zeroize", -] - -[[package]] -name = "tendermint-config" -version = "0.40.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "069d1791f9b02a596abcd26eb72003b2e9906c6169a60fa82ffc080dd3a43fda" -dependencies = [ - "flex-error", - "serde", - "serde_json", - "tendermint", - "toml 0.8.23", - "url", -] - -[[package]] -name = "tendermint-proto" -version = "0.40.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2c40e13d39ca19082d8a7ed22de7595979350319833698f8b1080f29620a094" -dependencies = [ - "bytes", - "flex-error", - "prost", - "serde", - "serde_bytes", - "subtle-encoding", - "time", -] - -[[package]] -name = "tendermint-rpc" -version = "0.40.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35e0569a4b4cc42ff00df5a665be2858a39ff79df4790b176f1cd0e169bc0fc2" -dependencies = [ - "async-trait", - "async-tungstenite", - "bytes", - "flex-error", - "futures", - "getrandom 0.2.16", - "peg", - "pin-project", - "rand 0.8.5", - "reqwest 0.11.27", - "semver 1.0.27", - "serde", - "serde_bytes", - "serde_json", - "subtle 2.6.1", - "subtle-encoding", - "tendermint", - "tendermint-config", - "tendermint-proto", - "thiserror 1.0.69", - "time", - "tokio", - "tracing", - "url", - "uuid", - "walkdir", -] - -[[package]] -name = "tendril" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d24a120c5fc464a3458240ee02c299ebcb9d67b5249c8848b09d639dca8d7bb0" -dependencies = [ - "futf", - "mac", - "utf-8", -] - -[[package]] -name = "termcolor" -version = "1.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755" -dependencies = [ - "winapi-util", -] - -[[package]] -name = "test-with" -version = "0.15.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0f370b9efbfbbc5f057cbce9888373eaeb146a3095bb8cc869b199c94d15559" -dependencies = [ - "proc-macro-error2", - "proc-macro2", - "quote", - "regex", - "syn 2.0.107", -] - -[[package]] -name = "testnet-manager" -version = "0.1.0" -dependencies = [ - "anyhow", - "bip39", - "bs58", - "clap", - "console", - "cw-utils", - "dkg-bypass-contract", - "humantime", - "indicatif", - "nym-bin-common", - "nym-coconut-dkg-common", - "nym-compact-ecash", - "nym-config", - "nym-contracts-common", - "nym-crypto", - "nym-ecash-contract-common", - "nym-group-contract-common", - "nym-http-api-client", - "nym-mixnet-contract-common", - "nym-multisig-contract-common", - "nym-pemstore", - "nym-performance-contract-common", - "nym-validator-client", - "nym-vesting-contract-common", - "rand 0.8.5", - "serde", - "serde_json", - "sqlx", - "tempfile", - "thiserror 2.0.17", - "time", - "tokio", - "toml 0.8.23", - "tracing", - "url", - "zeroize", -] - -[[package]] -name = "textwrap" -version = "0.16.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c13547615a44dc9c452a8a534638acdf07120d4b6847c8178705da06306a3057" -dependencies = [ - "smawk", -] - -[[package]] -name = "thiserror" -version = "1.0.69" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" -dependencies = [ - "thiserror-impl 1.0.69", -] - -[[package]] -name = "thiserror" -version = "2.0.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f63587ca0f12b72a0600bcba1d40081f830876000bb46dd2337a3051618f4fc8" -dependencies = [ - "thiserror-impl 2.0.17", -] - -[[package]] -name = "thiserror-impl" -version = "1.0.69" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.107", -] - -[[package]] -name = "thiserror-impl" -version = "2.0.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ff15c8ecd7de3849db632e14d18d2571fa09dfc5ed93479bc4485c7a517c913" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.107", -] - -[[package]] -name = "thread_local" -version = "1.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f60246a4944f24f6e018aa17cdeffb7818b76356965d03b07d6a9886e8962185" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "threadpool" -version = "1.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d050e60b33d41c19108b32cea32164033a9013fe3b46cbd4457559bfbf77afaa" -dependencies = [ - "num_cpus", -] - -[[package]] -name = "thrift" -version = "0.17.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e54bc85fc7faa8bc175c4bab5b92ba8d9a3ce893d0e9f42cc455c8ab16a9e09" -dependencies = [ - "byteorder", - "integer-encoding", - "log", - "ordered-float", - "threadpool", -] - -[[package]] -name = "time" -version = "0.3.44" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91e7d9e3bb61134e77bde20dd4825b97c010155709965fedf0f49bb138e52a9d" -dependencies = [ - "deranged", - "itoa", - "js-sys", - "libc", - "num-conv", - "num_threads", - "powerfmt", - "serde", - "time-core", - "time-macros", -] - -[[package]] -name = "time-core" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40868e7c1d2f0b8d73e4a8c7f0ff63af4f6d19be117e90bd73eb1d62cf831c6b" - -[[package]] -name = "time-macros" -version = "0.2.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30cfb0125f12d9c277f35663a0a33f8c30190f4e4574868a330595412d34ebf3" -dependencies = [ - "num-conv", - "time-core", -] - -[[package]] -name = "tinystr" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d4f6d1145dcb577acf783d4e601bc1d76a13337bb54e6233add580b07344c8b" -dependencies = [ - "displaydoc", - "zerovec", -] - -[[package]] -name = "tinytemplate" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be4d6b5f19ff7664e8c98d03e2139cb510db9b0a60b55f8e8709b689d939b6bc" -dependencies = [ - "serde", - "serde_json", -] - -[[package]] -name = "tinyvec" -version = "1.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfa5fdc3bce6191a1dbc8c02d5c8bffcf557bafa17c124c5264a458f1b0613fa" -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 = "tokio" -version = "1.48.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff360e02eab121e0bc37a2d3b4d4dc622e6eda3a8e5253d5435ecf5bd4c68408" -dependencies = [ - "bytes", - "libc", - "mio 1.1.0", - "parking_lot", - "pin-project-lite", - "signal-hook-registry", - "socket2 0.6.1", - "tokio-macros", - "tracing", - "windows-sys 0.61.2", -] - -[[package]] -name = "tokio-macros" -version = "2.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af407857209536a95c8e56f8231ef2c2e2aff839b22e07a1ffcbc617e9db9fa5" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.107", -] - -[[package]] -name = "tokio-postgres" -version = "0.7.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b40d66d9b2cfe04b628173409368e58247e8eddbbd3b0e6c6ba1d09f20f6c9e" -dependencies = [ - "async-trait", - "byteorder", - "bytes", - "fallible-iterator", - "futures-channel", - "futures-util", - "log", - "parking_lot", - "percent-encoding", - "phf 0.13.1", - "pin-project-lite", - "postgres-protocol", - "postgres-types", - "rand 0.9.2", - "socket2 0.6.1", - "tokio", - "tokio-util", - "whoami", -] - -[[package]] -name = "tokio-rustls" -version = "0.24.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081" -dependencies = [ - "rustls 0.21.12", - "tokio", -] - -[[package]] -name = "tokio-rustls" -version = "0.25.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "775e0c0f0adb3a2f22a00c4745d728b479985fc15ee7ca6a2608388c5569860f" -dependencies = [ - "rustls 0.22.4", - "rustls-pki-types", - "tokio", -] - -[[package]] -name = "tokio-rustls" -version = "0.26.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1729aa945f29d91ba541258c8df89027d5792d85a8841fb65e8bf0f4ede4ef61" -dependencies = [ - "rustls 0.23.33", - "tokio", -] - -[[package]] -name = "tokio-stream" -version = "0.1.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eca58d7bba4a75707817a2c44174253f9236b2d5fbd055602e9d5c07c139a047" -dependencies = [ - "futures-core", - "pin-project-lite", - "tokio", - "tokio-util", -] - -[[package]] -name = "tokio-test" -version = "0.4.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2468baabc3311435b55dd935f702f42cd1b8abb7e754fb7dfb16bd36aa88f9f7" -dependencies = [ - "async-stream", - "bytes", - "futures-core", - "tokio", - "tokio-stream", -] - -[[package]] -name = "tokio-tun" -version = "0.11.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68f5381752d5832fc811f89d54fc334951aa435022f494190ba7151661f206df" -dependencies = [ - "libc", - "nix 0.29.0", - "thiserror 1.0.69", - "tokio", -] - -[[package]] -name = "tokio-tungstenite" -version = "0.20.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "212d5dcb2a1ce06d81107c3d0ffa3121fe974b73f068c8282cb1c32328113b6c" -dependencies = [ - "futures-util", - "log", - "rustls 0.21.12", - "tokio", - "tokio-rustls 0.24.1", - "tungstenite 0.20.1", - "webpki-roots 0.25.4", -] - -[[package]] -name = "tokio-util" -version = "0.7.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14307c986784f72ef81c89db7d9e28d6ac26d16213b109ea501696195e6e3ce5" -dependencies = [ - "bytes", - "futures-core", - "futures-sink", - "futures-util", - "pin-project-lite", - "slab", - "tokio", -] - -[[package]] -name = "tokio_with_wasm" -version = "0.8.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4dfba9b946459940fb564dcf576631074cdfb0bfe4c962acd4c31f0dca7897e6" -dependencies = [ - "js-sys", - "tokio", - "tokio_with_wasm_proc", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", -] - -[[package]] -name = "tokio_with_wasm_proc" -version = "0.8.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37e04c1865c281139e5ccf633cb9f76ffdaabeebfe53b703984cf82878e2aabb" -dependencies = [ - "quote", - "syn 2.0.107", -] - -[[package]] -name = "toml" -version = "0.5.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4f7f0dd8d50a853a531c426359045b1998f04219d88799810762cd4ad314234" -dependencies = [ - "serde", -] - -[[package]] -name = "toml" -version = "0.8.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc1beb996b9d83529a9e75c17a1686767d148d70663143c7854d8b4a09ced362" -dependencies = [ - "serde", - "serde_spanned", - "toml_datetime 0.6.11", - "toml_edit 0.22.27", -] - -[[package]] -name = "toml_datetime" -version = "0.6.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22cddaf88f4fbc13c51aebbf5f8eceb5c7c5a9da2ac40a13519eb5b0a0e8f11c" -dependencies = [ - "serde", -] - -[[package]] -name = "toml_datetime" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2cdb639ebbc97961c51720f858597f7f24c4fc295327923af55b74c3c724533" -dependencies = [ - "serde_core", -] - -[[package]] -name = "toml_edit" -version = "0.22.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41fe8c660ae4257887cf66394862d21dbca4a6ddd26f04a3560410406a2f819a" -dependencies = [ - "indexmap 2.12.0", - "serde", - "serde_spanned", - "toml_datetime 0.6.11", - "toml_write", - "winnow", -] - -[[package]] -name = "toml_edit" -version = "0.23.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6485ef6d0d9b5d0ec17244ff7eb05310113c3f316f2d14200d4de56b3cb98f8d" -dependencies = [ - "indexmap 2.12.0", - "toml_datetime 0.7.3", - "toml_parser", - "winnow", -] - -[[package]] -name = "toml_parser" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0cbe268d35bdb4bb5a56a2de88d0ad0eb70af5384a99d648cd4b3d04039800e" -dependencies = [ - "winnow", -] - -[[package]] -name = "toml_write" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d99f8c9a7727884afe522e9bd5edbfc91a3312b36a77b5fb8926e4c31a41801" - -[[package]] -name = "tonic" -version = "0.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "877c5b330756d856ffcc4553ab34a5684481ade925ecc54bcd1bf02b1d0d4d52" -dependencies = [ - "async-stream", - "async-trait", - "axum", - "base64 0.22.1", - "bytes", - "h2 0.4.12", - "http 1.3.1", - "http-body 1.0.1", - "http-body-util", - "hyper 1.7.0", - "hyper-timeout", - "hyper-util", - "percent-encoding", - "pin-project", - "prost", - "socket2 0.5.10", - "tokio", - "tokio-stream", - "tower 0.4.13", - "tower-layer", - "tower-service", - "tracing", -] - -[[package]] -name = "tower" -version = "0.4.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" -dependencies = [ - "futures-core", - "futures-util", - "indexmap 1.9.3", - "pin-project", - "pin-project-lite", - "rand 0.8.5", - "slab", - "tokio", - "tokio-util", - "tower-layer", - "tower-service", - "tracing", -] - -[[package]] -name = "tower" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9" -dependencies = [ - "futures-core", - "futures-util", - "pin-project-lite", - "sync_wrapper 1.0.2", - "tokio", - "tower-layer", - "tower-service", - "tracing", -] - -[[package]] -name = "tower-http" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e9cd434a998747dd2c4276bc96ee2e0c7a2eadf3cae88e52be55a05fa9053f5" -dependencies = [ - "async-compression", - "bitflags 2.10.0", - "bytes", - "futures-core", - "futures-util", - "http 1.3.1", - "http-body 1.0.1", - "http-body-util", - "http-range-header", - "httpdate", - "mime", - "mime_guess", - "percent-encoding", - "pin-project-lite", - "tokio", - "tokio-util", - "tower-layer", - "tower-service", - "tracing", -] - -[[package]] -name = "tower-http" -version = "0.6.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adc82fd73de2a9722ac5da747f12383d2bfdb93591ee6c58486e0097890f05f2" -dependencies = [ - "bitflags 2.10.0", - "bytes", - "futures-util", - "http 1.3.1", - "http-body 1.0.1", - "iri-string", - "pin-project-lite", - "tower 0.5.2", - "tower-layer", - "tower-service", -] - -[[package]] -name = "tower-layer" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" - -[[package]] -name = "tower-service" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" - -[[package]] -name = "tracing" -version = "0.1.41" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" -dependencies = [ - "log", - "pin-project-lite", - "tracing-attributes", - "tracing-core", -] - -[[package]] -name = "tracing-attributes" -version = "0.1.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81383ab64e72a7a8b8e13130c49e3dab29def6d0c7d76a03087b3cf71c5c6903" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.107", -] - -[[package]] -name = "tracing-core" -version = "0.1.34" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9d12581f227e93f094d3af2ae690a574abb8a2b9b7a96e7cfe9647b2b617678" -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-indicatif" -version = "0.3.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04d4e11e0e27acef25a47f27e9435355fecdc488867fa2bc90e75b0700d2823d" -dependencies = [ - "indicatif", - "tracing", - "tracing-core", - "tracing-subscriber", -] - -[[package]] -name = "tracing-log" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f751112709b4e791d8ce53e32c4ed2d353565a795ce84da2285393f41557bdf2" -dependencies = [ - "log", - "once_cell", - "tracing-core", -] - -[[package]] -name = "tracing-log" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" -dependencies = [ - "log", - "once_cell", - "tracing-core", -] - -[[package]] -name = "tracing-opentelemetry" -version = "0.19.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00a39dcf9bfc1742fa4d6215253b33a6e474be78275884c216fc2a06267b3600" -dependencies = [ - "once_cell", - "opentelemetry", - "tracing", - "tracing-core", - "tracing-log 0.1.4", - "tracing-subscriber", -] - -[[package]] -name = "tracing-subscriber" -version = "0.3.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2054a14f5307d601f88daf0553e1cbf472acc4f2c51afab632431cdcd72124d5" -dependencies = [ - "matchers", - "nu-ansi-term 0.50.3", - "once_cell", - "regex-automata", - "sharded-slab", - "smallvec", - "thread_local", - "tracing", - "tracing-core", - "tracing-log 0.2.0", -] - -[[package]] -name = "tracing-test" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "557b891436fe0d5e0e363427fc7f217abf9ccd510d5136549847bdcbcd011d68" -dependencies = [ - "tracing-core", - "tracing-subscriber", - "tracing-test-macro", -] - -[[package]] -name = "tracing-test-macro" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04659ddb06c87d233c566112c1c9c5b9e98256d9af50ec3bc9c8327f873a7568" -dependencies = [ - "quote", - "syn 2.0.107", -] - -[[package]] -name = "tracing-tree" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ec6adcab41b1391b08a308cc6302b79f8095d1673f6947c2dc65ffb028b0b2d" -dependencies = [ - "nu-ansi-term 0.46.0", - "tracing-core", - "tracing-log 0.1.4", - "tracing-subscriber", -] - -[[package]] -name = "trackable" -version = "0.2.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b98abb9e7300b9ac902cc04920945a874c1973e08c310627cc4458c04b70dd32" -dependencies = [ - "trackable 1.3.0", - "trackable_derive", -] - -[[package]] -name = "trackable" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b15bd114abb99ef8cee977e517c8f37aee63f184f2d08e3e6ceca092373369ae" -dependencies = [ - "trackable_derive", -] - -[[package]] -name = "trackable_derive" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebeb235c5847e2f82cfe0f07eb971d1e5f6804b18dac2ae16349cc604380f82f" -dependencies = [ - "quote", - "syn 1.0.109", -] - -[[package]] -name = "try-lock" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" - -[[package]] -name = "ts-rs" -version = "10.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e640d9b0964e9d39df633548591090ab92f7a4567bc31d3891af23471a3365c6" -dependencies = [ - "lazy_static", - "thiserror 2.0.17", - "ts-rs-macros", -] - -[[package]] -name = "ts-rs-cli" -version = "0.1.0" -dependencies = [ - "anyhow", - "nym-api-requests", - "nym-mixnet-contract-common", - "nym-types", - "nym-validator-client", - "nym-vesting-contract-common", - "nym-wallet-types", - "ts-rs", - "walkdir", -] - -[[package]] -name = "ts-rs-macros" -version = "10.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e9d8656589772eeec2cf7a8264d9cda40fb28b9bc53118ceb9e8c07f8f38730" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.107", - "termcolor", -] - -[[package]] -name = "tsify" -version = "0.4.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6b26cf145f2f3b9ff84e182c448eaf05468e247f148cf3d2a7d67d78ff023a0" -dependencies = [ - "gloo-utils 0.1.7", - "serde", - "serde-wasm-bindgen 0.5.0", - "serde_json", - "tsify-macros", - "wasm-bindgen", -] - -[[package]] -name = "tsify-macros" -version = "0.4.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a94b0f0954b3e59bfc2c246b4c8574390d94a4ad4ad246aaf2fb07d7dfd3b47" -dependencies = [ - "proc-macro2", - "quote", - "serde_derive_internals 0.28.0", - "syn 2.0.107", -] - -[[package]] -name = "tungstenite" -version = "0.20.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e3dac10fd62eaf6617d3a904ae222845979aec67c615d1c842b4002c7666fb9" -dependencies = [ - "byteorder", - "bytes", - "data-encoding", - "http 0.2.12", - "httparse", - "log", - "rand 0.8.5", - "rustls 0.21.12", - "sha1", - "thiserror 1.0.69", - "url", - "utf-8", - "webpki-roots 0.24.0", -] - -[[package]] -name = "tungstenite" -version = "0.21.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ef1a641ea34f399a848dea702823bbecfb4c486f911735368f1f137cb8257e1" -dependencies = [ - "byteorder", - "bytes", - "data-encoding", - "http 1.3.1", - "httparse", - "log", - "rand 0.8.5", - "rustls 0.22.4", - "rustls-pki-types", - "sha1", - "thiserror 1.0.69", - "url", - "utf-8", -] - -[[package]] -name = "typed-builder" -version = "0.23.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d0dd654273fc253fde1df4172c31fb6615cf8b041d3a4008a028ef8b1119e66" -dependencies = [ - "typed-builder-macro", -] - -[[package]] -name = "typed-builder-macro" -version = "0.23.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "016c26257f448222014296978b2c8456e2cad4de308c35bdb1e383acd569ef5b" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.107", -] - -[[package]] -name = "typenum" -version = "1.19.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb" - -[[package]] -name = "ucd-trie" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2896d95c02a80c6d6a5d6e953d479f5ddf2dfdb6a244441010e373ac0fb88971" - -[[package]] -name = "unicase" -version = "2.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75b844d17643ee918803943289730bec8aac480150456169e647ed0b576ba539" - -[[package]] -name = "unicode-bidi" -version = "0.3.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c1cb5db39152898a79168971543b1cb5020dff7fe43c8dc468b0885f5e29df5" - -[[package]] -name = "unicode-ident" -version = "1.0.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "462eeb75aeb73aea900253ce739c8e18a67423fadf006037cd3ff27e82748a06" - -[[package]] -name = "unicode-normalization" -version = "0.1.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5033c97c4262335cded6d6fc3e5c18ab755e1a3dc96376350f3d8e9f009ad956" -dependencies = [ - "tinyvec", -] - -[[package]] -name = "unicode-properties" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e70f2a8b45122e719eb623c01822704c4e0907e7e426a05927e1a1cfff5b75d0" - -[[package]] -name = "unicode-segmentation" -version = "1.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" - -[[package]] -name = "unicode-width" -version = "0.1.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af" - -[[package]] -name = "unicode-width" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4ac048d71ede7ee76d585517add45da530660ef4390e49b098733c6e897f254" - -[[package]] -name = "unicode-xid" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" - -[[package]] -name = "uniffi" -version = "0.29.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6d968cb62160c11f2573e6be724ef8b1b18a277aededd17033f8a912d73e2b4" -dependencies = [ - "anyhow", - "camino", - "cargo_metadata 0.19.2", - "clap", - "uniffi_bindgen", - "uniffi_build", - "uniffi_core", - "uniffi_macros", - "uniffi_pipeline", -] - -[[package]] -name = "uniffi_bindgen" -version = "0.29.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6b39ef1acbe1467d5d210f274fae344cb6f8766339330cb4c9688752899bf6b" -dependencies = [ - "anyhow", - "askama", - "camino", - "cargo_metadata 0.19.2", - "fs-err", - "glob", - "goblin", - "heck 0.5.0", - "indexmap 2.12.0", - "once_cell", - "serde", - "tempfile", - "textwrap", - "toml 0.5.11", - "uniffi_internal_macros", - "uniffi_meta", - "uniffi_pipeline", - "uniffi_udl", -] - -[[package]] -name = "uniffi_build" -version = "0.29.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6683e6b665423cddeacd89a3f97312cf400b2fb245a26f197adaf65c45d505b2" -dependencies = [ - "anyhow", - "camino", - "uniffi_bindgen", -] - -[[package]] -name = "uniffi_core" -version = "0.29.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2d990b553d6b9a7ee9c3ae71134674739913d52350b56152b0e613595bb5a6f" -dependencies = [ - "anyhow", - "bytes", - "once_cell", - "static_assertions", -] - -[[package]] -name = "uniffi_internal_macros" -version = "0.29.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04f4f224becf14885c10e6e400b95cc4d1985738140cb194ccc2044563f8a56b" -dependencies = [ - "anyhow", - "indexmap 2.12.0", - "proc-macro2", - "quote", - "syn 2.0.107", -] - -[[package]] -name = "uniffi_macros" -version = "0.29.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b481d385af334871d70904e6a5f129be7cd38c18fcf8dd8fd1f646b426a56d58" -dependencies = [ - "camino", - "fs-err", - "once_cell", - "proc-macro2", - "quote", - "serde", - "syn 2.0.107", - "toml 0.5.11", - "uniffi_meta", -] - -[[package]] -name = "uniffi_meta" -version = "0.29.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10f817868a3b171bb7bf259e882138d104deafde65684689b4694c846d322491" -dependencies = [ - "anyhow", - "siphasher 0.3.11", - "uniffi_internal_macros", - "uniffi_pipeline", -] - -[[package]] -name = "uniffi_pipeline" -version = "0.29.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b147e133ad7824e32426b90bc41fda584363563f2ba747f590eca1fd6fd14e6" -dependencies = [ - "anyhow", - "heck 0.5.0", - "indexmap 2.12.0", - "tempfile", - "uniffi_internal_macros", -] - -[[package]] -name = "uniffi_udl" -version = "0.29.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "caed654fb73da5abbc7a7e9c741532284532ba4762d6fe5071372df22a41730a" -dependencies = [ - "anyhow", - "textwrap", - "uniffi_meta", - "weedle2", -] - -[[package]] -name = "unit-prefix" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "323402cff2dd658f39ca17c789b502021b3f18707c91cdf22e3838e1b4023817" - -[[package]] -name = "universal-hash" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc1de2c688dc15305988b563c3854064043356019f97a4b46276fe734c4f07ea" -dependencies = [ - "crypto-common", - "subtle 2.6.1", -] - -[[package]] -name = "unsafe-libyaml" -version = "0.2.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "673aac59facbab8a9007c7f6108d11f63b603f7cabff99fabf650fea5c32b861" - -[[package]] -name = "untrusted" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" - -[[package]] -name = "url" -version = "2.5.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08bc136a29a3d1758e07a9cca267be308aeebf5cfd5a10f3f67ab2097683ef5b" -dependencies = [ - "form_urlencoded", - "idna", - "percent-encoding", - "serde", -] - -[[package]] -name = "urlencoding" -version = "2.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "daf8dba3b7eb870caf1ddeed7bc9d2a049f3cfdfae7cb521b087cc33ae4c49da" - -[[package]] -name = "utf-8" -version = "0.7.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" - -[[package]] -name = "utf8_iter" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" - -[[package]] -name = "utf8parse" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" - -[[package]] -name = "utoipa" -version = "5.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2fcc29c80c21c31608227e0912b2d7fddba57ad76b606890627ba8ee7964e993" -dependencies = [ - "indexmap 2.12.0", - "serde", - "serde_json", - "utoipa-gen", -] - -[[package]] -name = "utoipa-gen" -version = "5.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d79d08d92ab8af4c5e8a6da20c47ae3f61a0f1dabc1997cdf2d082b757ca08b" -dependencies = [ - "proc-macro2", - "quote", - "regex", - "syn 2.0.107", - "uuid", -] - -[[package]] -name = "utoipa-swagger-ui" -version = "8.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db4b5ac679cc6dfc5ea3f2823b0291c777750ffd5e13b21137e0f7ac0e8f9617" -dependencies = [ - "axum", - "base64 0.22.1", - "mime_guess", - "regex", - "rust-embed", - "serde", - "serde_json", - "url", - "utoipa", - "zip", -] - -[[package]] -name = "utoipauto" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cba36db2c397c614110554a60fbb4bb97d5f8c6823775c766e6f455e37377047" -dependencies = [ - "utoipauto-macro", -] - -[[package]] -name = "utoipauto-core" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "268d76aaebb80eba79240b805972e52d7d410d4bcc52321b951318b0f440cd60" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.107", -] - -[[package]] -name = "utoipauto-macro" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "382673bda1d05c85b4550d32fd4192ccd4cffe9a908543a0795d1e7682b36246" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.107", - "utoipauto-core", -] - -[[package]] -name = "uuid" -version = "1.18.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f87b8aa10b915a06587d0dec516c282ff295b475d94abf425d62b57710070a2" -dependencies = [ - "getrandom 0.3.4", - "js-sys", - "serde", - "wasm-bindgen", -] - -[[package]] -name = "validator-status-check" -version = "0.1.0" -dependencies = [ - "anyhow", - "clap", - "comfy-table", - "nym-bin-common", - "nym-http-api-client", - "nym-network-defaults", - "nym-validator-client", - "serde", - "serde_json", - "strum", - "time", - "tokio", - "tracing", -] - -[[package]] -name = "valuable" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" - -[[package]] -name = "vcpkg" -version = "0.2.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" - -[[package]] -name = "vergen" -version = "8.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e27d6bdd219887a9eadd19e1c34f32e47fa332301184935c6d9bca26f3cca525" -dependencies = [ - "anyhow", - "cargo_metadata 0.18.1", - "cfg-if", - "regex", - "rustc_version 0.4.1", - "rustversion", - "time", -] - -[[package]] -name = "vergen" -version = "9.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b2bf58be11fc9414104c6d3a2e464163db5ef74b12296bda593cac37b6e4777" -dependencies = [ - "anyhow", - "cargo_metadata 0.19.2", - "derive_builder", - "regex", - "rustc_version 0.4.1", - "rustversion", - "time", - "vergen-lib", -] - -[[package]] -name = "vergen-gitcl" -version = "1.0.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9dfc1de6eb2e08a4ddf152f1b179529638bedc0ea95e6d667c014506377aefe" -dependencies = [ - "anyhow", - "derive_builder", - "rustversion", - "time", - "vergen 9.0.6", - "vergen-lib", -] - -[[package]] -name = "vergen-lib" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b07e6010c0f3e59fcb164e0163834597da68d1f864e2b8ca49f74de01e9c166" -dependencies = [ - "anyhow", - "derive_builder", - "rustversion", -] - -[[package]] -name = "version_check" -version = "0.9.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" - -[[package]] -name = "vt100" -version = "0.15.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84cd863bf0db7e392ba3bd04994be3473491b31e66340672af5d11943c6274de" -dependencies = [ - "itoa", - "log", - "unicode-width 0.1.14", - "vte", -] - -[[package]] -name = "vte" -version = "0.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f5022b5fbf9407086c180e9557be968742d839e68346af7792b8592489732197" -dependencies = [ - "arrayvec", - "utf8parse", - "vte_generate_state_changes", -] - -[[package]] -name = "vte_generate_state_changes" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e369bee1b05d510a7b4ed645f5faa90619e05437111783ea5848f28d97d3c2e" -dependencies = [ - "proc-macro2", - "quote", -] - -[[package]] -name = "waker-fn" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "317211a0dc0ceedd78fb2ca9a44aed3d7b9b26f81870d485c07122b4350673b7" - -[[package]] -name = "walkdir" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" -dependencies = [ - "same-file", - "winapi-util", -] - -[[package]] -name = "want" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" -dependencies = [ - "try-lock", -] - -[[package]] -name = "wasi" -version = "0.11.1+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" - -[[package]] -name = "wasip2" -version = "1.0.1+wasi-0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0562428422c63773dad2c345a1882263bbf4d65cf3f42e90921f787ef5ad58e7" -dependencies = [ - "wit-bindgen", -] - -[[package]] -name = "wasite" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8dad83b4f25e74f184f64c43b150b91efe7647395b42289f38e50566d82855b" - -[[package]] -name = "wasix" -version = "0.12.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1fbb4ef9bbca0c1170e0b00dd28abc9e3b68669821600cad1caaed606583c6d" -dependencies = [ - "wasi", -] - -[[package]] -name = "wasm-bindgen" -version = "0.2.104" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1da10c01ae9f1ae40cbfac0bac3b1e724b320abfcf52229f80b547c0d250e2d" -dependencies = [ - "cfg-if", - "once_cell", - "rustversion", - "wasm-bindgen-macro", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-backend" -version = "0.2.104" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "671c9a5a66f49d8a47345ab942e2cb93c7d1d0339065d4f8139c486121b43b19" -dependencies = [ - "bumpalo", - "log", - "proc-macro2", - "quote", - "syn 2.0.107", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-futures" -version = "0.4.54" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e038d41e478cc73bae0ff9b36c60cff1c98b8f38f8d7e8061e79ee63608ac5c" -dependencies = [ - "cfg-if", - "js-sys", - "once_cell", - "wasm-bindgen", - "web-sys", -] - -[[package]] -name = "wasm-bindgen-macro" -version = "0.2.104" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ca60477e4c59f5f2986c50191cd972e3a50d8a95603bc9434501cf156a9a119" -dependencies = [ - "quote", - "wasm-bindgen-macro-support", -] - -[[package]] -name = "wasm-bindgen-macro-support" -version = "0.2.104" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f07d2f20d4da7b26400c9f4a0511e6e0345b040694e8a75bd41d578fa4421d7" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.107", - "wasm-bindgen-backend", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-shared" -version = "0.2.104" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bad67dc8b2a1a6e5448428adec4c3e84c43e561d8c9ee8a9e5aabeb193ec41d1" -dependencies = [ - "unicode-ident", -] - -[[package]] -name = "wasm-bindgen-test" -version = "0.3.54" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e381134e148c1062f965a42ed1f5ee933eef2927c3f70d1812158f711d39865" -dependencies = [ - "js-sys", - "minicov", - "wasm-bindgen", - "wasm-bindgen-futures", - "wasm-bindgen-test-macro", -] - -[[package]] -name = "wasm-bindgen-test-macro" -version = "0.3.54" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b673bca3298fe582aeef8352330ecbad91849f85090805582400850f8270a2e8" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.107", -] - -[[package]] -name = "wasm-client-core" -version = "0.1.0" -dependencies = [ - "async-trait", - "console_error_panic_hook", - "js-sys", - "nym-bandwidth-controller", - "nym-client-core", - "nym-config", - "nym-credential-storage", - "nym-crypto", - "nym-gateway-client", - "nym-http-api-client", - "nym-sphinx", - "nym-sphinx-acknowledgements", - "nym-statistics-common", - "nym-task", - "nym-topology", - "nym-validator-client", - "rand 0.8.5", - "serde", - "serde-wasm-bindgen 0.6.5", - "thiserror 2.0.17", - "time", - "tsify", - "url", - "wasm-bindgen", - "wasm-bindgen-futures", - "wasm-storage", - "wasm-utils", - "zeroize", -] - -[[package]] -name = "wasm-storage" -version = "0.1.0" -dependencies = [ - "async-trait", - "getrandom 0.2.16", - "indexed_db_futures", - "js-sys", - "nym-store-cipher", - "serde", - "serde-wasm-bindgen 0.6.5", - "thiserror 2.0.17", - "wasm-bindgen", - "wasm-utils", -] - -[[package]] -name = "wasm-streams" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15053d8d85c7eccdbefef60f06769760a563c7f0a9d6902a13d35c7800b0ad65" -dependencies = [ - "futures-util", - "js-sys", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", -] - -[[package]] -name = "wasm-utils" -version = "0.1.0" -dependencies = [ - "console_error_panic_hook", - "futures", - "getrandom 0.2.16", - "gloo-net", - "gloo-utils 0.2.0", - "js-sys", - "tungstenite 0.20.1", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", -] - -[[package]] -name = "wasmtimer" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c598d6b99ea013e35844697fc4670d08339d5cda15588f193c6beedd12f644b" -dependencies = [ - "futures", - "js-sys", - "parking_lot", - "pin-utils", - "slab", - "wasm-bindgen", -] - -[[package]] -name = "web-sys" -version = "0.3.81" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9367c417a924a74cae129e6a2ae3b47fabb1f8995595ab474029da749a8be120" -dependencies = [ - "js-sys", - "wasm-bindgen", -] - -[[package]] -name = "web-time" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb" -dependencies = [ - "js-sys", - "wasm-bindgen", -] - -[[package]] -name = "web_atoms" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57ffde1dc01240bdf9992e3205668b235e59421fd085e8a317ed98da0178d414" -dependencies = [ - "phf 0.11.3", - "phf_codegen", - "string_cache", - "string_cache_codegen", -] - -[[package]] -name = "webpki-roots" -version = "0.24.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b291546d5d9d1eab74f069c77749f2cb8504a12caa20f0f2de93ddbf6f411888" -dependencies = [ - "rustls-webpki 0.101.7", -] - -[[package]] -name = "webpki-roots" -version = "0.25.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f20c57d8d7db6d3b86154206ae5d8fba62dd39573114de97c2cb0578251f8e1" - -[[package]] -name = "webpki-roots" -version = "0.26.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "521bc38abb08001b01866da9f51eb7c5d647a19260e00054a8c7fd5f9e57f7a9" -dependencies = [ - "webpki-roots 1.0.3", -] - -[[package]] -name = "webpki-roots" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32b130c0d2d49f8b6889abc456e795e82525204f27c42cf767cf0d7734e089b8" -dependencies = [ - "rustls-pki-types", -] - -[[package]] -name = "weedle2" -version = "5.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "998d2c24ec099a87daf9467808859f9d82b61f1d9c9701251aea037f514eae0e" -dependencies = [ - "nom", -] - -[[package]] -name = "whoami" -version = "1.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d4a4db5077702ca3015d3d02d74974948aba2ad9e12ab7df718ee64ccd7e97d" -dependencies = [ - "libredox", - "wasite", - "web-sys", -] - -[[package]] -name = "widestring" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72069c3113ab32ab29e5584db3c6ec55d416895e60715417b5b883a357c3e471" - -[[package]] -name = "winapi" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" -dependencies = [ - "winapi-i686-pc-windows-gnu", - "winapi-x86_64-pc-windows-gnu", -] - -[[package]] -name = "winapi-i686-pc-windows-gnu" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" - -[[package]] -name = "winapi-util" -version = "0.1.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" -dependencies = [ - "windows-sys 0.61.2", -] - -[[package]] -name = "winapi-x86_64-pc-windows-gnu" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" - -[[package]] -name = "windows" -version = "0.61.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9babd3a767a4c1aef6900409f85f5d53ce2544ccdfaa86dad48c91782c6d6893" -dependencies = [ - "windows-collections", - "windows-core 0.61.2", - "windows-future", - "windows-link 0.1.3", - "windows-numerics", -] - -[[package]] -name = "windows-collections" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3beeceb5e5cfd9eb1d76b381630e82c4241ccd0d27f1a39ed41b2760b255c5e8" -dependencies = [ - "windows-core 0.61.2", -] - -[[package]] -name = "windows-core" -version = "0.61.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0fdd3ddb90610c7638aa2b3a3ab2904fb9e5cdbecc643ddb3647212781c4ae3" -dependencies = [ - "windows-implement", - "windows-interface", - "windows-link 0.1.3", - "windows-result 0.3.4", - "windows-strings 0.4.2", -] - -[[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 0.2.1", - "windows-result 0.4.1", - "windows-strings 0.5.1", -] - -[[package]] -name = "windows-future" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc6a41e98427b19fe4b73c550f060b59fa592d7d686537eebf9385621bfbad8e" -dependencies = [ - "windows-core 0.61.2", - "windows-link 0.1.3", - "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", - "quote", - "syn 2.0.107", -] - -[[package]] -name = "windows-interface" -version = "0.59.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.107", -] - -[[package]] -name = "windows-link" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a" - -[[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.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9150af68066c4c5c07ddc0ce30421554771e528bde427614c61038bc2c92c2b1" -dependencies = [ - "windows-core 0.61.2", - "windows-link 0.1.3", -] - -[[package]] -name = "windows-result" -version = "0.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56f42bd332cc6c8eac5af113fc0c1fd6a8fd2aa08a0119358686e5160d0586c6" -dependencies = [ - "windows-link 0.1.3", -] - -[[package]] -name = "windows-result" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5" -dependencies = [ - "windows-link 0.2.1", -] - -[[package]] -name = "windows-strings" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56e6c93f3a0c3b36176cb1327a4958a0353d5d166c2a35cb268ace15e91d3b57" -dependencies = [ - "windows-link 0.1.3", -] - -[[package]] -name = "windows-strings" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091" -dependencies = [ - "windows-link 0.2.1", -] - -[[package]] -name = "windows-sys" -version = "0.45.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" -dependencies = [ - "windows-targets 0.42.2", -] - -[[package]] -name = "windows-sys" -version = "0.48.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" -dependencies = [ - "windows-targets 0.48.5", -] - -[[package]] -name = "windows-sys" -version = "0.52.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" -dependencies = [ - "windows-targets 0.52.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 0.2.1", -] - -[[package]] -name = "windows-targets" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" -dependencies = [ - "windows_aarch64_gnullvm 0.42.2", - "windows_aarch64_msvc 0.42.2", - "windows_i686_gnu 0.42.2", - "windows_i686_msvc 0.42.2", - "windows_x86_64_gnu 0.42.2", - "windows_x86_64_gnullvm 0.42.2", - "windows_x86_64_msvc 0.42.2", -] - -[[package]] -name = "windows-targets" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" -dependencies = [ - "windows_aarch64_gnullvm 0.48.5", - "windows_aarch64_msvc 0.48.5", - "windows_i686_gnu 0.48.5", - "windows_i686_msvc 0.48.5", - "windows_x86_64_gnu 0.48.5", - "windows_x86_64_gnullvm 0.48.5", - "windows_x86_64_msvc 0.48.5", -] - -[[package]] -name = "windows-targets" -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 0.2.1", - "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.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b66463ad2e0ea3bbf808b7f1d371311c80e115c0b71d60efc142cafbcfb057a6" -dependencies = [ - "windows-link 0.1.3", -] - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006" - -[[package]] -name = "windows_i686_gnu" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" - -[[package]] -name = "windows_i686_gnu" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" - -[[package]] -name = "windows_i686_gnu" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" - -[[package]] -name = "windows_i686_gnu" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a506593a3" - -[[package]] -name = "windows_i686_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" - -[[package]] -name = "windows_i686_gnullvm" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c" - -[[package]] -name = "windows_i686_msvc" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" - -[[package]] -name = "windows_i686_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" - -[[package]] -name = "windows_i686_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" - -[[package]] -name = "windows_i686_msvc" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" - -[[package]] -name = "winnow" -version = "0.7.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21a0236b59786fed61e2a80582dd500fe61f18b5dca67a4a067d0bc9039339cf" -dependencies = [ - "memchr", -] - -[[package]] -name = "winreg" -version = "0.50.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "524e57b2c537c0f9b1e69f1965311ec12182b4122e45035b1508cd24d2adadb1" -dependencies = [ - "cfg-if", - "windows-sys 0.48.0", -] - -[[package]] -name = "wit-bindgen" -version = "0.46.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f17a85883d4e6d00e8a97c586de764dabcc06133f7f1d55dce5cdc070ad7fe59" - -[[package]] -name = "writeable" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea2f10b9bb0928dfb1b42b65e1f9e36f7f54dbdf08457afefb38afcdec4fa2bb" - -[[package]] -name = "wyz" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" -dependencies = [ - "tap", -] - -[[package]] -name = "x25519-dalek" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7e468321c81fb07fa7f4c636c3972b9100f0346e5b6a9f2bd0603a52f7ed277" -dependencies = [ - "curve25519-dalek", - "rand_core 0.6.4", - "serde", - "zeroize", -] - -[[package]] -name = "xattr" -version = "1.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32e45ad4206f6d2479085147f02bc2ef834ac85886624a23575ae137c8aa8156" -dependencies = [ - "libc", - "rustix", -] - -[[package]] -name = "yansi" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cfe53a6657fd280eaa890a3bc59152892ffa3e30101319d168b781ed6529b049" - -[[package]] -name = "yoke" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f41bb01b8226ef4bfd589436a297c53d118f65921786300e427be8d487695cc" -dependencies = [ - "serde", - "stable_deref_trait", - "yoke-derive", - "zerofrom", -] - -[[package]] -name = "yoke-derive" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38da3c9736e16c5d3c8c597a9aaa5d1fa565d0532ae05e27c24aa62fb32c0ab6" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.107", - "synstructure", -] - -[[package]] -name = "zerocopy" -version = "0.8.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0894878a5fa3edfd6da3f88c4805f4c8558e2b996227a3d864f47fe11e38282c" -dependencies = [ - "zerocopy-derive", -] - -[[package]] -name = "zerocopy-derive" -version = "0.8.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88d2b8d9c68ad2b9e4340d7832716a4d21a22a1154777ad56ea55c51a9cf3831" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.107", -] - -[[package]] -name = "zerofrom" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" -dependencies = [ - "zerofrom-derive", -] - -[[package]] -name = "zerofrom-derive" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.107", - "synstructure", -] - -[[package]] -name = "zeroize" -version = "1.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b97154e67e32c85465826e8bcc1c59429aaaf107c1e4a9e53c8d8ccd5eff88d0" -dependencies = [ - "zeroize_derive", -] - -[[package]] -name = "zeroize_derive" -version = "1.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.107", -] - -[[package]] -name = "zerotrie" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36f0bbd478583f79edad978b407914f61b2972f5af6fa089686016be8f9af595" -dependencies = [ - "displaydoc", - "yoke", - "zerofrom", -] - -[[package]] -name = "zerovec" -version = "0.11.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7aa2bd55086f1ab526693ecbe444205da57e25f4489879da80635a46d90e73b" -dependencies = [ - "yoke", - "zerofrom", - "zerovec-derive", -] - -[[package]] -name = "zerovec-derive" -version = "0.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b96237efa0c878c64bd89c436f661be4e46b2f3eff1ebb976f7ef2321d2f58f" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.107", -] - -[[package]] -name = "zip" -version = "2.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fabe6324e908f85a1c52063ce7aa26b68dcb7eb6dbc83a2d148403c9bc3eba50" -dependencies = [ - "arbitrary", - "crc32fast", - "crossbeam-utils", - "displaydoc", - "flate2", - "indexmap 2.12.0", - "memchr", - "thiserror 2.0.17", - "zopfli", -] - -[[package]] -name = "zknym-lib" -version = "0.1.0" -dependencies = [ - "anyhow", - "async-trait", - "bs58", - "getrandom 0.2.16", - "js-sys", - "nym-bin-common", - "nym-compact-ecash", - "nym-credentials", - "nym-crypto", - "nym-http-api-client", - "rand 0.8.5", - "reqwest 0.12.24", - "serde", - "thiserror 2.0.17", - "tokio", - "tsify", - "uuid", - "wasm-bindgen", - "wasm-utils", - "wasmtimer", - "zeroize", -] - -[[package]] -name = "zopfli" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edfc5ee405f504cd4984ecc6f14d02d55cfda60fa4b689434ef4102aae150cd7" -dependencies = [ - "bumpalo", - "crc32fast", - "log", - "simd-adler32", -] - -[[package]] -name = "zstd" -version = "0.13.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e91ee311a569c327171651566e07972200e76fcfe2242a4fa446149a3881c08a" -dependencies = [ - "zstd-safe", -] - -[[package]] -name = "zstd-safe" -version = "7.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f49c4d5f0abb602a93fb8736af2a4f4dd9512e36f7f570d66e65ff867ed3b9d" -dependencies = [ - "zstd-sys", -] - -[[package]] -name = "zstd-sys" -version = "2.0.16+zstd.1.5.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91e19ebc2adc8f83e43039e79776e3fda8ca919132d68a1fed6a5faca2683748" -dependencies = [ - "cc", - "pkg-config", -] - -[[package]] -name = "zulip-client" -version = "0.1.0" -dependencies = [ - "itertools 0.14.0", - "nym-bin-common", - "nym-http-api-client", - "reqwest 0.12.24", - "serde", - "serde_json", - "thiserror 2.0.17", - "tokio", - "tracing", - "url", - "zeroize", -] diff --git a/Cargo.toml b/Cargo.toml index 61411826b8..3cd3e3eacd 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -129,6 +129,7 @@ members = [ "nym-credential-proxy/nym-credential-proxy", "nym-credential-proxy/nym-credential-proxy-requests", "nym-data-observatory", + "nym-gateway-directory", "nym-ip-packet-client", "nym-network-monitor", "nym-node", diff --git a/nym-gateway-directory/Cargo.toml b/nym-gateway-directory/Cargo.toml new file mode 100644 index 0000000000..3b1914a0d2 --- /dev/null +++ b/nym-gateway-directory/Cargo.toml @@ -0,0 +1,31 @@ +[package] +name = "nym-gateway-directory" +# version.workspace = true +authors.workspace = true +repository.workspace = true +homepage.workspace = true +documentation.workspace = true +edition.workspace = true +license.workspace = true + +[dependencies] +futures.workspace = true +itertools.workspace = true +nym-client-core = { path = "../common/client-core" } +nym-common = { git = "https://github.com/nymtech/nym-vpn-client/", rev = "c7e38aae038748f7d577a8b1ae02931fff97e868" } # nym-vpn-core 1.11.0 +nym-http-api-client = { path = "../common/http-api-client" } +nym-offline-monitor = { git = "https://github.com/nymtech/nym-vpn-client/", rev = "c7e38aae038748f7d577a8b1ae02931fff97e868" } +nym-sdk = { path = "../sdk/rust/nym-sdk" } +nym-topology = { path = "../common/topology" } +nym-validator-client = { path = "../common/client-libs/validator-client" } +# nym-vpn-api-client = { path = "../nym-vpn-api-client" } # pull in remote and see if that works? I wonder if I can sack this off +rand.workspace = true +serde.workspace = true +strum.workspace = true +thiserror.workspace = true +tokio.workspace = true +tracing.workspace = true +url.workspace = true + +[dev-dependencies] +tokio = { workspace = true, features = ["full"] } diff --git a/nym-gateway-directory/src/caching_client.rs b/nym-gateway-directory/src/caching_client.rs new file mode 100644 index 0000000000..790d22a152 --- /dev/null +++ b/nym-gateway-directory/src/caching_client.rs @@ -0,0 +1,329 @@ +// Copyright 2025 - Nym Technologies SA +// SPDX-License-Identifier: GPL-3.0-only + +use std::{ + collections::HashMap, + net::IpAddr, + sync::Arc, + time::{Duration, Instant}, +}; + +use futures::{FutureExt, StreamExt, stream::FuturesUnordered}; +use nym_offline_monitor::ConnectivityHandle; +pub use nym_sdk::mixnet::NodeIdentity; +use strum::IntoEnumIterator; +use tokio::sync::Mutex; + +use crate::{ + Config, Country, Error, Gateway, GatewayClient, GatewayList, GatewayType, error::Result, +}; + +#[derive(Clone)] +pub struct CachingGatewayClient { + inner: Arc>, +} + +impl CachingGatewayClient { + pub fn new( + gateway_client: GatewayClient, + connectivity_handle: Option, + ) -> Self { + Self { + inner: Arc::new(Mutex::new(CachingGatewayClientInner { + gateway_client, + connectivity_handle, + cached_gateways: Default::default(), + cached_countries: Default::default(), + })), + } + } + + pub async fn new_from_existing(existing_client: &CachingGatewayClient) -> Self { + let inner = existing_client.inner.lock().await; + Self { + inner: Arc::new(Mutex::new(CachingGatewayClientInner { + gateway_client: inner.gateway_client.clone(), + connectivity_handle: inner.connectivity_handle.clone(), + cached_gateways: inner.cached_gateways.clone(), + cached_countries: inner.cached_countries.clone(), + })), + } + } + + pub async fn update_client(&self, new_client: GatewayClient) { + self.inner.lock().await.gateway_client = new_client; + } + + pub async fn set_connectivity_handle(&self, connectivity_handle: ConnectivityHandle) { + self.inner.lock().await.connectivity_handle = Some(connectivity_handle); + } + + pub async fn get_config(&self) -> Config { + self.inner.lock().await.gateway_client.get_config() + } + + pub async fn refresh_all(&self) { + self.inner.lock().await.refresh_all().await + } + + pub async fn force_refresh_all(&self) { + self.inner.lock().await.force_refresh_all().await + } + + pub async fn lookup_gateways(&self, gw_type: GatewayType) -> Result { + self.inner.lock().await.lookup_gateways(gw_type).await + } + + pub async fn lookup_countries(&self, gw_type: GatewayType) -> Result> { + self.inner.lock().await.lookup_countries(gw_type).await + } + + pub async fn lookup_gateway_ip(&self, gateway_identity: &str) -> Result { + self.inner + .lock() + .await + .lookup_gateway_ip(gateway_identity) + .await + } +} + +/// A caching client that wraps around the `GatewayClient` and caches the results of +/// `lookup_gateways` and `lookup_countries` calls. +struct CachingGatewayClientInner { + // The underlying client that actually does the work + gateway_client: GatewayClient, + + // The connectivity handle to check if we are online + connectivity_handle: Option, + + // The cached gateways and their last updated time + cached_gateways: HashMap, + + // The cached countries and their last updated time + cached_countries: HashMap, Instant)>, +} + +enum LookupResult { + Gateways(Result), + Countries(Result>), +} + +impl CachingGatewayClientInner { + /// The maximum age of the cache before it is considered stale. + const MAX_CACHE_AGE: Duration = Duration::from_secs(5 * 60); + + async fn check_offline(&self) -> bool { + if let Some(connectivity_handle) = &self.connectivity_handle { + if connectivity_handle.connectivity().await.is_offline() { + return true; + } + } + false + } + + pub async fn refresh_all(&mut self) { + tracing::info!("Refreshing all gateways and countries"); + self.refresh( + self.get_stale_gateway_list_types(), + self.get_stale_country_list_types(), + ) + .await; + } + + pub async fn force_refresh_all(&mut self) { + tracing::info!("Forcing refresh of all gateways and countries"); + self.refresh(GatewayType::iter().collect(), GatewayType::iter().collect()) + .await; + } + + fn get_stale_gateway_list_types(&self) -> Vec { + let mut stale_gw_types = Vec::new(); + for gw_type in GatewayType::iter() { + if !self.is_gateways_current(&gw_type) { + stale_gw_types.push(gw_type.clone()); + } + } + stale_gw_types + } + + fn get_stale_country_list_types(&self) -> Vec { + let mut stale_gw_types = Vec::new(); + for gw_type in GatewayType::iter() { + if !self.is_countries_current(&gw_type) { + stale_gw_types.push(gw_type.clone()); + } + } + stale_gw_types + } + + async fn refresh(&mut self, gw_list_types: Vec, country_types: Vec) { + if self.check_offline().await { + tracing::warn!("Not refreshing gateways and countries because we are not connected"); + return; + } + + tracing::info!( + "Refreshing gateway lists: {gw_list_types:?}, country lists: {country_types:?}" + ); + let mut tasks = FuturesUnordered::new(); + + for gw_type in country_types { + let client = self.gateway_client.clone(); + tasks.push( + async move { + let res = client.lookup_countries(gw_type.clone()).await; + (gw_type, LookupResult::Countries(res)) + } + .boxed(), + ); + } + for gw_type in gw_list_types { + let client = self.gateway_client.clone(); + tasks.push( + async move { + let res = client.lookup_gateways(gw_type.clone()).await; + (gw_type, LookupResult::Gateways(res)) + } + .boxed(), + ); + } + + while let Some((gw_type, res)) = tasks.next().await { + match res { + LookupResult::Gateways(r) => match r { + Ok(ref refreshed_gateways) => { + tracing::info!("Refreshed gateways for {gw_type:?}"); + self.cached_gateways.insert( + gw_type.clone(), + (refreshed_gateways.clone(), Instant::now()), + ); + } + Err(err) => { + tracing::warn!("Failed to refresh gateways for {gw_type:?}: {err}"); + } + }, + LookupResult::Countries(r) => match r { + Ok(ref refreshed_countries) => { + tracing::info!("Refreshed countries for {gw_type:?}"); + self.cached_countries.insert( + gw_type.clone(), + (refreshed_countries.clone(), Instant::now()), + ); + } + Err(err) => { + tracing::warn!("Failed to refresh countries for {gw_type:?}: {err}"); + } + }, + } + } + } + + fn is_countries_current(&self, gw_type: &GatewayType) -> bool { + if let Some((_, last_updated)) = self.cached_countries.get(gw_type) { + last_updated.elapsed() < Self::MAX_CACHE_AGE + } else { + false + } + } + + fn is_gateways_current(&self, gw_type: &GatewayType) -> bool { + if let Some((_, last_updated)) = self.cached_gateways.get(gw_type) { + last_updated.elapsed() < Self::MAX_CACHE_AGE + } else { + false + } + } + + async fn refresh_countries(&mut self, gw_type: GatewayType) -> Result> { + if let Some((countries, last_updated)) = self.cached_countries.get(&gw_type) { + if last_updated.elapsed() < Self::MAX_CACHE_AGE { + return Ok(countries.clone()); + } + } + self.force_refresh_countries(gw_type).await + } + + async fn force_refresh_countries(&mut self, gw_type: GatewayType) -> Result> { + if self.check_offline().await { + tracing::warn!("Not refreshing countries because we are not connected"); + return Err(Error::Offline); + } + let refreshed_countries = self + .gateway_client + .lookup_countries(gw_type.clone()) + .await?; + self.cached_countries.insert( + gw_type.clone(), + (refreshed_countries.clone(), Instant::now()), + ); + Ok(refreshed_countries) + } + + async fn refresh_gateways(&mut self, gw_type: GatewayType) -> Result { + if let Some((gw_list, last_updated)) = self.cached_gateways.get(&gw_type) { + if last_updated.elapsed() < Self::MAX_CACHE_AGE { + return Ok(gw_list.clone()); + } + } + self.force_refresh_gateways(gw_type).await + } + + async fn force_refresh_gateways(&mut self, gw_type: GatewayType) -> Result { + if self.check_offline().await { + tracing::warn!("Not refreshing countries because we are not connected"); + return Err(Error::Offline); + } + let refreshed_gateways = self.gateway_client.lookup_gateways(gw_type.clone()).await?; + self.cached_gateways.insert( + gw_type.clone(), + (refreshed_gateways.clone(), Instant::now()), + ); + Ok(refreshed_gateways) + } + + async fn lookup_gateways(&mut self, gw_type: GatewayType) -> Result { + let refresh_result = self.refresh_gateways(gw_type.clone()).await; + + // Regardless of if we managed to refresh the cache, we return the cached gateways if they + // exist. They should be the most recent one we can muster + if let Some((gateways, _)) = self.cached_gateways.get(&gw_type) { + Ok(gateways.clone()) + } else { + refresh_result + } + } + + async fn lookup_countries(&mut self, gw_type: GatewayType) -> Result> { + let refresh_result = self.refresh_countries(gw_type.clone()).await; + + // Regardless of if we managed to refresh the cache, we return the cached countries if they + // exist. They should be the most recent one we can muster + if let Some((countries, _)) = self.cached_countries.get(&gw_type) { + Ok(countries.clone()) + } else { + refresh_result + } + } + + async fn lookup_gateway_ip(&mut self, gateway_identity: &str) -> Result { + // If we have a populated list of gateways, we should always be able to find the IP there. + if let Ok(identity) = NodeIdentity::from_base58_string(gateway_identity) { + for (_, (gateways, _)) in self.cached_gateways.iter() { + if let Some(ip) = gateways + .node_with_identity(&identity) + .and_then(Gateway::lookup_ip) + { + return Ok(ip); + } + } + } else { + tracing::warn!("Failed to parse gateway identity: {gateway_identity}"); + } + + // Fallback + tracing::warn!("Using fallback to lookup gateway IP"); + self.gateway_client + .lookup_gateway_ip(gateway_identity) + .await + } +} diff --git a/nym-gateway-directory/src/entries/auth_addresses.rs b/nym-gateway-directory/src/entries/auth_addresses.rs new file mode 100644 index 0000000000..a958032cae --- /dev/null +++ b/nym-gateway-directory/src/entries/auth_addresses.rs @@ -0,0 +1,57 @@ +// Copyright 2023 - Nym Technologies SA +// SPDX-License-Identifier: GPL-3.0-only + +use std::fmt::Display; + +pub use nym_sdk::mixnet::Recipient; + +use crate::{Error, error::Result}; + +// optional, until we remove the wireguard feature flag +#[derive(Debug, Copy, Clone)] +pub struct AuthAddress(pub Option); + +impl AuthAddress { + pub(crate) fn try_from_base58_string(address: &str) -> Result { + let recipient = Recipient::try_from_base58_string(address).map_err(|source| { + Error::RecipientFormattingError { + address: address.to_string(), + source, + } + })?; + Ok(AuthAddress(Some(recipient))) + } +} + +#[derive(Debug, Copy, Clone)] +pub struct AuthAddresses { + entry_addr: AuthAddress, + exit_addr: AuthAddress, +} + +impl AuthAddresses { + pub fn new(entry_addr: AuthAddress, exit_addr: AuthAddress) -> Self { + AuthAddresses { + entry_addr, + exit_addr, + } + } + + pub fn entry(&self) -> AuthAddress { + self.entry_addr + } + + pub fn exit(&self) -> AuthAddress { + self.exit_addr + } +} + +impl Display for AuthAddresses { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!( + f, + "entry: {:?} exit: {:?}", + self.entry_addr.0, self.exit_addr.0 + ) + } +} diff --git a/nym-gateway-directory/src/entries/country.rs b/nym-gateway-directory/src/entries/country.rs new file mode 100644 index 0000000000..0a93685e7b --- /dev/null +++ b/nym-gateway-directory/src/entries/country.rs @@ -0,0 +1,31 @@ +// Copyright 2024 - Nym Technologies SA +// SPDX-License-Identifier: GPL-3.0-only + +use crate::Location; + +#[derive(Debug, Clone, PartialEq, Eq, Hash)] +pub struct Country { + iso_code: String, +} + +impl Country { + pub fn iso_code(&self) -> &str { + &self.iso_code + } +} + +impl From for Country { + fn from(country: nym_vpn_api_client::response::NymDirectoryCountry) -> Self { + Self { + iso_code: country.iso_code().to_string(), + } + } +} + +impl From for Country { + fn from(location: Location) -> Self { + Self { + iso_code: location.two_letter_iso_country_code, + } + } +} diff --git a/nym-gateway-directory/src/entries/entry_point.rs b/nym-gateway-directory/src/entries/entry_point.rs new file mode 100644 index 0000000000..24458351f9 --- /dev/null +++ b/nym-gateway-directory/src/entries/entry_point.rs @@ -0,0 +1,78 @@ +// Copyright 2023 - Nym Technologies SA +// SPDX-License-Identifier: GPL-3.0-only + +use std::fmt::{Display, Formatter}; + +pub use nym_sdk::mixnet::NodeIdentity; +use serde::{Deserialize, Serialize}; +use tracing::debug; + +use super::gateway::{Gateway, GatewayList}; +use crate::{Error, error::Result}; + +// The entry point is always a gateway identity, or some other entry that can be resolved to a +// gateway identity. +#[derive(Clone, Debug, Deserialize, PartialEq, Eq, Serialize)] +pub enum EntryPoint { + // An explicit entry gateway identity. + Gateway { identity: NodeIdentity }, + // Select a random entry gateway in a specific location. + Location { location: String }, + // Select an entry gateway at random. + Random, +} + +impl Display for EntryPoint { + fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { + match self { + EntryPoint::Gateway { identity } => write!(f, "Gateway: {identity}"), + EntryPoint::Location { location } => write!(f, "Location: {location}"), + EntryPoint::Random => write!(f, "Random"), + } + } +} + +impl EntryPoint { + pub fn from_base58_string(base58: &str) -> Result { + let identity = NodeIdentity::from_base58_string(base58).map_err(|source| { + Error::NodeIdentityFormattingError { + identity: base58.to_string(), + source, + } + })?; + Ok(EntryPoint::Gateway { identity }) + } + + pub fn is_location(&self) -> bool { + matches!(self, EntryPoint::Location { .. }) + } + + pub async fn lookup_gateway(&self, gateways: &GatewayList) -> Result { + match &self { + EntryPoint::Gateway { identity } => { + debug!("Selecting gateway by identity: {}", identity); + gateways + .gateway_with_identity(identity) + .ok_or_else(|| Error::NoMatchingGateway { + requested_identity: identity.to_string(), + }) + .cloned() + } + EntryPoint::Location { location } => { + debug!("Selecting gateway by location: {}", location); + gateways + .random_gateway_located_at(location.to_string()) + .ok_or_else(|| Error::NoMatchingEntryGatewayForLocation { + requested_location: location.clone(), + available_countries: gateways.all_iso_codes(), + }) + } + EntryPoint::Random => { + debug!("Selecting a random gateway"); + gateways + .random_gateway() + .ok_or_else(|| Error::FailedToSelectGatewayRandomly) + } + } + } +} diff --git a/nym-gateway-directory/src/entries/exit_point.rs b/nym-gateway-directory/src/entries/exit_point.rs new file mode 100644 index 0000000000..7a95be8295 --- /dev/null +++ b/nym-gateway-directory/src/entries/exit_point.rs @@ -0,0 +1,92 @@ +// Copyright 2023 - Nym Technologies SA +// SPDX-License-Identifier: GPL-3.0-only + +use std::fmt::{Display, Formatter}; + +pub use nym_sdk::mixnet::{NodeIdentity, Recipient}; +use serde::{Deserialize, Serialize}; + +use super::gateway::{Gateway, GatewayList}; +use crate::{Error, IpPacketRouterAddress, error::Result}; + +// The exit point is a nym-address, but if the exit ip-packet-router is running embedded on a +// gateway, we can refer to it by the gateway identity. +#[derive(Clone, Debug, PartialEq, Eq, Deserialize, Serialize)] +pub enum ExitPoint { + // An explicit exit address. This is useful when the exit ip-packet-router is running as a + // standalone entity (private). + Address { address: Box }, + + // An explicit exit gateway identity. This is useful when the exit ip-packet-router is running + // embedded on a gateway. + Gateway { identity: NodeIdentity }, + + // NOTE: Consider using a crate with strongly typed country codes instead of strings + Location { location: String }, + + // Select an exit gateway at random. + Random, +} + +impl Display for ExitPoint { + fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { + match self { + ExitPoint::Address { address } => write!(f, "Address: {address}"), + ExitPoint::Gateway { identity } => write!(f, "Gateway: {identity}"), + ExitPoint::Location { location } => write!(f, "Location: {location}"), + ExitPoint::Random => write!(f, "Random"), + } + } +} + +impl ExitPoint { + pub fn is_location(&self) -> bool { + matches!(self, ExitPoint::Location { .. }) + } + + pub fn lookup_gateway(&self, gateways: &GatewayList) -> Result { + match &self { + ExitPoint::Address { address } => { + tracing::debug!("Selecting gateway by address: {address}"); + // There is no validation done when a ip packet router is specified by address + // since it might be private and not available in any directory. + let ipr_address = IpPacketRouterAddress::from(**address); + let gateway_address = ipr_address.gateway(); + + // Now fetch the gateway that the IPR is connected to, and override its IPR address + let mut gateway = gateways + .gateway_with_identity(&gateway_address) + .ok_or_else(|| Error::NoMatchingGateway { + requested_identity: gateway_address.to_string(), + }) + .cloned()?; + gateway.ipr_address = Some(ipr_address); + Ok(gateway) + } + ExitPoint::Gateway { identity } => { + tracing::debug!("Selecting gateway by identity: {identity}"); + gateways + .gateway_with_identity(identity) + .ok_or_else(|| Error::NoMatchingGateway { + requested_identity: identity.to_string(), + }) + .cloned() + } + ExitPoint::Location { location } => { + tracing::debug!("Selecting gateway by location: {location}"); + gateways + .random_gateway_located_at(location.to_string()) + .ok_or_else(|| Error::NoMatchingExitGatewayForLocation { + requested_location: location.clone(), + available_countries: gateways.all_iso_codes(), + }) + } + ExitPoint::Random => { + tracing::debug!("Selecting a random exit gateway"); + gateways + .random_gateway() + .ok_or_else(|| Error::FailedToSelectGatewayRandomly) + } + } + } +} diff --git a/nym-gateway-directory/src/entries/gateway.rs b/nym-gateway-directory/src/entries/gateway.rs new file mode 100644 index 0000000000..eb8ecf852e --- /dev/null +++ b/nym-gateway-directory/src/entries/gateway.rs @@ -0,0 +1,535 @@ +// Copyright 2024 - Nym Technologies SA +// SPDX-License-Identifier: GPL-3.0-only + +use itertools::Itertools; +pub use nym_sdk::mixnet::NodeIdentity; +use nym_topology::{NodeId, RoutingNode}; +use nym_vpn_api_client::types::{NaiveFloat, Percent, ScoreThresholds}; +use rand::seq::IteratorRandom; +use std::{fmt, net::IpAddr}; +use tracing::error; + +use crate::{AuthAddress, Country, Error, IpPacketRouterAddress, error::Result}; + +use super::score::{HIGH_SCORE_THRESHOLD, LOW_SCORE_THRESHOLD, MEDIUM_SCORE_THRESHOLD, Score}; + +pub type NymNode = Gateway; + +#[derive(Clone)] +pub struct Gateway { + pub identity: NodeIdentity, + pub moniker: String, + pub location: Option, + pub ipr_address: Option, + pub authenticator_address: Option, + pub last_probe: Option, + pub ips: Vec, + pub host: Option, + pub clients_ws_port: Option, + pub clients_wss_port: Option, + pub mixnet_performance: Option, + pub wg_performance: Option, + pub wg_score: Option, + pub mixnet_score: Option, + pub version: Option, +} + +impl fmt::Debug for Gateway { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + f.debug_struct("Gateway") + .field("identity", &self.identity.to_base58_string()) + .field("location", &self.location) + .field("ipr_address", &self.ipr_address) + .field("authenticator_address", &self.authenticator_address) + .field("last_probe", &self.last_probe) + .field("host", &self.host) + .field("clients_ws_port", &self.clients_ws_port) + .field("clients_wss_port", &self.clients_wss_port) + .field("mixnet_performance", &self.mixnet_performance) + .finish() + } +} + +impl Gateway { + pub fn identity(&self) -> NodeIdentity { + self.identity + } + + pub fn two_letter_iso_country_code(&self) -> Option<&str> { + self.location + .as_ref() + .map(|l| l.two_letter_iso_country_code.as_str()) + } + + pub fn is_two_letter_iso_country_code(&self, code: &str) -> bool { + self.two_letter_iso_country_code() == Some(code) + } + + pub fn has_ipr_address(&self) -> bool { + self.ipr_address.is_some() + } + + pub fn has_authenticator_address(&self) -> bool { + self.authenticator_address.is_some() + } + + pub fn host(&self) -> Option<&String> { + self.host.as_ref() + } + + pub fn lookup_ip(&self) -> Option { + self.ips.first().copied() + } + + pub fn clients_address_no_tls(&self) -> Option { + match (&self.host, &self.clients_ws_port) { + (Some(host), Some(port)) => Some(format!("ws://{host}:{port}")), + _ => None, + } + } + + pub fn clients_address_tls(&self) -> Option { + match (&self.host, &self.clients_wss_port) { + (Some(host), Some(port)) => Some(format!("wss://{host}:{port}")), + _ => None, + } + } + + pub fn update_to_new_thresholds( + &mut self, + mix_thresholds: Option, + wg_thresholds: Option, + ) { + if let (Some(mix_thresholds), Some(score)) = (mix_thresholds, self.mixnet_score.as_mut()) { + score.update_to_new_thresholds(mix_thresholds); + } + if let (Some(wg_thresholds), Some(score)) = (wg_thresholds, self.wg_score.as_mut()) { + score.update_to_new_thresholds(wg_thresholds); + } + } +} + +#[derive(Debug, Default, Clone, PartialEq)] +pub struct Location { + pub two_letter_iso_country_code: String, + pub latitude: f64, + pub longitude: f64, +} + +#[derive(Debug, Clone, PartialEq)] +pub struct Probe { + pub last_updated_utc: String, + pub outcome: ProbeOutcome, +} + +#[derive(Debug, Clone, PartialEq)] +pub struct ProbeOutcome { + pub as_entry: Entry, + pub as_exit: Option, + pub wg: Option, +} + +#[derive(Debug, Clone, PartialEq)] +pub struct Entry { + pub can_connect: bool, + pub can_route: bool, +} + +#[derive(Debug, Clone, PartialEq)] +pub struct Exit { + pub can_connect: bool, + pub can_route_ip_v4: bool, + pub can_route_ip_external_v4: bool, + pub can_route_ip_v6: bool, + pub can_route_ip_external_v6: bool, +} + +#[derive(Debug, Clone, PartialEq)] +pub struct WgProbeResults { + pub can_register: bool, + pub can_handshake: bool, + pub can_resolve_dns: bool, + pub ping_hosts_performance: f32, + pub ping_ips_performance: f32, +} + +impl From for Location { + fn from(location: nym_vpn_api_client::response::Location) -> Self { + Location { + two_letter_iso_country_code: location.two_letter_iso_country_code, + latitude: location.latitude, + longitude: location.longitude, + } + } +} + +impl From for Probe { + fn from(probe: nym_vpn_api_client::response::Probe) -> Self { + Probe { + last_updated_utc: probe.last_updated_utc, + outcome: ProbeOutcome::from(probe.outcome), + } + } +} + +impl From for Score { + fn from(percent: Percent) -> Self { + let rounded_percent = percent.round_to_integer(); + if rounded_percent >= HIGH_SCORE_THRESHOLD { + Score::High(rounded_percent) + } else if rounded_percent >= MEDIUM_SCORE_THRESHOLD { + Score::Medium(rounded_percent) + } else if rounded_percent > LOW_SCORE_THRESHOLD { + Score::Low(rounded_percent) + } else { + Score::None + } + } +} + +impl From for ProbeOutcome { + fn from(outcome: nym_vpn_api_client::response::ProbeOutcome) -> Self { + ProbeOutcome { + as_entry: Entry::from(outcome.as_entry), + as_exit: outcome.as_exit.map(Exit::from), + wg: outcome.wg.map(WgProbeResults::from), + } + } +} + +impl From for Entry { + fn from(entry: nym_vpn_api_client::response::Entry) -> Self { + Entry { + can_connect: entry.can_connect, + can_route: entry.can_route, + } + } +} + +impl From for Exit { + fn from(exit: nym_vpn_api_client::response::Exit) -> Self { + Exit { + can_connect: exit.can_connect, + can_route_ip_v4: exit.can_route_ip_v4, + can_route_ip_external_v4: exit.can_route_ip_external_v4, + can_route_ip_v6: exit.can_route_ip_v6, + can_route_ip_external_v6: exit.can_route_ip_external_v6, + } + } +} + +impl From for WgProbeResults { + fn from(results: nym_vpn_api_client::response::WgProbeResults) -> Self { + WgProbeResults { + can_register: results.can_register, + can_handshake: results.can_handshake, + can_resolve_dns: results.can_resolve_dns, + ping_hosts_performance: results.ping_hosts_performance, + ping_ips_performance: results.ping_ips_performance, + } + } +} + +impl TryFrom for Gateway { + type Error = Error; + + fn try_from(gateway: nym_vpn_api_client::response::NymDirectoryGateway) -> Result { + let identity = + NodeIdentity::from_base58_string(&gateway.identity_key).map_err(|source| { + Error::NodeIdentityFormattingError { + identity: gateway.identity_key, + source, + } + })?; + + let ipr_address = gateway + .ip_packet_router + .and_then(|ipr| IpPacketRouterAddress::try_from_base58_string(&ipr.address).ok()); + + let authenticator_address = gateway + .authenticator + .and_then(|auth| AuthAddress::try_from_base58_string(&auth.address).ok()); + + let hostname = gateway.entry.hostname; + let first_ip_address = gateway + .ip_addresses + .first() + .cloned() + .map(|ip| ip.to_string()); + let host = hostname.or(first_ip_address); + let wg_performance = gateway.last_probe.as_ref().and_then(|probe| { + probe + .outcome + .wg + .as_ref() + .and_then(|p| Percent::naive_try_from_f64(p.ping_hosts_performance as f64).ok()) + }); + + Ok(Gateway { + identity, + moniker: gateway.name, + location: Some(gateway.location.into()), + ipr_address, + authenticator_address, + last_probe: gateway.last_probe.map(Probe::from), + ips: gateway.ip_addresses, + host, + clients_ws_port: Some(gateway.entry.ws_port), + clients_wss_port: gateway.entry.wss_port, + mixnet_performance: Some(gateway.performance), + mixnet_score: Some(Score::from(gateway.performance)), + wg_performance, + wg_score: wg_performance.map(Score::from), + version: gateway.build_information.map(|info| info.build_version), + }) + } +} + +impl TryFrom for Gateway { + type Error = Error; + + fn try_from( + node_description: nym_validator_client::models::NymNodeDescription, + ) -> Result { + let identity = node_description.description.host_information.keys.ed25519; + let location = node_description + .description + .auxiliary_details + .location + .map(|l| Location { + two_letter_iso_country_code: l.alpha2.to_string(), + ..Default::default() + }); + let ipr_address = node_description + .description + .ip_packet_router + .as_ref() + .and_then(|ipr| { + IpPacketRouterAddress::try_from_base58_string(&ipr.address) + .inspect_err(|err| error!("Failed to parse IPR address: {err}")) + .ok() + }); + let authenticator_address = node_description + .description + .authenticator + .as_ref() + .and_then(|a| { + AuthAddress::try_from_base58_string(&a.address) + .inspect_err(|err| error!("Failed to parse authenticator address: {err}")) + .ok() + }); + let version = Some(node_description.version().to_string()); + let role = if node_description.description.declared_role.entry { + nym_validator_client::nym_nodes::NodeRole::EntryGateway + } else if node_description.description.declared_role.exit_ipr + || node_description.description.declared_role.exit_nr + { + nym_validator_client::nym_nodes::NodeRole::ExitGateway + } else { + nym_validator_client::nym_nodes::NodeRole::Inactive + }; + + let gateway = + RoutingNode::try_from(&node_description.to_skimmed_node(role, Default::default())) + .map_err(|_| Error::MalformedGateway)?; + + let host = gateway.ws_entry_address(false); + let entry_info = &gateway.entry; + let clients_ws_port = entry_info.as_ref().map(|g| g.clients_ws_port); + let clients_wss_port = entry_info.as_ref().and_then(|g| g.clients_wss_port); + let ips = node_description.description.host_information.ip_address; + Ok(Gateway { + identity, + moniker: String::new(), + location, + ipr_address, + authenticator_address, + last_probe: None, + ips, + host, + clients_ws_port, + clients_wss_port, + mixnet_performance: None, + wg_performance: None, + wg_score: None, + mixnet_score: None, + version, + }) + } +} + +pub type NymNodeList = GatewayList; + +#[derive(Debug, Clone)] +pub struct GatewayList { + gateways: Vec, +} + +impl GatewayList { + pub fn new(gateways: Vec) -> Self { + GatewayList { gateways } + } + + // Returns a list of all locations of the gateways, including duplicates + fn all_locations(&self) -> impl Iterator { + self.gateways + .iter() + .filter_map(|gateway| gateway.location.as_ref()) + } + + pub fn all_countries(&self) -> Vec { + self.all_locations() + .cloned() + .map(Country::from) + .unique() + .collect() + } + + pub fn all_iso_codes(&self) -> Vec { + self.all_countries() + .into_iter() + .map(|country| country.iso_code().to_string()) + .collect() + } + + pub fn node_with_identity(&self, identity: &NodeIdentity) -> Option<&NymNode> { + self.gateways + .iter() + .find(|node| &node.identity() == identity) + } + + pub fn gateway_with_identity(&self, identity: &NodeIdentity) -> Option<&Gateway> { + self.node_with_identity(identity) + } + + pub fn gateways_located_at(&self, code: String) -> impl Iterator { + self.gateways.iter().filter(move |gateway| { + gateway + .two_letter_iso_country_code() + .is_some_and(|gw_code| gw_code == code) + }) + } + + pub fn random_gateway(&self) -> Option { + self.gateways + .iter() + .choose(&mut rand::thread_rng()) + .cloned() + } + + pub fn random_gateway_located_at(&self, code: String) -> Option { + self.gateways_located_at(code) + .choose(&mut rand::thread_rng()) + .cloned() + } + + pub fn remove_gateway(&mut self, entry_gateway: &Gateway) { + self.gateways + .retain(|gateway| gateway.identity() != entry_gateway.identity()); + } + + pub fn len(&self) -> usize { + self.gateways.len() + } + + pub fn is_empty(&self) -> bool { + self.gateways.is_empty() + } + + pub fn into_exit_gateways(self) -> GatewayList { + let gw = self + .gateways + .into_iter() + .filter(Gateway::has_ipr_address) + .collect(); + Self::new(gw) + } + + pub fn into_vpn_gateways(self) -> GatewayList { + let gw = self + .gateways + .into_iter() + .filter(Gateway::has_authenticator_address) + .collect(); + Self::new(gw) + } + + pub fn into_countries(self) -> Vec { + self.all_countries() + } + + pub fn into_inner(self) -> Vec { + self.gateways + } +} + +impl IntoIterator for GatewayList { + type Item = Gateway; + type IntoIter = std::vec::IntoIter; + + fn into_iter(self) -> Self::IntoIter { + self.gateways.into_iter() + } +} + +impl nym_client_core::init::helpers::ConnectableGateway for Gateway { + #[allow(unconditional_recursion)] + fn node_id(&self) -> NodeId { + self.node_id() + } + + fn identity(&self) -> nym_sdk::mixnet::NodeIdentity { + self.identity() + } + + fn clients_address(&self, _prefer_ipv6: bool) -> Option { + // This is a bit of a sharp edge, but temporary until we can remove Option from host + // and tls port when we add these to the vpn API endpoints. + Some( + self.clients_address_tls() + .or(self.clients_address_no_tls()) + .unwrap_or("ws://".to_string()), + ) + } + + fn is_wss(&self) -> bool { + self.clients_address_tls().is_some() + } +} + +#[derive(Debug, Clone, Hash, PartialEq, Eq, strum::EnumIter)] +pub enum GatewayType { + MixnetEntry, + MixnetExit, + Wg, +} + +impl fmt::Display for GatewayType { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + match self { + GatewayType::MixnetEntry => write!(f, "mixnet entry"), + GatewayType::MixnetExit => write!(f, "mixnet exit"), + GatewayType::Wg => write!(f, "vpn"), + } + } +} + +impl From for GatewayType { + fn from(gateway_type: nym_vpn_api_client::types::GatewayType) -> Self { + match gateway_type { + nym_vpn_api_client::types::GatewayType::MixnetEntry => GatewayType::MixnetEntry, + nym_vpn_api_client::types::GatewayType::MixnetExit => GatewayType::MixnetExit, + nym_vpn_api_client::types::GatewayType::Wg => GatewayType::Wg, + } + } +} + +impl From for nym_vpn_api_client::types::GatewayType { + fn from(gateway_type: GatewayType) -> Self { + match gateway_type { + GatewayType::MixnetEntry => nym_vpn_api_client::types::GatewayType::MixnetEntry, + GatewayType::MixnetExit => nym_vpn_api_client::types::GatewayType::MixnetExit, + GatewayType::Wg => nym_vpn_api_client::types::GatewayType::Wg, + } + } +} diff --git a/nym-gateway-directory/src/entries/ipr_addresses.rs b/nym-gateway-directory/src/entries/ipr_addresses.rs new file mode 100644 index 0000000000..e6c0eb3115 --- /dev/null +++ b/nym-gateway-directory/src/entries/ipr_addresses.rs @@ -0,0 +1,56 @@ +// Copyright 2023 - Nym Technologies SA +// SPDX-License-Identifier: GPL-3.0-only + +pub use nym_sdk::mixnet::{NodeIdentity, Recipient}; +use nym_validator_client::models::NymNodeData; + +use crate::{Error, error::Result}; + +#[derive(Debug, Copy, Clone)] +pub struct IpPacketRouterAddress(Recipient); + +impl IpPacketRouterAddress { + pub fn try_from_base58_string(ip_packet_router_nym_address: &str) -> Result { + Ok(Self( + Recipient::try_from_base58_string(ip_packet_router_nym_address).map_err(|source| { + Error::RecipientFormattingError { + address: ip_packet_router_nym_address.to_string(), + source, + } + })?, + )) + } + + pub fn try_from_described_gateway(gateway: &NymNodeData) -> Result { + let address = gateway + .clone() + .ip_packet_router + .map(|ipr| ipr.address) + .ok_or(Error::MissingIpPacketRouterAddress)?; + Ok(Self(Recipient::try_from_base58_string(&address).map_err( + |source| Error::RecipientFormattingError { address, source }, + )?)) + } + + pub fn gateway(&self) -> NodeIdentity { + self.0.gateway() + } +} + +impl std::fmt::Display for IpPacketRouterAddress { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(f, "{}", self.0) + } +} + +impl From for IpPacketRouterAddress { + fn from(recipient: Recipient) -> Self { + Self(recipient) + } +} + +impl From for Recipient { + fn from(ipr_address: IpPacketRouterAddress) -> Self { + ipr_address.0 + } +} diff --git a/nym-gateway-directory/src/entries/mod.rs b/nym-gateway-directory/src/entries/mod.rs new file mode 100644 index 0000000000..0a74d0afed --- /dev/null +++ b/nym-gateway-directory/src/entries/mod.rs @@ -0,0 +1,7 @@ +pub(crate) mod auth_addresses; +pub(crate) mod country; +pub(crate) mod entry_point; +pub(crate) mod exit_point; +pub(crate) mod gateway; +pub(crate) mod ipr_addresses; +pub(crate) mod score; diff --git a/nym-gateway-directory/src/entries/score.rs b/nym-gateway-directory/src/entries/score.rs new file mode 100644 index 0000000000..45c298f16c --- /dev/null +++ b/nym-gateway-directory/src/entries/score.rs @@ -0,0 +1,34 @@ +// Copyright 2025 - Nym Technologies SA +// SPDX-License-Identifier: GPL-3.0-only + +use nym_vpn_api_client::types::ScoreThresholds; + +pub(crate) const HIGH_SCORE_THRESHOLD: u8 = 80; +pub(crate) const MEDIUM_SCORE_THRESHOLD: u8 = 60; +pub(crate) const LOW_SCORE_THRESHOLD: u8 = 0; + +#[derive(Clone)] +pub enum Score { + High(u8), + Medium(u8), + Low(u8), + None, +} + +impl Score { + pub fn update_to_new_thresholds(&mut self, thresholds: ScoreThresholds) { + let score = match self { + Score::None => return, + Score::High(score) | Score::Medium(score) | Score::Low(score) => *score, + }; + *self = if score > thresholds.high { + Score::High(score) + } else if score > thresholds.medium { + Score::Medium(score) + } else if score > thresholds.low { + Score::Low(score) + } else { + Score::None + }; + } +} diff --git a/nym-gateway-directory/src/error.rs b/nym-gateway-directory/src/error.rs new file mode 100644 index 0000000000..3600324186 --- /dev/null +++ b/nym-gateway-directory/src/error.rs @@ -0,0 +1,93 @@ +// Copyright 2023 - Nym Technologies SA +// SPDX-License-Identifier: GPL-3.0-only + +#[derive(thiserror::Error, Debug)] +pub enum Error { + #[error("identity not formatted correctly: {identity}")] + NodeIdentityFormattingError { + identity: String, + source: nym_sdk::mixnet::ed25519::Ed25519RecoveryError, + }, + + #[error("recipient is not formatted correctly: {address}")] + RecipientFormattingError { + address: String, + source: nym_sdk::mixnet::RecipientFormattingError, + }, + + #[error(transparent)] + ValidatorClientError(#[from] nym_validator_client::ValidatorClientError), + + #[error(transparent)] + VpnApiClientError(#[from] nym_vpn_api_client::VpnApiClientError), + + #[error("failed to resolve gateway hostname: {hostname}")] + FailedToDnsResolveGateway { + hostname: String, + source: nym_http_api_client::HickoryDnsError, + }, + + #[error("resolved hostname {0} but no IP address found")] + ResolvedHostnameButNoIp(String), + + #[error("failed to lookup described gateways")] + FailedToLookupDescribedGateways(#[source] nym_validator_client::ValidatorClientError), + + #[error("failed to lookup skimmed gateways")] + FailedToLookupSkimmedGateways(#[source] nym_validator_client::ValidatorClientError), + + #[error("failed to lookup skimmed nodes")] + FailedToLookupSkimmedNodes(#[source] nym_validator_client::ValidatorClientError), + + #[error("requested gateway not found in the remote list: {0}")] + RequestedGatewayIdNotFound(String), + + #[error("missing ip packet router address for gateway")] + MissingIpPacketRouterAddress, + + #[error("missing hostname or ip address for gateway")] + MissingHostnameOrIpAddress { gateway_identity: String }, + + #[error("no matching gateway found: {requested_identity}")] + NoMatchingGateway { requested_identity: String }, + + #[error( + "no entry gateway available for location {requested_location}, available countries: {available_countries:?}" + )] + NoMatchingEntryGatewayForLocation { + requested_location: String, + available_countries: Vec, + }, + + #[error( + "no exit gateway available for location {requested_location}, available countries: {available_countries:?}" + )] + NoMatchingExitGatewayForLocation { + requested_location: String, + available_countries: Vec, + }, + + #[error("no matching gateway found after selecting low latency: {requested_identity}")] + NoMatchingGatewayAfterSelectingLowLatency { requested_identity: String }, + + #[error("failed to select gateway randomly")] + FailedToSelectGatewayRandomly, + + #[error("gateway {0} doesn't have a description available")] + NoGatewayDescriptionAvailable(String), + + #[error("failed to lookup gateway ip for gateway {0}")] + FailedToLookupIp(String), + + #[error("the url {url} doesn't parse to a host and/or a port: {reason}")] + UrlError { url: url::Url, reason: String }, + + #[error("the provided gateway information is malformed")] + MalformedGateway, + + #[error("no connectivity")] + Offline, +} + +// Result type based on our error type +pub type Result = std::result::Result; diff --git a/nym-gateway-directory/src/gateway_client.rs b/nym-gateway-directory/src/gateway_client.rs new file mode 100644 index 0000000000..7f9e16d2ca --- /dev/null +++ b/nym-gateway-directory/src/gateway_client.rs @@ -0,0 +1,508 @@ +// Copyright 2023-2024 - Nym Technologies SA +// SPDX-License-Identifier: GPL-3.0-only + +use std::{ + fmt, + net::{IpAddr, SocketAddr}, +}; + +pub use nym_sdk::UserAgent; +use nym_validator_client::{NymApiClient, models::NymNodeDescription, nym_nodes::SkimmedNode}; +use nym_vpn_api_client::types::{GatewayMinPerformance, Percent, ScoreThresholds}; +use rand::{prelude::SliceRandom, thread_rng}; +use tracing::{debug, error, warn}; +use url::Url; + +use crate::{ + Error, NymNode, + entries::{ + country::Country, + gateway::{Gateway, GatewayList, GatewayType, NymNodeList}, + }, + error::Result, +}; + +#[derive(Clone, Debug)] +pub struct Config { + pub nyxd_url: Url, + pub api_url: Url, + pub nym_vpn_api_url: Option, + pub min_gateway_performance: Option, + pub mix_score_thresholds: Option, + pub wg_score_thresholds: Option, +} + +fn to_string(value: &Option) -> String { + match value { + Some(value) => value.to_string(), + None => "unset".to_string(), + } +} + +impl fmt::Display for Config { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + write!( + f, + "nyxd_url: {}, api_url: {}, nym_vpn_api_url: {}", + self.nyxd_url, + self.api_url, + to_string(&self.nym_vpn_api_url), + ) + } +} + +impl Config { + pub fn nyxd_url(&self) -> &Url { + &self.nyxd_url + } + + pub fn with_custom_nyxd_url(mut self, nyxd_url: Url) -> Self { + self.nyxd_url = nyxd_url; + self + } + + pub fn api_url(&self) -> &Url { + &self.api_url + } + + pub fn with_custom_api_url(mut self, api_url: Url) -> Self { + self.api_url = api_url; + self + } + + pub fn nym_vpn_api_url(&self) -> Option<&Url> { + self.nym_vpn_api_url.as_ref() + } + + pub fn with_custom_nym_vpn_api_url(mut self, nym_vpn_api_url: Url) -> Self { + self.nym_vpn_api_url = Some(nym_vpn_api_url); + self + } + + pub fn with_min_gateway_performance( + mut self, + min_gateway_performance: GatewayMinPerformance, + ) -> Self { + self.min_gateway_performance = Some(min_gateway_performance); + self + } +} + +#[derive(Debug, Clone)] +pub struct ResolvedConfig { + pub nyxd_socket_addrs: Vec, + pub api_socket_addrs: Vec, + pub nym_vpn_api_socket_addrs: Option>, +} + +impl ResolvedConfig { + pub fn all_socket_addrs(&self) -> Vec { + let mut socket_addrs = vec![]; + socket_addrs.extend(self.nyxd_socket_addrs.iter()); + socket_addrs.extend(self.api_socket_addrs.iter()); + if let Some(vpn_api_socket_addrs) = &self.nym_vpn_api_socket_addrs { + socket_addrs.extend(vpn_api_socket_addrs.iter()); + } + socket_addrs + } +} + +#[derive(Clone)] +pub struct GatewayClient { + api_client: NymApiClient, + nym_vpn_api_client: Option, + nyxd_url: Url, + min_gateway_performance: Option, + mix_score_thresholds: Option, + wg_score_thresholds: Option, +} + +impl GatewayClient { + pub fn new(config: Config, user_agent: UserAgent) -> Result { + Self::new_with_resolver_overrides(config, user_agent, None) + } + + pub fn new_with_resolver_overrides( + config: Config, + user_agent: UserAgent, + static_nym_api_ip_addresses: Option<&[SocketAddr]>, + ) -> Result { + let api_client = NymApiClient::new_with_user_agent(config.api_url, user_agent.clone()); + let nym_vpn_api_client = config + .nym_vpn_api_url + .map(|url| { + nym_vpn_api_client::VpnApiClient::new_with_resolver_overrides( + url, + user_agent.clone(), + static_nym_api_ip_addresses, + ) + }) + .transpose()?; + + Ok(GatewayClient { + api_client, + nym_vpn_api_client, + nyxd_url: config.nyxd_url, + min_gateway_performance: config.min_gateway_performance, + mix_score_thresholds: config.mix_score_thresholds, + wg_score_thresholds: config.wg_score_thresholds, + }) + } + + /// Return the config of this instance. + pub fn get_config(&self) -> Config { + Config { + api_url: self.api_client.api_url().clone(), + nym_vpn_api_url: self + .nym_vpn_api_client + .as_ref() + .map(|client| client.current_url().clone()), + nyxd_url: self.nyxd_url.clone(), + min_gateway_performance: self.min_gateway_performance, + mix_score_thresholds: self.mix_score_thresholds, + wg_score_thresholds: self.wg_score_thresholds, + } + } + + pub fn mixnet_min_performance(&self) -> Option { + self.min_gateway_performance + .as_ref() + .and_then(|min_performance| min_performance.mixnet_min_performance) + } + + pub fn vpn_min_performance(&self) -> Option { + self.min_gateway_performance + .as_ref() + .and_then(|min_performance| min_performance.vpn_min_performance) + } + + async fn lookup_described_nodes(&self) -> Result> { + debug!("Fetching all described nodes from nym-api..."); + self.api_client + .get_all_described_nodes() + .await + .map_err(Error::FailedToLookupDescribedGateways) + } + + async fn lookup_skimmed_gateways(&self) -> Result> { + debug!("Fetching skimmed entry assigned nodes from nym-api..."); + self.api_client + .get_all_basic_entry_assigned_nodes() + .await + .map_err(Error::FailedToLookupSkimmedGateways) + } + + async fn lookup_skimmed_nodes(&self) -> Result> { + debug!("Fetching skimmed entry assigned nodes from nym-api..."); + self.api_client + .get_all_basic_nodes() + .await + .map_err(Error::FailedToLookupSkimmedNodes) + } + + pub async fn lookup_gateway_ip_from_nym_api(&self, gateway_identity: &str) -> Result { + debug!("Fetching gateway ip from nym-api..."); + let mut ips = self + .api_client + .get_all_described_nodes() + .await? + .iter() + .find_map(|node| { + if node + .description + .host_information + .keys + .ed25519 + .to_base58_string() + == gateway_identity + { + Some(node.description.host_information.ip_address.clone()) + } else { + None + } + }) + .ok_or(Error::RequestedGatewayIdNotFound( + gateway_identity.to_string(), + ))?; + + if ips.is_empty() { + // nym-api should forbid this from ever happening, but we don't want to accidentally panic + // if this assumption fails + warn!("somehow {gateway_identity} hasn't provided any ip addresses!"); + return Err(Error::RequestedGatewayIdNotFound( + gateway_identity.to_string(), + )); + } + + debug!("found the following ips for {gateway_identity}: {ips:?}"); + if ips.len() == 1 { + // SAFETY: the vector is not empty, so unwrap is fine + Ok(ips.pop().unwrap()) + } else { + // chose a random one if there's more than one + // SAFETY: the vector is not empty, so unwrap is fine + let mut rng = thread_rng(); + let ip = ips.choose(&mut rng).unwrap(); + Ok(*ip) + } + } + + pub async fn lookup_all_gateways_from_nym_api(&self) -> Result { + let mut gateways = self + .lookup_described_nodes() + .await? + .into_iter() + .filter(|node| node.description.declared_role.entry) + .filter_map(|gw| { + Gateway::try_from(gw) + .inspect_err(|err| error!("Failed to parse gateway: {err}")) + .ok() + }) + .collect::>(); + let skimmed_gateways = self.lookup_skimmed_gateways().await?; + append_performance(&mut gateways, skimmed_gateways); + filter_on_mixnet_min_performance(&mut gateways, &self.min_gateway_performance); + Ok(GatewayList::new(gateways)) + } + + pub async fn lookup_all_nymnodes(&self) -> Result { + let mut nodes = self + .lookup_described_nodes() + .await? + .into_iter() + .filter_map(|gw| { + NymNode::try_from(gw) + .inspect_err(|err| error!("Failed to parse node: {err}")) + .ok() + }) + .collect::>(); + let skimmed_nodes = self.lookup_skimmed_nodes().await?; + append_performance(&mut nodes, skimmed_nodes); + filter_on_mixnet_min_performance(&mut nodes, &self.min_gateway_performance); + Ok(GatewayList::new(nodes)) + } + + pub async fn lookup_gateways_from_nym_api(&self, gw_type: GatewayType) -> Result { + match gw_type { + GatewayType::MixnetEntry => self.lookup_entry_gateways_from_nym_api().await, + GatewayType::MixnetExit => self.lookup_exit_gateways_from_nym_api().await, + GatewayType::Wg => self.lookup_vpn_gateways_from_nym_api().await, + } + } + + // This is currently the same as the set of all gateways, but it doesn't have to be. + async fn lookup_entry_gateways_from_nym_api(&self) -> Result { + self.lookup_all_gateways_from_nym_api().await + } + + async fn lookup_exit_gateways_from_nym_api(&self) -> Result { + self.lookup_all_gateways_from_nym_api() + .await + .map(GatewayList::into_exit_gateways) + } + + async fn lookup_vpn_gateways_from_nym_api(&self) -> Result { + self.lookup_all_gateways_from_nym_api() + .await + .map(GatewayList::into_vpn_gateways) + } + + pub async fn lookup_gateway_ip(&self, gateway_identity: &str) -> Result { + if let Some(nym_vpn_api_client) = &self.nym_vpn_api_client { + debug!("Fetching gateway ip from nym-vpn-api..."); + let gateway = nym_vpn_api_client + .get_gateways(None) + .await? + .into_iter() + .find_map(|gw| { + if gw.identity_key != gateway_identity { + None + } else { + Gateway::try_from(gw) + .inspect_err(|err| error!("Failed to parse gateway: {err}")) + .ok() + } + }) + .ok_or_else(|| Error::RequestedGatewayIdNotFound(gateway_identity.to_string()))?; + gateway + .lookup_ip() + .ok_or(Error::FailedToLookupIp(gateway_identity.to_string())) + } else { + warn!("OPERATING IN FALLBACK MODE WITHOUT NYM-VPN-API!"); + self.lookup_gateway_ip_from_nym_api(gateway_identity).await + } + } + + pub async fn lookup_all_gateways(&self) -> Result { + if let Some(nym_vpn_api_client) = &self.nym_vpn_api_client { + debug!("Fetching all gateways from nym-vpn-api..."); + let gateways: Vec<_> = nym_vpn_api_client + .get_gateways(self.min_gateway_performance) + .await? + .into_iter() + .filter_map(|gw| { + Gateway::try_from(gw) + .inspect_err(|err| error!("Failed to parse gateway: {err}")) + .ok() + .map(|mut gw| { + gw.update_to_new_thresholds( + self.mix_score_thresholds, + self.wg_score_thresholds, + ); + gw + }) + }) + .collect(); + Ok(GatewayList::new(gateways)) + } else { + warn!("OPERATING IN FALLBACK MODE WITHOUT NYM-VPN-API!"); + self.lookup_all_gateways_from_nym_api().await + } + } + + pub async fn lookup_gateways(&self, gw_type: GatewayType) -> Result { + if let Some(nym_vpn_api_client) = &self.nym_vpn_api_client { + debug!("Fetching {gw_type} gateways from nym-vpn-api..."); + let gateways: Vec<_> = nym_vpn_api_client + .get_gateways_by_type(gw_type.into(), self.min_gateway_performance) + .await? + .into_iter() + .filter_map(|gw| { + Gateway::try_from(gw) + .inspect_err(|err| error!("Failed to parse gateway: {err}")) + .ok() + .map(|mut gw| { + gw.update_to_new_thresholds( + self.mix_score_thresholds, + self.wg_score_thresholds, + ); + gw + }) + }) + .collect(); + Ok(GatewayList::new(gateways)) + } else { + warn!("OPERATING IN FALLBACK MODE WITHOUT NYM-VPN-API!"); + self.lookup_gateways_from_nym_api(gw_type).await + } + } + + pub async fn lookup_countries(&self, gw_type: GatewayType) -> Result> { + if let Some(nym_vpn_api_client) = &self.nym_vpn_api_client { + debug!("Fetching entry countries from nym-vpn-api..."); + Ok(nym_vpn_api_client + .get_gateway_countries_by_type(gw_type.into(), self.min_gateway_performance) + .await? + .into_iter() + .map(Country::from) + .collect()) + } else { + warn!("OPERATING IN FALLBACK MODE WITHOUT NYM-VPN-API!"); + self.lookup_gateways_from_nym_api(gw_type) + .await + .map(GatewayList::into_countries) + } + } +} + +// Append the performance to the gateways. This is a temporary hack until the nymvpn.com endpoints +// are updated to also include this field. +fn append_performance( + gateways: &mut [Gateway], + basic_gw: Vec, +) { + debug!("Appending mixnet_performance to gateways"); + for gateway in gateways.iter_mut() { + if let Some(basic_gw) = basic_gw + .iter() + .find(|bgw| bgw.ed25519_identity_pubkey == gateway.identity()) + { + gateway.mixnet_performance = Some(basic_gw.performance); + } else { + tracing::warn!( + "Failed to append mixnet_performance, node {} not found among the skimmed nodes", + gateway.identity() + ); + } + } +} + +fn filter_on_mixnet_min_performance( + gateways: &mut Vec, + min_gateway_performance: &Option, +) { + if let Some(min_performance) = min_gateway_performance { + if let Some(mixnet_min_performance) = min_performance.mixnet_min_performance { + tracing::debug!( + "Filtering gateways based on mixnet_min_performance: {:?}", + min_performance + ); + gateways.retain(|gateway| { + gateway.mixnet_performance.unwrap_or_default() >= mixnet_min_performance + }); + } + } +} + +#[cfg(test)] +mod test { + use nym_sdk::UserAgent; + + use super::*; + + fn user_agent() -> UserAgent { + UserAgent { + application: "test".to_string(), + version: "0.0.1".to_string(), + platform: "test".to_string(), + git_commit: "test".to_string(), + } + } + + fn new_mainnet() -> Config { + let mainnet_network_defaults = nym_sdk::NymNetworkDetails::default(); + let default_nyxd_url = mainnet_network_defaults + .endpoints + .first() + .expect("rust sdk mainnet default incorrectly configured") + .nyxd_url(); + let default_api_url = mainnet_network_defaults + .endpoints + .first() + .expect("rust sdk mainnet default incorrectly configured") + .api_url() + .expect("rust sdk mainnet default api_url not parseable"); + + let default_nym_vpn_api_url = mainnet_network_defaults + .nym_vpn_api_url() + .expect("rust sdk mainnet default nym-vpn-api url not parseable"); + + Config { + nyxd_url: default_nyxd_url, + api_url: default_api_url, + nym_vpn_api_url: Some(default_nym_vpn_api_url), + min_gateway_performance: None, + mix_score_thresholds: None, + wg_score_thresholds: None, + } + } + + #[tokio::test] + async fn lookup_described_gateways() { + let config = new_mainnet(); + let client = GatewayClient::new(config, user_agent()).unwrap(); + let gateways = client.lookup_described_nodes().await.unwrap(); + assert!(!gateways.is_empty()); + } + + #[tokio::test] + async fn lookup_gateways_in_nym_vpn_api() { + let config = new_mainnet(); + let client = GatewayClient::new(config, user_agent()).unwrap(); + let gateways = client + .lookup_gateways(GatewayType::MixnetExit) + .await + .unwrap(); + assert!(!gateways.is_empty()); + } +} diff --git a/nym-gateway-directory/src/helpers.rs b/nym-gateway-directory/src/helpers.rs new file mode 100644 index 0000000000..e11a1f7e0b --- /dev/null +++ b/nym-gateway-directory/src/helpers.rs @@ -0,0 +1,64 @@ +// Copyright 2023 - Nym Technologies SA +// SPDX-License-Identifier: GPL-3.0-only + +use std::net::{IpAddr, SocketAddr}; + +use nym_common::trace_err_chain; +use nym_http_api_client::HickoryDnsResolver; + +use crate::{Config, Error, error::Result, gateway_client::ResolvedConfig}; + +async fn try_resolve_hostname(hostname: &str) -> Result> { + tracing::debug!("Trying to resolve hostname: {hostname}"); + let resolver = HickoryDnsResolver::default(); + let addrs = resolver.resolve_str(hostname).await.map_err(|err| { + trace_err_chain!(err, "Failed to resolve gateway hostname"); + Error::FailedToDnsResolveGateway { + hostname: hostname.to_string(), + source: err, + } + })?; + tracing::debug!("Resolved to: {addrs:?}"); + + let ips = addrs.iter().collect::>(); + if ips.is_empty() { + return Err(Error::ResolvedHostnameButNoIp(hostname.to_string())); + } + + Ok(ips) +} + +async fn url_to_socket_addr(unresolved_url: &url::Url) -> Result> { + let port = unresolved_url + .port_or_known_default() + .ok_or(Error::UrlError { + url: unresolved_url.clone(), + reason: "missing port".to_string(), + })?; + let hostname = unresolved_url.host_str().ok_or(Error::UrlError { + url: unresolved_url.clone(), + reason: "missing hostname".to_string(), + })?; + + Ok(try_resolve_hostname(hostname) + .await? + .into_iter() + .map(|ip| SocketAddr::new(ip, port)) + .collect()) +} + +pub async fn resolve_config(config: &Config) -> Result { + let nyxd_socket_addrs = url_to_socket_addr(config.nyxd_url()).await?; + let api_socket_addrs = url_to_socket_addr(config.api_url()).await?; + let nym_vpn_api_socket_addrs = if let Some(vpn_api_url) = config.nym_vpn_api_url() { + Some(url_to_socket_addr(vpn_api_url).await?) + } else { + None + }; + + Ok(ResolvedConfig { + nyxd_socket_addrs, + api_socket_addrs, + nym_vpn_api_socket_addrs, + }) +} diff --git a/nym-gateway-directory/src/lib.rs b/nym-gateway-directory/src/lib.rs new file mode 100644 index 0000000000..9c11045e02 --- /dev/null +++ b/nym-gateway-directory/src/lib.rs @@ -0,0 +1,29 @@ +// Copyright 2023 - Nym Technologies SA +// SPDX-License-Identifier: GPL-3.0-only + +mod caching_client; +mod entries; +mod error; +mod gateway_client; +mod helpers; + +pub use nym_sdk::mixnet::{NodeIdentity, Recipient}; +pub use nym_vpn_api_client::types::{GatewayMinPerformance, Percent}; + +pub use crate::{ + caching_client::CachingGatewayClient, + entries::{ + auth_addresses::{AuthAddress, AuthAddresses}, + country::Country, + entry_point::EntryPoint, + exit_point::ExitPoint, + gateway::{ + Entry, Exit, Gateway, GatewayList, GatewayType, Location, NymNode, Probe, ProbeOutcome, + }, + ipr_addresses::IpPacketRouterAddress, + score::Score, + }, + error::Error, + gateway_client::{Config, GatewayClient, ResolvedConfig}, + helpers::resolve_config, +}; diff --git a/nym-ip-packet-client/Cargo.toml b/nym-ip-packet-client/Cargo.toml index e631a759ca..1f54330e9f 100644 --- a/nym-ip-packet-client/Cargo.toml +++ b/nym-ip-packet-client/Cargo.toml @@ -16,6 +16,9 @@ workspace = true bincode.workspace = true bytes.workspace = true futures.workspace = true +nym-gateway-directory = { path = "../nym-gateway-directory" } +nym-ip-packet-requests = { path = "../common/ip-packet-requests" } +nym-sdk = {path = "../sdk/rust/nym-sdk" } thiserror.workspace = true tokio-util.workspace = true tokio.workspace = true diff --git a/nym-ip-packet-client/src/error.rs b/nym-ip-packet-client/src/error.rs index b88c332f67..f74ab688a4 100644 --- a/nym-ip-packet-client/src/error.rs +++ b/nym-ip-packet-client/src/error.rs @@ -18,6 +18,9 @@ pub enum Error { )] ReceivedResponseWithNewVersion { expected: u8, received: u8 }, + #[error("got reply for connect request, but it appears intended for the wrong address?")] + GotReplyIntendedForWrongAddress, + #[error("unexpected connect response")] UnexpectedConnectResponse, @@ -41,6 +44,10 @@ pub enum Error { #[error(transparent)] Bincode(#[from] bincode::Error), + #[error("failed to create connect request")] + FailedToCreateConnectRequest { + source: nym_ip_packet_requests::sign::SignatureError, + }, } // Result type based on our error type diff --git a/nym-ip-packet-client/src/listener.rs b/nym-ip-packet-client/src/listener.rs index 7380300175..4642f788af 100644 --- a/nym-ip-packet-client/src/listener.rs +++ b/nym-ip-packet-client/src/listener.rs @@ -4,7 +4,7 @@ use bytes::Bytes; use futures::StreamExt; use nym_ip_packet_requests::{codec::MultiIpPacketCodec, v8::response::ControlResponse}; -use nym_sdk::mixnet::ReconstructedMessage; +pub use nym_sdk::mixnet::ReconstructedMessage; use tokio_util::codec::FramedRead; use tracing::{debug, error, info, warn}; diff --git a/nym-vpn-api-client/Cargo.toml b/nym-vpn-api-client/Cargo.toml new file mode 100644 index 0000000000..56898e6e08 --- /dev/null +++ b/nym-vpn-api-client/Cargo.toml @@ -0,0 +1,40 @@ +[package] +name = "nym-vpn-api-client" +version.workspace = true +authors.workspace = true +repository.workspace = true +homepage.workspace = true +documentation.workspace = true +edition.workspace = true +license.workspace = true + +[dependencies] +backon.workspace = true +base64-url.workspace = true +bip39 = { workspace = true, features = ["zeroize"] } +bs58.workspace = true +chrono = { workspace = true, features = ["serde"] } +itertools.workspace = true +nym-compact-ecash.workspace = true +nym-config.workspace = true +nym-contracts-common.workspace = true +nym-credential-proxy-requests.workspace = true +nym-crypto = { workspace = true, features = ["asymmetric", "stream_cipher"] } +nym-http-api-client.workspace = true +nym-validator-client.workspace = true +serde = { workspace = true, features = ["derive"] } +serde_json.workspace = true +sha2.workspace = true +strum.workspace = true +thiserror.workspace = true +time = { workspace = true, features = [ + "serde-human-readable", + "serde-well-known", +] } +tokio = { workspace = true, features = [] } +tracing.workspace = true +url.workspace = true + +[dev-dependencies] +tokio = { workspace = true, features = ["full"] } +bip39 = { workspace = true, features = ["zeroize"] } diff --git a/nym-vpn-api-client/src/bootstrap.rs b/nym-vpn-api-client/src/bootstrap.rs new file mode 100644 index 0000000000..784ab38466 --- /dev/null +++ b/nym-vpn-api-client/src/bootstrap.rs @@ -0,0 +1,65 @@ +// Copyright 2024 - Nym Technologies SA +// SPDX-License-Identifier: GPL-3.0-only + +use nym_http_api_client::{ApiClient, NO_PARAMS}; + +use url::Url; + +use crate::{ + client::NYM_VPN_API_TIMEOUT, + error::{Result, VpnApiClientError}, + response::{NymWellknownDiscoveryItemResponse, RegisteredNetworksResponse}, + routes, +}; + +/// Bootstrapping Environments and Network Discovery +pub struct BootstrapVpnApiClient { + inner: nym_http_api_client::Client, +} + +impl BootstrapVpnApiClient { + /// Returns a VpnApiClient Based on locally set well known url and empty user agent. + /// + /// THIS SHOULD ONLY BE USED FOR BOOTSTRAPPING. + pub fn new(base_url: Url) -> Result { + nym_http_api_client::Client::builder(base_url) + .map(|builder| builder.with_timeout(NYM_VPN_API_TIMEOUT)) + .and_then(|builder| builder.build()) + .map(|c| Self { inner: c }) + .map_err(VpnApiClientError::CreateVpnApiClient) + } + + pub async fn get_wellknown_envs(&self) -> Result { + self.inner + .get_json( + &[ + routes::PUBLIC, + routes::V1, + routes::WELLKNOWN, + routes::ENVS_FILE, + ], + NO_PARAMS, + ) + .await + .map_err(VpnApiClientError::GetNetworkEnvs) + } + + pub async fn get_wellknown_discovery( + &self, + network_name: &str, + ) -> Result { + self.inner + .get_json( + &[ + routes::PUBLIC, + routes::V1, + routes::WELLKNOWN, + network_name, + routes::DISCOVERY_FILE, + ], + NO_PARAMS, + ) + .await + .map_err(VpnApiClientError::GetDiscoveryInfo) + } +} diff --git a/nym-vpn-api-client/src/client.rs b/nym-vpn-api-client/src/client.rs new file mode 100644 index 0000000000..bcebd7bfe1 --- /dev/null +++ b/nym-vpn-api-client/src/client.rs @@ -0,0 +1,1164 @@ +// Copyright 2024 - Nym Technologies SA +// SPDX-License-Identifier: GPL-3.0-only + +use std::{fmt, net::SocketAddr, time::Duration}; + +use backon::Retryable; +use nym_credential_proxy_requests::api::v1::ticketbook::models::PartialVerificationKeysResponse; +use nym_http_api_client::{ApiClient, HttpClientError, NO_PARAMS, Params, PathSegments, UserAgent}; +use serde::{Deserialize, Serialize, de::DeserializeOwned}; +use time::OffsetDateTime; +use url::Url; + +use crate::{ + error::{Result, VpnApiClientError}, + request::{ + ApplyFreepassRequestBody, CreateAccountRequestBody, CreateSubscriptionKind, + CreateSubscriptionRequestBody, RegisterDeviceRequestBody, RequestZkNymRequestBody, + UpdateDeviceRequestBody, UpdateDeviceRequestStatus, + }, + response::{ + NymDirectoryGatewayCountriesResponse, NymDirectoryGatewaysResponse, NymVpnAccountResponse, + NymVpnAccountSummaryResponse, NymVpnDevice, NymVpnDevicesResponse, NymVpnHealthResponse, + NymVpnRegisterAccountResponse, NymVpnSubscription, NymVpnSubscriptionResponse, + NymVpnSubscriptionsResponse, NymVpnUsagesResponse, NymVpnZkNym, NymVpnZkNymPost, + NymVpnZkNymResponse, NymWellknownDiscoveryItem, StatusOk, + }, + routes, + types::{ + Device, DeviceStatus, GatewayMinPerformance, GatewayType, Platform, VpnApiAccount, + VpnApiTime, VpnApiTimeSynced, + }, +}; + +pub(crate) const DEVICE_AUTHORIZATION_HEADER: &str = "x-device-authorization"; + +// GET requests can unfortunately take a long time over the mixnet +pub(crate) const NYM_VPN_API_TIMEOUT: Duration = Duration::from_secs(60); + +#[derive(Clone, Debug)] +pub struct VpnApiClient { + inner: nym_http_api_client::Client, +} + +impl VpnApiClient { + pub fn new(base_url: Url, user_agent: UserAgent) -> Result { + Self::new_with_resolver_overrides(base_url, user_agent, None) + } + + pub fn new_with_resolver_overrides( + base_url: Url, + user_agent: UserAgent, + static_addresses: Option<&[SocketAddr]>, + ) -> Result { + nym_http_api_client::Client::builder(base_url.clone()) + .map(|builder| { + let mut builder = builder + .with_user_agent(user_agent) + .with_timeout(NYM_VPN_API_TIMEOUT); + + if let Some(domain) = base_url.domain() { + match static_addresses { + Some(static_addresses) if !static_addresses.is_empty() => { + tracing::info!( + "Enabling DNS resolver overrides: {:?}", static_addresses + ); + builder = builder.resolve_to_addrs(domain, static_addresses); + } + Some(_) => { + tracing::warn!( + "Not enabling DNS resolver overrides because static addresses are empty" + ); + } + None => { + tracing::info!( + "Not enabling DNS resolver overrides because static addresses are not set" + ); + } + } + } else { + tracing::info!( + "Not enabling DNS resolver overrides because domain is not present in base URL" + ); + } + + builder + }) + .and_then(|builder| builder.build()) + .map(|c| Self { inner: c }) + .map_err(VpnApiClientError::CreateVpnApiClient) + } + + pub fn swap_inner_client(&mut self, client: VpnApiClient) { + self.inner = client.inner; + } + + pub fn current_url(&self) -> &Url { + self.inner.current_url() + } + + pub async fn get_remote_time(&self) -> Result { + let time_before = OffsetDateTime::now_utc(); + let remote_timestamp = self.get_health().await?.timestamp_utc; + let time_after = OffsetDateTime::now_utc(); + + Ok(VpnApiTime::from_remote_timestamp( + time_before, + remote_timestamp, + time_after, + )) + } + + fn use_remote_time(remote_time: VpnApiTime) -> bool { + match remote_time.is_synced() { + VpnApiTimeSynced::AlmostSame => { + tracing::debug!("{remote_time}"); + false + } + VpnApiTimeSynced::AcceptableSynced => { + tracing::info!("{remote_time}"); + false + } + VpnApiTimeSynced::NotSynced => { + tracing::warn!( + "The time skew between the local and remote time is too large, we'll use remote instead for JWT ({remote_time})." + ); + true + } + } + } + + async fn sync_with_remote_time(&self) -> Result> { + let remote_time = self.get_remote_time().await?; + + if Self::use_remote_time(remote_time) { + Ok(Some(remote_time)) + } else { + Ok(None) + } + } + + async fn get_query( + &self, + path: PathSegments<'_>, + account: &VpnApiAccount, + device: Option<&Device>, + jwt: Option, + ) -> std::result::Result> + where + T: DeserializeOwned, + E: fmt::Display + DeserializeOwned, + { + let request = self + .inner + .create_get_request(path, NO_PARAMS) + .bearer_auth(account.jwt(jwt).to_string()); + + let request = match device { + Some(device) => request.header( + DEVICE_AUTHORIZATION_HEADER, + format!("Bearer {}", device.jwt(jwt)), + ), + None => request, + }; + let response = request.send().await?; + nym_http_api_client::parse_response(response, false).await + } + + async fn get_authorized( + &self, + path: PathSegments<'_>, + account: &VpnApiAccount, + device: Option<&Device>, + ) -> std::result::Result> + where + T: DeserializeOwned, + E: fmt::Display + DeserializeOwned, + { + match self.get_query::(path, account, device, None).await { + Ok(response) => Ok(response), + Err(err) => { + if let HttpClientError::EndpointFailure { status: _, error } = &err { + if jwt_error(&error.to_string()) { + tracing::warn!( + "Encountered possible JWT error: {error}. Retrying query with remote time" + ); + if let Ok(Some(jwt)) = + self.sync_with_remote_time().await.inspect_err(|err| { + tracing::error!( + "Failed to get remote time: {err}. Not retring anymore" + ) + }) + { + // retry with remote vpn api time, and return that only if it succeeds, + // otherwise return the initial error + let res = self.get_query(path, account, device, Some(jwt)).await; + if res.is_ok() { + return res; + } + } + } + } + Err(err) + } + } + } + + #[allow(unused)] + async fn get_authorized_debug( + &self, + path: PathSegments<'_>, + account: &VpnApiAccount, + device: Option<&Device>, + ) -> std::result::Result> + where + T: DeserializeOwned, + E: fmt::Display + DeserializeOwned, + { + let request = self + .inner + .create_get_request(path, NO_PARAMS) + .bearer_auth(account.jwt(None).to_string()); + + let request = match device { + Some(device) => request.header( + DEVICE_AUTHORIZATION_HEADER, + format!("Bearer {}", device.jwt(None)), + ), + None => request, + }; + + let response = request.send().await?; + let status = response.status(); + tracing::info!("Response status: {:#?}", status); + + // TODO: support this mode in the upstream crate + + if status.is_success() { + let response_text = response.text().await?; + tracing::info!("Response: {:#?}", response_text); + let response_json = serde_json::from_str(&response_text) + .map_err(|e| HttpClientError::GenericRequestFailure(e.to_string()))?; + Ok(response_json) + //} else if status == reqwest::StatusCode::NOT_FOUND { + // Err(HttpClientError::NotFound) + } else { + let Ok(response_text) = response.text().await else { + return Err(HttpClientError::RequestFailure { status }); + }; + + tracing::info!("Response: {:#?}", response_text); + + if let Ok(request_error) = serde_json::from_str(&response_text) { + Err(HttpClientError::EndpointFailure { + status, + error: request_error, + }) + } else { + Err(HttpClientError::GenericRequestFailure(response_text)) + } + } + } + + async fn get_json_with_retry( + &self, + path: PathSegments<'_>, + params: Params<'_, K, V>, + ) -> std::result::Result> + where + for<'a> T: Deserialize<'a>, + K: AsRef + Sync, + V: AsRef + Sync, + E: fmt::Display + fmt::Debug + DeserializeOwned, + { + let response = (|| async { self.inner.get_json(path, params).await }) + .retry(backon::ConstantBuilder::default()) + .notify(|err: &HttpClientError, dur: Duration| { + tracing::warn!("Failed to get JSON: {}", err); + tracing::warn!("retrying after {:?}", dur); + }) + .await?; + Ok(response) + } + + async fn post_json_with_retry( + &self, + path: PathSegments<'_>, + params: Params<'_, K, V>, + json_body: &B, + ) -> std::result::Result> + where + for<'a> T: Deserialize<'a>, + B: Serialize + ?Sized + Sync, + K: AsRef + Sync, + V: AsRef + Sync, + E: fmt::Display + fmt::Debug + DeserializeOwned, + { + let response = (|| async { self.inner.post_json(path, params, json_body).await }) + .retry(backon::ConstantBuilder::default()) + .notify(|err: &HttpClientError, dur: Duration| { + tracing::warn!("Failed to post JSON: {}", err); + tracing::warn!("retrying after {:?}", dur); + }) + .await?; + Ok(response) + } + + async fn post_query( + &self, + path: PathSegments<'_>, + json_body: &B, + account: &VpnApiAccount, + device: Option<&Device>, + jwt: Option, + ) -> std::result::Result> + where + T: DeserializeOwned, + B: Serialize, + E: fmt::Display + DeserializeOwned, + { + let request = self + .inner + .create_post_request(path, NO_PARAMS, json_body) + .bearer_auth(account.jwt(jwt).to_string()); + + let request = match device { + Some(device) => request.header( + DEVICE_AUTHORIZATION_HEADER, + format!("Bearer {}", device.jwt(jwt)), + ), + None => request, + }; + let response = request.send().await?; + nym_http_api_client::parse_response(response, false).await + } + + async fn post_authorized( + &self, + path: PathSegments<'_>, + json_body: &B, + account: &VpnApiAccount, + device: Option<&Device>, + ) -> std::result::Result> + where + T: DeserializeOwned, + B: Serialize, + E: fmt::Display + DeserializeOwned, + { + match self + .post_query::(path, json_body, account, device, None) + .await + { + Ok(response) => Ok(response), + Err(err) => { + if let HttpClientError::EndpointFailure { status: _, error } = &err { + if jwt_error(&error.to_string()) { + tracing::warn!( + "Encountered possible JWT error: {error}. Retrying query with remote time" + ); + if let Ok(Some(jwt)) = + self.sync_with_remote_time().await.inspect_err(|err| { + tracing::error!( + "Failed to get remote time: {err}. Not retring anymore" + ) + }) + { + // retry with remote vpn api time, and return that only if it succeeds, + // otherwise return the initial error + let res = self + .post_query(path, json_body, account, device, Some(jwt)) + .await; + if res.is_ok() { + return res; + } + } + } + } + Err(err) + } + } + } + + async fn delete_query( + &self, + path: PathSegments<'_>, + account: &VpnApiAccount, + device: Option<&Device>, + jwt: Option, + ) -> std::result::Result> + where + T: DeserializeOwned, + E: fmt::Display + DeserializeOwned, + { + let request = self + .inner + .create_delete_request(path, NO_PARAMS) + .bearer_auth(account.jwt(jwt).to_string()); + + let request = match device { + Some(device) => request.header( + DEVICE_AUTHORIZATION_HEADER, + format!("Bearer {}", device.jwt(jwt)), + ), + None => request, + }; + let response = request.send().await?; + nym_http_api_client::parse_response(response, false).await + } + + async fn delete_authorized( + &self, + path: PathSegments<'_>, + account: &VpnApiAccount, + device: Option<&Device>, + ) -> std::result::Result> + where + T: DeserializeOwned, + E: fmt::Display + DeserializeOwned, + { + match self.delete_query::(path, account, device, None).await { + Ok(response) => Ok(response), + Err(err) => { + if let HttpClientError::EndpointFailure { status: _, error } = &err { + if jwt_error(&error.to_string()) { + tracing::warn!( + "Encountered possible JWT error: {error}. Retrying query with remote time" + ); + if let Ok(Some(jwt)) = + self.sync_with_remote_time().await.inspect_err(|err| { + tracing::error!( + "Failed to get remote time: {err}. Not retring anymore" + ) + }) + { + // retry with remote vpn api time, and return that only if it succeeds, + // otherwise return the initial error + let res = self.delete_query(path, account, device, Some(jwt)).await; + if res.is_ok() { + return res; + } + } + } + } + Err(err) + } + } + } + + async fn patch_query( + &self, + path: PathSegments<'_>, + json_body: &B, + account: &VpnApiAccount, + device: Option<&Device>, + jwt: Option, + ) -> std::result::Result> + where + T: DeserializeOwned, + B: Serialize, + E: fmt::Display + DeserializeOwned, + { + let request = self + .inner + .create_patch_request(path, NO_PARAMS, json_body) + .bearer_auth(account.jwt(jwt).to_string()); + + let request = match device { + Some(device) => request.header( + DEVICE_AUTHORIZATION_HEADER, + format!("Bearer {}", device.jwt(jwt)), + ), + None => request, + }; + let response = request.send().await?; + nym_http_api_client::parse_response(response, false).await + } + + async fn patch_authorized( + &self, + path: PathSegments<'_>, + json_body: &B, + account: &VpnApiAccount, + device: Option<&Device>, + ) -> std::result::Result> + where + T: DeserializeOwned, + B: Serialize, + E: fmt::Display + DeserializeOwned, + { + match self + .patch_query::(path, json_body, account, device, None) + .await + { + Ok(response) => Ok(response), + Err(err) => { + if let HttpClientError::EndpointFailure { status: _, error } = &err { + if jwt_error(&error.to_string()) { + tracing::warn!( + "Encountered possible JWT error: {error}. Retrying query with remote time" + ); + if let Ok(Some(jwt)) = + self.sync_with_remote_time().await.inspect_err(|err| { + tracing::error!( + "Failed to get remote time: {err}. Not retring anymore" + ) + }) + { + // retry with remote vpn api time, and return that only if it succeeds, + // otherwise return the initial error + let res = self + .patch_query(path, json_body, account, device, Some(jwt)) + .await; + if res.is_ok() { + return res; + } + } + } + } + Err(err) + } + } + } + + // ACCOUNT + + pub async fn get_account(&self, account: &VpnApiAccount) -> Result { + self.get_authorized( + &[routes::PUBLIC, routes::V1, routes::ACCOUNT, account.id()], + account, + None, + ) + .await + .map_err(crate::error::VpnApiClientError::GetAccount) + } + + pub async fn post_account( + &self, + account: &VpnApiAccount, + platform: Platform, + ) -> Result { + let body = CreateAccountRequestBody { + account_addr: account.id().to_string(), + pub_key: account.pub_key().to_string(), + signature_base64: account.signature_base64().to_string(), + }; + + self.post_json_with_retry( + &[ + routes::PUBLIC, + routes::V1, + routes::ACCOUNT, + platform.api_path_component(), + ], + NO_PARAMS, + &body, + ) + .await + .map_err(crate::error::VpnApiClientError::PostAccount) + } + + pub async fn get_health(&self) -> Result { + self.get_json_with_retry(&[routes::PUBLIC, routes::V1, routes::HEALTH], NO_PARAMS) + .await + .map_err(crate::error::VpnApiClientError::GetHealth) + } + + pub async fn get_account_summary( + &self, + account: &VpnApiAccount, + ) -> Result { + self.get_authorized( + &[ + routes::PUBLIC, + routes::V1, + routes::ACCOUNT, + account.id(), + routes::SUMMARY, + ], + account, + None, + ) + .await + .map_err(VpnApiClientError::GetAccountSummary) + } + + // DEVICES + + pub async fn get_devices(&self, account: &VpnApiAccount) -> Result { + self.get_authorized( + &[ + routes::PUBLIC, + routes::V1, + routes::ACCOUNT, + account.id(), + routes::DEVICE, + ], + account, + None, + ) + .await + .map_err(VpnApiClientError::GetDevices) + } + + pub async fn register_device( + &self, + account: &VpnApiAccount, + device: &Device, + ) -> Result { + let body = RegisterDeviceRequestBody { + device_identity_key: device.identity_key().to_base58_string(), + signature: device.sign_identity_key().to_base64_string(), + }; + + self.post_authorized( + &[ + routes::PUBLIC, + routes::V1, + routes::ACCOUNT, + account.id(), + routes::DEVICE, + ], + &body, + account, + Some(device), + ) + .await + .map_err(VpnApiClientError::RegisterDevice) + } + + pub async fn get_active_devices( + &self, + account: &VpnApiAccount, + ) -> Result { + self.get_authorized( + &[ + routes::PUBLIC, + routes::V1, + routes::ACCOUNT, + account.id(), + routes::DEVICE, + routes::ACTIVE, + ], + account, + None, + ) + .await + .map_err(VpnApiClientError::GetActiveDevices) + } + + pub async fn get_device_by_id( + &self, + account: &VpnApiAccount, + device: &Device, + ) -> Result { + self.get_authorized( + &[ + routes::PUBLIC, + routes::V1, + routes::ACCOUNT, + account.id(), + routes::DEVICE, + &device.identity_key().to_string(), + ], + account, + None, + ) + .await + .map_err(VpnApiClientError::GetDeviceById) + } + + pub async fn update_device( + &self, + account: &VpnApiAccount, + device: &Device, + status: DeviceStatus, + ) -> Result { + let body = UpdateDeviceRequestBody { + status: UpdateDeviceRequestStatus::from(status), + }; + + self.patch_authorized( + &[ + routes::PUBLIC, + routes::V1, + routes::ACCOUNT, + account.id(), + routes::DEVICE, + &device.identity_key().to_string(), + ], + &body, + account, + Some(device), + ) + .await + .map_err(VpnApiClientError::UpdateDevice) + } + + // ZK-NYM + + pub async fn get_device_zk_nyms( + &self, + account: &VpnApiAccount, + device: &Device, + ) -> Result { + self.get_authorized( + &[ + routes::PUBLIC, + routes::V1, + routes::ACCOUNT, + account.id(), + routes::DEVICE, + &device.identity_key().to_string(), + routes::ZKNYM, + ], + account, + Some(device), + ) + .await + .map_err(VpnApiClientError::GetDeviceZkNyms) + } + + pub async fn request_zk_nym( + &self, + account: &VpnApiAccount, + device: &Device, + withdrawal_request: String, + ecash_pubkey: String, + expiration_date: String, + ticketbook_type: String, + ) -> Result { + tracing::debug!("Requesting zk-nym for type: {}", ticketbook_type); + let body = RequestZkNymRequestBody { + withdrawal_request, + ecash_pubkey, + expiration_date, + ticketbook_type, + }; + tracing::debug!("Request body: {:#?}", body); + + self.post_authorized( + &[ + routes::PUBLIC, + routes::V1, + routes::ACCOUNT, + account.id(), + routes::DEVICE, + &device.identity_key().to_string(), + routes::ZKNYM, + ], + &body, + account, + Some(device), + ) + .await + .map_err(VpnApiClientError::RequestZkNym) + } + + pub async fn get_zk_nyms_available_for_download( + &self, + account: &VpnApiAccount, + device: &Device, + ) -> Result { + self.get_authorized( + &[ + routes::PUBLIC, + routes::V1, + routes::ACCOUNT, + account.id(), + routes::DEVICE, + &device.identity_key().to_string(), + routes::ZKNYM, + routes::AVAILABLE, + ], + account, + Some(device), + ) + .await + .map_err(VpnApiClientError::GetDeviceZkNyms) + } + + pub async fn get_zk_nym_by_id( + &self, + account: &VpnApiAccount, + device: &Device, + id: &str, + ) -> Result { + self.get_authorized( + &[ + routes::PUBLIC, + routes::V1, + routes::ACCOUNT, + account.id(), + routes::DEVICE, + &device.identity_key().to_string(), + routes::ZKNYM, + id, + ], + account, + Some(device), + ) + .await + .map_err(VpnApiClientError::GetZkNymById) + } + + pub async fn confirm_zk_nym_download_by_id( + &self, + account: &VpnApiAccount, + device: &Device, + id: &str, + ) -> Result { + self.delete_authorized( + &[ + routes::PUBLIC, + routes::V1, + routes::ACCOUNT, + account.id(), + routes::DEVICE, + &device.identity_key().to_string(), + routes::ZKNYM, + id, + ], + account, + Some(device), + ) + .await + .map_err(VpnApiClientError::ConfirmZkNymDownloadById) + } + + // FREEPASS + + pub async fn get_free_passes( + &self, + account: &VpnApiAccount, + ) -> Result { + self.get_authorized( + &[ + routes::PUBLIC, + routes::V1, + routes::ACCOUNT, + account.id(), + routes::FREEPASS, + ], + account, + None, + ) + .await + .map_err(VpnApiClientError::GetFreePasses) + } + + pub async fn apply_freepass( + &self, + account: &VpnApiAccount, + code: String, + ) -> Result { + let body = ApplyFreepassRequestBody { code }; + + self.post_authorized( + &[ + routes::PUBLIC, + routes::V1, + routes::ACCOUNT, + account.id(), + routes::FREEPASS, + ], + &body, + account, + None, + ) + .await + .map_err(VpnApiClientError::ApplyFreepass) + } + + // SUBSCRIPTIONS + + pub async fn get_subscriptions( + &self, + account: &VpnApiAccount, + ) -> Result { + self.get_authorized( + &[ + routes::PUBLIC, + routes::V1, + routes::ACCOUNT, + account.id(), + routes::SUBSCRIPTION, + ], + account, + None, + ) + .await + .map_err(VpnApiClientError::GetSubscriptions) + } + + pub async fn create_subscription(&self, account: &VpnApiAccount) -> Result { + let body = CreateSubscriptionRequestBody { + valid_from_utc: "todo".to_string(), + subscription_kind: CreateSubscriptionKind::OneMonth, + }; + + self.post_authorized( + &[ + routes::PUBLIC, + routes::V1, + routes::ACCOUNT, + account.id(), + routes::SUBSCRIPTION, + ], + &body, + account, + None, + ) + .await + .map_err(VpnApiClientError::CreateSubscription) + } + + pub async fn get_active_subscriptions( + &self, + account: &VpnApiAccount, + ) -> Result { + self.get_authorized( + &[ + routes::PUBLIC, + routes::V1, + routes::ACCOUNT, + account.id(), + routes::SUBSCRIPTION, + routes::ACTIVE, + ], + account, + None, + ) + .await + .map_err(VpnApiClientError::GetActiveSubscriptions) + } + + pub async fn get_usage(&self, account: &VpnApiAccount) -> Result { + self.get_authorized( + &[ + routes::PUBLIC, + routes::V1, + routes::ACCOUNT, + account.id(), + routes::USAGE, + ], + account, + None, + ) + .await + .map_err(VpnApiClientError::GetUsage) + } + + // GATEWAYS + + pub async fn get_gateways( + &self, + min_performance: Option, + ) -> Result { + self.get_json_with_retry( + &[ + routes::PUBLIC, + routes::V1, + routes::DIRECTORY, + routes::GATEWAYS, + ], + &min_performance.unwrap_or_default().to_param(), + ) + .await + .map_err(VpnApiClientError::GetGateways) + } + + pub async fn get_gateways_by_type( + &self, + kind: GatewayType, + min_performance: Option, + ) -> Result { + match kind { + GatewayType::MixnetEntry => self.get_entry_gateways(min_performance).await, + GatewayType::MixnetExit => self.get_exit_gateways(min_performance).await, + GatewayType::Wg => self.get_vpn_gateways(min_performance).await, + } + } + + pub async fn get_gateway_countries_by_type( + &self, + kind: GatewayType, + min_performance: Option, + ) -> Result { + match kind { + GatewayType::MixnetEntry => self.get_entry_gateway_countries(min_performance).await, + GatewayType::MixnetExit => self.get_exit_gateway_countries(min_performance).await, + GatewayType::Wg => self.get_vpn_gateway_countries(min_performance).await, + } + } + + pub async fn get_vpn_gateways( + &self, + min_performance: Option, + ) -> Result { + let mut params = min_performance.unwrap_or_default().to_param(); + params.push((routes::SHOW_VPN_ONLY.to_string(), "true".to_string())); + self.get_json_with_retry( + &[ + routes::PUBLIC, + routes::V1, + routes::DIRECTORY, + routes::GATEWAYS, + ], + ¶ms, + ) + .await + .map_err(VpnApiClientError::GetVpnGateways) + } + + pub async fn get_vpn_gateway_countries( + &self, + min_performance: Option, + ) -> Result { + let mut params = min_performance.unwrap_or_default().to_param(); + params.push((routes::SHOW_VPN_ONLY.to_string(), "true".to_string())); + self.get_json_with_retry( + &[ + routes::PUBLIC, + routes::V1, + routes::DIRECTORY, + routes::GATEWAYS, + routes::COUNTRIES, + ], + ¶ms, + ) + .await + .map_err(VpnApiClientError::GetVpnGatewayCountries) + } + + pub async fn get_gateway_countries( + &self, + min_performance: Option, + ) -> Result { + self.get_json_with_retry( + &[ + routes::PUBLIC, + routes::V1, + routes::DIRECTORY, + routes::GATEWAYS, + routes::COUNTRIES, + ], + &min_performance.unwrap_or_default().to_param(), + ) + .await + .map_err(VpnApiClientError::GetGatewayCountries) + } + + pub async fn get_entry_gateways( + &self, + min_performance: Option, + ) -> Result { + self.get_json_with_retry( + &[ + routes::PUBLIC, + routes::V1, + routes::DIRECTORY, + routes::GATEWAYS, + routes::ENTRY, + ], + &min_performance.unwrap_or_default().to_param(), + ) + .await + .map_err(VpnApiClientError::GetEntryGateways) + } + + pub async fn get_entry_gateway_countries( + &self, + min_performance: Option, + ) -> Result { + self.get_json_with_retry( + &[ + routes::PUBLIC, + routes::V1, + routes::DIRECTORY, + routes::GATEWAYS, + routes::ENTRY, + routes::COUNTRIES, + ], + &min_performance.unwrap_or_default().to_param(), + ) + .await + .map_err(VpnApiClientError::GetEntryGatewayCountries) + } + + pub async fn get_exit_gateways( + &self, + min_performance: Option, + ) -> Result { + self.get_json_with_retry( + &[ + routes::PUBLIC, + routes::V1, + routes::DIRECTORY, + routes::GATEWAYS, + routes::EXIT, + ], + &min_performance.unwrap_or_default().to_param(), + ) + .await + .map_err(VpnApiClientError::GetExitGateways) + } + + pub async fn get_exit_gateway_countries( + &self, + min_performance: Option, + ) -> Result { + self.get_json_with_retry( + &[ + routes::PUBLIC, + routes::V1, + routes::DIRECTORY, + routes::GATEWAYS, + routes::EXIT, + routes::COUNTRIES, + ], + &min_performance.unwrap_or_default().to_param(), + ) + .await + .map_err(VpnApiClientError::GetExitGatewayCountries) + } + + // DIRECTORY ZK-NYM + + pub async fn get_directory_zk_nyms_ticketbook_partial_verification_keys( + &self, + ) -> Result { + self.get_json_with_retry( + &[ + routes::PUBLIC, + routes::V1, + routes::DIRECTORY, + routes::ZK_NYMS, + routes::TICKETBOOK, + routes::PARTIAL_VERIFICATION_KEYS, + ], + NO_PARAMS, + ) + .await + .map_err(VpnApiClientError::GetDirectoryZkNymsTicketbookPartialVerificationKeys) + } + + pub async fn get_wellknown_current_env(&self) -> Result { + tracing::debug!("Fetching nym vpn network details"); + self.inner + .get_json( + &[ + routes::PUBLIC, + routes::V1, + routes::WELLKNOWN, + routes::CURRENT_ENV, + ], + NO_PARAMS, + ) + .await + .map_err(VpnApiClientError::GetVpnNetworkDetails) + } +} + +fn jwt_error(error: &str) -> bool { + error.to_lowercase().contains("jwt") +} diff --git a/nym-vpn-api-client/src/error.rs b/nym-vpn-api-client/src/error.rs new file mode 100644 index 0000000000..d37db5ab2e --- /dev/null +++ b/nym-vpn-api-client/src/error.rs @@ -0,0 +1,143 @@ +// Copyright 2024 - Nym Technologies SA +// SPDX-License-Identifier: GPL-3.0-only + +use std::error::Error; + +pub use nym_http_api_client::HttpClientError; + +use nym_contracts_common::ContractsCommonError; + +use crate::response::{ErrorMessage, NymErrorResponse, UnexpectedError}; + +#[derive(Debug, thiserror::Error)] +pub enum VpnApiClientError { + #[error("failed tp create vpn api client")] + CreateVpnApiClient(#[source] HttpClientError), + + #[error("failed to get account")] + GetAccount(#[source] HttpClientError), + + #[error("failed to get account summary")] + GetAccountSummary(#[source] HttpClientError), + + #[error("failed to get devices")] + GetDevices(#[source] HttpClientError), + + #[error("failed to register device")] + RegisterDevice(#[source] HttpClientError), + + #[error("failed to get active devices")] + GetActiveDevices(#[source] HttpClientError), + + #[error("failed to get device by id")] + GetDeviceById(#[source] HttpClientError), + + #[error("failed to get device zk-nym")] + GetDeviceZkNyms(#[source] HttpClientError), + + #[error("failed to update device")] + UpdateDevice(#[source] HttpClientError), + + #[error("failed to request zk-nym")] + RequestZkNym(#[source] HttpClientError), + + #[error("failed to get active zk-nym")] + GetActiveZkNym(#[source] HttpClientError), + + #[error("failed to get zk-nym by id")] + GetZkNymById(#[source] HttpClientError), + + #[error("failed to confirm zk-nym download")] + ConfirmZkNymDownloadById(#[source] HttpClientError), + + #[error("failed to get free passes")] + GetFreePasses(#[source] HttpClientError), + + #[error("failed to apply free pass")] + ApplyFreepass(#[source] HttpClientError), + + #[error("failed to get subscriptions")] + GetSubscriptions(#[source] HttpClientError), + + #[error("failed to create subscription")] + CreateSubscription(#[source] HttpClientError), + + #[error("failed to get active subscription")] + GetActiveSubscriptions(#[source] HttpClientError), + + #[error("failed to get gateways")] + GetGateways(#[source] HttpClientError), + + #[error("failed to get gateway countries")] + GetGatewayCountries(#[source] HttpClientError), + + #[error("failed to get entry gateways")] + GetEntryGateways(#[source] HttpClientError), + + #[error("failed to get entry gateway countries")] + GetEntryGatewayCountries(#[source] HttpClientError), + + #[error("failed to get exit gateways")] + GetExitGateways(#[source] HttpClientError), + + #[error("failed to get exit gateway countries")] + GetExitGatewayCountries(#[source] HttpClientError), + + #[error("failed to get vpn gateways")] + GetVpnGateways(#[source] HttpClientError), + + #[error("failed to get vpn gateway countries")] + GetVpnGatewayCountries(#[source] HttpClientError), + + #[error("invalud percent value")] + InvalidPercentValue(#[source] ContractsCommonError), + + #[error("failed to derive from path")] + CosmosDeriveFromPath( + #[source] nym_validator_client::signing::direct_wallet::DirectSecp256k1HdWalletError, + ), + + #[error("failed to get directory zk-nym ticketbook partial verification keys")] + GetDirectoryZkNymsTicketbookPartialVerificationKeys(#[source] HttpClientError), + + #[error("failed to get health")] + GetHealth(#[source] HttpClientError), + + #[error("failed to get usage")] + GetUsage(#[source] HttpClientError), + + #[error("failed to get registered network environments")] + GetNetworkEnvs(#[source] HttpClientError), + + #[error("failed to get discovery info")] + GetDiscoveryInfo(#[source] HttpClientError), + + #[error("failed to get vpn network Details")] + GetVpnNetworkDetails(#[source] HttpClientError), + + #[error("failed to post account")] + PostAccount(#[source] HttpClientError), + + #[error("create account")] + CreateAccount(#[source] crate::types::AccountError), +} + +pub type Result = std::result::Result; + +impl TryFrom for NymErrorResponse { + type Error = VpnApiClientError; + + fn try_from(response: VpnApiClientError) -> std::result::Result { + crate::response::extract_error_response(&response).ok_or(response) + } +} + +impl VpnApiClientError { + pub fn http_client_error(&self) -> Option<&HttpClientError> + where + T: std::fmt::Display + std::fmt::Debug + 'static, + { + self.source() + .and_then(|source| source.downcast_ref::>()) + } +} diff --git a/nym-vpn-api-client/src/jwt.rs b/nym-vpn-api-client/src/jwt.rs new file mode 100644 index 0000000000..6e4d99eb15 --- /dev/null +++ b/nym-vpn-api-client/src/jwt.rs @@ -0,0 +1,247 @@ +// Copyright 2024 - Nym Technologies SA +// SPDX-License-Identifier: GPL-3.0-only + +use std::fmt; + +use nym_crypto::asymmetric::ed25519; +use nym_validator_client::{DirectSecp256k1HdWallet, signing::signer::OfflineSigner}; +use serde::{Deserialize, Serialize}; +use serde_json::json; +use sha2::{Digest, Sha256}; + +use crate::types::VpnApiTime; + +#[derive(Debug, Clone, Deserialize, Serialize)] +pub(crate) struct JwtHeader { + /// Type that is always "jwt" + typ: String, + /// Either "ES256K" or "ECDSA" + /// + /// NOTE: These JWTs are not meant to be used outside NymVPN API, so the encoding of their signatures + /// serialisation formats do not follow any RFCs, because NymVPN software creates and consumes them + /// + /// Elliptic curve signatures using secp256k1 scheme, sadly not in the table of standard algorithms in + /// https://www.rfc-editor.org/rfc/rfc7518#section-3.1. This scheme is chosen to match the signatures used + /// in the Nyx chain based on the Cosmos SDK. + /// + alg: String, +} + +#[derive(Debug, Clone, Deserialize, Serialize)] +pub(crate) struct JwtPayload { + /// Issued at, as a Unix epoch, timezone is UTC + iat: u128, + /// The number of seconds the token is valid for, after the issued at UTC epoch + exp: u8, + /// The base58 public key of the account (for signature verification) + #[serde(skip_serializing_if = "Option::is_none")] + #[serde(default)] + pubkey: Option, + /// The subject is the Cosmos account id of the user, or the public key of the device + sub: String, +} + +#[allow(unused)] +#[derive(Debug, Clone)] +pub(crate) struct Jwt { + header: JwtHeader, + payload: JwtPayload, + signature: String, + jwt: String, +} + +impl Jwt { + pub fn new_secp256k1(wallet: &DirectSecp256k1HdWallet) -> Jwt { + let timestamp = std::time::UNIX_EPOCH.elapsed().unwrap().as_secs() as u128; + tracing::debug!("timestamp: {}", timestamp); + Jwt::new_secp256k1_with_now(wallet, timestamp) + } + + pub fn new_secp256k1_synced(wallet: &DirectSecp256k1HdWallet, remote_time: VpnApiTime) -> Jwt { + Jwt::new_secp256k1_with_now(wallet, remote_time.estimate_remote_now_unix()) + } + + pub fn new_secp256k1_with_now(wallet: &DirectSecp256k1HdWallet, now: u128) -> Jwt { + let account = wallet.get_accounts().unwrap(); // TODO: result + let address = account[0].address(); + let public_key = account[0].public_key().to_bytes(); + + let header = JwtHeader { + typ: "JWT".to_string(), + alg: "ES256K".to_string(), + }; + let payload = JwtPayload { + iat: now, + exp: 30, + pubkey: Some(bs58::encode(&public_key).into_string()), + sub: address.to_string(), + }; + + let header_base64 = base64_url::encode(&json!(header.clone()).to_string()); + let payload_base64 = base64_url::encode(&json!(payload.clone()).to_string()); + let message = format!("{header_base64}.{payload_base64}").into_bytes(); + + let signature = wallet.sign_raw(address, message).unwrap(); // TODO: result + let signature_bytes = signature.to_bytes().to_vec(); + + let signature_base64 = base64_url::encode(&signature_bytes); + + let jwt = format!("{header_base64}.{payload_base64}.{signature_base64}"); + + Jwt { + header, + payload, + signature: signature_base64, + jwt, + } + } + + pub fn new_ecdsa(key_pair: &ed25519::KeyPair) -> Jwt { + let timestamp = std::time::UNIX_EPOCH.elapsed().unwrap().as_secs() as u128; + Jwt::new_ecdsa_with_now(key_pair, timestamp) + } + + pub fn new_ecdsa_synced(key_pair: &ed25519::KeyPair, remote_time: VpnApiTime) -> Jwt { + Jwt::new_ecdsa_with_now(key_pair, remote_time.estimate_remote_now_unix()) + } + + pub fn new_ecdsa_with_now(key_pair: &ed25519::KeyPair, now: u128) -> Jwt { + let header = JwtHeader { + typ: "JWT".to_string(), + alg: "ECDSA".to_string(), + }; + let payload = JwtPayload { + iat: now, + exp: 30, + pubkey: None, + sub: key_pair.public_key().to_base58_string(), + }; + + let header_base64 = base64_url::encode(&json!(header.clone()).to_string()); + let payload_base64 = base64_url::encode(&json!(payload.clone()).to_string()); + let message = format!("{header_base64}.{payload_base64}").into_bytes(); + let to_sign = Sha256::digest(&message); + + let signature = key_pair.private_key().sign(to_sign); + let signature_bytes = signature.to_bytes(); + + let signature_base64 = base64_url::encode(&signature_bytes); + + let jwt = format!("{header_base64}.{payload_base64}.{signature_base64}"); + + Jwt { + header, + payload, + signature: signature_base64, + jwt, + } + } +} + +impl fmt::Display for Jwt { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + write!(f, "{}", self.jwt) + } +} + +#[cfg(test)] +mod tests { + use nym_crypto::asymmetric::ed25519; + use nym_validator_client::DirectSecp256k1HdWallet; + + use super::*; + + fn get_secp256k1_keypair() -> DirectSecp256k1HdWallet { + let mnemonic = "kiwi ketchup mix canvas curve ribbon congress method feel frozen act annual aunt comfort side joy mesh palace tennis cannon orange name tortoise piece"; + let mnemonic = bip39::Mnemonic::parse(mnemonic).unwrap(); + DirectSecp256k1HdWallet::from_mnemonic("n", mnemonic) + } + + #[test] + fn secp256k1_jwt_matches_javascript() { + let now = 1722535718u128; + let jwt_expected_from_js_snapshot = "eyJhbGciOiJFUzI1NksiLCJ0eXAiOiJKV1QifQ.eyJleHAiOjMwLCJpYXQiOjE3MjI1MzU3MTgsInB1YmtleSI6IndneFpTM25CbWJBd2Nud0FpTnlDTjE5dWNTZHo5cVdkUXlidDJyYWtQVUhyIiwic3ViIjoibjE4Y2phemx4dTd0ODZzODV3YWwzbTdobms4ZXE3cGNmYWtoZHE1MyJ9.qxwY96D-vzMxHWZ840_l6YVDeuZeEkYqz2FaPS8ROztEqipXWCYUi8M1YTH1ZUuNyjgDAMS3NAM3hYvY09ODWQ"; + let jwt_expected_from_js_snapshot_components: Vec<&str> = + jwt_expected_from_js_snapshot.split('.').collect(); + + let wallet = get_secp256k1_keypair(); + let jwt = Jwt::new_secp256k1_with_now(&wallet, now); + + let jwt_str = jwt.to_string(); + let jwt_components: Vec<&str> = jwt_str.split('.').collect(); + + if jwt_str != jwt_expected_from_js_snapshot { + println!("== secp256k1 / ED256K1 =="); + println!( + "jwt_expected_from_js_snapshot = {}", + jwt_expected_from_js_snapshot + ); + println!("jwt_str = {}", jwt_str); + } + + assert_eq!( + jwt_expected_from_js_snapshot_components[0], + jwt_components[0] + ); // header + assert_eq!( + jwt_expected_from_js_snapshot_components[1], + jwt_components[1] + ); // payload + assert_eq!( + jwt_expected_from_js_snapshot_components[2], + jwt_components[2] + ); // signature + + assert_eq!(jwt_expected_from_js_snapshot, jwt_str); // whole JWT strings + } + + fn get_ed25519_keypair() -> ed25519::KeyPair { + // let mnemonic = "kiwi ketchup mix canvas curve ribbon congress method feel frozen act annual aunt comfort side joy mesh palace tennis cannon orange name tortoise piece"; + let private_key_base58 = "9JqXnPvTrWkq1Yq66d8GbXrcz5eryAhPZvZ46cEsBPUY"; + let public_key_base58 = "4SPdxfBYsuARBw6REQQa5vFiKcvmYiet9sSWqb751i3Z"; + + let private_key = bs58::decode(private_key_base58).into_vec().unwrap(); + let public_key = bs58::decode(public_key_base58).into_vec().unwrap(); + + ed25519::KeyPair::from_bytes(&private_key, &public_key).unwrap() + } + + #[test] + fn ed25519_ecdsa_jwt_matches_javascript() { + let now = 1722535718u128; + let jwt_expected_from_js_snapshot = "eyJhbGciOiJFQ0RTQSIsInR5cCI6IkpXVCJ9.eyJleHAiOjMwLCJpYXQiOjE3MjI1MzU3MTgsInN1YiI6IjRTUGR4ZkJZc3VBUkJ3NlJFUVFhNXZGaUtjdm1ZaWV0OXNTV3FiNzUxaTNaIn0.wSd8y1QdqOVYLf2uTMlnymmiIPQwpxXWd2QvPZ-XqV8O1PNiurQO5JPU65SnaOfggJVA5pnAgZLbj9ciOJKIDg"; + let jwt_expected_from_js_snapshot_components: Vec<&str> = + jwt_expected_from_js_snapshot.split('.').collect(); + + let key_pair = get_ed25519_keypair(); + + let jwt = Jwt::new_ecdsa_with_now(&key_pair, now); + + let jwt_str = jwt.to_string(); + let jwt_components: Vec<&str> = jwt_str.split('.').collect(); + + if jwt_str != jwt_expected_from_js_snapshot { + println!("== ed25519 / ECDSA =="); + println!( + "jwt_expected_from_js_snapshot = {}", + jwt_expected_from_js_snapshot + ); + println!("jwt_str = {}", jwt_str); + } + + assert_eq!( + jwt_expected_from_js_snapshot_components[0], + jwt_components[0] + ); // header + assert_eq!( + jwt_expected_from_js_snapshot_components[1], + jwt_components[1] + ); // payload + assert_eq!( + jwt_expected_from_js_snapshot_components[2], + jwt_components[2] + ); // signature + + assert_eq!(jwt_expected_from_js_snapshot, jwt_str); // whole JWT strings + } +} diff --git a/nym-vpn-api-client/src/lib.rs b/nym-vpn-api-client/src/lib.rs new file mode 100644 index 0000000000..ec95365cae --- /dev/null +++ b/nym-vpn-api-client/src/lib.rs @@ -0,0 +1,19 @@ +// Copyright 2024 - Nym Technologies SA +// SPDX-License-Identifier: GPL-3.0-only + +pub mod response; +pub mod types; + +pub(crate) mod jwt; + +mod bootstrap; +mod client; +mod error; +mod network_compatibility; +mod request; +mod routes; + +pub use bootstrap::BootstrapVpnApiClient; +pub use client::VpnApiClient; +pub use error::{HttpClientError, VpnApiClientError}; +pub use network_compatibility::NetworkCompatibility; diff --git a/nym-vpn-api-client/src/network_compatibility.rs b/nym-vpn-api-client/src/network_compatibility.rs new file mode 100644 index 0000000000..ff49a50af5 --- /dev/null +++ b/nym-vpn-api-client/src/network_compatibility.rs @@ -0,0 +1,35 @@ +use serde::{Deserialize, Serialize}; +use std::fmt; + +use crate::response::NetworkCompatibilityResponse; + +#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] +pub struct NetworkCompatibility { + pub core: String, + pub ios: String, + pub macos: String, + pub tauri: String, + pub android: String, +} + +impl fmt::Display for NetworkCompatibility { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + write!( + f, + "core: {}, ios: {}, macos: {}, tauri: {}, android: {}", + self.core, self.ios, self.macos, self.tauri, self.android + ) + } +} + +impl From for NetworkCompatibility { + fn from(response: NetworkCompatibilityResponse) -> Self { + NetworkCompatibility { + core: response.core, + ios: response.ios, + macos: response.macos, + tauri: response.tauri, + android: response.android, + } + } +} diff --git a/nym-vpn-api-client/src/request.rs b/nym-vpn-api-client/src/request.rs new file mode 100644 index 0000000000..564809bf25 --- /dev/null +++ b/nym-vpn-api-client/src/request.rs @@ -0,0 +1,99 @@ +// Copyright 2024 - Nym Technologies SA +// SPDX-License-Identifier: GPL-3.0-only + +use serde::{Deserialize, Serialize}; + +#[derive(Debug, Serialize, Deserialize)] +pub struct CreateAccountRequestBody { + pub account_addr: String, + pub pub_key: String, + pub signature_base64: String, +} + +#[derive(Debug, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct RegisterDeviceRequestBody { + pub device_identity_key: String, + pub signature: String, +} + +#[derive(Debug, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct RequestZkNymRequestBody { + pub withdrawal_request: String, + pub ecash_pubkey: String, + pub expiration_date: String, + pub ticketbook_type: String, +} + +#[derive(Debug, Serialize, Deserialize)] +pub struct ApplyFreepassRequestBody { + pub code: String, +} + +#[derive(Debug, Serialize, Deserialize)] +pub struct CreateSubscriptionInvoicesRequestBody { + pub subscription: String, + pub date: String, + pub status: CreateSubscriptionInvoicesStatus, + pub invoice_no: String, +} + +#[derive(Debug, Serialize, Deserialize)] +#[serde(rename_all = "snake_case")] +pub enum CreateSubscriptionInvoicesStatus { + Unpaid, + Paid, + Cancelled, +} + +#[derive(Debug, Serialize, Deserialize)] +pub struct CreateSubscriptionRequestBody { + pub valid_from_utc: String, + pub subscription_kind: CreateSubscriptionKind, +} + +#[derive(Debug, Serialize, Deserialize)] +#[serde(rename_all = "snake_case")] +pub enum CreateSubscriptionKind { + OneMonth, + OneYear, + TwoYears, +} + +#[derive(Debug, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct RequestRefundRequestBody { + subscription_invoice: String, + status: RequestRefundRequestStatus, + user_reason: RequestRefundRequestUserReason, +} + +#[derive(Debug, Serialize, Deserialize)] +#[serde(rename_all = "snake_case")] +pub enum RequestRefundRequestStatus { + Pending, + Complete, + Rejected, +} + +#[derive(Debug, Serialize, Deserialize)] +#[serde(rename_all = "snake_case")] +pub enum RequestRefundRequestUserReason { + SubscriptionInError, + PoorPerformance, +} + +#[derive(Debug, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct UpdateDeviceRequestBody { + pub status: UpdateDeviceRequestStatus, +} + +#[derive(Debug, Serialize, Deserialize)] +#[serde(rename_all = "snake_case")] +pub enum UpdateDeviceRequestStatus { + Active, + Inactive, + DeleteMe, +} diff --git a/nym-vpn-api-client/src/response.rs b/nym-vpn-api-client/src/response.rs new file mode 100644 index 0000000000..36b712be28 --- /dev/null +++ b/nym-vpn-api-client/src/response.rs @@ -0,0 +1,658 @@ +// Copyright 2024 - Nym Technologies SA +// SPDX-License-Identifier: GPL-3.0-only + +use std::{collections::HashSet, fmt, net::IpAddr}; + +use itertools::Itertools; +use nym_contracts_common::Percent; +use nym_credential_proxy_requests::api::v1::ticketbook::models::TicketbookWalletSharesResponse; +use serde::{Deserialize, Serialize}; +use time::OffsetDateTime; + +use crate::network_compatibility::NetworkCompatibility; + +const MAX_PROBE_RESULT_AGE_MINUTES: i64 = 60; + +#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq)] +pub struct NymVpnRegisterAccountResponse { + pub created_on_utc: String, + pub last_updated_utc: String, + pub account_addr: String, + pub status: NymVpnRegisterAccountStatusResponse, + pub account_token: String, +} + +#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq)] +#[serde(rename_all = "snake_case")] +pub enum NymVpnRegisterAccountStatusResponse { + Active, +} + +#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq)] +pub struct NymVpnAccountResponse { + pub created_on_utc: String, + pub last_updated_utc: String, + pub account_addr: String, + pub status: NymVpnAccountStatusResponse, +} + +#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq)] +#[serde(rename_all = "snake_case")] +pub enum NymVpnAccountStatusResponse { + Active, + Inactive, + DeleteMe, +} + +#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)] +#[serde(rename_all = "camelCase")] +pub struct NymVpnAccountSummaryResponse { + pub account: NymVpnAccountResponse, + pub subscription: NymVpnAccountSummarySubscription, + pub devices: NymVpnAccountSummaryDevices, + pub fair_usage: NymVpnAccountSummaryFairUsage, +} + +#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq)] +#[serde(rename_all = "camelCase")] +pub struct NymVpnAccountSummarySubscription { + pub is_active: bool, + pub active: Option, +} + +#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq)] +#[serde(rename_all = "camelCase")] +pub struct NymVpnAccountSummaryDevices { + pub active: u64, + pub max: u64, + pub remaining: u64, +} + +#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)] +#[allow(non_snake_case)] +// These fields have the substring 'GB' in them, meaning we can't use `rename_all = "camelCase"` +// like for the other structs +pub struct NymVpnAccountSummaryFairUsage { + pub usedGB: u64, + pub limitGB: u64, + pub resetsOnUtc: Option, +} + +#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq)] +#[serde(rename_all = "camelCase")] +pub struct NymVpnHealthResponse { + pub status: String, + #[serde(with = "time::serde::rfc3339")] + pub timestamp_utc: OffsetDateTime, +} + +#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq)] +pub struct NymVpnDevice { + pub created_on_utc: String, + pub last_updated_utc: String, + pub device_identity_key: String, + pub status: NymVpnDeviceStatus, +} + +#[derive(Copy, Clone, Debug, Serialize, Deserialize, PartialEq, Eq)] +#[serde(rename_all = "snake_case")] +pub enum NymVpnDeviceStatus { + Active, + Inactive, + DeleteMe, +} + +#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq)] +#[serde(rename_all = "camelCase")] +pub struct NymVpnDevicesResponse { + pub total_items: u64, + pub page: u64, + pub page_size: u64, + pub items: Vec, +} + +impl fmt::Display for NymVpnDevicesResponse { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + write!( + f, + "{}", + self.items + .iter() + .format_with(", ", |item, f| f(&format_args!("{item:?}"))) + ) + } +} + +#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq)] +#[serde(rename_all = "camelCase")] +pub struct NymVpnRefundsResponse { + pub total_items: u64, + pub page: u64, + pub page_size: u64, + pub items: Vec, +} + +#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq)] +pub struct NymVpnRefund { + pub created_on_utc: String, + pub last_updated_utc: String, + pub subscription_invoice: String, + pub status: NymVpnRefundStatus, + pub user_reason: NymVpnRefundUserReason, + pub data: Option, +} + +#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq)] +#[serde(rename_all = "snake_case")] +pub enum NymVpnRefundStatus { + Pending, + Complete, + Rejected, +} + +#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq)] +#[serde(rename_all = "snake_case")] +pub enum NymVpnRefundUserReason { + SubscriptionInError, + PoorPerformance, + Other, +} + +// Legacy type, because the blinded_shares response for the POST seems to be different than the GET +// Remove once it's not needed anymore +#[derive(Clone, Debug, Serialize, Deserialize)] +pub struct NymVpnZkNymPost { + pub created_on_utc: String, + pub last_updated_utc: String, + pub id: String, + pub ticketbook_type: String, + pub valid_until_utc: String, + pub valid_from_utc: String, + pub issued_bandwidth_in_gb: f64, + pub blinded_shares: Option>>, + pub status: NymVpnZkNymStatus, +} + +#[derive(Clone, Debug, Serialize, Deserialize)] +pub struct NymVpnZkNym { + pub created_on_utc: String, + pub last_updated_utc: String, + pub id: String, + pub ticketbook_type: String, + pub valid_until_utc: String, + pub valid_from_utc: String, + pub issued_bandwidth_in_gb: f64, + pub blinded_shares: Option, + pub status: NymVpnZkNymStatus, +} + +#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq, strum::Display)] +#[serde(rename_all = "snake_case")] +pub enum NymVpnZkNymStatus { + Pending, + Active, + Revoking, + Revoked, + Error, +} + +#[derive(Clone, Debug, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct NymVpnZkNymResponse { + pub total_items: u64, + pub page: u64, + pub page_size: u64, + pub items: Vec, +} + +#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq)] +pub struct NymVpnSubscription { + pub created_on_utc: String, + pub last_updated_utc: String, + pub id: String, + pub valid_until_utc: String, + pub valid_from_utc: String, + pub status: NymVpnSubscriptionStatus, + pub kind: NymVpnSubscriptionKind, +} + +#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq)] +#[serde(rename_all = "snake_case")] +pub enum NymVpnSubscriptionStatus { + Pending, + Complete, + Active, +} + +#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq)] +#[serde(rename_all = "snake_case")] +pub enum NymVpnSubscriptionKind { + OneMonth, + OneYear, + TwoYears, + Freepass, +} + +#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)] +#[serde(rename_all = "camelCase")] +pub struct NymVpnSubscriptionResponse { + pub is_subscription_active: bool, + pub subscription: Option, + pub remaining_allowance_in_gb: f64, +} + +#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq)] +#[serde(rename_all = "camelCase")] +pub struct NymVpnSubscriptionsResponse { + pub total_items: u64, + pub page: u64, + pub page_size: u64, + pub items: Vec, +} + +#[derive(Debug, Clone, Deserialize, Serialize, PartialEq)] +#[serde(rename_all = "camelCase")] +pub struct NymVpnUsagesResponse { + pub total_items: u64, + pub page: u64, + pub page_size: u64, + pub items: Vec, +} + +#[derive(Debug, Clone, Deserialize, Serialize, PartialEq)] +pub struct NymVpnUsage { + pub created_on_utc: String, + pub last_updated_utc: String, + pub id: String, + pub subscription_id: String, + pub valid_until_utc: String, + pub valid_from_utc: String, + pub bandwidth_allowance_gb: f64, + pub bandwidth_used_gb: f64, +} + +#[derive(Debug, Clone, Deserialize, Serialize)] +pub struct NymDirectoryGatewaysResponse(Vec); + +impl NymDirectoryGatewaysResponse { + pub fn into_inner(self) -> Vec { + self.0 + } +} + +impl IntoIterator for NymDirectoryGatewaysResponse { + type Item = NymDirectoryGateway; + type IntoIter = std::vec::IntoIter; + + fn into_iter(self) -> Self::IntoIter { + self.0.into_iter() + } +} + +#[derive(Debug, Clone, Deserialize, Serialize)] +pub struct NymDirectoryGateway { + pub identity_key: String, + pub name: String, + pub ip_packet_router: Option, + pub authenticator: Option, + pub location: Location, + pub last_probe: Option, + pub ip_addresses: Vec, + pub mix_port: u16, + pub role: Role, + pub entry: EntryInformation, + // The performance data here originates from the nym-api, and is effectively mixnet performance + // at the time of writing this + pub performance: Percent, + pub build_information: Option, +} + +#[derive(Debug, Clone, Deserialize, Serialize)] +pub struct EntryInformation { + pub hostname: Option, + pub ws_port: u16, + pub wss_port: Option, +} + +#[derive(Debug, Clone, Deserialize, Serialize)] +pub struct UxScore { + pub max_score: u8, + pub current_score: u8, + pub color: String, +} + +#[derive(Debug, Clone, Deserialize, Serialize)] +pub struct IpPacketRouter { + pub address: String, +} + +#[derive(Debug, Clone, Deserialize, Serialize)] +pub struct Authenticator { + pub address: String, +} + +#[derive(Debug, Clone, Deserialize, Serialize)] +pub enum Role { + // a properly active mixnode + Mixnode { + layer: u8, + }, + + #[serde(alias = "entry", alias = "gateway")] + EntryGateway, + + #[serde(alias = "exit")] + ExitGateway, + + // equivalent of node that's in rewarded set but not in the inactive set + Standby, + + Inactive, +} + +#[derive(Debug, Clone, Deserialize, Serialize)] +pub struct BuildInformation { + pub build_version: String, + pub commit_branch: String, + pub commit_sha: String, +} + +impl NymDirectoryGateway { + pub fn is_fully_operational_entry(&self) -> bool { + self.last_probe + .as_ref() + .map(|probe| probe.is_fully_operational_entry()) + .unwrap_or(false) + } + + pub fn is_fully_operational_exit(&self) -> bool { + self.last_probe + .as_ref() + .map(|probe| probe.is_fully_operational_exit()) + .unwrap_or(false) + } +} + +#[derive(Debug, Clone, Deserialize, Serialize)] +pub struct Location { + pub two_letter_iso_country_code: String, + pub latitude: f64, + pub longitude: f64, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct Probe { + pub last_updated_utc: String, + pub outcome: ProbeOutcome, +} + +impl Probe { + pub fn is_fully_operational_entry(&self) -> bool { + if !is_recently_updated(&self.last_updated_utc) { + return false; + } + self.outcome.is_fully_operational_entry() + } + + pub fn is_fully_operational_exit(&self) -> bool { + if !is_recently_updated(&self.last_updated_utc) { + return false; + } + self.outcome.is_fully_operational_exit() + } +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct ProbeOutcome { + pub as_entry: Entry, + pub as_exit: Option, + pub wg: Option, +} + +impl ProbeOutcome { + pub fn is_fully_operational_entry(&self) -> bool { + self.as_entry.can_connect && self.as_entry.can_route + } + + pub fn is_fully_operational_exit(&self) -> bool { + self.as_entry.can_connect + && self.as_entry.can_route + && self.as_exit.as_ref().is_some_and(|exit| { + exit.can_connect + && exit.can_route_ip_v4 + && exit.can_route_ip_external_v4 + && exit.can_route_ip_v6 + && exit.can_route_ip_external_v6 + }) + } +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct Entry { + pub can_connect: bool, + pub can_route: bool, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct Exit { + pub can_connect: bool, + pub can_route_ip_v4: bool, + pub can_route_ip_external_v4: bool, + pub can_route_ip_v6: bool, + pub can_route_ip_external_v6: bool, +} + +#[derive(Debug, Clone, Serialize, Deserialize, Default)] +#[serde(rename = "wg")] +pub struct WgProbeResults { + pub can_register: bool, + pub can_handshake: bool, + pub can_resolve_dns: bool, + pub ping_hosts_performance: f32, + pub ping_ips_performance: f32, +} + +fn is_recently_updated(last_updated_utc: &str) -> bool { + if let Ok(last_updated) = last_updated_utc.parse::>() { + let now = chrono::Utc::now(); + let duration = now - last_updated; + duration.num_minutes() < MAX_PROBE_RESULT_AGE_MINUTES + } else { + false + } +} + +#[derive(Debug, Clone, Deserialize, Serialize)] +pub struct NymDirectoryGatewayCountriesResponse(Vec); + +impl NymDirectoryGatewayCountriesResponse { + pub fn into_inner(self) -> Vec { + self.0 + } +} + +impl IntoIterator for NymDirectoryGatewayCountriesResponse { + type Item = NymDirectoryCountry; + type IntoIter = std::vec::IntoIter; + + fn into_iter(self) -> Self::IntoIter { + self.0.into_iter() + } +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct NymDirectoryCountry(String); + +impl NymDirectoryCountry { + pub fn iso_code(&self) -> &str { + &self.0 + } + + pub fn into_string(self) -> String { + self.0 + } +} + +impl From for NymDirectoryCountry { + fn from(s: String) -> Self { + Self(s) + } +} + +#[derive(Debug, Clone, Serialize, Deserialize, Default, PartialEq, Eq)] +#[serde(rename_all = "camelCase")] +pub struct NymErrorResponse { + pub message: String, + pub message_id: Option, + pub code_reference_id: Option, + pub status: String, +} + +impl fmt::Display for NymErrorResponse { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + let fields = [ + Some(format!("message: {}", self.message)), + self.message_id + .as_deref() + .map(|x| format!("message_id: {x}")), + self.code_reference_id + .as_deref() + .map(|x| format!("code_reference_id: {x}")), + Some(format!("status: {}", self.status)), + ] + .iter() + .filter_map(|x| x.clone()) + .collect::>(); + write!(f, "{}", fields.join(", ")) + } +} + +#[derive(Debug, Serialize, Deserialize)] +pub struct ErrorMessage { + message: String, +} + +impl fmt::Display for ErrorMessage { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + write!(f, "{}", self.message) + } +} + +#[derive(Debug, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct UnexpectedError { + pub message: String, +} + +impl fmt::Display for UnexpectedError { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + write!(f, "{}", self.message) + } +} + +#[derive(Debug, Serialize, Deserialize)] +pub struct StatusOk { + status: String, +} + +impl fmt::Display for StatusOk { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + write!(f, "{}", self.status) + } +} + +pub fn extract_error_response(err: &E) -> Option +where + E: std::error::Error + 'static, +{ + let mut source = err.source(); + while let Some(err) = source { + if let Some(status) = err + .downcast_ref::>() + .and_then(extract_error_response_inner::) + { + return Some(status); + } + source = err.source(); + } + None +} + +fn extract_error_response_inner(err: &nym_http_api_client::HttpClientError) -> Option +where + E: Clone + std::fmt::Display, +{ + match err { + nym_http_api_client::HttpClientError::EndpointFailure { error, .. } => Some(error.clone()), + _ => None, + } +} + +// The response type we fetch from the discovery endpoint +#[derive(Clone, Debug, serde::Serialize, serde::Deserialize)] +pub struct NymWellknownDiscoveryItemResponse { + pub network_name: String, + pub nym_api_url: String, + pub nym_vpn_api_url: String, + pub account_management: Option, + pub feature_flags: Option, + pub system_messages: Option>, + pub system_configuration: Option, + pub network_compatibility: Option, +} + +#[derive(Clone, Debug, serde::Serialize, serde::Deserialize, PartialEq, Eq)] +pub struct AccountManagementResponse { + pub url: String, + pub paths: AccountManagementPathsResponse, +} + +#[derive(Clone, Debug, serde::Serialize, serde::Deserialize, PartialEq, Eq)] +pub struct AccountManagementPathsResponse { + pub sign_up: String, + pub sign_in: String, + pub account: String, +} + +#[derive(Clone, Debug, serde::Serialize, serde::Deserialize, PartialEq, Eq)] +#[serde(rename_all = "camelCase")] +pub struct SystemMessageResponse { + pub name: String, + pub display_from: String, + pub display_until: String, + pub message: String, + pub properties: serde_json::Value, +} + +#[derive(Clone, Debug, serde::Serialize, serde::Deserialize, PartialEq, Eq)] +pub struct SystemConfigurationResponse { + pub mix_thresholds: ScoreThresholdsResponse, + pub wg_thresholds: ScoreThresholdsResponse, + pub statistics_recipient: Option, + pub min_supported_app_versions: Option, +} + +#[derive(Clone, Debug, serde::Serialize, serde::Deserialize, PartialEq, Eq)] +pub struct NetworkCompatibilityResponse { + pub core: String, + pub macos: String, + pub ios: String, + pub tauri: String, + pub android: String, +} + +#[derive(Clone, Debug, serde::Serialize, serde::Deserialize, PartialEq, Eq)] +pub struct ScoreThresholdsResponse { + pub high: u8, + pub medium: u8, + pub low: u8, +} + +#[derive(Clone, Debug, serde::Serialize, serde::Deserialize)] +pub struct NymWellknownDiscoveryItem { + pub network_name: String, + pub nym_api_url: String, + pub nym_vpn_api_url: String, +} + +pub type RegisteredNetworksResponse = HashSet; diff --git a/nym-vpn-api-client/src/routes.rs b/nym-vpn-api-client/src/routes.rs new file mode 100644 index 0000000000..9e5bcc91e8 --- /dev/null +++ b/nym-vpn-api-client/src/routes.rs @@ -0,0 +1,33 @@ +// Copyright 2024 - Nym Technologies SA +// SPDX-License-Identifier: GPL-3.0-only + +pub(crate) const PUBLIC: &str = "public"; +pub(crate) const V1: &str = "v1"; +pub(crate) const ACCOUNT: &str = "account"; +pub(crate) const APPLE: &str = "apple"; +pub(crate) const HEALTH: &str = "health"; +pub(crate) const SUMMARY: &str = "summary"; +pub(crate) const DEVICE: &str = "device"; +pub(crate) const ACTIVE: &str = "active"; +pub(crate) const ZKNYM: &str = "zknym"; +pub(crate) const AVAILABLE: &str = "available"; +pub(crate) const FREEPASS: &str = "freepass"; +pub(crate) const SUBSCRIPTION: &str = "subscription"; +pub(crate) const USAGE: &str = "usage"; +pub(crate) const DIRECTORY: &str = "directory"; +pub(crate) const GATEWAYS: &str = "gateways"; +pub(crate) const COUNTRIES: &str = "countries"; +pub(crate) const ENTRY: &str = "entry"; +pub(crate) const EXIT: &str = "exit"; +pub(crate) const ZK_NYMS: &str = "zk-nyms"; +pub(crate) const TICKETBOOK: &str = "ticketbook"; +pub(crate) const PARTIAL_VERIFICATION_KEYS: &str = "partial-verification-keys"; + +pub(crate) const SHOW_VPN_ONLY: &str = "show_vpn_only"; +pub(crate) const VPN_MIN_PERFORMANCE: &str = "vpn_min_performance"; +pub(crate) const MIXNET_MIN_PERFORMANCE: &str = "mixnet_min_performance"; + +pub(crate) const WELLKNOWN: &str = ".wellknown"; +pub(crate) const ENVS_FILE: &str = "envs.json"; +pub(crate) const DISCOVERY_FILE: &str = "discovery.json"; +pub(crate) const CURRENT_ENV: &str = "current-env.json"; diff --git a/nym-vpn-api-client/src/types/account.rs b/nym-vpn-api-client/src/types/account.rs new file mode 100644 index 0000000000..6a698e65f5 --- /dev/null +++ b/nym-vpn-api-client/src/types/account.rs @@ -0,0 +1,248 @@ +// Copyright 2024 - Nym Technologies SA +// SPDX-License-Identifier: GPL-3.0-only + +use std::fmt; + +use nym_compact_ecash::scheme::keygen::KeyPairUser; +use nym_validator_client::{ + DirectSecp256k1HdWallet, nyxd::bip32::DerivationPath, signing::signer::OfflineSigner as _, +}; +use time::{Duration, OffsetDateTime}; + +use crate::{VpnApiClientError, error::Result, jwt::Jwt}; + +const MAX_ACCEPTABLE_SKEW_SECONDS: i64 = 60; +const SKEW_SECONDS_CONSIDERED_SAME: i64 = 2; + +#[derive(thiserror::Error, Debug)] +pub enum Error { + #[error("wallet error")] + Wallet(#[from] nym_validator_client::signing::direct_wallet::DirectSecp256k1HdWalletError), + + #[error("no accounts in wallet")] + NoAccounts, +} + +#[derive(Clone, Debug)] +pub struct VpnApiAccount { + wallet: DirectSecp256k1HdWallet, + id: String, + pub_key: String, + signature_base64: String, +} + +impl VpnApiAccount { + fn derive_from_wallet(wallet: DirectSecp256k1HdWallet) -> std::result::Result { + let accounts = wallet.get_accounts()?; + let address = accounts.first().ok_or(Error::NoAccounts)?.address(); + let id = address.to_string(); + let pub_key = bs58::encode( + accounts + .first() + .ok_or(Error::NoAccounts)? + .public_key() + .to_bytes(), + ) + .into_string(); + + let message = id.clone().into_bytes(); + let signature = wallet.sign_raw(address, message)?; + let signature_bytes = signature.to_bytes().to_vec(); + let signature_base64 = base64_url::encode(&signature_bytes); + + Ok(Self { + wallet, + id, + pub_key, + signature_base64, + }) + } + + pub fn random() -> Result<(Self, bip39::Mnemonic)> { + let mnemonic = bip39::Mnemonic::generate(24).unwrap(); + let wallet = DirectSecp256k1HdWallet::from_mnemonic("n", mnemonic.clone()); + let account = Self::derive_from_wallet(wallet).map_err(VpnApiClientError::CreateAccount)?; + Ok((account, mnemonic)) + } + + pub fn id(&self) -> &str { + &self.id + } + + pub fn pub_key(&self) -> &str { + &self.pub_key + } + + pub fn signature_base64(&self) -> &str { + &self.signature_base64 + } + + pub(crate) fn jwt(&self, remote_time: Option) -> Jwt { + match remote_time { + Some(remote_time) => Jwt::new_secp256k1_synced(&self.wallet, remote_time), + None => Jwt::new_secp256k1(&self.wallet), + } + } + + pub fn create_ecash_keypair(&self) -> Result { + let hd_path = cosmos_derivation_path(); + let extended_private_key = self + .wallet + .derive_extended_private_key(&hd_path) + .map_err(VpnApiClientError::CosmosDeriveFromPath)?; + Ok(KeyPairUser::new_seeded( + extended_private_key.private_key().to_bytes(), + )) + } + + pub fn get_mnemonic(&self) -> String { + self.wallet.mnemonic() + } +} + +impl TryFrom for VpnApiAccount { + type Error = VpnApiClientError; + + fn try_from(mnemonic: bip39::Mnemonic) -> std::result::Result { + let wallet = DirectSecp256k1HdWallet::from_mnemonic("n", mnemonic.clone()); + Self::derive_from_wallet(wallet).map_err(VpnApiClientError::CreateAccount) + } +} + +fn cosmos_derivation_path() -> DerivationPath { + nym_config::defaults::COSMOS_DERIVATION_PATH + .parse() + .unwrap() +} + +#[derive(Clone, Copy, Debug)] +pub struct VpnApiTime { + // The local time on the client. + pub local_time: OffsetDateTime, + + // The estimated time on the remote server. Based on RTT, it's not guaranteed to be accurate. + pub estimated_remote_time: OffsetDateTime, +} + +impl VpnApiTime { + pub fn from_estimated_remote_time( + local_time: OffsetDateTime, + estimated_remote_time: OffsetDateTime, + ) -> Self { + Self { + local_time, + estimated_remote_time, + } + } + + pub fn from_remote_timestamp( + local_time_before_request: OffsetDateTime, + remote_timestamp: OffsetDateTime, + local_time_after_request: OffsetDateTime, + ) -> Self { + let rtt = local_time_after_request - local_time_before_request; + let estimated_remote_time = remote_timestamp + (rtt / 2); + Self { + local_time: local_time_after_request, + estimated_remote_time, + } + } + + // Local time minus remote time. Meaning if the value is positive, the local time is ahead + // of the remote time. + pub fn local_time_ahead_skew(&self) -> Duration { + self.local_time - self.estimated_remote_time + } + + pub fn is_almost_same(&self) -> bool { + self.local_time_ahead_skew().abs().whole_seconds() < SKEW_SECONDS_CONSIDERED_SAME + } + + pub fn is_acceptable_synced(&self) -> bool { + self.local_time_ahead_skew().abs().whole_seconds() < MAX_ACCEPTABLE_SKEW_SECONDS + } + + pub fn is_synced(&self) -> VpnApiTimeSynced { + if self.is_almost_same() { + VpnApiTimeSynced::AlmostSame + } else if self.is_acceptable_synced() { + VpnApiTimeSynced::AcceptableSynced + } else { + VpnApiTimeSynced::NotSynced + } + } + + pub fn estimate_remote_now(&self) -> OffsetDateTime { + tracing::debug!( + "Estimating remote now using (local time ahead) skew: {}", + self.local_time_ahead_skew() + ); + let local_time_now = OffsetDateTime::now_utc(); + local_time_now - self.local_time_ahead_skew() + } + + pub fn estimate_remote_now_unix(&self) -> u128 { + self.estimate_remote_now().unix_timestamp() as u128 + } +} + +impl fmt::Display for VpnApiTime { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + write!( + f, + "Local time: {}, Remote time: {}, Skew: {}", + self.local_time, + self.estimated_remote_time, + self.local_time_ahead_skew(), + ) + } +} + +#[derive(Clone, Copy, Debug, PartialEq, Eq)] +pub enum VpnApiTimeSynced { + AlmostSame, + AcceptableSynced, + NotSynced, +} + +impl VpnApiTimeSynced { + pub fn is_synced(&self) -> bool { + matches!( + self, + VpnApiTimeSynced::AlmostSame | VpnApiTimeSynced::AcceptableSynced + ) + } + + pub fn is_not_synced(&self) -> bool { + !self.is_synced() + } +} + +#[cfg(test)] +mod tests { + use crate::types::test_fixtures::{TEST_DEFAULT_MNEMONIC, TEST_DEFAULT_MNEMONIC_ID}; + + use super::*; + + #[test] + fn create_account_from_mnemonic() { + let account = + VpnApiAccount::try_from(bip39::Mnemonic::parse(TEST_DEFAULT_MNEMONIC).unwrap()) + .unwrap(); + assert_eq!(account.id(), TEST_DEFAULT_MNEMONIC_ID); + } + + #[test] + fn create_random_account() { + let (_, mnemonic) = VpnApiAccount::random().unwrap(); + assert_eq!(mnemonic.word_count(), 24); + } + + #[test] + fn derive_wallets() { + for word_count in [12, 24] { + let wallet = DirectSecp256k1HdWallet::generate("n", word_count).unwrap(); + VpnApiAccount::derive_from_wallet(wallet).unwrap(); + } + } +} diff --git a/nym-vpn-api-client/src/types/device.rs b/nym-vpn-api-client/src/types/device.rs new file mode 100644 index 0000000000..9c2178853d --- /dev/null +++ b/nym-vpn-api-client/src/types/device.rs @@ -0,0 +1,222 @@ +// Copyright 2024 - Nym Technologies SA +// SPDX-License-Identifier: GPL-3.0-only + +use std::{fmt, sync::Arc}; + +use nym_crypto::asymmetric::ed25519; +use sha2::Digest as _; + +use crate::{jwt::Jwt, request::UpdateDeviceRequestStatus}; + +use super::VpnApiTime; + +#[derive(Clone)] +pub struct Device { + keypair: Arc, +} + +impl Device { + pub fn identity_key(&self) -> &ed25519::PublicKey { + self.keypair.public_key() + } + + pub(crate) fn jwt(&self, remote_time: Option) -> Jwt { + match remote_time { + Some(remote_time) => Jwt::new_ecdsa_synced(&self.keypair, remote_time), + None => Jwt::new_ecdsa(&self.keypair), + } + } + + pub fn sign>(&self, message: M) -> DeviceSignature { + let digest = { + let mut hasher = sha2::Sha256::new(); + hasher.update(message); + hasher.finalize() + }; + + DeviceSignature(self.keypair.private_key().sign(digest)) + } + + pub fn sign_identity_key(&self) -> DeviceSignature { + self.sign(self.identity_key().to_base58_string()) + } +} + +impl fmt::Display for Device { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + write!(f, "Device {{ {} }}", self.identity_key().to_base58_string()) + } +} + +impl fmt::Debug for Device { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + write!( + f, + "Device {{ identity_key: {} }}", + self.identity_key().to_base58_string() + ) + } +} + +impl From> for Device { + fn from(keypair: Arc) -> Self { + Self { keypair } + } +} + +impl From for Device { + fn from(keypair: ed25519::KeyPair) -> Self { + Self { + keypair: Arc::new(keypair), + } + } +} + +// In tests we create from a mnemonic, in production these are always created directly from +// the keypair +#[cfg(test)] +impl From for Device { + fn from(mnemonic: bip39::Mnemonic) -> Self { + let (entropy, _) = mnemonic.to_entropy_array(); + // Entropy is statically >= 32 bytes, so we can safely extract the first 32 + // bytes + let seed = &entropy[0..32]; + + let signing_key = ed25519::PrivateKey::from_bytes(seed).unwrap(); + let verifying_key = signing_key.public_key(); + + let privkey = signing_key.to_bytes().to_vec(); + let pubkey = verifying_key.to_bytes().to_vec(); + + let keypair = ed25519::KeyPair::from_bytes(&privkey, &pubkey).unwrap(); + + Self { + keypair: Arc::new(keypair), + } + } +} + +#[derive(Debug, Clone, PartialEq, Eq)] +pub enum DeviceStatus { + Active, + Inactive, + DeleteMe, +} + +impl From for UpdateDeviceRequestStatus { + fn from(status: DeviceStatus) -> Self { + match status { + DeviceStatus::Active => UpdateDeviceRequestStatus::Active, + DeviceStatus::Inactive => UpdateDeviceRequestStatus::Inactive, + DeviceStatus::DeleteMe => UpdateDeviceRequestStatus::DeleteMe, + } + } +} + +#[derive(Debug, Clone, PartialEq, Eq)] +pub struct DeviceSignature(ed25519::Signature); + +impl DeviceSignature { + pub fn to_bytes(&self) -> [u8; 64] { + self.0.to_bytes() + } + + pub fn to_base64_url_string(&self) -> String { + base64_url::encode(&self.to_bytes()) + } + + pub fn to_base64_string(&self) -> String { + base64_url::unescape(&self.to_base64_url_string()).to_string() + } +} + +#[cfg(test)] +mod tests { + use crate::types::test_fixtures::{ + TEST_DEFAULT_DEVICE_IDENTITY_KEY, TEST_DEFAULT_DEVICE_MNEMONIC, + }; + + use super::*; + + fn ed25519_keypair_fixture() -> ed25519::KeyPair { + // The mnemonic used to generate the keypair + let _mnemonic = "kiwi ketchup mix canvas curve ribbon congress method feel frozen act annual aunt comfort side joy mesh palace tennis cannon orange name tortoise piece"; + + // The corresponding keypair generated from the mnemonic + let private_key_base58 = "9JqXnPvTrWkq1Yq66d8GbXrcz5eryAhPZvZ46cEsBPUY"; + let public_key_base58 = "4SPdxfBYsuARBw6REQQa5vFiKcvmYiet9sSWqb751i3Z"; + + let private_key = bs58::decode(private_key_base58).into_vec().unwrap(); + let public_key = bs58::decode(public_key_base58).into_vec().unwrap(); + + ed25519::KeyPair::from_bytes(&private_key, &public_key).unwrap() + } + + #[test] + fn verify_ed25519_keypair_fixture() { + let device = Device::from( + bip39::Mnemonic::parse("kiwi ketchup mix canvas curve ribbon congress method feel frozen act annual aunt comfort side joy mesh palace tennis cannon orange name tortoise piece").unwrap() + ); + let expected_keypair = ed25519_keypair_fixture(); + assert_eq!( + device.keypair.private_key().to_base58_string(), + expected_keypair.private_key().to_base58_string() + ); + assert_eq!( + device.keypair.public_key().to_base58_string(), + expected_keypair.public_key().to_base58_string() + ); + } + + #[test] + fn create_device_from_mnemonic_1() { + let device = Device::from(bip39::Mnemonic::parse(TEST_DEFAULT_DEVICE_MNEMONIC).unwrap()); + assert_eq!( + device.identity_key().to_base58_string(), + TEST_DEFAULT_DEVICE_IDENTITY_KEY + ); + } + + #[test] + fn create_device_from_mnemonic_2() { + let device = Device::from( + bip39::Mnemonic::parse("kiwi ketchup mix canvas curve ribbon congress method feel frozen act annual aunt comfort side joy mesh palace tennis cannon orange name tortoise piece").unwrap() + ); + assert_eq!( + device.identity_key().to_base58_string(), + "4SPdxfBYsuARBw6REQQa5vFiKcvmYiet9sSWqb751i3Z", + ); + assert_eq!( + device.keypair.private_key().to_base58_string(), + "9JqXnPvTrWkq1Yq66d8GbXrcz5eryAhPZvZ46cEsBPUY", + ); + } + + #[test] + fn create_device_from_keypair() { + let device = Device::from(ed25519_keypair_fixture()); + assert_eq!( + device.keypair.public_key().to_base58_string(), + "4SPdxfBYsuARBw6REQQa5vFiKcvmYiet9sSWqb751i3Z", + ); + assert_eq!( + device.keypair.private_key().to_base58_string(), + "9JqXnPvTrWkq1Yq66d8GbXrcz5eryAhPZvZ46cEsBPUY", + ); + } + + #[test] + fn sign_identity_key() { + let device = Device::from(bip39::Mnemonic::parse(TEST_DEFAULT_DEVICE_MNEMONIC).unwrap()); + assert_eq!( + device.identity_key().to_base58_string(), + TEST_DEFAULT_DEVICE_IDENTITY_KEY + ); + + let signature = device.sign_identity_key().to_base64_string(); + assert_eq!( + signature, + "W5Zv1QhG37Al0QQH/9tqOmv1MU9IjfWP1xDq116GGSu/1Z6cnAW0sOyfrIiqdEleUKJB9wC/HjcsifaogymWAw==" + ); + } +} diff --git a/nym-vpn-api-client/src/types/gateway.rs b/nym-vpn-api-client/src/types/gateway.rs new file mode 100644 index 0000000000..b480c86565 --- /dev/null +++ b/nym-vpn-api-client/src/types/gateway.rs @@ -0,0 +1,63 @@ +// Copyright 2024 - Nym Technologies SA +// SPDX-License-Identifier: GPL-3.0-only + +pub use nym_contracts_common::Percent; + +use crate::VpnApiClientError; + +#[derive(Clone, Copy, Default, Debug)] +pub struct GatewayMinPerformance { + pub mixnet_min_performance: Option, + pub vpn_min_performance: Option, +} + +impl GatewayMinPerformance { + pub fn from_percentage_values( + mixnet_min_performance: Option, + vpn_min_performance: Option, + ) -> Result { + let mixnet_min_performance = mixnet_min_performance + .map(Percent::from_percentage_value) + .transpose() + .map_err(VpnApiClientError::InvalidPercentValue)?; + let vpn_min_performance = vpn_min_performance + .map(Percent::from_percentage_value) + .transpose() + .map_err(VpnApiClientError::InvalidPercentValue)?; + Ok(Self { + mixnet_min_performance, + vpn_min_performance, + }) + } + + pub(crate) fn to_param(self) -> Vec<(String, String)> { + let mut params = vec![]; + if let Some(threshold) = self.mixnet_min_performance { + params.push(( + crate::routes::MIXNET_MIN_PERFORMANCE.to_string(), + threshold.to_string(), + )); + }; + if let Some(threshold) = self.vpn_min_performance { + params.push(( + crate::routes::VPN_MIN_PERFORMANCE.to_string(), + threshold.to_string(), + )); + }; + params + } +} + +#[derive(Clone, Debug)] +pub enum GatewayType { + MixnetEntry, + MixnetExit, + Wg, +} + +#[derive(Clone, Copy, Debug)] +pub struct ScoreThresholds { + pub high: u8, + pub medium: u8, + pub low: u8, +} diff --git a/nym-vpn-api-client/src/types/mod.rs b/nym-vpn-api-client/src/types/mod.rs new file mode 100644 index 0000000000..6aecd37fd2 --- /dev/null +++ b/nym-vpn-api-client/src/types/mod.rs @@ -0,0 +1,17 @@ +// Copyright 2024 - Nym Technologies SA +// SPDX-License-Identifier: GPL-3.0-only + +mod account; +mod device; +mod gateway; +mod platform; + +#[cfg(test)] +mod test_fixtures; + +pub use account::{Error as AccountError, VpnApiAccount, VpnApiTime, VpnApiTimeSynced}; +pub use device::{Device, DeviceStatus}; +pub use gateway::{GatewayMinPerformance, GatewayType, ScoreThresholds}; +pub use platform::Platform; + +pub use nym_contracts_common::{NaiveFloat, Percent}; diff --git a/nym-vpn-api-client/src/types/platform.rs b/nym-vpn-api-client/src/types/platform.rs new file mode 100644 index 0000000000..ae15908c2e --- /dev/null +++ b/nym-vpn-api-client/src/types/platform.rs @@ -0,0 +1,16 @@ +// Copyright 2025 - Nym Technologies SA +// SPDX-License-Identifier: GPL-3.0-only + +#[derive(Clone, Copy, Debug)] +pub enum Platform { + Apple, + Unspecified, +} +impl Platform { + pub fn api_path_component(&self) -> &'static str { + match self { + Platform::Apple => crate::routes::APPLE, + Platform::Unspecified => "", + } + } +} diff --git a/nym-vpn-api-client/src/types/test_fixtures.rs b/nym-vpn-api-client/src/types/test_fixtures.rs new file mode 100644 index 0000000000..c5267e972f --- /dev/null +++ b/nym-vpn-api-client/src/types/test_fixtures.rs @@ -0,0 +1,11 @@ +// Copyright 2024 - Nym Technologies SA +// SPDX-License-Identifier: GPL-3.0-only + +// The default acccount mnemonic, the same as in the js integration tests +pub(super) const TEST_DEFAULT_MNEMONIC: &str = "range mystery picture decline olympic acoustic lesson quick rebuild panda royal fold start leader egg hammer width olympic worry length crawl couch link mobile"; +pub(super) const TEST_DEFAULT_MNEMONIC_ID: &str = "n1sslaag27wfydyrvyua72hg5e0vteglxrs8nw3c"; + +// The default device mnemonic, the same as in the js integration tests +pub(super) const TEST_DEFAULT_DEVICE_MNEMONIC: &str = "pitch deputy proof fire movie put bread ribbon what chef zebra car vacuum gadget steak board state oyster layer glory barely thrive nice box"; +pub(super) const TEST_DEFAULT_DEVICE_IDENTITY_KEY: &str = + "FJDUECYAeosXhNGjxf8w5MJM7N2DfDwQznvWwTxJz6ft"; diff --git a/sdk/rust/nym-sdk/Cargo.toml b/sdk/rust/nym-sdk/Cargo.toml index ffd74297f3..cee9abe880 100644 --- a/sdk/rust/nym-sdk/Cargo.toml +++ b/sdk/rust/nym-sdk/Cargo.toml @@ -50,7 +50,7 @@ nym-bin-common = { workspace = true, features = [ "basic_tracing", ] } -nym-ip-packet-client = { git = "https://github.com/nymtech/nym-vpn-client", rev = "5c3aacfce158aac73cbd3fd905d90269f8bacc01" } # max/re-export-test https://github.com/nymtech/nym-vpn-client/commit/5c3aacfce158aac73cbd3fd905d90269f8bacc01 +# nym-ip-packet-client = { git = "https://github.com/nymtech/nym-vpn-client", rev = "5c3aacfce158aac73cbd3fd905d90269f8bacc01" } # nym-gateway-directory bytecodec = { workspace = true }